Как в БП реализовать цикл по сборке данных из справочников и отправку всех этих данных одним письмом

Доброго времени суток, коллеги!

 

Возникла необходимость собирать несколько записей из справочников и затем все эти данные отправлять одним письмом в виде таблицы.

Какие есть варианты решения данного вопроса и можно ли это сделать стандартными средствами предоставляемые Studio?

 

Заранее спасибо!

Нравится

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

Mykhailo Kozlenko,

Добрый день.

Можно в элементе 'Задание-сценарий' сформировать таблицу, которую нужно отправлять, и записать её в параметр бизнес-процесса. Например, я делала вот таким образом:

const string quote = "\"";
const string siteRef = "http://site_name";
 
var userConnection = Get<UserConnection>("UserConnection");
var softwareInventoryTableHTML = String.Empty;
 
var esqSoftwareInventory = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SoftwareInventory");
esqSoftwareInventory.AddColumn("Id");
esqSoftwareInventory.AddColumn("Number");
esqSoftwareInventory.AddColumn("Software.Name");
esqSoftwareInventory.AddColumn("LicenseKey.Name");
var expirationDateColumn = esqSoftwareInventory.AddColumn("LicenseExpirationDate");
expirationDateColumn.OrderDirection = OrderDirection.Ascending;
expirationDateColumn.OrderPosition = 1;
esqSoftwareInventory.AddColumn("Equipment.Name");
esqSoftwareInventory.AddColumn("Equipment.Id");
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Equal,
	"LicenseStatus", new Guid("CDD71003-D5BB-43E7-8E06-280FE40BEBF8")));
DateTime dueDate = DateTime.Today.AddMonths(2);
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Less,
	"LicenseExpirationDate", dueDate));
var softwareInventories = esqSoftwareInventory.GetEntityCollection(userConnection);
if (softwareInventories.Count > 0)
{
	var htmlTableBuilder = new StringBuilder();
	htmlTableBuilder.AppendLine("<table border='1' width='100%' cellpadding='5'>");
	var headerSB = new StringBuilder();
	headerSB.Append("<tr>");
	string[] columnNames = { "Номер", "Программное обеспечение", "Лицензионный ключ", "Дата окончания лицензии",
		"Оборудование" };
	foreach (string columnName in columnNames)
	{
		headerSB.Append("<td>" + columnName + "</td>");
	}
    headerSB.Append("</tr>");
    htmlTableBuilder.AppendLine(headerSB.ToString());
	foreach (var softwareInventory in softwareInventories)
	{
		var rowSB = new StringBuilder();
		rowSB.Append("<tr>");
		string Number = softwareInventory.GetTypedColumnValue<string>("Number");
		Guid recordId = softwareInventory.GetTypedColumnValue<Guid>("Id1");
		string softwareInventoryRef = siteRef + "/0/Nui/ViewModule.aspx#CardModuleV2/SoftwareInventory1Page/edit/" +
			recordId.ToString();
		string inventoryNumberRef = "<a href=" + quote + softwareInventoryRef + quote +">" + Number + "</a>";
		rowSB.Append("<td width=\"44\">" + inventoryNumberRef + "</td>");
		rowSB.Append("<td width=\"120\">" + softwareInventory.GetTypedColumnValue<string>("Software_Name") + "</td>");
		string licenseKey = softwareInventory.GetTypedColumnValue<string>("LicenseKey_Name");
		int licenseKeyLength = licenseKey.Length;
		int indexStr = 8;
		if (licenseKeyLength <= 8)
		{
			indexStr = licenseKeyLength;
		}
		rowSB.Append("<td width=\"110\">" + licenseKey.Substring(0, indexStr) + "</td>");
		DateTime licenseExpirationDate = softwareInventory.GetTypedColumnValue<DateTime>(expirationDateColumn.Name);
		string licenseExpirationDateStr = "";
		if (licenseExpirationDate != DateTime.MinValue) {
			licenseExpirationDateStr = licenseExpirationDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
		}
		rowSB.Append("<td width=\"83\">" + licenseExpirationDateStr + "</td>");
		rowSB.Append("<td width=\"106\">" +	softwareInventory.GetTypedColumnValue<string>("Equipment_Name") + "</td>");
		rowSB.Append("</tr>");
 
        htmlTableBuilder.AppendLine(rowSB.ToString());
	}
	htmlTableBuilder.AppendLine("</table>");	
	softwareInventoryTableHTML = htmlTableBuilder.ToString();
}
Set<string>("SoftwareInventoryTableHTML", softwareInventoryTableHTML);
return true;

А потом этот параметр бизнес-процесса использовать в элементе 'Отправить email' в качестве макроса:

