17

我们开始使用 Epicor 10,我们希望利用 DLL/服务与 Epicor 对话。这样我们就可以从自定义应用程序中添加/更新信息。到目前为止,一切进展顺利,但是当我们想要为特定工厂添加工作时遇到了问题。它似乎总是希望将用户上次通过客户端应用程序登录的工厂保存到工厂。

例如——假设用户的最后一个植物是植物“A”。我希望我的自定义应用程序登录 Epicor(创建会话)并为工厂“B”创建作业。我可以很好地添加工作,但它会将它放在工厂“A”而不是“B”下,即使我在创建会话时登录了工厂“B”。

我们正在调用 SetPlant 并传入我们想要的正确植物,但 Epicor 似乎总是覆盖将其保存为的植物。有没有其他人遇到过这种情况?我们也与公司有这个问题。SetCompany 似乎根本不起作用。

更多信息: - 我们正在使用 net.tcp:///ERP/ICE/Lib/SessionMod.svc 服务。- 我们可以使用 Login() 正常登录并返回 SessionId - 即使在 Session 对象上调用 GetValues() 表示我们已登录到工厂“B”,即使 Epicor 仍将使用工厂“A”。

我们能想到的唯一解决方法是,我们不想做的,是按公司和工厂拥有一个应用程序用户,这样我们就可以保证将数据保存到哪个公司和工厂。这会起作用,但并不理想。

有人对如何让系统接管新公司或新工厂有任何建议吗?

4

3 回答 3

1

正如 user463132 指出的那样,您可以使用临时会话上下文包装您的服务连接:

using (CallContext.Current.TemporarySessionCreator.SetCompanyID("YourCompanyHere").SetPlantID("B").Create())
{
}

Haso Keric 文章参考

我还要补充一点,如果您使用 UI 适配器,您可以简单地从 oTrans 对象实例中获取会话并在此处设置属性,这些属性控制 oTrans 如何与您的数据交互。

Ice.Core.Session s1 = (Ice.Core.Session)this.oTrans.Session;
s1.CompanyID = "YourCompanyHere";
s1.PlantID = "B";
于 2019-06-03T15:29:48.337 回答
1

可以使用 SetPlant() 方法在会话中更新植物 ID。它必须在 SetCompany() 之后调用:

sessionModImpl = NetTcp_Helper.ClassAttributHelper.CreateBusObj<SessionModImpl>(Guid.Empty, SessionModImpl.UriPath, Settings);

sessionId = sessionModImpl.Login();

sessionModImpl.SessionID = sessionId;

sessionModImpl.SetCompany(epicorCompanyID, out companyName, out plantID, out plantName, out workstationID, out workstationDescription, out employeeID,
                                        out countryGroupCode, out countryCode, out tenantID);

sessionModImpl.SetPlant(newSiteID, out plantName);
于 2019-12-04T14:52:29.223 回答
0

首先要了解的是,服务器会话不是单个实例,而是会话实例的 .NET 堆栈。'CallContext.Current.Session' 变量只是一个指向栈顶的指针。在大多数情况下,CallContext 堆栈中只有一个 Session 实例。但是当你需要遍历 Companies 来处理某些东西时,Session Stack 会被推送和弹出。这就是“临时会话”的用武之地。

阅读: https ://www.linkedin.com/pulse/snippet-epicor-change-companyplantuser-bpm-haso-keric/

于 2018-06-19T00:28:12.540 回答