Hi all,
I have a process where a user selects a contact folder from a list on a preconfigured page. A sub process then needs to run for each contact in the selected folder.
I've read the article for Programmatically Using Section Folder Filters in Processes or Server-Side Code in Creatio | Customer FX and I have borrowed a script task for creating the list of contacts.
var sectionName = "Contact";
var folderId = "2d3c0306-1e43-4ba7-943b-a3d261b66897"; //I will pass this in from the preconfigured page
// get folder SearchData
var folderSchema = UserConnection.EntitySchemaManager.GetInstanceByName(sectionName + "Folder");
var esq = new EntitySchemaQuery(folderSchema);
var dataCol = esq.AddColumn("SearchData").Name;
var folderData = esq.GetEntity(UserConnection, folderId).GetBytesValue(dataCol);
// convert filter data to esq filters
var serializedFilters = System.Text.Encoding.UTF8.GetString(folderData, 0, folderData.Length);
var dataSourceFilters = Terrasoft.Common.Json.Json.Deserialize(serializedFilters);
// MUST INCLUDE using Terrasoft.Nui.ServiceModel.Extensions;
var folderFilters = dataSourceFilters.BuildEsqFilter(UserConnection.EntitySchemaManager.GetInstanceByName(sectionName).UId, UserConnection);
// now can include folderFilters as filters in new esq
var contactEsq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
contactEsq.AddColumn("Id");
contactEsq.Filters.Add(folderFilters); // using the filters from the folder
var contacts = contactEsq.GetEntityCollection(UserConnection);I would like to either pass the results into a collection or run a sub process for each contact directly from the script task.
Any help would be much appreciated,
Like
An easy way to accomplish what you're after is to:
- Create a collection parameter in the process
- Populate the contacts from the ESQ into the collection parameter (see link below)
- Then use normal subprocess for each contact in the collection
See here for how to add the results of the ESQ from the folder to a collection param: https://customerfx.com/article/working-with-collection-parameters-in-a-process-in-creatio/
Ryan
An easy way to accomplish what you're after is to:
- Create a collection parameter in the process
- Populate the contacts from the ESQ into the collection parameter (see link below)
- Then use normal subprocess for each contact in the collection
See here for how to add the results of the ESQ from the folder to a collection param: https://customerfx.com/article/working-with-collection-parameters-in-a-process-in-creatio/
Ryan
Ryan Farley,
I'm still struggling to get the result I'm after with the following code:
Parameters:
- ContactFolderId (Guid)
- ContactsList (Collection)
- ContactsList.ContactId
- ContactsList.Name
var sectionName = "Contact";
var folderId = Get<Guid>("CommunityFolderId"); //"2d3c0306-1e43-4ba7-943b-a3d261b66897";
var folderSchema = UserConnection.EntitySchemaManager.GetInstanceByName(sectionName + "Folder");
var esq = new EntitySchemaQuery(folderSchema);
var dataCol = esq.AddColumn("SearchData").Name;
var folderEntity = esq.GetEntity(UserConnection, folderId);
var folderData = folderEntity.GetBytesValue(dataCol);
var serializedFilters = System.Text.Encoding.UTF8.GetString(folderData, 0, folderData.Length);
var dataSourceFilters = Terrasoft.Common.Json.Json.Deserialize<Terrasoft.Nui.ServiceModel.DataContract.Filters>(serializedFilters);
var folderFilters = dataSourceFilters.BuildEsqFilter(
UserConnection.EntitySchemaManager.GetInstanceByName(sectionName).UId,
UserConnection
);
var contactEsq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");
contactEsq.AddColumn("Id");
contactEsq.AddColumn("Name");
contactEsq.Filters.Add(folderFilters);
var contacts = contactEsq.GetEntityCollection(UserConnection);
var list = Get<CompositeObjectList<CompositeObject>>("ContactsList");
foreach (var contact in contacts)
{
var item = new CompositeObject();
item["ContactId"] = contact.GetTypedColumnValue<string>("Id");
item["Name"] = contact.GetTypedColumnValue<string>("Name");
list.Add(item);
}
return true;When I run the process (passing 2d3c0306-1e43-4ba7-943b-a3d261b66897 into the ContactFolderId parameter, I'm getting an error saying:
Terrasoft.Common.ItemNotFoundException: Value "Id" was not found.
at Terrasoft.Core.Entities.EntityColumnValueCollection.GetByName(String name)
at Terrasoft.Core.Entities.Entity.InternalGetColumnValue(String valueName)
at Terrasoft.Core.Entities.Entity.GetTypedColumnValue[TResult](String valueName)
I tried changing it to the following alternatives but I got the same error:
var item = new CompositeObject();
item["ContactId"] = contact.GetTypedColumnValue<Guid>("Id");and
var item = new CompositeObject();
item["ContactId"] = contact.Get<Guid>("Id");I feel like I'm missing something obvious somewhere.