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