Вопрос

Доброго дня!

При работе в CRM нередко сталкиваюсь со спонтанно появляющимися ошибками. Воспроизвести кейс повторно не получается, т.е. сейчас ошибка возникает, а после перезагрузки страницы все в порядке.

Подскажите, пожалуйста, по каким причинам могут возникать подобного рода ошибки? Что они значат? Каким образом можно от них избавиться?

Прикрепленные файлы

У меня такой же вопрос

9 комментариев

По ошибке 1. После какого-то действия, вы пытаетесь добавить в базу данных значение с тем же ID, которое уже существует, соответственно получаете ошибку.
По ошибке 2, уже труднее, что-то сказать, какой-то объект данных, сериализуемый в JSON и переданный далее, не был правильно обработан на принимающей стороне.
Скорее всего он был заполнен данными одного типа, а ожидаются данные другого типа.
Например вы передали this.$Contact в качестве параметра, а ожидался тип Guid, вместо object и чтобы такой ошибки не было, вы должны были бы передать this.$Contact.value

Литвинко Павел,

Спасибо! 
Парадокс, но первая ошибка возникает при создании новой записи (счет/КП). И ладно бы действительно запись была, но ее нет!

 

Alex Zaslavsky,

Нет, т.е. опция "сохранить" при создании присутствует. Где это можно посмотреть наверняка? И почему вы уточнили?

 

Пикулик Тимур,

да у меня когда-то такое было, и я тогда по-моему принудительно сохранял запись, чтобы сделать копирование на определенные детали и для этого мне приходилось перед копированием сохранять запись с помощью this.save({isSilent: true}); 

Но я уже не помню в ем именно была проблема, если честно, сейчас попробую воссоздать маленький кейс, если получится, отпишусь)

Пикулик Тимур,

А у вас продажа создается по бизнес-процессу с помощью элемента "Открыть страницу редактирования" или с помощью какой-либо кнопки без запуска БП?

Alex Zaslavsky,

Вручную, путем обращения к детали и нажатию на "+". 

Пикулик Тимур,

что-то у меня не получилось воссоздать проблему годичной давности)

А какая у Вас версия CRM?

Пикулик Тимур,

а вообще, в первую очередь, я смотрел бы в OpportunityPageV2 в пользовательском пакете, не вызывается ли где-нибудь там метод 'save', а так, не знаю чем помочь)

Alex Zaslavsky,

7.12. Спасибо хотя бы за попытку.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Существует проблема следующего характера. На предприятии с большим количеством сотрудников для работы с CRM применяется NTLM аутентификация. Почта в CRM привязана к учетной записи в Exchange. И все вроде бы хорошо, ввел один раз пароль и работаешь.

Но! В в целях безопасности раз в 30 дней сотрудник должен менять пароль от учетной записи. Соответственно пароль от почты автоматически меняется на аналогичный пароль. Авторизация в CRM проходит успешно, но вот для синхронизации почты приходится лезть в настройки и менять пароль. Некоторым пользователям это лень делать, некоторые боятся что-нибудь испортить и т.д. Но это пол беды, из-за того что от пользователя поступает слишком много запросов на авторизацию с неверными данными он блокируется в Active Directory

Есть ли способ автоматически назначать актуальный пароль для синхронизации почты? Если да, то как это это сделать? Возможно кто-нибудь уже сталкивался с подобным.

У меня такой же вопрос

5 комментариев
Лучший ответ

Алексей Следь,

И я с таким неоднократно сталкивалась crying

Когда смотрю, что уже прошло больше года задаю вопрос 'когда' повторно, на что получаю ответ - 'Такое пожелание поступило только от Вас, поэтому у него низкий приоритет и мы его пока не рассматриваем на реализацию'.

Если честно, когда постоянно получаешь такие ответы, то понимаешь, что писать какие бы то ни было пожелания нет смысла.

Думаю, что многие пользователи из-за такого подхода уже 'забили' писать свои пожелания и идеи.

Хорошо, что появился маркетплейс bpm'online, и много чего полезного теперь можно найти бесплатно или за небольшие деньги.

Тимур, здравствуйте!

