Hi Team,

How does this merge records will work?

There are dplicate record in a section and this "Merge Record" menu option is disabled. Bulk duplicate search service installed.

If "Show duplicate Account" duplicate rule is ran, it shows the list and the merge works and generally if a duplicate record is searched in filter and if there are multiple entries, after selecting all duplicate entries, this merge record menu option is disabled.

 

 

Besr regards,

Bhoobalan Palanivelu.

Like 1

Like

4 comments

"Merge records" on the actions menu should become enabled when you select more than one record in the list (as long as the user also has the "Duplicates processing" (CanMergeDuplicates) operation permission). Could it be that the user account doesn't have this permission?

Ryan

Ryan Farley,

Thanks for the note!

1. Here more than one duplicated record is selected
2. The logged-in user is the supervisor and has the "Duplicates processing" (CanMergeDuplicates) operation permission). 

 

Note:
If a record is filtered and multiple entries (i.e., duplicates) are selected this merge record is disabled. If multiple records in a section are selected without applying any filters in the section filter (OOTB filter option --: "Merge Record" option is enabled).

 

 

Best regards,

Bhoobalan Palanivelu.

Bhoobalan Palanivelu,

I looked at the code for the merge button, it looks like it sets visible based on if the user has the permission or not, not the enabled property. For the menu item to be enabled, it looks like it just uses the "isAnySelected" to determine if any records are selected in the list (isAnySelected is implemented in GridUtilitiesV2 mixin). 

Apparently, that is returning false for your section. Do you have any console errors showing when using that section?

Ryan

Ryan Farley,

No console errors for the section.
Now it works. But haven't changed any operation permission or configuration.

Thanks for the insight !
It seems the property enabled/disabled is based on  "isAnySelected"  attribute and the operation permission read from "SysAdminOperation" which defines the access right.

could you please help with the module that has this Merge menu code? 

 

 

Best regards,

Bhoobalan Palanivelu.

 

Show all comments

Hi Team,

We are able to update the global search result for a few of the OOTB object schemas by replacing the corresponding module such as AccountSearchRowSchema and for contacts - ContactSearchRowSchema.

a)OOTB object schema,
Contact, Account

https://community.creatio.com/questions/modify-global-search-result

b)I couldn't find any schema as BankCardSearchRowSchema for the OOTB object
BankCard.  How to get this XSearchrowSchema generated?
No details on BankCardSchema

Please note the indexing for the object BankCard is enabled and the results are retrieved but wanted to update the result for this object. Unable to find 

 

Any help would be greatly appreciated!

Best Regards,

Bhoobalan P.

Like 0

Like

12 comments
Best reply

Hi Bhoobalan,

 

You can track if the global search results for the section uses its own SearchRowSchema or the BaseSearchRowSchema using the query below (MS SQL):

SELECT
	sme.Id, sme.ActionKindName, ss.[Name], ss.[UId]
FROM 
	SysModuleEdit sme
JOIN 
	SysSchema ss
ON
	sme.SearchRowSchemaUId = ss.UId
WHERE
	sme.SearchRowSchemaUId IS NOT NULL

But you can create a custom SearchRowSchema module for some section that doesn't have its own SearchRowSchema. The example below is for Documents section that also doesn't have its own SearchRowSchema module.

 

Here is the screenshot of the base result that the Global Search returns when searching a document:

Let's say we want to add the "Status" column to the search result (the one from the screenshot below):

To achieve this:

 

1) Create the "Page view model" in configurations with "UsrDocumentSearchRowSchema" code, "Document search row" name and select BaseSearchRowSchema as a parent:

2) Specify the following code in this schema:

define("UsrDocumentSearchRowSchema", [], function() {
	return {
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "DataContainer",
				"propertyName": "items",
				"name": "State",
				"values": {
					"layout": {
						"column": 4,
						"row": 0,
						"colSpan": 12
					}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

and save the schema.

 

3) Find the SysModuleEdit record related to the Documents section (for example using the query below):

SELECT
	*
FROM
	SysModuleEdit
WHERE 
	ActionKindName = 'Document'

and then update the value for the "SearchRowSchemaUId" column in this record:

UPDATE 
	SysModuleEdit
SET 
	SearchRowSchemaUId = '63388eba-74f2-4bc4-85f2-e6c326adb3e5'
WHERE
	Id
IN
	(
		SELECT 
			Id
		FROM 
			SysModuleEdit
		WHERE
			ActionKindName = 'Document'
	)

4) Refresh the page and check the result. The "Status" column should appear in the SearchRowSchema for documents:

Same operation can be performed to any section needed.

 

Best regards,

Oscar

Hi Bhoobalan,

 

You can track if the global search results for the section uses its own SearchRowSchema or the BaseSearchRowSchema using the query below (MS SQL):

SELECT
	sme.Id, sme.ActionKindName, ss.[Name], ss.[UId]
FROM 
	SysModuleEdit sme
JOIN 
	SysSchema ss
ON
	sme.SearchRowSchemaUId = ss.UId
WHERE
	sme.SearchRowSchemaUId IS NOT NULL

But you can create a custom SearchRowSchema module for some section that doesn't have its own SearchRowSchema. The example below is for Documents section that also doesn't have its own SearchRowSchema module.

 

Here is the screenshot of the base result that the Global Search returns when searching a document:

Let's say we want to add the "Status" column to the search result (the one from the screenshot below):

To achieve this:

 

1) Create the "Page view model" in configurations with "UsrDocumentSearchRowSchema" code, "Document search row" name and select BaseSearchRowSchema as a parent:

2) Specify the following code in this schema:

