Bpm'online mobile bug report: Невозможно получить значение колонки Data, так как она не была загружена
Симптомы
В мобильном приложении добавляется файл/фото на деталь "файлы и ссылки" в одном из разделов.
После запуска синхронизации возникает ошибка:
Bpm'online mobile bug report
Type: Terrasoft.ODataException
Message: An error occurred while processing this request.
Сообщение содержит: Невозможно получить значение колонки Data, так как она не была загружена
Причина
В процессе схемы File в скрипте ScriptFileSaving есть код:
var data = Entity.GetColumnValue("Data") as byte[];И если обновлять данные в этой схеме (через OData) и не указывать колонку Data, то появляется сообщение, что она не загружена.
Такая ситуация может происходить если в таблице файлов (ActivityFile, OpportunityFile и т.п.) есть циклическая связь.
Например в таблице ActivityFile есть колонка Activity, которая ссылается на таблицу Activity, в которой, в свою очередь, есть справочная колонка UsrActivityFile, которая ссылается на таблицу ActivityFile.
Мобильное приложение это отслеживает и разбивает один запрос
INSERT INTO ActivityFile (Id, Name, Data, Activity) VALUES (1, 2, 3, 4)На два запроса:
INSERT INTO ActivityFile (Id, Name, Data) VALUES (1, 2, 3)
UPDATE ActivityFile SET Activity = 4 WHERE Id = 1Вот этот второй запрос и не срабатывает.
Решение
Есть обходное решение. Для требуемой таблицы в манифесте установить признак IgnoreSplitLogActions
{
"SyncOptions": {
"ModelDataExportConfig": [
{
"Name": "ActivityFile",
"IgnoreSplitLogActions": true
}
],Тогда вставка файла не будет разбиваться на два запроса.
Необходимые условия и возможные ограничения
Для UIV1 необходимо дополнительно "заоверрайдить" схему:
if (!Terrasoft.SysSettingsValue.getBooleanValue("UseMobileUIV2")) {
/*
* Moved from UIV2
*/
Ext.define("Terrasoft.Sync.LogManager.override", {
override: "Terrasoft.Sync.LogManager",
/**
* @private
*/
ignoreSplitLogActions: function(logAction) {
var modelName = logAction.get("ModelName");
var manifest = Terrasoft.ApplicationConfig.manifest;
var ignore = false;
if (manifest.SyncOptions) {
var modelDataExportConfig = manifest.SyncOptions.ModelDataExportConfig || [];
for (var i = 0, ln = modelDataExportConfig.length; i < ln; i++) {
var modelConfig = modelDataExportConfig[i];
if (Ext.isObject(modelConfig) && modelConfig.Name === modelName) {
ignore = modelConfig.IgnoreSplitLogActions;
break;
}
}
}
return ignore === true;
},
/**
* @private
*/
splitLogActions: function() {
var firstTierActions = this.firstTierActions = [];
var secondTierActions = this.secondTierActions = [];
for (var i = 0, ln = this.mergedLogActions.length; i < ln; i++) {
var logAction = this.mergedLogActions[i];
if (this.isCreateAction(logAction) && !this.ignoreSplitLogActions(logAction)) {
firstTierActions.push(logAction);
this.splitLogActionWithLoopColumns(logAction);
this.splitLogActionWithBinaryColumns(logAction);
} else {
secondTierActions.push(logAction);
if (this.isUpdateAction(logAction)) {
this.splitLogActionWithBinaryColumns(logAction);
}
}
}
}
});
}