Суть вопроса проста, но к сожалению так и не смог разобраться как действует заполнение контактной информации Контакта, контактной информацией выбранного Контрагента. Хочу сделать тоже самое с договорами...Нужно в случае выбора Контрагента заполнить поля договора регалиями котнрагента, хранящиеся в таблице Контрагент.
Прошу прощения за тавтологию. Пытался описать вопрос обширнее).
scr_ContactAccountUtils
function FillInformationBySelectedItem(Dataset, LookupDataset, Message)
- это оно. Суть - проста. Говорим откуда тянуть данные, куда писать. Все через датасеты.
Для начала попытался заполнить текстовое поле "CustomerFIO"(Имя заказчика) на форме Договор способом выбора "CustomerID"(Индификатор контрагента.
Для этого:
1) Добавил в scr_ContactAccountUtils свою функцию
function FillCustomerBySelectedItem(Dataset, LookupDataset, Message){if(System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0)== mrYes){if(!Assigned(LookupDataset)){return}if(LookupDataset.State== dstInactive){return}
var ContactIDName ='CustomerFIO';
var ContactID = GetFieldValueFromDisabledField(LookupDataset,
ContactIDName);
Dataset.Values(ContactIDName)= ContactID;}}
2) Прикрутил scr_ContactAccountUtils к ds_ContractScript
3) Добавил в ds_ContractScript функцию
function SelfOnDatasetDataChange(DataField){
var Dataset = DataField.ParentDataFields.ParentDataset;try{if(DataField.Name=='CustomerID'){
var LookupDataset = DataField.LookupDataset;if(!IsEmptyStr(DataField.DisplayValue)){ FillCustomerBySelectedItem(Dataset, LookupDataset, DoYouWantToFillCustomerEntriesMessage);}return;}} finally {}
DataChange(DataField);}
4) Добавил в константы: DoYouWantToFillCustomerEntriesMessage
5)
РЕЗУЛЬТАТ: При запуске и выборе Контрагента TSCRM зависает...Не могу определить где она зацикливается.
а вот здесь что происходит, может закомментить это?
кстати, дебаггером бы пройтись можно было, выяснить сразу где оно виснет)) еще вопрос такой - нет ли на визуальной части каких обработчиков на контролах?
Чтобы находить нужные функции в скриптах используйте scr_GrepSearch (запустите этот скрипт в администраторе).
Подозреваю, что DataChange(DataField) изменяет значение какого нибудь поля, что в свою очередь вызывает событие SelfOnDatasetDataChange - вот Вам и зацикливание.
Александр и Сергей, спасибо за помощь.
Как оказалось никакого зацикливания не было)).
На самом деле подвисал JIT.
Перезагрузился.
С помощью отладчика нашёл свою ошибку.
Если поля в исходном и результирующем датасете имеют разное название, то необходимо изменить формальный параметр на фактический. До:
function FillCustomerBySelectedItem(Dataset, LookupDataset, Message){if(System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0)== mrYes){if(!Assigned(LookupDataset)){return}if(LookupDataset.State== dstInactive){return}
var ContactIDName ='CEO';
var ContactID = GetFieldValueFromDisabledField(LookupDataset,
ContactIDName);
Dataset.Values(ContactIDName)= ContactID;}}
После:
function FillCustomerBySelectedItem(Dataset, LookupDataset, Message){if(System.MessageDialog(Message, mdtConfirmation, mdbYes + mdbNo, 0)== mrYes){if(!Assigned(LookupDataset)){return}if(LookupDataset.State== dstInactive){return}
var ContactIDName ='CEO';
var ContactID = GetFieldValueFromDisabledField(LookupDataset,
ContactIDName);
Dataset.Values('CustomerFIO')= ContactID;}}
В моём случае поле 'СЕО' находится в датасете Контрагента, а поле 'CustomerFIO' в датасете Договора.
А что касается
"Глова Сергей" написал:DataChange(DataField) изменяет значение какого нибудь поля, что в свою очередь вызывает событие SelfOnDatasetDataChange - вот Вам и зацикливание.
эта функция была установлена до внесения мною изменений. Как определить что она делает предложеным выше методом(scr_GrepSearch) не разобрался...
Находите scr_GrepSearch в администраторе. Нажимаете F9 или кнопочку "запустить скрипт". И пользуетесь таким функционалом для поиска непонятных функций.
"Глова Сергей" написал:Находите scr_GrepSearch в администраторе. Нажимаете F9 или кнопочку "запустить скрипт". И пользуетесь таким функционалом для поиска непонятных функций.
Это я пробовал, но в ответ Error "Метод Main не существует".
Может нужно передать ей какие то параметры?