Проговорил описанную проблему с аналитиками продукта. Синхронизация почты в bpmonline работает так, что она сохраняет учетные данные для почтового ящика в базе данных (оригинальное имя пользователя и зашифрованный пароль). Да, на текущий момент система работает так, что после смены пароля пользователя в AD/NTLM нужно менять вручную изменить пароль в bpmonline для почтовых ящиков, чтобы синхронизация почты работала дальше.

Мы зарегистрировали проблему по вашему обращению и передали на анализ команде разработки продукта.

На данный момент в коммуникационной панели отображается соответствующее сообщение если пароль невалидный (см. Рис. 1).

Рис. 1

Вильшанский Дмитрий,

Дмитрий, спасибо за ответ! 
Скажите, пожалуйста, есть ли на текущий момент понимание как реализовать подобную доработку с технической точки зрения? 
И как долго ждать релиза с данным исправлением?

Писал такой же вопрос в техподдержку в сентябре 2018. получил ответ "подобная настройка в текущей версии системы не может быть выполнена по соображениям безопасности. Мы передали данное обращение в команду разработчиков и они рассмотрят возможность изменения логики работы синхронизации почты в будущих версиях."

Прошло почти полгода. Ответ тот же

Сами тоже пока не решили этот вопрос.

Пикулик Тимур,

Немного не так выразился. Имелось ввиду не исправление, а пожелание. На данный момент такой функциональности нет сейчас. Вам необходимо задавать пароль (см. скриншот выше).

Алексей Следь,

И я с таким неоднократно сталкивалась crying

Когда смотрю, что уже прошло больше года задаю вопрос 'когда' повторно, на что получаю ответ - 'Такое пожелание поступило только от Вас, поэтому у него низкий приоритет и мы его пока не рассматриваем на реализацию'.

Если честно, когда постоянно получаешь такие ответы, то понимаешь, что писать какие бы то ни было пожелания нет смысла.

Думаю, что многие пользователи из-за такого подхода уже 'забили' писать свои пожелания и идеи.

Хорошо, что появился маркетплейс bpm'online, и много чего полезного теперь можно найти бесплатно или за небольшие деньги.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Как можно сделать что бы страница редактирования была как в детали "деталь со страницей редактирования", а страница добавления была как в "детали с выбором из справочника", что бы при выборе записи она не появлялась в списке когда снова войти в выбор для добавления?

У меня такой же вопрос

2 комментария
Лучший ответ

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

Как вариант сделайте свою кнопку добавить или переопределите ее обработку и вызывайте где хотите свою страничку для добавления

 

Так же для добавления можно создать свою мини карточку детали тут

Переопределите обработчик нажатия на кнопку [+] добавления новой записи. Обычно она называется AddRecordButton. Обработчик кнопки реализуйте аналогично примера на Академии. В методе openDocumentLookup накладывайте нужные фильтры, чтобы уже добавленная запись в списке выбора не появлялась.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Подскажите как убрать значки быстрого создания активности из полоски кейсов?

 

У меня такой же вопрос

2 комментария
Лучший ответ

Заместить SectionActionsDashboard"

и

		{
			"operation": "remove",
			"name": "CallMessageTab"			
		},
		{
			"operation": "remove",
			"name": "EmailMessageTab"
		},
		{
			"operation": "remove",
			"name": "SocialMessageTab"
		},
		{
		   "operation": "remove",
		    "name": "TaskMessageTab"
		}

 

Вам нужно переопределить методы getSectionPublishers и getExtendedConfig в SectionActionsDashboard.

Посмотрите пример добавления нового канала в ActionDashboard и реализацию SectionActionsDashboard в пакетах TaskMessagePublisher, EmailMessagePublisher, CallMessagePublisher и SocialMessagePublisher.

Разобравшись в механизме добавления, Вы сможете понять, каким образом убрать существующие значки.

 

Заместить SectionActionsDashboard"

и

		{
			"operation": "remove",
			"name": "CallMessageTab"			
		},
		{
			"operation": "remove",
			"name": "EmailMessageTab"
		},
		{
			"operation": "remove",
			"name": "SocialMessageTab"
		},
		{
		   "operation": "remove",
		    "name": "TaskMessageTab"
		}

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

На страницу выведено поле с датой и временем, нужно передать в него время из справочника при изменении значения в выпадающем списке. Стандартные js способы new Data(dataCode) не работает

У меня такой же вопрос

