Задача в том что бы запомнить данные определенной колонки, при создании записи.
Идея: можно в таблицу необходимой сущности добавить колонку в которой мы будем хранить первичную информацию.
Приведу пример на основании карточки Счета и поля Поставщик:
В таблице счета (tbl_Invoice ) необходимо добавить поле в котором мы будем хранть историчное значение
Назовем поле OldSupplierName
Далее созданое поле необходимо добавить в SelectQuary соотвествующие таблице tbl_Invoice
После чего данное поле добавить в дата сет:
В данном случае нас интересует тип «Строковое поле»
В свойстве поля, устанавливаем колонку с запроса, и устанавливаем Заголовок
Далее необходимо добавить контрол в сервис окна, в нашем случае wnd_InvoiceEdit
Назовем контрол на форме edtOldSupplierName и установим значение IsEnabled = False, для того что бы данное поле не было доступно для редактирования, также укажем DatasetLink и DataFieldName( название колонки в Dataset), заголовок для контрола подтяниться с названия колонки в Dataset
После чего необходимо сделать маленькую доработку в скрипте самого датасета (ds_Invoice)
На событии OnDatasetBeforePost датасета:
Добавим строки
{
Dataset('OldSupplierName') = Dataset('SupplierName'); //заполнить его значеним Dataset('SupplierName')
}
Что по сути будет первым заполненым значения контрагента
Итоговый вид обработчика события ds_InvoiceOnDatasetBeforePost
if (IsEmptyValue(Dataset('OldSupplierName')))
{
Dataset('OldSupplierName') = Dataset('SupplierName');
}
InvoiceScript.IsAppend = (Dataset.State == dstInsert);
SetItemSystemNumber('Invoice', Dataset, 'InvoiceNumber');
}
После чего карточка счета будет иметь вид:
"Яворский Алексей" написал:Задача в том что бы запомнить данные определенной колонки, при создании записи.
Алексей, вы подписались на событие OnDatasetBeforePost, которое если мне не изменяет память срабатывает и при создании и при редактировании записи.... А так как поле SuplierName не обязательное, то при создании записи будет записано пусто, если не выбрали поставщика, а потом при редактировании будет записано значение, если укажут поставщика, что противоречит задаче.
А не проще воспользоваться механизмом журнала?
Александ, спасибо за замечание, в рамках данного поста действительно разумно вспомнить о журнале БД.
Просто данная задача немного была вырвана с контекста запроса, желание клиента было в том что бы видеть в карточке, поля которые были первый раз выбраны, так как дальше эти поля использовались бы в построении отчетов.
Как вариант можно обратиться к атрибуту окна IsNew, что бы учесть ситуацию создания новой записи, а не редактирования конкретного поля, в случае если поле может быть не заполнено
function dlDataOnDatasetBeforePost(Dataset, DoPost) { if (Boolean(Self.Attributes('IsNew'))) { Dataset('OldSupplierName') = Dataset('SupplierName'); } }