Hello,

 

We use Binding tool for binding data in our development package. And customer binds data in their data package.

When we choose 'Bind all' in Lookup, it creates new Data like 'AccountCategory_Values' in the package that we select (Dev package)

 

When customer does the same operation and selects their Data package, tools updates Data in the locked Dev package.



Currently we use workaround - not to use 'Bind all', but just select all records. But it would be nice to fix this small issue



Thank you!

Like 3

Like

1 comments

Hi Vladimir,



Thank you for bringing our attention to this matter.

We've confirmed the issue with the 'Bind all' feature and have relayed your feedback to the development team for review.



Kindly await a new release on the marketplace.

 

Show all comments

Hi!

 

I am currently working on a functionality that overrides and defines what needs to happen when clicking a button on a detail.

 

This means I am working on a "Source Code" type of file within the configuration, so only C# code involved.

 

I have some trouble debugging the code to see what's wrong besides this message that pops up:

 

I haven't found any debugging tips specifically for this type of "file"/task and I would like to display message boxes with values of variables and so on, just like the one above.

 

I know there is a way to achieve this using business processes and JS code inside the client module, but I haven't found any solution to programatically display this using C# code.

 

Can someone refer me to the class/library where this is located exactly?

 

Thanks,

Laurentiu

Like 1

Like

4 comments

Hello Laurentiu,

 

C# cannot be used to display the popup directly. What can be done is send a websocket message to the client side and display the popup when a websocket message is received. Like described here, but in the onNewMessage method you need to call this.showInformationDialog method (just check how it's called out-of-the-box) and pass the message to it.

If this is a local system you can use debugging with your C# code, see https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

If this is a cloud system, sending messages to the UI to display a message box isn't the best route since the message boxes aren't blocking, meaning if your code sends 3 messages, only the last one will show in the message box, plus it means you have to add client-side code to receive the message and display it. 

It would be far better to just create a lookup object to write your debug messages to, then you just check the lookup to see the messages. 

Ryan

Ryan Farley,

Do you have an example how to write into a lookup  object please ?

You can write to any object using the following: 

var schema = UserConnection.EntitySchemaManager.GetInstanceByName("AccountType");
var entity = schema.CreateEntity(UserConnection)
entity.SetDefColumnValues();
entity.SetColumnValue("Name", "Some new type");
entity.Save();

 

However, for debugging, even better than writing to an object would be to use logging, see https://customerfx.com/article/logging-information-and-errors-in-creatio-c-code-and-viewing-from-cloud-hosted-systems/

Ryan

Show all comments

Hello,

 

I have a page with the progress bar (cases) on Studio 8.1.0.6827. To simplify the explanation, let's say there are two stages based on a status field: New Request and Completed and I have business rules stating that the request description is required if the status is Completed. 



If the 'Save record on stage change' is off, when I click on the Completed bar, the description field becomes require and I cannot save without entering. But of 'Save record on stage change' is on the record is saved and the status changes to Completed even if the description was not entered. 



Any ideas on how to make it work where the 'Save record on stage change' is on but the business rules are applied, and the record is not saved if the required fields for that status are missing?



Thanks,

Jose

 

Like 1

Like

1 comments

Hello!

 

To provide you with an answer, we need to investigate it deeper. Please contact the Support Team directly via support@creatio.com and provide all these details.

 

Best regards, Mariia

Show all comments

Greetings, I was wondering if there was a way to apply a filter to an audience in a bulk email that only applies those who didn't click a link in a particular email. For example, we have Bulk Email A that launched last quarter. We want to send Bulk Email B, but only to those who did not click on a link within Bulk Email A. I know campaigns have this logic, but does it exist in bulk email launches? Thanks in advance.



Lucas

Like 0

Like

1 comments
Best reply

Hello!



Here's an example of such a filter:







Best regards,

Anton

Hello!



Here's an example of such a filter:







Best regards,

Anton

Show all comments

Hi,



Did anyone experienced the same thing as I am?



I am trying to import data (from dev) to a custom object after deploying it to Client in production but gives no sign of completion or any error.



Section > Data Import > Upload file > Close.



While doing this, I am actively checking console and network to check for any signs of error but it doesn't have any. Its been more than >40 minutes for a 2 row entry I exported from dev.



Any possible reason?



Creatio Version: 8.1.1.3635



Thank you.

Like 0

Like

1 comments

Hello!

 

Please create a separate request to the Support Team via support@creatio.com and provide all these details. 

 

Best regards, Mariia

Show all comments

Dear,

We can not add or edit business rules on our custom Order Product Detail, the system return the following error : 