7 комментариев
Лучший ответ

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Добрый день!

А что именно "стандартное" не работает? Какой тип у dataCode? Возможно просто напросто вы не можете создать дату? Так как значение устанавливается просто. Например:

//...
attributes: {
	"SomeDate": {
		"dataValueType": this.Terrasoft.DataValueType.DATE_TIME,
		"type": this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"dependencies": [{
			columns: ["Type"],
			methodName: "setSomeDate"
		}]
	},
	"Type": {
		"lookupListConfig": {
			columns: ["CreatedOn"]
		}
	}
},
//...
methods: {
	setSomeDate: function () {
		var value = (this.get("Type") || {}).CreatedOn || null;
		this.set("SomeDate", value);
	}
}
//...

И Вам, наверное, стоит заглянуть в консоль, там скорее всего ошибка, которая прояснит ситуацию

Лопатин Константин Николаевич,

Ошибке в консоли нет, в том и дело. Мне по факту нужно понимать как в поле с датой положить значение, его формат.

Пробовал this.set("dataColume", new Date(); - не работает, хотя в js даёт текущую дату и время. Так же пробовал из другого поля скопировать дату this.set("date", new Date(this.get("date2").toString()))

И

this.set("date1", this.get("date2"))

Prime Source,

А в каком методе Вы это делаете? По событию? Запрос может быть к базе какой-то выполняете? Контекст верный? Вариант с

this.set("SomeDate", new Date());

очень даже рабочий. Тяжело помочь, когда не видишь полной картины

Лопатин Константин Николаевич,

define("PsPPsPApprovalPuRequests1Page", [], function() {
	return {
		entitySchemaName: "PsPApprovalPuRequests",
		attributes: {
			"PsPDateTimeApproval": {
				dataValueType: Terrasoft.DataValueType.FLOAT,
				dependencies: [
					{
						columns: ["PsPsPMatchResult"],
						methodName: "approvalDate"
					}
				]
			}
		},
		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		businessRules: /**SCHEMA_BUSINESS_RULES*/{
			"PsPsPMatchResult": {
				"b7a163a0-228d-4005-bfd3-3d19229a6328": {
					"uId": "b7a163a0-228d-4005-bfd3-3d19229a6328",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						},
						{
							"comparisonType": 1,
							"leftExpression": {
								"type": 1,
								"attribute": "PsPsPMatchResult"
							}
						}
					]
				}
			},
			"PsPComent": {
				"e39449ef-895f-4341-8133-2e773a4dec7d": {
					"uId": "e39449ef-895f-4341-8133-2e773a4dec7d",
					"enabled": true,
					"removed": false,
					"ruleType": 0,
					"property": 1,
					"logical": 0,
					"conditions": [
						{
							"comparisonType": 3,
							"leftExpression": {
								"type": 3,
								"value": "CurrentUserContact",
								"dataValueType": 10
							},
							"rightExpression": {
								"type": 1,
								"attribute": "PsPApprovalMan"
							}
						}
					]
				}
			}
		}/**SCHEMA_BUSINESS_RULES*/,
		methods: {
			approvalDate: function() {
				var matchResult = this.get("PsPsPMatchResult");
				if (matchResult) {
					var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPMatchResult"});
					//esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
					debugger;
					esq.getEntity(matchResult.value, function(result) {
						if (!result.success) {
							// обработка/логирование ошибки, например
							this.showInformationDialog("Ошибка запроса данных");
							return;
						}
						this.set("PsPDateTimeApproval", new Date());
					}, this);
				}
			}
		},
		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "PsPApprovalMan",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "Header"
					},
					"bindTo": "PsPApprovalMan"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "PsPsPMatchResult",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "Header"
					},
					"bindTo": "PsPsPMatchResult",
					"labelConfig": {
						"caption": {
							"bindTo": "Resources.Strings.PsPsPMatchResultLabelCaption"
						}
					},
					"enabled": true,
					"contentType": 5
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "PsPComent",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 3,
						"layoutName": "Header"
					},
					"bindTo": "PsPComent"
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 2
			},
			{
				"operation": "insert",
				"name": "PsPDateTimeApproval27fcf723-04c0-4c5d-86d1-e4ef52f8b467",
				"values": {
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "Header"
					},
					"bindTo": "PsPDateTimeApproval",
					"enabled": false
				},
				"parentName": "Header",
				"propertyName": "items",
				"index": 3
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Лопатин Константин Николаевич,

