Вопрос

Исчезает значение локализируемой строки.

Не удается выполнить копирование локализируемой строки ScriptTemplate из BaseGeneratedWebFormPageV2 в мою созданную. При попытке записи значения и сохранения, после сохранение значение этой строки становится пустым.

Кто с таким встречался?

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

1 комментарий

Здравствуйте, Михаил!

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

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

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

Естественно самой реальной и первой причиной возникновения такой ошибки приходила идея о сбоях в работе событий полей окна редактирования (то есть значения в полях изменялись, а события данных полей(-я) не срабатывали).

В основу решения было положено создание двух таблиц в базе данных для ведения логов, что происходят с записью набора данных. Первая таблица WindowLog, а вторая TriggerLog.

Первая таблица WindowLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Ответственный» (WindowsUser), «Имя поля породившего событие»(FieldName), «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для наполнения таблицы было использованы события невизуального компонента окна dlData: dlDataOnDatasetDataChange, dlDataOnDatasetBeforePost и dlDataOnDatasetAfterPost. В скрипте в событиях была создана функция, которая формировала SQL запрос к таблице WindowLog базы данных с фиксацией информации по указанным полям на момент срабатывания события.

Запрос:

INSERT INTO WindowLog (*набор полей*)
SELECT (*набор полей*) -- Dataset('поле1'), Dataset('поле2'), Dataset('поле2')

Вторая таблица TriggerLog включает в себя поля «Дата создания»(CreatedOn), «Идентификатор записи» (RecordID), «Состояние» (до изменения записи и после), «SystemUser», «Итого» и поля из которых оно вычисляется («Сумма покупки», «Наценка», «Сбор» и т.д.). Для заполнения данной таблицы был создан триггер на инструкцию UPDATE проблемной таблицы с двумя запросами вставки значений в таблицу. В одном запросе вставлялись значения до изменений, а во втором после.

Запрос №1:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM deleted

Запрос №2:

INSERT INTO TriggerLog (*набор полей*)       
SELECT (*набор полей*)
FROM inserted

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

Проанализировав записи в таблице TriggerLog было установлено, что в результате выполнения инструкции UPDATE было внесено некорректное значение. Сопоставив даты создания записей в таблице TriggerLog и WindowLog было установлено, что инструкция UPDATE была вызвана не в результате манипуляций с окном редактирования, а иным источником. На основании поля «SystemUser» таблицы TriggerLog было установлено что изменения были внесены с помощью импортера данных.

Таблицу TriggerLog возможно расширить, добавив в нее поля, которые помогут ускорить процесс обнаружение источника изменений записи базы данных. Список дополнительных полей может выгладять следующим образом: ApplicationName, LoginName, HostName.

PS: Принимаю предложения на доработку вашей конфигурации!!! Для более детальной информации можно связаться по следующему e-mail адресу: providnui@ukr.net !!!

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

Всем удачи в этом не легком процессе!!!

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

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

Рассмотрим реализацию функционала на конкретном примере.Видоизменяем карточку контакта для собственных нужд: создаем отдельные поля "Фамилия", "Имя", "Отчество". Но также оставляем поле "ФИО", которое должно заполняться автоматически на основании суммы значений в вышеуказанных полях.

Для реализации подобного функционала во-первых, требуется создать функцию, которая будет заполнять поле ФИО. Эту функцию можно создать вначале скрипта, в котором будет обработчик события OnDatasetDataChange:

function CreateName(Dataset) {
var FirstName = Dataset.Values('FirstName');
FirstName = (IsEmptyValue(FirstName) ? '' : ' ' + FirstName);
var Surname = Dataset.Values('Surname');
Surname = (IsEmptyValue(Surname) ? '' : Surname);
var PatronymicName = Dataset.Values('PatronymicName');
PatronymicName = (IsEmptyValue(PatronymicName) ? '' : ' ' + PatronymicName);
Dataset.Values('Name') = Surname + FirstName + PatronymicName;
}

Затем на событии OnDatasetDataChange датасета необходимо для каждого из полей вызывать созданную предварительно функцию:

function SelfOnDatasetDataChange(DataField) {
var Dataset = DataField.ParentDataFields.ParentDataset;
if (DataField.Name == 'Surname') {
CreateName(Dataset);
return;
}
if (DataField.Name == 'FirstName') {
CreateName(Dataset);
return;
}
if (DataField.Name == 'PatronymicName') {
CreateName(Dataset);
return;
}
if ((Contact.IsUpdating || !Assigned(DataField) ||
(IsEmpty(DataField.Value)))) {
return;
};
}

По аналогии с предоставленным примером Вы можете реализовать функционал по заполнению, например поля "Адрес" в карточках или же каких-либо других полей, в которых должна храниться сумма значений одного или нескольких других полей карточек.

Поделиться

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