Unable to modify business rules because the "Edit card - Product in order" page source code contains invalid json symbols. Your system administrator will have to delete these symbols. After the mentioned above symbols have been deleted, you need to re-open the wizard, and business rules will be available for edit.

I tryed to remove all the code in our custom orderProduct detail :

=> the system still returns the error

Does anyone have any ideas to fix the problem ?

Thank you,

Nicolas

Like 0

Like

2 comments

Just throwing out some ideas. Maybe there's some non-printable character that got posted in somewhere? I'd try pasting the contents to a text editor that can show non-printable chars (such as Notepad++).

Also, maybe look at the resource strings? Maybe there's a resource name with some weird char?

Thank you Ryan for your answer, i ve check what you advise me to check, but i did not find any problem.

We are having two OrderProductPageV2 in two separate package: Custom and Custom_transfert, we removed all business rules in the OrderProductPageV2 in Custom_transfert and surprisingly we can edit the orderProductDetail business rules...

Thank you again for your help !

Show all comments

Hello, 



Do you know how to bind data for column permission in package? I have to bind the highlighted records in package. 



 

Like 4

Like

1 comments

Hello,

 

SQL scripts can be utilized to implement the transfer of organizational structure settings and access rights from one environment to another. To do this, insert queries need to be generated on the reference environment based on records from the following tables:

  • SysAdminUnit (Administration object: users and roles)
  • SysUserInRole (Direct user role assignments)
  • SysFuncRoleInOrgRole (Functional role assignments to organizational roles)
  • SysAdminOperation (System operations, if necessary)
  • SysAdminOperationGrantee (Access to system operations, if necessary)
  • SysEntitySchemaOperationRight (Access to objects)
  • SysEntitySchemaRecordDefRight (Access to default records)
  • SysEntitySchemaColumnRight (Access to object columns)
  • SysAdminUnitGrantedRight (Delegation)
  • SysWorkplace – (User workplace)
  • SysAdminUnitInWorkplace – (Users in the workplace)
  • SysModuleInWorkplace – (Module in the workplace)

You can use Microsoft SQL Server Database Publishing Wizard or similar tools to generate queries. The resulting SQL script should be attached to the package. If the transfer is happening to a production environment, we recommend making a backup of the data beforehand and primarily deploying the package to a test environment to verify the script execution results. These tasks should be performed outside of business hours.

 

Show all comments

Is it possible to restrict the "Owner" filter for Timeline components to only show Contacts which match a specific filter condition? We are currently seeing every Contact as an option, but for us this should be restricted to only Contacts which have a User record associated with them, and ideally we'd want to add some more customisation to the filter options beyond this.

Like 0

Like

9 comments
Best reply

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Hello Harvey,



There is no such option for now, however, we've registered it in our R&D team backlog for consideration and implementation in future application releases.

 

Thank you for helping us to improve our product. 

Thanks Bogdan, it's definitely a feature that's needed - having every Contact show up in the Owner filter with no way to change this on a CRM platform isn't ideal.

I've discovered that it's possible to add this using code. To do so, you need to override the crt.LoadDataRequest handler and use the following code:

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		// Filter Timeline's Owner filter to just Contacts with a User record
		if(request.dataSourceName === "ByOwnerQuickFilterInTimeline_xi3lpgm_ComboBox_List_DS") {
			const filter = new sdk.FilterGroup();
			await filter.addExistsFilter("[SysAdminUnit:Contact:Id].Id");
 
			// workaround for filters
			const newFilter = Object.assign({}, filter);
			newFilter.items = filter.items;
 
			request.parameters.push({
				type: "filter",
				value: newFilter
			});
		}
 
		return await next?.handle(request);
	}
},

You have to replace the name of the Timeline component in the above code from Timeline_xi3lpgm to whatever the component is called on your page.

Harvey Adcock,

good find, thanks!

You should mark your own answer as solution ;)

Harvey Adcock,

Well done! Thanks for sharing this Harvey. 

Also, if you've moved to 8.1.1 you no longer need the filters workaround - it's finally working properly in 8.1.1, just thought I'd mention.

Ryan

Ryan Farley,

Ahh great to hear, thanks for the info Ryan - and thanks for spreading the info about that workaround in the first place!

I'd like to share my solution on lookup filtering.

We wanted to have only contacts from our company and in certain functional role.