attributes: {
	"PsPTimeLimit": {
		dataValueType: Terrasoft.DataValueType.FLOAT,
		dependencies: [
			{
				columns: ["PsPProcurementType"],
				methodName: "calculateTimeLimit"
			}
		]
	}
},
methods: {
	onEntityInitialized: function() {
		this.callParent(arguments);
		this.calculateTimeLimit();
		this.calculateDepartment();
	},
	calculateTimeLimit: function() {
		var recordId = this.get("PsPProcurementType");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "PsPProcurementType"});
		esq.addColumn("PsPTimeLimit", "PsPTimeLimit");
		if (recordId) {
			esq.getEntity(recordId.Id, function(result) {
				if (!result.success) {
					// обработка/логирование ошибки, например
					this.showInformationDialog("Ошибка запроса данных");
					return;
				}
				var timeLimit = result.entity.get("PsPTimeLimit").toString();
				this.set("PsPTimeLimit", {
					displayValue: new Date(timeLimit)
				});
			}, this);
		}
	}
}

Это из базы уже

Prime Source,

А что Вы ожидаете получить в целом? Колонка PsPTimeLimit имеет  тип FLOAT, и в нее различными способами пытаются запихнуть дату, логично что не работает. А способ

this.set("PsPTimeLimit", { displayValue: new Date(timeLimit) });

Вы где подсмотрели?

Повнимательней перечитайте мой первый комментарий. Можете оттуда выбросить VITRUAL_COLUMN, подставить свои названия полей и все заработает

Лопатин Константин Николаевич,

Спасибо, тип изменил и все заработало, нужно больше спать)))

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте!

Хотим сделать чтобы в редактируемом реестре записи отображались как ссылки для удобного перехода, нашел что для этого необходимо добавить признак useLinks: true для DataGrid и метод-обработчик linkClicked, но это почему-то не меняет ситуацию, строки отображаются как обычно... ошибок в консоли нет

Код DataGrid:

{
    "operation": "merge",
    "name": "DataGrid",
    "values": {
        "className": "Terrasoft.ConfigurationGrid",
        "generator": "ConfigurationGridGenerator.generatePartial",
        "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
        "changeRow": {"bindTo": "changeRow"},
        "unSelectRow": {"bindTo": "unSelectRow"},
        "onGridClick": {"bindTo": "onGridClick"},
        "activeRow": {"bindTo": "ActiveRow"},
        "selectedRows": {"bindTo": "SelectedRows"},
        "activeRowActions": [
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "save",
                "markerValue": "save",
                "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "card",
                "markerValue": "card",
                "imageConfig": {"bindTo": "Resources.Images.CardIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "cancel",
                "markerValue": "cancel",
                "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
            },
            {
                "className": "Terrasoft.Button",
                "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                "tag": "remove",
                "markerValue": "remove",
                "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
            }
        ],
        "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
        "activeRowAction": {"bindTo": "onActiveRowAction"},
        "multiSelect": false,
        "useLinks": true,
        "primaryColumnName": "Id",
        "sortColumnIndex": null,
        "listedZebra": true,
        "type": "listed"
    }
}

 

Посмотрите, пожалуйста, может я что-то упустил

У меня такой же вопрос

3 комментария
Лучший ответ

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Добрый день!

Я бы Вам рекомендовал посмотреть в сторону метода addColumnLink в GridUtilitiesV2. Так же можно изучить поподробнее как формируются ссылки в FileDetailV2

Обрати внимание на флаг showValueAsLink (и выше тебе уже ответили в системе множество примеров, потрать немного времени и разберись)

ПРимер использования ниже

{
    "operation": "insert",
    "name": "UsrURLpage",
    "values": {
        "layout": {
            "colSpan": 12,
            "rowSpan": 1,
            "column": 0,
            "row": 3,
            "layoutName": "Header"
        },
        "labelConfig": {},
        "enabled": true,
        "bindTo": "UsrURLpage",
        "showValueAsLink": true,
        "href": {
            "bindTo": "UsrURLpage",
            "bindConfig": {"converter": "getUsrURLpageLink"}
        },
        "controlConfig": {
            "className": "Terrasoft.TextEdit",
            "linkclick": { bindTo: "onUsrURLpageLinkClick"}
        }
    },
    "parentName": "Header",
    "propertyName": "items",
    "index": 6
}

 