define("UsrDocumentSearchRowSchema", [], function() {
	return {
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "DataContainer",
				"propertyName": "items",
				"name": "State",
				"values": {
					"layout": {
						"column": 4,
						"row": 0,
						"colSpan": 12
					}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

and save the schema.

 

3) Find the SysModuleEdit record related to the Documents section (for example using the query below):

SELECT
	*
FROM
	SysModuleEdit
WHERE 
	ActionKindName = 'Document'

and then update the value for the "SearchRowSchemaUId" column in this record:

UPDATE 
	SysModuleEdit
SET 
	SearchRowSchemaUId = '63388eba-74f2-4bc4-85f2-e6c326adb3e5'
WHERE
	Id
IN
	(
		SELECT 
			Id
		FROM 
			SysModuleEdit
		WHERE
			ActionKindName = 'Document'
	)

4) Refresh the page and check the result. The "Status" column should appear in the SearchRowSchema for documents:

Same operation can be performed to any section needed.

 

Best regards,

Oscar

Oscar Dylan,

 

This is informative and thanks for sharing the steps!

I have an issue,

By default, the card search is working for the BankCard object in the customer journey bundle but one of the values shows as (not filled in)

a) Bound values not shown

b) When clicked on (not filled in) it opens the record and the top left label is filled in as depicted below,

I have ran the re-indexation, but still the value is not shown in UI.

Any help would be higly appreciated!

Best Regards,

Bhoobalan Palanivelu.

Bhoobalan Palanivelu,

 

Please send a complete code of the SearchRowSchema of the BankCard schema.

 

Best regards,

Oscar

Oscar Dylan,

Thanks for the quick response!

Unfortunately, there is no SearchRowSchema of the BankCard schema.

I have enabled the indexed in BankCard section and the result appears but there is no trace for "SearchRowSchema".

 

Also, I ran the query to track the schema of Global search below is the result

 

Attaching the "BaseSearchRowSchema" of Customer journey bundle,