Обратите внимание, по данному программному обеспечению истек срок действия лицензии либо истечет в ближайшее время.
Пожалуйста, актуализируйте в срм информацию по этому ПО:
[#Software inventory table#]
 
С уважением,
Системный администратор crm

 

P.S. В скрипте, приведенном выше, ещё и гиперссылки на карточки сущностей в срм формируются.

 

 

 

 

Добрый день.

 

Вы можете использовать бесплатное дополнение, которое позволяет встраивать таблицу с данными в e-mail сообщение, отправляемое из бизнес-процесса.

Добрый! Кроме данного дополнения больше никаких вариантов нет? Ибо при попытке работать с данным расширением оказалось, что оно не совсем рабочее. 

Mykhailo Kozlenko,

Добрый день.

Можно в элементе 'Задание-сценарий' сформировать таблицу, которую нужно отправлять, и записать её в параметр бизнес-процесса. Например, я делала вот таким образом:

const string quote = "\"";
const string siteRef = "http://site_name";
 
var userConnection = Get<UserConnection>("UserConnection");
var softwareInventoryTableHTML = String.Empty;
 
var esqSoftwareInventory = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SoftwareInventory");
esqSoftwareInventory.AddColumn("Id");
esqSoftwareInventory.AddColumn("Number");
esqSoftwareInventory.AddColumn("Software.Name");
esqSoftwareInventory.AddColumn("LicenseKey.Name");
var expirationDateColumn = esqSoftwareInventory.AddColumn("LicenseExpirationDate");
expirationDateColumn.OrderDirection = OrderDirection.Ascending;
expirationDateColumn.OrderPosition = 1;
esqSoftwareInventory.AddColumn("Equipment.Name");
esqSoftwareInventory.AddColumn("Equipment.Id");
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Equal,
	"LicenseStatus", new Guid("CDD71003-D5BB-43E7-8E06-280FE40BEBF8")));
DateTime dueDate = DateTime.Today.AddMonths(2);
esqSoftwareInventory.Filters.Add(esqSoftwareInventory.CreateFilterWithParameters(FilterComparisonType.Less,
	"LicenseExpirationDate", dueDate));
var softwareInventories = esqSoftwareInventory.GetEntityCollection(userConnection);
if (softwareInventories.Count > 0)
{
	var htmlTableBuilder = new StringBuilder();
	htmlTableBuilder.AppendLine("<table border='1' width='100%' cellpadding='5'>");
	var headerSB = new StringBuilder();
	headerSB.Append("<tr>");
	string[] columnNames = { "Номер", "Программное обеспечение", "Лицензионный ключ", "Дата окончания лицензии",
		"Оборудование" };
	foreach (string columnName in columnNames)
	{
		headerSB.Append("<td>" + columnName + "</td>");
	}
    headerSB.Append("</tr>");
    htmlTableBuilder.AppendLine(headerSB.ToString());
	foreach (var softwareInventory in softwareInventories)
	{
		var rowSB = new StringBuilder();
		rowSB.Append("<tr>");
		string Number = softwareInventory.GetTypedColumnValue<string>("Number");
		Guid recordId = softwareInventory.GetTypedColumnValue<Guid>("Id1");
		string softwareInventoryRef = siteRef + "/0/Nui/ViewModule.aspx#CardModuleV2/SoftwareInventory1Page/edit/" +
			recordId.ToString();
		string inventoryNumberRef = "<a href=" + quote + softwareInventoryRef + quote +">" + Number + "</a>";
		rowSB.Append("<td width=\"44\">" + inventoryNumberRef + "</td>");
		rowSB.Append("<td width=\"120\">" + softwareInventory.GetTypedColumnValue<string>("Software_Name") + "</td>");
		string licenseKey = softwareInventory.GetTypedColumnValue<string>("LicenseKey_Name");
		int licenseKeyLength = licenseKey.Length;
		int indexStr = 8;
		if (licenseKeyLength <= 8)
		{
			indexStr = licenseKeyLength;
		}
		rowSB.Append("<td width=\"110\">" + licenseKey.Substring(0, indexStr) + "</td>");
		DateTime licenseExpirationDate = softwareInventory.GetTypedColumnValue<DateTime>(expirationDateColumn.Name);
		string licenseExpirationDateStr = "";
		if (licenseExpirationDate != DateTime.MinValue) {
			licenseExpirationDateStr = licenseExpirationDate.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture);
		}
		rowSB.Append("<td width=\"83\">" + licenseExpirationDateStr + "</td>");
		rowSB.Append("<td width=\"106\">" +	softwareInventory.GetTypedColumnValue<string>("Equipment_Name") + "</td>");
		rowSB.Append("</tr>");
 
        htmlTableBuilder.AppendLine(rowSB.ToString());
	}
	htmlTableBuilder.AppendLine("</table>");	
	softwareInventoryTableHTML = htmlTableBuilder.ToString();
}
Set<string>("SoftwareInventoryTableHTML", softwareInventoryTableHTML);
return true;

А потом этот параметр бизнес-процесса использовать в элементе 'Отправить email' в качестве макроса:

Обратите внимание, по данному программному обеспечению истек срок действия лицензии либо истечет в ближайшее время.
Пожалуйста, актуализируйте в срм информацию по этому ПО:
[#Software inventory table#]
 
С уважением,
Системный администратор crm

 

P.S. В скрипте, приведенном выше, ещё и гиперссылки на карточки сущностей в срм формируются.

 

 

 

 

Я однажды делал подобное следующим образом:

в БП в элементе "Задание-сценарий" вычитывал в коллекцию какие-то значения.

После кодом формировал html-код в виде:

<table>

<tbody>

  <tr>

    <td >Номер</td>

    <td >Колонка 1</td>

    <td >Колонка 2</td>

  </tr>

  <tr>

    <td >1</td>

    <td >Значение 1</td>

    <td >Значение 2</td>

  </tr>

</tbody>

</table>

где Значение 1 и Значение 2 значения из коллекции.

После использовал элемент БП "Отправка письма", где в тело подсовывал html-код в виде строки.

После отправки получатель увидит заполненную html-таблицу

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