I am reading a collection of records, and would like to concatenate one of the fields from all the records into one long field. I tried using a sub-process to do the concatenation but it does not seem to pass anything back. Has anyone found a way to do this?

Like 0

Like

7 comments

Hi Heather, 

I usually do this in a script task with an ESQ, however, if you can set a field to flag the records you can do it in a process without coding. You can see this article for some details on how to loop in a process by flagging records: https://customerfx.com/article/how-to-loop-through-records-in-a-process…

The basic idea is:

  1. Create a process param that will hold the concatenated value
  2. Use a modify data to flag all the records you want to work with
  3. Now, read the flagged records
  4. Check if you got a record by checking if the Id != Guid.Empty
  5. Concatenate the value in the process param
  6. Unflag the record by using a modify data to un-set the field
  7. Loop back to #3

Make sure the maximum number of repetitions setting for the process is larger than the typical set of data you'd be working with. Anyway, hope this helps. Of course, doing it in code is pretty straight forward as well if you're interested in going that route I'd be happy to help.

Ryan

Ryan Farley,

Thanks for your response. I have been trying to get away from using loop flags because it causes all the records to be marked as "modified", which causes confusion about when the records were actually last modified by a user. Could you give me an example of how you do it with a script task? I have never worked with script tasks before.

Heather,

Here's an example that uses an EntitySchemaQuery to read all accounts with a type of Customer and creates a comma delimited string of the account names. When done, it puts the value in a process parameter named TextParam.

var text = "";
 
var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Account");
esq.AddColumn("Name");
 
var customerFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Type.Name", "Customer");
esq.Filters.Add(customerFilter);
 
var accounts = esq.GetEntityCollection(UserConnection);
foreach (var account in accounts)
{
	var name = account.GetTypedColumnValue<string>("Name");
	text += name + ", ";
}
text = text.Trim().TrimEnd(',');
 
Set("TextParam", text);
return true;

Hope this helps get you started.

Ryan

Ryan Farley,

Thanks so much, I was able to get that to work. Do you happen to know how to get the value from a non-Typed column? I'm assuming you have to get the GUID and then do a separate lookup from that table?

Heather,

If I am understanding you correctly, you can do that all in the same query. For example, in the example I posted, let's say you want to get the Account Owner's email address (Owner is a lookup to contact). I would add a column like this:

esq.AddColumn("Owner.Email");

Then, I could read that from the results like this (the dots are replaced with underscores):

var ownerEmail = account.GetTypedColumnValue<string>("Owner_Email");

You can go through many object relationships like this, for example Owner.City.Name, etc.

Ryan

 

Ryan Farley,

Thank you for all your help so far. I will check out the method you suggest. I got this almost working using a different method and I'm wondering if you can help with the last step. I just need to get the value of the record that I want to filter on in my script. I have tried a number of different syntax but just keep getting errors. I'm tryin gto get the UsrContact, which is a Contact Lookup record, and add that value to my SQL as the "user". I have tried it as a Guid and a string and get different errors depending on what way I do it.

 

var text = "";

var user = Get<string>("UsrContact");

var sql = "select case when cc.Name is null then ' ' else cc.Name end, "+ 

                 "case when org.Name is null then ' ' else org.Name end, "+ 

                 "case when cc.Phone is null then ' ' else cc.Phone end, "+ 

                 "case when cc.MobilePhone is null then ' ' else cc.MobilePhone end, "+ 

                 "case when freq.Name is null then ' ' else freq.Name end, "+ 

                 "case when rm. UsrLastCPIContact is null then ' ' else rm.UsrLastCPIContact end "+

            "from kwlcustomerMatrix rm "+ 

            "left outer join Contact cc on rm.KwlRCustomerContact1Id=cc.ID "+ 

            "left outer join Account org on rm.KwlCMAccountId=org.ID "+

            "left outer join KwlFrequency freq on rm.KwlExpectedMinFrequencyId=freq.ID "+

            "where rm.KwlROurcontact1Id='"+user+"'";

Actually, that issue was a silly mistake on my part. I got this working. Thank you so much for your help in this. I will post my code in case this is useful for someone else in the future.

