Запомнить первичные данные при создании записи

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

Идея: можно в таблицу необходимой сущности добавить колонку в которой мы будем хранить первичную информацию.

Приведу пример на основании карточки Счета и поля Поставщик:
В таблице счета (tbl_Invoice ) необходимо добавить поле в котором мы будем хранть историчное значение
1
Назовем поле OldSupplierName
2
Далее созданое поле необходимо добавить в SelectQuary соотвествующие таблице tbl_Invoice
3
4
После чего данное поле добавить в дата сет:
5
В данном случае нас интересует тип «Строковое поле»
6
В свойстве поля, устанавливаем колонку с запроса, и устанавливаем Заголовок
Далее необходимо добавить контрол в сервис окна, в нашем случае wnd_InvoiceEdit
7
Назовем контрол на форме edtOldSupplierName и установим значение IsEnabled = False, для того что бы данное поле не было доступно для редактирования, также укажем DatasetLink и DataFieldName( название колонки в Dataset), заголовок для контрола подтяниться с названия колонки в Dataset
8
После чего необходимо сделать маленькую доработку в скрипте самого датасета (ds_Invoice)

На событии OnDatasetBeforePost датасета:
9
Добавим строки

if (IsEmptyValue(Dataset('OldSupplierName'))) // если поле Dataset('OldSupplierName') не заповнено
        {
        Dataset('OldSupplierName') = Dataset('SupplierName'); //заполнить его значеним Dataset('SupplierName')
        }

Что по сути будет первым заполненым значения контрагента

Итоговый вид обработчика события ds_InvoiceOnDatasetBeforePost

function ds_InvoiceOnDatasetBeforePost(Dataset, DoPost) {
        if (IsEmptyValue(Dataset('OldSupplierName')))
        {
        Dataset('OldSupplierName') = Dataset('SupplierName');
        }
       
       
        InvoiceScript.IsAppend = (Dataset.State == dstInsert);
    SetItemSystemNumber('Invoice', Dataset, 'InvoiceNumber');
}

После чего карточка счета будет иметь вид:
10

Нравится

Поделиться

2 комментария

"Яворский Алексей" написал:Задача в том что бы запомнить данные определенной колонки, при создании записи.

Алексей, вы подписались на событие OnDatasetBeforePost, которое если мне не изменяет память срабатывает и при создании и при редактировании записи.... А так как поле SuplierName не обязательное, то при создании записи будет записано пусто, если не выбрали поставщика, а потом при редактировании будет записано значение, если укажут поставщика, что противоречит задаче.
А не проще воспользоваться механизмом журнала?

Александ, спасибо за замечание, в рамках данного поста действительно разумно вспомнить о журнале БД.
Просто данная задача немного была вырвана с контекста запроса, желание клиента было в том что бы видеть в карточке, поля которые были первый раз выбраны, так как дальше эти поля использовались бы в построении отчетов.

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

function dlDataOnDatasetBeforePost(Dataset, DoPost) {
	if (Boolean(Self.Attributes('IsNew')))
	{    
	Dataset('OldSupplierName') = Dataset('SupplierName');		
	}
}
Показать все комментарии