Epicor 10 - Смена завода для текущей сессии

Мы начинаем использовать Epicor 10 и хотим использовать библиотеки DLL /Services для общения с Epicor. Таким образом, мы можем добавлять / обновлять информацию из пользовательского приложения. Пока все идет хорошо, но мы столкнулись с проблемой, когда хотели, скажем, добавить работу для конкретного завода. Кажется, всегда хочется сохранить на заводе пользователя, который последний раз вошел в систему через клиентское приложение.

Так, к примеру - допустим, что последним заводом пользователя был завод "А". Я хочу, чтобы мое пользовательское приложение входило в Epicor (создавая сеанс) и создавало задание для завода "B". Я могу добавить задание в порядке, но оно будет помещено под завод "A", а не "B", хотя я вошел на завод "B" при создании сеанса.

Мы вызываем SetPlant и передаем нужный завод, который нам нужен, но Epicor, похоже, всегда переопределяет, на каком заводе его сохранить. Кто-нибудь еще сталкивался с этим делом? У нас также есть эта проблема с Компанией. SetCompany, похоже, не работает вообще.

Дополнительная информация: - Мы используем сервис net.tcp:///ERP/ICE/Lib/SessionMod.svc. - Мы можем нормально войти в систему с помощью Login() и получить SessionId. - Даже вызов GetValues ​​() для объекта Session говорит, что мы вошли в систему "B", даже если Epicor все равно будет использовать установку "A".

Единственный обходной путь, который мы можем придумать, который мы не хотим делать, - это иметь пользователя приложения по компании и по заводу, чтобы мы могли гарантировать, в какую компанию и завод будут сохранены данные. Это будет работать, но это не идеально.

У кого-нибудь есть какие-либо предложения о том, как заставить систему принять новую компанию или завод?

1 ответ

PlantID можно обновить в сеансе с помощью метода SetPlant(). Он должен вызываться после 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);

Как указывает user463132, вы можете заключить соединение со службой во временный контекст сеанса:

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

Haso Keric Ссылка на статью

Я также добавлю, что если вы используете адаптеры пользовательского интерфейса, вы можете просто получить сеанс из экземпляра объекта oTrans и установить здесь свойства, которые определяют, как oTrans взаимодействует с вашими данными.

Ice.Core.Session s1 = (Ice.Core.Session)this.oTrans.Session;
s1.CompanyID = "YourCompanyHere";
s1.PlantID = "B";

Первое, что нужно понять, это то, что серверный сеанс - это не отдельный экземпляр, а стек экземпляров.NET. Переменная CallContext.Current.Session является просто указателем на вершину стека. В большинстве случаев в стеке CallContext есть только один экземпляр Session. Но когда вам нужно перебирать компании для обработки чего-либо, стек сессий перемещается и извлекается. Вот где приходит TemporarySessions.

Читайте об этом по адресу: https://www.linkedin.com/pulse/snippet-epicor-change-companyplantuser-bpm-haso-keric/

Другие вопросы по тегам