define("BaseSearchRowSchema", ["NetworkUtilities", "ConfigurationEnums", "EmailHelper", "GlobalSearchViewGenerator",
	"MiniPageUtilities"], function(NetworkUtilities, ConfigurationEnums, EmailHelper) {
	return {
		hideEmptyModelItems: true,
		attributes: {
			/**
			 * Schema view config.
			 */
			"ViewConfig": {
				dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT
			},
			/**
			 * Array of found column names.
			 */
			"FoundColumnsCollection": {
				dataValueType: this.Terrasoft.DataValueType.COLLECTION
			},
			/**
			 * Entity schema caption.
			 */
			"EntitySchemaCaption": {
				"dataValueType": Terrasoft.DataValueType.TEXT,
				"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			},
			/**
			 * Primary column url value.
			 */
			"PrimaryColumnURL": {
				"dataValueType": Terrasoft.DataValueType.TEXT
			}
		},
		mixins: {
			MiniPageUtilities: "Terrasoft.MiniPageUtilities"
		},
		methods: {
 
			/**
			 * Returns state object module id for edit page.
			 * @private
			 */
			_getStateObjModuleId: function() {
				return Ext.String.format("{0}_{1}_{2}", this.sandbox.id,
					this.entitySchemaName, this.get(this.primaryColumnName));
			},
 
			/**
			 * @private
			 */
			_initTypedColumnValue: function (callback, scope) {
				const typeColumnName = this.get("TypeColumnName");
				if (typeColumnName && !this.get(typeColumnName)) {
					NetworkUtilities.getAttributeValueByRecordId({
						entitySchemaName: this.entitySchemaName,
						entityId: this.get(this.primaryColumnName),
						attribute: typeColumnName
					}, function(typedValue) {
						this.set(typeColumnName, { value: typedValue });
						Ext.callback(callback, scope);
					}, this);
				} else {
					Ext.callback(callback, scope);
				}
			},
 
			/**
			 * @inheritdoc Terrasoft.BaseSchemaViewModel#init
			 * @overridden
			 */
			init: function(callback, scope) {
				const parentMethod = this.getParentMethod();
				Terrasoft.chain(
					function(next) {
						parentMethod.call(this, next, this);
					},
					this._initTypedColumnValue,
					function() {
						this.initEditPages();
						this.initMultiLookup();
						this.initAttributeValues();
						Ext.callback(callback, scope);
					}, this
				);
			},
 
			/**
			 * Fills lookup field.
			 * @param {String} name Entity schema name
			 * @param {String} value Entity value.
			 * @param {Function} callback Callback-function.
			 * @param {Object} scope Execution context.
			 */
			loadLookupDisplayValue: Terrasoft.emptyFn,
 
			/**
			 * @inheritdoc Terrasoft.BaseSchemaViewModel#sendGoogleTagManagerData
			 * @overridden
			 */
			sendGoogleTagManagerData: Terrasoft.emptyFn,
 
			/**
			 * Initializes viewmodel attributes.
			 * @protected
			 */
			initAttributeValues: function() {
				this.initSchemaCaption();
				this.set("PrimaryColumnURL", this.getPrimaryColumnURL());
			},
 
			/**
			 * Initializes entity schema caption.
			 */
			initSchemaCaption: function() {
				this.set("EntitySchemaCaption", this.entitySchema && this.entitySchema.caption || "");
			},
 
			/**
			 * Returns eintity image url or section logo url or default image url.
			 * @protected
			 * @return {String} Image url.
			 */
			getImage: function() {
				var primaryImageColumnValue = this.get(this.primaryImageColumnName);
				if (primaryImageColumnValue && primaryImageColumnValue.value) {
					return this.getSchemaImageUrl(primaryImageColumnValue);
				}
				var moduleStructure = this.getModuleStructure(this.entitySchemaName);
				if (moduleStructure && moduleStructure.logoId) {
					return this.Terrasoft.ImageUrlBuilder.getUrl({
						source: Terrasoft.ImageSources.SYS_IMAGE,
						params: {
							primaryColumnValue: moduleStructure.logoId
						}
					});
				}
				return this.getDefaultImage();
			},
 
			/**
			 * Returns default image url.
			 * @protected
			 * @return {String} Default image url.
			 */
			getDefaultImage: function() {
				return this.Terrasoft.ImageUrlBuilder.getUrl(this.get("Resources.Images.DefaultSearchImage"));
			},
 
			/**
			 * Returns primary display column value.
			 * @protected
			 * @returns {String} Primary display column value.
			 */
			getPrimaryDisplayColumnValue: function() {
				var notFilledValue = this.get("Resources.Strings.NotFilled");
				if (this.primaryDisplayColumnName) {
					return this.get(this.primaryDisplayColumnName) || notFilledValue;
				}
				return notFilledValue;
			},
 
			/**
			 * Returns primary display column caption.
			 * @protected
			 * @returns {String} Primary display column caption.
			 */
			getPrimaryDisplayColumnCaption: function() {
				if (this.primaryDisplayColumnName) {
					var primaryColumn =  this.columns[this.primaryDisplayColumnName];
					return primaryColumn.caption;
				}
				return "";
			},
 
			/**
			 * Returns found column items view config.
			 * @private
			 * @return {Array} Found column items view config.
			 */
			getFoundColumnItemsConfig: function() {
				var columnNames = this.getAdditionalColumnNames();
				var items = [];
				Terrasoft.each(columnNames, function(columnName) {
					var columnContainer = {
						"id": columnName + "Container",
						"className": "Terrasoft.Container",
						"items": []
					};
					var column = this.getColumnByName(columnName) || this.get(columnName);
					var caption = column && column.caption || columnName;
					var value = this.get(columnName);
					if (this.isNotEmpty(value)) {
						columnContainer.items.push({
							"className": "Terrasoft.Label",
							"classes": {"labelClass": ["found-column-caption"]},
							"caption": caption
						});
						columnContainer.items.push({
							"className": "Terrasoft.Label",
							"classes": {"labelClass": ["found-column-value"]},
							"caption": value.displayValue || value,
							"highlightText": this.getHighlightText(columnName)
						});
						items.push(columnContainer);
					}
				}, this);
				return items;
			},
 
			/**
			 * Returns found columns.
			 * @private
			 * @return {Object} Found columns array.
			 */
			getFoundColumns: function() {
				var foundColumnsCollection = this.get("FoundColumnsCollection");
				return foundColumnsCollection.getByIndex(0).get("FoundColumns");
			},
 
			/**
			 * Returns additional column names for view searcg result.
			 * Gets not showed found column names.
			 * @private
			 * @return {String[]} Not showed found column names.
			 */
			getAdditionalColumnNames: function() {
				var bindMap = this.getBindMap();
				var bindMapKeys = bindMap ? bindMap.getKeys() : [];
				var foundColumns = this.getFoundColumns();
				var additionalColumnNames = [];
				Terrasoft.each(foundColumns, function(item, columnName) {
					if(!(Ext.Array.contains(bindMapKeys, columnName)
							|| this.primaryDisplayColumnName === columnName)) {
						additionalColumnNames.push(columnName);
					}
				}, this);
				return additionalColumnNames;
			},
 
			/**
			 * Generates configuration of the element view.
			 * @protected
			 * @param {Object} itemConfig Link to the configuration element of ContainerList.
			 */
			onGetItemConfig: function(itemConfig) {
				var viewConfig = {
					"id": "foundColumns",
					"className": "Terrasoft.Container",
					"classes": {"wrapClassName": ["found-columns-list"]},
					"items": []
				};
				viewConfig.items = this.getFoundColumnItemsConfig();
				itemConfig.config = viewConfig;
			},
 
			/**
			 * Returns not showed columns container visibility.
			 * @protected
			 * @return {Boolean} Not showed columns container visibility.
			 */
			isFoundColumnsVisible: function() {
				var notShowedFoundColumns = this.getAdditionalColumnNames();
				return notShowedFoundColumns.length > 0;
			},
 
			/**
			 * Returns primary column link url.
			 * @protected
			 * @return {String} Primary column link url.
			 */
			getPrimaryColumnURL: function() {
				return Ext.String.format("ViewModule.aspx#{0}", NetworkUtilities.getEntityUrl(this.entitySchemaName,
						this.get(this.primaryColumnName), this.getTypeColumnValue(this)));
			},
 
			/**
			 * Handler on primary column link mouse over.
			 * @protected
			 */
			onPrimaryColumnMouseOver: function(options) {
				this.openMiniPage({
					targetId: options.targetId,
					entitySchemaName: this.entitySchemaName,
					recordId: this.get(this.primaryColumnName)
				});
			},
 
			/**
			 * Handler on primary column link click.
			 * @protected
			 * @return {Boolean} False.
			 */
			onPrimaryColumnLinkClick: function() {
				var typedColumnValue = this.getTypeColumnValue(this);
				NetworkUtilities.openEntityPage({
					entityId: this.get(this.primaryColumnName),
					entitySchemaName: this.entitySchemaName,
					typeId: typedColumnValue,
					sandbox: this.sandbox,
					stateObj: {
						moduleId: this._getStateObjModuleId()
					}
				});
				return false;
			},
 
			/**
			 * @overridden
			 * @inheritdoc Terrasoft.BaseSchemaViewModel#onLinkClick
			 */
			onLinkClick: function(url, columnName) {
				this.updateColumnReferenceSchemaByMultiLookupValue(columnName);
				var column = this.getColumnByName(columnName);
				var columnValue = this.get(columnName);
				var entityId = columnValue && columnValue.value;
				if (!column || !entityId) {
					return true;
				}
				NetworkUtilities.openEntityPage({
					entityId: entityId,
					entitySchemaName: column.referenceSchemaName,
					sandbox: this.sandbox,
					stateObj: {
						moduleId: this._getStateObjModuleId()
					}
				});
				return false;
			},
 
			/**
			 * Returns found column text for highlight.
			 * @private
			 * @param {String} columnName Column name.
			 * @return {String[]} Found column text array.
			 */
			getHighlightText: function(columnName) {
				var highlightTextArray = [];
				var foundColumns = this.getFoundColumns();
				if (columnName === "PrimaryColumn") {
					columnName = this.primaryDisplayColumnName;
				}
				Terrasoft.each(foundColumns, function(item, foundColumnName) {
					if (foundColumnName === columnName) {
						highlightTextArray = item;
					}
				}, this);
				return highlightTextArray;
			},
 
			/**
			 * Returns email url.
			 * @protected
			 * @param {String} columnName Column name.
			 * @return {String} Email url.
			 */
			getEmailUrl: function(columnName) {
				return EmailHelper.getEmailUrl(this.get(columnName));
			},
 
			/**
			 * Open browser mailto.
			 * @param {HTMLElement} target Target element.
			 * @param {String} columnName Email column name.
			 */
			onEmailUrlClick: function(target, columnName) {
				location.href = EmailHelper.getEmailUrl(this.get(columnName));
			},
 
			/**
			 * @overridden
			 * @inheritdoc Terrasoft.BaseSchemaViewModel#getLinkConfig
			 */
			getLinkConfig: function(columnName) {
				var config = this.callParent(arguments);
				var lookupLinkConfig = this.getLookupLinkConfig(columnName);
				this.Ext.apply(config, lookupLinkConfig);
				return config;
			},
 
			/**
			 * Gets lookup link config for open card.
			 * @private
			 * @param {String} columnName Column name.
			 * @return {Object} {schemaName: String} lookup link config for open card.
			 */
			getLookupLinkConfig: function(columnName) {
				var column = this.getColumnByName(columnName);
				var columnValue = this.get(columnName);
				if (column && this.isNotEmpty(column.multiLookupColumns)) {
					var multiLookupColumn = this.getColumnByName(columnValue.column);
					var referenceSchemaName = multiLookupColumn.referenceSchemaName;
					var schemaName = this.getCardSchemaName(referenceSchemaName, multiLookupColumn.name);
					return {schemaName: schemaName};
				}
				return {};
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "PrimaryImage",
				"propertyName": "items",
				"values": {
					"getSrcMethod": "getImage",
					"readonly": true,
					"onImageClick": {bindTo: "onPrimaryColumnLinkClick"},
					"generator": "ImageCustomGeneratorV2.generateSimpleCustomImage"
				}
			},
			{
				"operation": "insert",
				"name": "DataContainer",
				"propertyName": "items",
				"values": {
					"isViewMode": true,
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": [],
					"collapseEmptyRow": true
				}
			},
			{
				"operation": "insert",
				"name": "PrimaryColumnContainer",
				"parentName": "DataContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"classes": {
						"wrapClassName": ["primary-column-container", "control-width-15"]
					},
					"items": [],
					"layout": {
						"column": 0,
						"row": 0,
						"colSpan": 12
					}
				}
			},
			{
				"operation": "insert",
				"name": "PrimaryColumnCaption",
				"parentName": "PrimaryColumnContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.LABEL,
					"caption": {"bindTo": "getPrimaryDisplayColumnCaption"},
					"classes": {
						"labelClass": ["primary-column-caption"]
					}
				}
			},
			{
				"operation": "insert",
				"name": "PrimaryColumnValue",
				"parentName": "PrimaryColumnContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.HYPERLINK,
					"classes": {"hyperlinkClass": ["primary-column-link"]},
					"caption": {"bindTo": "getPrimaryDisplayColumnValue"},
					"click": {"bindTo": "onPrimaryColumnLinkClick"},
					"linkMouseOver": {"bindTo": "onPrimaryColumnMouseOver"},
					"href": {"bindTo": "PrimaryColumnURL"},
					"tag": "PrimaryColumn",
					"highlightText": { bindTo: "getHighlightText" }
				}
			},
			{
				"operation": "insert",
				"name": "EntitySchemaCaption",
				"parentName": "DataContainer",
				"propertyName": "items",
				"values": {
					"caption": {"bindTo": "Resources.Strings.EntitySchemaLabelCaption"},
					"layout": {
						"column": 12,
						"row": 0,
						"colSpan": 6
					}
				}
			},
			{
				"operation": "insert",
				"name": "FoundColumnsContainerList",
				"propertyName": "items",
				"parentName": "DataContainer",
				"values": {
					"layout": {
						"column": 0,
						"row": 1,
						"colSpan": 12
					},
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"generator": "ContainerListGenerator.generateGrid",
					"collection": {"bindTo": "FoundColumnsCollection"},
					"onGetItemConfig": {"bindTo": "onGetItemConfig"},
					"visible": {"bindTo": "isFoundColumnsVisible"},
					"selectableRowCss": "",
					"items": []
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

 

Any insight or help is highly appreciated!

Best Regards,

Bhoobalan Planivelu.

Bhoobalan Palanivelu,

 

Thank you!

 

I understood that you've created the SearchRowSchema for the BankCard and asked to share its code.

 

I will try to implement the same on my side and see what happens.

 

Best regards,

Oscar

Oscar Dylan,

Thanks, please let me know the results once you have a successful implementation.

I enabled the index in the section page of BankCard but no SearchRowSchema is found for it.
 

Oscar Dylan,

Any update on this part, please?

Best regards,

Bhoobalan Palanivelu.

Bhoobalan Palanivelu,

 

Hi,

 

I am sorry, but I don't need the BaseSearchRowSchema from your app (I do also have access to the BaseSearchRowSchema module from the bank bundle app), I need your custom SearchRowSchema code for the BankCard schema.

 

Best regards,

Oscar

Oscar Dylan,

That is the catch here, I couldn't find any SearchRowSchema for BankCardSchema. That is what I have shared in previous comments.

1. The SQL query doesn't return the BankCardSchema
2. There is no SearchRowSchema for BankCard.
3. All I did is open the Bank Card section and enable the Indexing by clicking the check box Indexing for full-text search.

The results appear and it doesn't have any X-SearchRowSchema and at the same time it shows (not filled in).

Best Regards,

Bhoobalan Palanivelu.

Oscar Dylan,

Any help/update on this?

Best regards,

Bhoobalan PAlanivelu

Bhoobalan Palanivelu,

 

Please read my post with the instruction carefully. I've asked to create a replacing view module using the BaseSearchRowSchema as a parent and then connect it to the SysModuleEdit record of your section using the SearchRowSchemaUId column (and provided an example with the Documents section that also don't have its own SearchRowSchema).

Oscar Dylan,

I have followed the same steps as suggested and there needs a little update.

Step 1: Find the target object for GS result update (Here, it is BankCard)
Step 2: Create the "Page view model" in configurations with "CTZBanCardSearchRowSchema" code, "BankCard search row" name and select BaseSearchRowSchema as a parent
Step 3: Update the design of the schema and save.
Step 4: Find the SysModuleEdit record related to the BankCard section (for example using the query below):

SELECT
	*
FROM
	SysModuleEdit
WHERE 
	ActionKindName = 'BankCard'

Step 5: update the value for the "SearchRowSchemaUId" column in the target objects record.

UPDATE 
	SysModuleEdit
SET 
	SearchRowSchemaUId = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
WHERE
	Id
IN
	(
		SELECT 
			Id
		FROM 
			SysModuleEdit
		WHERE
			ActionKindName = 'BankCard'
	)

**Note: This Column's "SearchRowSchemaUId" value should be the UID of the newly created Page view model performed in Step 2.

UID can be obtained by using the below query,

select Id, UId, Name from SysSchema 
where 
Name like ('%CTZBanCardSearchRowSchema%')

Thanks for the guide!

Best regards,

Bhoobalan Palanivelu
 

Show all comments

Hello,

 

I'm currently dealing with an issue similar to the one outlined in this post:

https://community.creatio.com/questions/searching-user-fields

 

I have been able to confirm that checking the "Indexed" box on a custom field will allow me to search on that column in the global search. However, the column that I actually need to be able to search is an Unlimited length text field. When I attempt to publish the entity, I receive the following error:

 

I believe the reason for this error is that it's attempting to add the new index to some table using the above stored procedure, but the index wasn't created due to the size constraints on non-clustered indexes outlined at the Microsoft link below. It's a fairly large page and the relevant part is this: "The maximum allowable size of the combined index values is 900 bytes for a clustered index, or 1,700 for a non-clustered index"

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15

 

Is there a way to index an unlimited length text field in the global search results?

Or can I bypass having to create an index on the field but still have the Elastic Search pick it up?

 

Thanks.

Like 0

Like

1 comments

Hello Daniel,

 

We have received a reply from our R&D that indexing unlimited length text fields by checking the 'indexed' box will not work. To do this you will need to do the following:

1. Add a column
2. Compile the appllication
3. Run the following script in the browser console under the Supervisor user:
require(["ServiceHelper"], (ServiceHelper) => { ServiceHelper.callService("IndexingConfigService", "SendIndexationConfigs"); });

Then create a new record and after some time the record will be indexed by the created column.

 

Best regards,

Max.

Show all comments

On the LEAD object, we have a user field ("UsrSecondaryPhone") and it is not indexing via Global Search (or at least no values in this field result in search results in a global search).  I have made sure that the section is marked for Index for Global Search (check box is checked).  How do I get this and other user fields to index via global search?

Like 0

Like

4 comments

Hello,

 

It is also necessary to mark the necessary column attribute Indexed as true. After that the column data will be available in the search list.

If it is still not found by the global search, I suggest to contact the support team via support@creatio.com to have a closer look at your object settings.

 

Regards,

Dean

Thank you for the reply.  I see how to do this when adding a new column.  But in this case, I have a user column that was previously added and I cannot find how to edit the column to check this box.

Hello,

 

Here it is:

 

 

Regards,

Dean

Dean,  Thanks again.  I've tried that.  I can follow these steps in our DEV environment and I can check the box in DEV, however, in our production environment, I cannot make the same change (and I've tried several instances of the LEAD object.  We made the changes to add user columns in our DEV environment, then exported a package and imported it into our production environment.  Now, I want to make this change for indexing purposes in production, but I am unable to make changes on the column.  Any ideas?

Show all comments

Hello, is it possible to have the global search include records from custom sections I've created? It appears to only search ootb sections. 

Like 0

Like

8 comments

You can try enabling the indexing for full text search option in section wizard.  https://academy.creatio.com/docs/user/no-code_customization/ui_and_busi…

Can that only be done upon initial setup? I set this custom section up a year ago and now if I go to the section wizard I don't see that option.

 

Dear Mitch, 

Can you please check SysModule table and make sure that for this section value of "GlobalSearchAvailable" column is set to 1? 

Kind regards,
Roman

Roman Brown,

 It was not set to 1, I updated the column so it was now 1. But still, this section does not show up in the global search.

Dear Mitch, 

Please contact our support team at support@creatio.com with a short description of the issue or simply provide a link to this post so we could help you with it. 

Kind regards,
Roman

Will this work for detail columns also ?

Dear Shailey, 

Can you please provide more details on your question?

Kind regards,
Roman

Hello,

 

same questions:

 

1. Custom section is set up as indexing for full-text search but I dont see in a result window.

2. Enabling section for fulltext search: would it find the details records aswell. For example if I search for product name, it find me all orders where that product in placed. Will it work for custom section as well with products detail?

Show all comments

Hi all,

I am facing this issue with filter functionality in Mobile App. In previous version we used to have filter icon for section, and in the current version (7.17) that replaced with search based on the first field on the page.

Is there any workaround to apply filtered search? 

This kind of annoying, specially when searching for full name and it doesn't respond when you are typing last name. For example, 'John Doe' only appears in search if you search for 'John'. If you type 'Doe' it returns with no results.

Like 0

Like

4 comments
Best reply

Hello Kavian,

 

Hope you're doing well.

 

If I understood your question correctly, it seems that search functionality didn't change (we have compared the last version (7.17) and the previous one (7.16)) and we were able to get search results via looking for the part of the full name and full name (for section search and for filtered search):

 

7.16:

 

7.17:

 

You can use '%' sign for partial word search if you are not sure in the full name:

 

Also, it is possible to configure columns by which search will be performed in mobile application from your side. Information on where and how it can be configured can be found in the next post: https://community.creatio.com/articles/search-multiple-columns-mobile-a…

 

Best regards,

Roman

Hello Kavian,

 

Hope you're doing well.

 

If I understood your question correctly, it seems that search functionality didn't change (we have compared the last version (7.17) and the previous one (7.16)) and we were able to get search results via looking for the part of the full name and full name (for section search and for filtered search):

 

7.16:

 

7.17:

 

You can use '%' sign for partial word search if you are not sure in the full name:

 

Also, it is possible to configure columns by which search will be performed in mobile application from your side. Information on where and how it can be configured can be found in the next post: https://community.creatio.com/articles/search-multiple-columns-mobile-a…

 

Best regards,

Roman

Roman Rak,

Thanks.

Roman Rak,

On the other note, is it possible to define the which fields to filter based on? for example, currently, it shows all the fields been used on the contact page, but we are only looking for searching based on 'Last name' and 'Type'

 

Thanks

Hello Kavian,

 

Thank you for your question.

 

As for now, there is no such functionality. I have created the functional request to 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

Hi Community,

 

Any idea how we can re order the global search result based on Created On field. Recent one should be on top. Thanks

Like 0

Like

3 comments

Hello Fulgen,

Unfortunately, there are no basic tools to modify the global search results in the application. However, you can edit a schema that is responsible for displaying the found data taken from a particular object according to your needs. You can modify the diff part of the code in the inherited from the object schema located in a Custom package. For accounts it is AccountSearchRowSchema and for contacts - ContactSearchRowSchema.

 

Best regards,

Bogdan S.

Bogdan Spasibov,

 

Thank you so much Bogdan. Do you have any example how I can put sorting based on CreatedOn field on diff?

Hi Fulgen Ninofranco,

 

We've tried to set up such a filtering feature as well as discussed the task with Creatio R&D team. Alas, as it was mentioned before, there is no option to modify the global search results in the application. The platform uses the Elastic Search engine that returns the result as it is and we cannot affect it somehow manually. 

 

Regards, 

Anastasiia

Show all comments

How do I check which version of the global search service I have?

If you use Creatio cloud, you will always have the latest version of the global search service.

If you use Creatio on-site, run the following console command:

docker ps

This will open the list of all containers. The number of global search version will be available in the “image” column.

How do I initiate the re-indexing of my Creatio site?

For global search versions lower than 2.0:

1. Open gs-mysql container via the following command:

docker exec -it gs-mysql bash

2. Run the following command in the opened gs-mysql container:

mysql -p1665017 use gs; UPDATE GlobalSearchIndexingEntity SET LastIndexedOn = NULL, InProcess = 0;

For global search version 2.0 and up:

Execute the following request on

gs-web-api: `/indexation/{siteName}/reindex/full

How do I enable logging the global search service?

By default, the service logs only errors. To enable logging of all events, locate the following string in the docker-compose.yaml file:

-Log4NetPath=${LOG$NET_CONFIG_FILE:-log4net.production.config}

Replace the string with the following string:

-Log4NetPath=${LOG$NET_CONFIG_FILE:-log4net.debug.config}

Note that if you enable logging of all events, the number of log files will increase significantly.

Which metrics and tracking schema can I use to monitor the global search operation?

Execute the following request:

http://[GS-WEB-API]:81/sites/[SITE_NAME]/search/state

Here, [GS-WEB-API] is the server address, and [SITE_NAME] is your Creatio website name.

How do I set up access to ElasticSearch via a password?

You can restrict access to ElasticSearch using Haproxy, which supports base64 authentification. Use the x-pack plugin to set up access to ElasticSearch via a login and a password.

How do I add a new object to the ElasticSearch indexing, or change the settings for the indexed fields of existing objects?

You can enable and configure indexing of specific sections using Creatio in-app tools. By default, ElasticSearch will index only sections, regardless of their author, as well as lookup columns (with a few exceptions). The attached PDF file contains the list of exceptions.

How do I deploy ElasticSearch on several servers with a single URL? How do I set up clustering?

This information is available in the Elastic service documentation.

Why the “Duplicates search rules” setting is not displayed for me?

Check if the “DeduplicationWebApiUrl” system setting is populated and whether the following features are enabled in “FeatureToggle:”

  • “BulkESDeduplication”
  • “ESDeduplication”
  • “Deduplication”

Learn more about working with additional options in the “Feature Toggle. Mechanism of enabling and disabling functions” article.

Can I use the global search and bulk duplicate search services in two Creatio applications simultaneously?

If you are using two Creatio applications, for example, production and developer environments, set up the global search and bulk duplicate search services for each of them independently. Use the following guides to set up the services:

 

File attachments
Like 1

Like

Share

1 comments

Hi Andre Kosolapenko,

Thanks for the article. I have performed the operation as guided for re-indexing and below is the result I got and it states that 0 rows got affected.

 

Is there any additional items to be handled ?

Please let me know.

Thanks in advance!

Show all comments

A few questions on this topic:

1. Can you configure global search to affect how many objects it searches? For example, if we only want to search knowledge base, could we prevent the global search from looking through other objects? We have many records in cases with lots of columns, currently the global search spins for a minute or more before the results finally load.

2. Can you configure the criteria for the matching results? For example, right now the search will return words that have three letters in the same order as what we searched. If I search "Compliance Connect", I get lots of results like "Concatenate", "Select", "Correctly"

3. Is there any good documentation that helps to explain ALL the possible ways you can configure the global search functionality? Or is there any documentation that explains how global search finds results?

Like 0

Like

1 comments

Dear Mitch, 

1. Unfortunately, you can't configure that in the global search, you can use regular filter in the section if you want to search record in a particular section or choose which section records to display in the section menu (http://prntscr.com/q4ti9f)
2. There are several built-in configurations of Global search: 3-letter search, 2-letter search and a full word search. Unfortunately, if you are using cloud version the only way to change the configuration is to send a letter to the creatio support (support@creatio.com). If you are using on-site version here is an academy page on setting up global search:
https://academy.creatio.com/documents/administration/7-15/global-search-setup
3.Here are academy pages on global search: 
https://academy.creatio.com/documents/administration/7-15/global-search-setup
https://academy.creatio.com/documents/base/7-15/global-search#XREF_45493

Best regards,
Dennis 

Show all comments

I imagine it is not likely that this is possible, but I did have an employee ask if there is away to run a search in Creatio that searches the contents of attached documents? Is there any such feature?

For example, if you attach a Microsoft Word document to the attachments detail of a case, then run a global search on a word that is in that document, will it return that as a search result?

Like 0

Like

4 comments

There is a marketplace add-on that does this: 

https://marketplace.creatio.com/app/full-text-search-creatio

Ryan

Hello Mitch,

Our R&D team has a task in "Planned" status registered on their side regarding full text search in files using Global Search feature. Currently the workaround is to use marketplace app Ryan provided you with. I will also make sure our R&D team could know about your community question so it could raise the priority of the problem.

Thank you for helping us to make our application better!

Regards,

Oscar

Oscar Dylan,

That's great news Oscar, thanks for the info.

Ryan

Ryan Farley,

Oscar Dylan,

Thank you both!

Show all comments