Здравствуйте. Для интеграции с существующей системой CRM нужно в трансферную таблицу вложить изменения контрагента и контактов. Контакты берутся из AD. Логины AD хранятся в таблице SysAdminUnit. Проблема в том что через БП добраться так просто к колонке LDAPEntry, нужно написать C# скрипт. Скрипт я написал, он работает
using System; using System.Collections.Generic; using System.Linq; using Terrasoft.Core; using Terrasoft.Core.Entities; using CoreConfiguration = Terrasoft.Core.Configuration; namespace Terrasoft.Configuration.PsADSearchUser { public class PsADSearchUserHelper { #region Properties: Public public UserConnection UserConnection { get; private set; } #endregion #region Constructors: Public public PsADSearchUserHelper(UserConnection userConnection) { UserConnection = userConnection; } #endregion #region Methods: Public public virtual string GetLoginADByContactId(string contactId){ if (string.IsNullOrEmpty(contactId)) { return string.Empty; } var result = ""; var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "SysAdminUnit"); var contact = esq.AddColumn("Contact"); var colLDAPEntry = esq.AddColumn("LDAPEntry"); var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact", contactId); esq.Filters.Add(esqFilter); var entities = esq.GetEntityCollection(UserConnection); if (entities.Count > 0) { //result = entities[0].GetColumnValue(colLDAPEntry.Name).ToString(); // Также можно использовать такой вариант: result = entities[0].GetTypedColumnValue<string>(colLDAPEntry.Name); } return result; } #endregion } }
В БП был создан метод
public virtual void LoginADB() { var helper = Factories.ClassFactory.Get<PsADSearchUserHelper>(new Factories.ConstructorArgument("userConnection", UserConnection)); LoginADByContact = helper.GetLoginADByContactId(ContactId.ToString()); }
и Using
Terrasoft.Configuration.PsADSearchUser
В "Задание-сценарий" был вызван метод
LoginADB(); return true;
Но при компиляции выдает ошибку
Нравится
1) Непонятно зачем всё это вынесено в метод, а не скрипт таск.
2) Если код вашей функции вынести в скрипт-таск, убрать галку "Для интерпретируемого процесса", исправить кусок кода на
var helper = Factories.ClassFactory.Get<PsADSearchUserHelper>(new Factories.ConstructorArgument("userConnection", UserConnection)); var LoginADByContact = helper.GetLoginADByContactId(ContactId.ToString());
то оно даже будет работать. Но на дворе уже 7.13, и галка с интерпретацией нещадно выпилена. Поэтому делаем скрипт-таск со следующим кодом:
//Получаем переменные процесса через Get var connection = Get<UserConnection>("UserConnection"); var contactId = Get<Guid>("ContactId"); //вызываем метод //Кстати, а зачем кидать guid как string??? PsADSearchUserHelper helper = new PsADSearchUserHelper(connection); string LoginADByContact = helper.GetLoginADByContactId(contactId.ToString());
1) Получите в скриптаске UserConnection для БП это будет:
UserConnection UserConnection = Get<UserConnection>("UserConnection");
2) Передайте его в ваш класс (лучше через конструктор с параметрами)
Если вы будете дергать ваш класс например из вэб сервиса метод получения UserConnection будет немного другой. Поэтому лучше его передавать в конструкторе класса.
3) Откройте свойства БП перейдите во вкладку методы и там добавьте в USING Terrasoft.Configuration.PsADSearchUser
4) В методе просто пропишите
//определите ContactId
UserConnection UserConnection = Get<UserConnection>("UserConnection");
var helper = new PsADSearchUserHelper(UserConnection); var rezult = helper.GetLoginADByContactId(ContactId.ToString()); Factory тут не нужна, она используется если вы замещаете чтото в пакетах не доступных от редактирования те если вы меняете логику работы замещаемого класса. А вообще всю логику можно вынести в скриптаск. Класс хэлпер используют для того чтоб можно было повторно в разных скриптасках использовать какой то "общий" код или для удобства отладки
Удачи
Григорий Чех, В свойствах БП прописан USING "Terrasoft.Configuration.PsADSearchUser"
В методе
public virtual void LoginADB(Guid contact) { UserConnection UserConnection = Get<UserConnection>("UserConnection"); var helper = new PsADSearchUserHelper(UserConnection); LoginADByContact = helper.GetLoginADByContactId(contact.ToString()); // LoginADByContact уже определен в свойствах как геттер и сеттер, должен быть глобальным но не видит его }
В "Задание-сценарий" (я так понимаю это скриптаск)
UserConnection UserConnection = Get<UserConnection>("UserConnection"); // Это тут нужно? LoginADB(ContactId); // Через параметр передать не выходит
Не совсем понял Вас "//определите ContactId".
Видимо что-то не так написал.
1) Непонятно зачем всё это вынесено в метод, а не скрипт таск.
2) Если код вашей функции вынести в скрипт-таск, убрать галку "Для интерпретируемого процесса", исправить кусок кода на
var helper = Factories.ClassFactory.Get<PsADSearchUserHelper>(new Factories.ConstructorArgument("userConnection", UserConnection)); var LoginADByContact = helper.GetLoginADByContactId(ContactId.ToString());
то оно даже будет работать. Но на дворе уже 7.13, и галка с интерпретацией нещадно выпилена. Поэтому делаем скрипт-таск со следующим кодом:
//Получаем переменные процесса через Get var connection = Get<UserConnection>("UserConnection"); var contactId = Get<Guid>("ContactId"); //вызываем метод //Кстати, а зачем кидать guid как string??? PsADSearchUserHelper helper = new PsADSearchUserHelper(connection); string LoginADByContact = helper.GetLoginADByContactId(contactId.ToString());
Варфоломеев Данила,
А как теперь найденное значение присвоить свойству LoginADByContact присвоить найденное значение?
Prime Source,
Set("LoginADByContact", LoginADByContact)
Варфоломеев Данила,
Я что-то написал и сам потом сообразил. Спасибо большее, просто огромное. ???