{
	request: "crt.LoadDataRequest",
	handler: async (request, next) => {
		if (request.dataSourceName !== "FbContact_List_DS") {
			return await next?.handle(request);
		}
 
		const ourCompanyFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "Account.Type"
			}), 
			new sdk.ParameterExpression({
				value: Constants.AccountType.OurCompany
			})
		);
 
		const funcRoleFilter = new sdk.CompareFilter(
			sdk.ComparisonType.Equal, 
			new sdk.ColumnExpression({
				columnPath: "[SysAdminUnit:Contact:Id].[SysUserInRole:SysUser:Id].SysRole.Id"
			}), 
			new sdk.ParameterExpression({
				value: Constants.FunctionalRole.MyCustomFunctionalRole
			})
		);
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: ourCompanyFilter
		});
 
		request.parameters.push({
			type: sdk.ModelParameterType.Filter,
			value: funcRoleFilter
		});
 
		return await next?.handle(request);
	}
}

 

Alex Zaslavsky,

Interesting, it hadn't occurred to me to push multiple filters to the parameters. I've always added the multiple filters to a FilterGroup and then added the group to the parameters. I guess it's an array for a reason :) Nice to know it works that way as well.

Ryan

Hello , 

Can we set a current user as a default in timeline quickfilter ? 

Show all comments

please help me what is causing this error   

#docker logs b6f87859e923

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

   at Terrasoft.EventSourcing.Configuration.EventStoreUtitities.GetEventSourcingConfiguration(Configuration configuration) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.EventSourcing/Configuration/EventStoreUtitities.cs:line 70

   at Terrasoft.WebHost.ApplicationModule.SetupEventStore(IServiceCollection services) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/ApplicationModule.cs:line 227

   at Terrasoft.WebHost.ApplicationModule.Configure(IServiceCollection services) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/ApplicationModule.cs:line 351

   at Terrasoft.Core.DI.AutofacContainerBuilder.Build() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core.DI/AutofacContainerBuilder.cs:line 63

   at Terrasoft.Core.DI.ContainerBuilder.Build() in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core.DI/ContainerBuilder.cs:line 100

   at Terrasoft.Core.DI.ServiceProvider.ServiceProviderFactory.CreateServiceProvider(ContainerBuilder containerBuilder) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.Core.DI/ServiceProvider/ServiceProviderFactory.cs:line 23

   at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)

   at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()

   at Microsoft.Extensions.Hosting.HostBuilder.Build()

   at Terrasoft.WebHost.Program.StartWebApplication(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 26

   at Terrasoft.WebHost.Program.<>c__DisplayClass2_0.b__0(StartOptions _) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 62

   at CommandLine.ParserResultExtensions.MapResult[T1,T2,TResult](ParserResult`1 result, Func`2 parsedFunc1, Func`2 parsedFunc2, Func`2 notParsedFunc)

   at Terrasoft.WebHost.Program.Main(String[] args) in /opt/buildagent/work/ApplicationCoreLinux/TSBpm/Src/Lib/Terrasoft.WebHost/Program.cs:line 59

Like 1

Like

1 comments

Hello,

 

Please check your binary files and connection string.

 

To get started, run the application outside of Docker directly on Linux.

Show all comments

Hello,

 

I have a web service that generates a file. I need to attach that file to a record. I see there is an option to the Process File Component passing a File as parameter, but the Parameter is Expecting a IFileLocator. How can I use a script to create a IFileLocator from a full file path on Creatio Studio version 8.1? 

 

Thanks,

Jose

File attachments
Like 0

Like

2 comments
Best reply

Hello,

You should use a script task to work with files from the web service.

 

More details about the API file:



https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Hello,

You should use a script task to work with files from the web service.

 

More details about the API file:



https://academy.creatio.com/docs/8.x/dev/development-on-creatio-platfor…

Thanks Cherednichenko. Using the information provided I wrote the C# below to attach a generated file to a record.



public void AttachFile(string schemaName, Guid recordId, string fullFilePath) {

            /* Create a unique ID for the new file. */

            Guid fileId = Guid.NewGuid(); 

            /* Create a file locator for the new file. */

            var fileLocator= new EntityFileLocator("SysFile", fileId); 

            /* Get an IFile object for the new file. */ 

            IFile file = UserConnection.CreateFile(fileLocator); 

            /* There is no file metadata or file content in the available file storages. Specify the file name in the file metadata. */

            file.Name = (new System.IO.FileInfo(fullFilePath)).Name; 

            /* Set an attributes for the new file: */

            file.SetAttribute("RecordSchemaName", schemaName); 

            file.SetAttribute("RecordId", recordId);             

            /* Save the file metadata Do this BEFORE saving the content. */

            file.Save(); 

            using (var sourceStream = new FileStream( fullFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true)) {

                file.Write(sourceStream, FileWriteOptions.SinglePart);            

            }

        }

Show all comments