var text = "";
Guid user = Get&lt;Guid&gt;("UsrContactGuid");
var sql = "select case when cc.Name is null then ' ' else cc.Name end, "+ 
                 "case when org.Name is null then ' ' else org.Name end, "+ 
                 "case when cc.Phone is null then ' ' else cc.Phone end, "+ 
                 "case when cc.MobilePhone is null then ' ' else cc.MobilePhone end, "+ 
                 "case when freq.Name is null then ' ' else freq.Name end, "+ 
                 "case when rm. UsrLastCPIContact is null then ' ' else convert(varchar, rm.UsrLastCPIContact, 23) end "+ 
            "from kwlcustomerMatrix rm "+ 
            "left outer join Contact cc on rm.KwlRCustomerContact1Id=cc.ID "+ 
            "left outer join Account org on rm.KwlCMAccountId=org.ID "+
            "left outer join KwlFrequency freq on rm.KwlExpectedMinFrequencyId=freq.ID "+
            "where rm.KwlROurcontact1Id='"+user+"'"+
            "ORDER BY CASE WHEN freq.Name = 'Daily' THEN '1'"+
                          "WHEN freq.Name = 'Semi-Weekly' THEN '2'"+
                          "WHEN freq.Name = 'Weekly' THEN '3'"+
                          "WHEN freq.Name = 'Monthly' THEN '4'"+
                          "WHEN freq.Name = 'Quarterly' THEN '5'"+
                          "WHEN freq.Name = 'Semi-Annually' THEN '6'"+
                          "WHEN freq.Name = 'Annually' THEN '7'"+
                          "ELSE freq.Name END ASC";
 
 
var query = new CustomQuery(UserConnection, sql);
using (var db = UserConnection.EnsureDBConnection())
{
    using (var reader = query.ExecuteReader(db))
    {
        while (reader.Read())
        {
 
            text += "&lt;tr&gt;&lt;td&gt;"+reader.GetString(0)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;"+
                        "&lt;td&gt;"+reader.GetString(1)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;"+
                        "&lt;td&gt;"+reader.GetString(2)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;"+
                        "&lt;td&gt;"+reader.GetString(3)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;"+
                        "&lt;td&gt;"+reader.GetString(4)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;"+
                        "&lt;td&gt;"+reader.GetString(5)+"&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;";
 
 
 
 
 
        }
    }
}
 
text = text.Trim().TrimEnd(',');
Set("UsrEmailContentTableRows", text);
return true;

 

Show all comments

I am unable to login to a local instance and nothing happens when clicking the login button. 

chrome console shows that the server responded with a status of 500 

(System.ServiceModel.ServiceActivationException)

 

Headers and request body

 

All features are enabled for the machine where IIS server is deployed .

I tryied to redeploy the site application from scratch still facing the same issue.

Like 0

Like

1 comments

Hello,

 

Please contact Creatio support directly (via email support@creatio.com) to check this issue. It will be easier to help you this way!

 

Best regards,

Angela

Show all comments

When our users click on Display Data, they are required to click select more over and over again. Is there a way to increase the default number of records when using Display Data from a Dashboard?

Like 1

Like

1 comments

Hello Cricket,

 

Hope you're doing well.

 

At the moment the base logic of the application doesn't allow to show you either more or all the records after clicking on the 'Show more' button. I have informed our R&D department about this case so they could consider enhancing the following functionality in the upcoming releases.

 

Best regards,

Roman

Show all comments

I registered at aspose cloud, made an app.  Got the client id and secret, and put those in the settings in Creatio.  But when trying to print, get this error:

 

 

