Как в БП реализовать цикл по сборке данных из справочников и отправку всех этих данных одним письмом
Доброго времени суток, коллеги!
Возникла необходимость собирать несколько записей из справочников и затем все эти данные отправлять одним письмом в виде таблицы.
Какие есть варианты решения данного вопроса и можно ли это сделать стандартными средствами предоставляемые Studio?
Заранее спасибо!
Нравится
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-таблицу