Достать колонку с логином от AD
Здравствуйте. Для интеграции с существующей системой 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(colLDAPEntry.Name);
}
return result;
}
#endregion
}
}В БП был создан метод
public virtual void LoginADB() {
var helper = Factories.ClassFactory.Get(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)
Варфоломеев Данила,
Я что-то написал и сам потом сообразил. Спасибо большее, просто огромное. ???