Request Error

      The server encountered an error processing the request. The exception message is 'Bad Request'. See server logs for more details. The exception stack trace is: 

         at Aspose.Words.Cloud.Sdk.RequestHandlers.ApiExceptionRequestHandler.ThrowApiException(HttpWebResponse webResponse, Stream resultStream)

   at Aspose.Words.Cloud.Sdk.RequestHandlers.ApiExceptionRequestHandler.ProcessResponse(HttpWebResponse response, Stream resultStream)

   at System.Collections.Generic.List`1.ForEach(Action`1 action)

   at Aspose.Words.Cloud.Sdk.ApiInvoker.ReadResponse(WebRequest client, Boolean binaryResponse)

   at Aspose.Words.Cloud.Sdk.ApiInvoker.InvokeInternal(String path, String method, Boolean binaryResponse, String body, Dictionary`2 headerParams, Dictionary`2 formParams, String contentType)

   at Aspose.Words.Cloud.Sdk.RequestHandlers.OAuthRequestHandler.RequestToken()

   at Aspose.Words.Cloud.Sdk.RequestHandlers.OAuthRequestHandler.ProcessUrl(String url)

   at Aspose.Words.Cloud.Sdk.ApiInvoker.<>c__DisplayClass10_0.b__0(IRequestHandler p)

   at System.Collections.Generic.List`1.ForEach(Action`1 action)

   at Aspose.Words.Cloud.Sdk.ApiInvoker.InvokeInternal(String path, String method, Boolean binaryResponse, String body, Dictionary`2 headerParams, Dictionary`2 formParams, String contentType)

   at Aspose.Words.Cloud.Sdk.WordsApi.ConvertDocument(ConvertDocumentRequest request)

   at Terrasoft.Configuration.AsposeCloudPdfConverter.Convert(Byte[] data)

   at Terrasoft.Configuration.ReportService.ReportService.GenerateMSWordReport(String urlTemplateId, String urlRecordUId, Boolean convertInPDF)

   at Terrasoft.Configuration.ReportService.ReportHelper.CreateReport(String entitySchemaUId, String reportSchemaUId, String templateId, String recordId, String reportParameters, Boolean convertInPDF)

   at Terrasoft.Configuration.ReportService.ReportService.CreateReportsList(String entitySchemaUId, String reportSchemaUId, String templateId, String[] recordIds, String reportParameters, Boolean convertInPDF)

   at SyncInvokeCreateReportsList(Object , Object[] , Object[] )

   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)

   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)

   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)

   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Like 0

Like

3 comments
Best reply

Hi Chris,

 

Here is the feedback we received:

You need to check the values in the Creatio system settings connected to the Aspose service.

Please use the screenshot below to check whether the Aspose setting values match the respective system settings in Creatio.:

 

 

After you apply the changes, we recommend you to log out and log back into Creatio for checking the updates.

 

Hope this helps, 

Have a good day!

Hi Chris,

 

Thank you for your message.

We have forwarded your request to the responsible team.

We will get back to you with a solution as soon as we receive their feedback.

 

Have a good day!

Hi Chris,

 

Here is the feedback we received:

You need to check the values in the Creatio system settings connected to the Aspose service.

Please use the screenshot below to check whether the Aspose setting values match the respective system settings in Creatio.:

 

 

After you apply the changes, we recommend you to log out and log back into Creatio for checking the updates.

 

Hope this helps, 

Have a good day!

Thanks!  That worked.

Show all comments

Hi team,

Many times we encounter the error as seen in the below image: 



The above errors are encountered while building workspace in visual studio and also while installing packages. These 'duplications' seems to be coming from auto-generated files.

 

We have followed the instructions to set up file system development mode as per the documentation. Could you please let us know how to overcome this issue?

 

Thanks

Like 0

Like

2 comments

Hello Shivani,

Unfortunately, the image is corrupted and cannot be opened. Could you please resend it?

Thank you in advance!
Olga.

Hi Olga,

I am reattaching the same image 

Show all comments

Hi Community,

Please help me out this question

 

How do you mitigate negative reactions from end users during a product demonstration?

 

Thanks in advance

Like 0

Like

0 comments
Show all comments

Hi team,

 

When multiple attachements are selected, we want it to get downloaded into a single folder in a given file path. Could you please let us know how to accomplish this? 

 

Thanks

Like 1

Like

2 comments

Hello Shivani,

 

Hope you're doing well.

 

As for now, there is no such functionality. I have informed our R&D department about this case so they could consider enhancing the following functionality in the upcoming releases.

 

Thank you for being interested in the Creatio application and for your ideas of further improvements!

 

Best regards,

Roman

Jasmin Hofstetter,

 

Unfortunately, we do not have an update on the matter as of now.



Best Regards,

Ivanna.

Show all comments

Hi,

Is there a functionality to allow users to search for contacts from an account page? Currently, you can only create a new contact. (Account page -> Contacts -> '+')

 

My use case is to, first search for a contact, and if it doesn't exist, create a new one. For example, "Configuration items"

 

Thanks

Like 0

Like

2 comments

Hello,

 

There is no way to add existing contacts on this detail. The logic of application presupposes that the Account will be selected on a Contact page here http://prntscr.com/qn2vzm. After that the contact will appear on the detail on Account page.

