我们开始使用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”。
我们能想出的唯一的变通办法是,我们不想做的是,每个公司和每个工厂都有一个应用程序用户,这样我们就可以保证数据保存到哪个公司和工厂。这是可行的,但并不理想。
有没有人对如何让系统接受新的公司或工厂有什么建议?
发布于 2019-06-03 23:29:48
正如user463132指出的,您可以使用临时会话上下文包装您的服务连接:
using (CallContext.Current.TemporarySessionCreator.SetCompanyID("YourCompanyHere").SetPlantID("B").Create())
{
}我还会补充说,如果您使用的是UI适配器,则可以简单地从oTrans对象实例中获取会话,并在此处设置控制oTrans与数据交互方式的属性。
Ice.Core.Session s1 = (Ice.Core.Session)this.oTrans.Session;
s1.CompanyID = "YourCompanyHere";
s1.PlantID = "B";发布于 2019-12-04 22:52:29
可以使用SetPlant()方法在会话中更新plantID。它必须在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);发布于 2018-06-19 08:28:13
首先要理解的是,服务器会话不是单个实例,而是会话实例的.NET堆栈。‘CallContext.Current.Session’变量只是指向堆栈顶部的指针。在大多数情况下,CallContext堆栈中只有一个会话实例。但是,当您需要遍历公司来处理某些事情时,会话堆栈就会被推送和弹出。这就是“TemporarySessions”的用武之地。
请访问:https://www.linkedin.com/pulse/snippet-epicor-change-companyplantuser-bpm-haso-keric/阅读相关信息
https://stackoverflow.com/questions/42115411
复制相似问题