Переопределил метод addColumnLink, спасибо Константину за наводку:

addColumnLink: function(item, column) {
    this.callParent(arguments);
 
    var columnPath = column.columnPath;
    if (columnPath === "UsrProduct") {
        item["on" + columnPath + "LinkClick"] = function() {
            var value = this.get(columnPath);
            return {
                caption: item.values.UsrProduct.displayValue,
                target: "_self",
                title: item.values.UsrProduct.displayValue,
                url: "/0/Nui/ViewModule.aspx#CardModuleV2/ProductPageV2/edit/" + item.values.UsrProduct.value
            };
        };
    }
}

При переходе по ссылке появились ошибки в консоли, видимо не мог поставить фокус при переходе, просто убрал фокус на это поле:

focusActiveRowControl: function(columnName) {
    if (!columnName || columnName === "UsrProduct") {
        return;
    }
    var activeRow = this.getActiveRow();
    activeRow.set("Is" + columnName + "Focused", true);
    this.currentActiveColumnName = columnName;
}

 

Всем спасибо за помощь...)

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

При использовании команды "debugger;" появляется сообщение об ошибке "forgotten 'debugger' statement".

Требуется ли дополнительно править что-то в конфигах или подключать в самом js-файле?

Спасибо!

У меня такой же вопрос

3 комментария
Лучший ответ

На это сообщение можно не обращать внимание, оно носит информационный характер.

После завершения отладки, нужно не забыть убрать его из схемы.

На это сообщение можно не обращать внимание, оно носит информационный характер.

После завершения отладки, нужно не забыть убрать его из схемы.

Алла Савельева,

Спасибо! А то я тут уже и исходные коды перерыл, и академию с сообществом. :)

Информационное предупреждение JSHint (используется для проверки синтаксиса JS в bpmonline), как написала Алла можно игнорировать это не Error а Warning.

Смысле его в том чтобы не ушел в продакшен код с отладочными операторами/командами информацией и тд!

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

По кнопке из карточки кастомного раздела запускаю БП.
Он создает по своей логике пачку записей в детали, которая выведена на текущей карточке.
Как после этого обновить реестр детали?

Пользовался следующей ссылкой:
https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr…
В ней правда есть только вывод сообщение в консоли.
Это действие планировал заменить как-то так:
//                this.refreshGridData();
или
//                this.location.reload();

Делал все аналогично:
1) бп после сохранения элемента детали
2) логика с родителем ClientMessageBridge 
3) подписка на странице, где выведена деталь

Такое впечатление, что сообщение не доходит и обрывается на каком-то моменте.
Можно ли его судьбу как-то отследить?

У меня такой же вопрос

5 комментариев
Лучший ответ

this.updateDetail({detail: "UsrMyDetail", realoadAll: true});

this.updateDetail({detail: "UsrMyDetail", realoadAll: true});

Алексей-Карягин,

А само сообщение, которое должно стать инициатором обновления, можно ли как-то отследить?

Я его по аналогии с примером описал (и источник, и приёмник)

Смотря на каком этапе пропадает. Можно рядом с обновлением детали оставить window.console.info из примера, чтобы видеть, дошло до клиента или нет. Сетевую активность между сервером и браузером можно мониторить в Fiddler, запущенном на том же компьютере, где браузер. Если же до отправки сообщения не доходит на стороне БП на сервере, их тоже можно мониторить.

Зверев Александр,

БП по сути только инициирует - там-то проблем быть не должно.
Дальше есть 2 куска логики (клиент и

ClientMessageBridge). Вот у клиента этой логики нет.

Вот для этого и нужно смотреть вышеупомянутыми или другими способами, на каком этапе ещё нормально отработало, а на каком — уже нет.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Если не использую фильтр, то все работает, но без фильтрации
Если использую, то null на выходе

