Вопрос

Достать колонку с логином от 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<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;

Но при компиляции выдает ошибку

Изображение удалено.

 

Нравится

6 комментариев
Лучший ответ

1) Непонятно зачем всё это вынесено в метод, а не скрипт таск.

2) Если код вашей функции вынести в скрипт-таск, убрать галку "Для интерпретируемого процесса", исправить кусок кода на 

var helper = Factories.ClassFactory.Get&lt;PsADSearchUserHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
var LoginADByContact = helper.GetLoginADByContactId(ContactId.ToString());

то оно даже будет работать. Но на дворе уже 7.13, и галка с интерпретацией нещадно выпилена. Поэтому делаем скрипт-таск со следующим кодом:

//Получаем переменные процесса через Get
var connection = Get&lt;UserConnection&gt;("UserConnection");
var contactId = Get&lt;Guid&gt;("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&lt;UserConnection&gt;("UserConnection");
	var helper = new PsADSearchUserHelper(UserConnection);
	LoginADByContact = helper.GetLoginADByContactId(contact.ToString()); // LoginADByContact уже определен в свойствах как геттер и сеттер, должен быть глобальным но не видит его
}

В "Задание-сценарий" (я так понимаю это скриптаск)

UserConnection UserConnection = Get&lt;UserConnection&gt;("UserConnection"); // Это тут нужно?
LoginADB(ContactId); // Через параметр передать не выходит

Не совсем понял Вас "//определите ContactId".

Видимо что-то не так написал.

1) Непонятно зачем всё это вынесено в метод, а не скрипт таск.

2) Если код вашей функции вынести в скрипт-таск, убрать галку "Для интерпретируемого процесса", исправить кусок кода на 

var helper = Factories.ClassFactory.Get&lt;PsADSearchUserHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
var LoginADByContact = helper.GetLoginADByContactId(ContactId.ToString());

то оно даже будет работать. Но на дворе уже 7.13, и галка с интерпретацией нещадно выпилена. Поэтому делаем скрипт-таск со следующим кодом:

//Получаем переменные процесса через Get
var connection = Get&lt;UserConnection&gt;("UserConnection");
var contactId = Get&lt;Guid&gt;("ContactId");
 
//вызываем метод
//Кстати, а зачем кидать guid как string???
PsADSearchUserHelper helper = new PsADSearchUserHelper(connection);
string LoginADByContact = helper.GetLoginADByContactId(contactId.ToString());

 

Варфоломеев Данила,

 

А как теперь найденное значение присвоить свойству LoginADByContact присвоить найденное значение?

Prime Source,

Set("LoginADByContact", LoginADByContact)

Варфоломеев Данила, 

Я что-то написал и сам потом сообразил. Спасибо большее, просто огромное. ???

Показать все комментарии