Добавлении или модификации извне набора данных

Добрый день!

Интересует решение следующей задачи.

При импорте данных (например, из таблиц Excel) данные добавляются напрямую в таблицы, т.е. обработчики Dataset-ов не выполняются, что не всегда приемлемо. Скажем, при импорте в таблицу tbl_OfferingInContract в поле OfferingID попадает нужный продукт, но процедура DataChange(DataField, ds_OfferingInContractScript) прописанная в обработчике Dataset-а SelfOnDatasetDataChange(DataField) не выполняется, таким образом, такие поля как: «Валюта», «Цена» и т.д. остаются пустыми. В SDK нашел метод обновления записи при ее добавлении или модификации извне набора данных (RefreshRecord(KeyValue: OleVariant; AddNewRecordOnPage: WordBool); ). Каким образом я могу его использовать для решения моей проблемы?

Заранее благодарен!

Нравится

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

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

Импорт выполняю пользовательскими средствами, как вариант, рассматриваю создание функции, перебирающей Dataset и выполняющей OnDataChange для нужный полей. По поводу RefreshRecord:
цитата из SDK: "Метод обновления записи при ее добавлении или модификации извне набора данных. При AddNewRecordOnPage = True добавляет запись в конце текущей страницы"
Наверное я не доконца понял это определение процедуры.

"Павел Крышкин" написал:Наверное я не доконца понял это определение процедуры.

Вы просто путаете метод и событие.

Понятно, может еще что-то можно предпринять кроме тригеров и "ручного" выполнения OnDataChange для нужный полей?

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

В том-то и дело что валюта это пол беды, основная проблема это цена продуктов, их не так уж и много до 10 штук, все прописанны в tbl_Offering каждый со своей ценой, а файлик содержит порядка 2000 строк данных о продажах этих продуктов (без цен).

Есть одна идея, только не пинайте ногами :)
Пишем макрос, который создает коннектор, коннектится к базе TSCRM, вытягивает данные по цене товара и ложит в колонку экселевского файла. Потом импортируем данные из файла. там вроде и не очень сложно реализовать это. неприятно только макрос этот таскать будет. Хотя в пределах одной машины его вроде глобальным можно сделать. Но что бы это заработало на другой машине при дется макрос туда копировать

За идею спасибо, но боюсь не подойдет.

Почему, вполне рабочий вариант. Разве что не совсем тривиальный.

Я привел лишь один из примеров (с tbl_OfferingInContract), таковых не один, также импорт будет проходить на регулярной основе т.е. выгрузил файл из одной программы загрузил в TS, поэтому вариант с редактированием файла макросаим не подходит в данном случае. А вообще, повторюсь, идея замечательная!

Если формат файлов не меняется, то можно перед импортом натравить на файлы террасфотовский скрипт, который проставит недостающие значения.

А еще лучше - написать небольшую хранимую процедуру, которая будет осуществлять необходимые вычисления и обновления значений в ячейках, и вызывать ее после осуществления импорта. Достоинство - скорость и легкость реализации. Недостаток - необходимо немного программировать на T-SQL (в случае, если используете MSSQL). Пример вызова хранимой процедуры из текста скрипта:
Connector.DBEngine.ExecuteCustomSQL('exec myproc', System.EmptyValue);
Желаю успехов!

Показать все комментарии