В чем может быть причина?

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "GeneralForm"
    });
    
    esq.addColumn("Id");
    esq.addColumn("UsrCode");
    esq.addColumn("UsrInfoId.Name");
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));
    
    var rowsCount = 0;
    var rowsCount1 = "";
    esq.getEntityCollection(function(result) {
        if (result.success) {
            
            
            result.collection.each(function (item) {
                rowsCount = rowsCount + 1;
                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfoId.Name") + 
                    "(" + rowsCount + ")" + "\n";
            });
            this.set("UsrCount", rowsCount1);
        }
    }, this);

У меня такой же вопрос

12 комментариев
Лучший ответ

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Посмотрите профилировщиком какой sql запрос отправляется в БД, это поможет определить проблему

Ошибка в том, что Вы неправильно построили связи - нужно писать UsrInfo.Name, а у Вас UsrInfoId.Name.

Вот корректный код:

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
        rootSchemaName: "GeneralForm"
    });
    
    esq.addColumn("Id");
    esq.addColumn("UsrCode");
    esq.addColumn("UsrInfo.Name");
    esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL, "UsrInfo.Name", "Инфо"));
    
    var rowsCount = 0;
    var rowsCount1 = "";
    esq.getEntityCollection(function(result) {
        if (result.success) {
            
            
            result.collection.each(function (item) {
                rowsCount = rowsCount + 1;
                rowsCount1 += item.get("UsrCode") + "#" + item.get("UsrInfo.Name") + 
                    "(" + rowsCount + ")" + "\n";
            });
            this.set("UsrCount", rowsCount1);
        }
    }, this);

Ну, и на будущее смотрите, какая ошибка возвращается в браузере и выполняете отладку клиентского кода, тогда сразу становится понятно, в какой строке кода допущена ошибка.

Алла Савельева,

пытаюсь реализовать запрос:

select 
    q1.UsrCode
    , q2.Name
from 
    GeneralForm q1 
    join UsrInfoList q2 
on 
    q1.UsrInfoId = q2.Id

При моей текущей реализации этот кусок работает:
esq.addColumn("UsrInfoId.Name");
Проблема с фильтром. 

Григорий Чех,

Ок. Разбираюсь с тем как его использовать.

Григорий Чех,

а как корректно этот механизм объявить в коде?
добавил:
//перед esq
var performanceManagerLabel = "";
performanceManager.start(performanceManagerLabel + "_Init");
//сразу после фильтрации
performanceManager.stop(performanceManagerLabel + "_Init");
пишет:
'performanceManager' is not defined
 

Григорий Чех,

Нашел. 

performanceManager указать надо было.

Григорий Чех,

Верно понимаю, что performanceManager.stop по сути служит меткой для того, чтобы в браузере можно было посмотреть состояние системы на этот момент и при необходимости перескочить на следующую метку?

Алла Савельева,

Верно понимаю, что для такого запроса реализация ниже верна?
На практике без фильтра логика выдает правильное число строк, а с фильтром null.

select 
    q1.Id
    q1.UsrCode
    , q2.Name
from 
    GeneralForm q1 
    join UsrInfoList q2 
on 
    q1.UsrInfoId = q2.Id

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "GeneralForm"
esq.addColumn("Id");
esq.addColumn("UsrCode");
esq.addColumn("UsrInfoId.Name");
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "UsrInfoId.Name", "Инфо"));

Посмотрите в профайлере, что за SQL-запрос идёт в базу при выполнении последнего кода и потом запустите в Management Studio  его отдельно, чтобы выяснить, почему у него пустой результат.

Зверев Александр,

система в yазвании таблицы, которую пробую подцепить добавляет в начале и конце названия еще символы

SysUsrInfoListLcz. А нужна таблица была UsrInfoList. Это фича такая?

Хотя нет. Не в ней дело. Тут все хорошо.

SysUsrInfoListLcz — это автоматически сгенерированная таблица переводов названий для UsrInfoList.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

В академии есть ряд разделов по данной теме. Например, ссылка:
https://academy.terrasoft.ua/documents/technic-sdk/7-13/clientmessagebr…

Если прошел последовательно по пунктам, но механизм не отработал как ожидалось, то где можно концы искать?

У меня такой же вопрос

1 комментарий
Лучший ответ

Выполните отладку клиентского кода. Как это сделать смотрите в статье на Академии.

Выполните отладку клиентского кода. Как это сделать смотрите в статье на Академии.

Войдите или зарегистрируйтесь, чтобы комментировать