If you still need to add the existing contacts on this detail, it will be necessary to create a new detail according to this development guide:

https://academy.creatio.com/docs/developer/front-end_development/creati…

 

Regards,

Dean

 

If you want to connect one Contact  with several Accounts you should use Job experience detail (probably with some modifications)

Show all comments

Hello Community,

 

Could You advise which module i may replace in order to implement function which will calculate and set system variable ?

 

Best Regard,

Marcin

Like 0

Like

1 comments

Hello Marcin,

 

You need to mark this system setting as not cached (uncheck this checkbox):

And create a trigger on the database level on the SysAdminUnit table so to check if the Supervisor is logged in then the value for the setting should be modified (something like this):

CREATE TRIGGER [dbo].[SysAdmUnit_SysSettingValueTrigger]
ON [dbo].[SysAdminUnit]
AFTER UPDATE
AS
BEGIN
DECLARE @admin_unit_id as UNIQUEIDENTIFIER;
DECLARE @loggedin as BIT;
SELECT @admin_unit_id = inserted.Id FROM inserted;
SELECT @loggedin = inserted.LoggedIn FROM inserted;
IF @admin_unit_id = '7F3B869F-34F3-4F20-AB4D-7480A5FDF647' AND @loggedin = 'true'
BEGIN
UPDATE SysSettingsValue SET IntegerValue = 111 WHERE SysSettingsId = 'F8520582-8161-4F36-A88D-028D3BDEFBDE'
END
END

where:

7F3B869F-34F3-4F20-AB4D-7480A5FDF647 - is an ID for the Supervisor user in the SysAdminUnit table

111 - value for the IntegerValue column in the SysSettingsValue table

 

Best regards,

Oscar

Show all comments

I need a single field to hold a DateTime variable.

It should be available for being read/written via business processes.

I tried to use System settings for this, but with no success; I couldn't manage a business process to set a value for a System setting.

What is the best way to keep a global variable in Creatio?

Like 0

Like

6 comments

Yurily,

A system setting is the best place for something like that. Normally, I'd use a Modify Data element in the process to write it back, but in current versions of Creatio the lookup to add columns to update causes a client-side error so you're unable to select columns. 

However, you can set it with a script task. Let's assume your value is a string value and currently in a process parameter named "MyParameterValue". You'd add code something like this to read it from the parameter and set a system setting with a code of "UsrMySetting":

var val = Get<string>("MyParameterValue");
Terrasoft.Core.Configuration.SysSettings.SetValue(UserConnection, "UsrMySetting", val);
return true;

Ryan

Ryan Farley,

Thanks for your answer. The thing I don't understand is what "Yurily" means :)

Yuriy Konstantinov,

lol, sorry for the typo Yuriy!

Ryan Farley,

Hi Ryan,

 

I'm doing this, but for some reason the updated value is not on the System Setting if I see it by the System Settings, but If I ask it on a process I get the updated number.

 

I try to explain better, I create a System Setting variable, and init it with a number, in the process I update the value of the system setting and use it for some task, but when I come back to Creatio System setting and open the System setting is just like I define it, no change, but If I ask its value from a process it's updated.

 

I think is something related with cache or whatever, did you know what could be wrong?

 

For example, the following sub process is called in a "Read collection of records" loop.

 

In the first image you can see, I get the value of the System Setting called "Incidencias Detectadas - Correlativo Histórico" and add 1 and stores it in a local parameter.

 

The initial value in the System setting is 1

 

In the next step of the sub process I did something with the value, and in the third element of the sub process I update the system setting using the updated value in step 1. ie the old number + 1

 

 

It works OK, it's fine!, but when I came to System Setting, it shows me the initial number, ie: 1 and it must be 800 to my example,

 

You can see the value still is one, but If I read the value from a process, it gives to me the correct value. WHAT'S WRONG?

 

Thanks in advance

Julio Falcón

Ryan Farley,

Does your code set the system setting for the All employees role, or specifically for whichever user triggered the BP? Is there a way to choose this? The setting we are trying to set should be a single system setting for all users, but after running the BP, it appears to be creating a system settings value record for the user who runs the BP.

Harvey Adcock,

For a non per-user setting you can use SetDefValue

Terrasoft.Core.Configuration.SysSettings.SetDefValue(UserConnection, "UsrMySetting", val);

Ryan

Show all comments