Суть вопроса проста, но к сожалению так и не смог разобраться как действует заполнение контактной информации Контакта, контактной информацией выбранного Контрагента.
Хочу сделать тоже самое с договорами...Нужно в случае выбора Контрагента заполнить поля договора регалиями котнрагента, хранящиеся в таблице Контрагент.
Прошу прощения за тавтологию. Пытался описать вопрос обширнее).
Нравится
scr_ContactAccountUtils
function FillInformationBySelectedItem(Dataset, LookupDataset, Message)
- это оно. Суть - проста. Говорим откуда тянуть данные, куда писать. Все через датасеты.
ООО "Лайнсервис"
www.ls-crm.ru
А в какой момент фактически инициируется функция заполнения?
Так как она не прикручена ни к контролу ни к датасету
function SelfOnDatasetDataChange(DataField)
в скрипте scr_Contact
function SelfOnDatasetDataChange(DataField) { .... if (DataField.Name == 'AccountID') { var LookupDataset = DataField.LookupDataset; if (!IsEmptyStr(DataField.DisplayValue)) { FillInformationBySelectedItem(Dataset, LookupDataset, DoYouWantToFillContactEntriesMessage); } return; } ... }
при смене значения в поле AccountID
а прикручено оно к ds_Contact
ООО "Лайнсервис"
www.ls-crm.ru
Для начала попытался заполнить текстовое поле "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 зависает...Не могу определить где она зацикливается.
"Швец Александр" написал:DataChange(DataField);
а вот здесь что происходит, может закомментить это?
кстати, дебаггером бы пройтись можно было, выяснить сразу где оно виснет)) еще вопрос такой - нет ли на визуальной части каких обработчиков на контролах?
ООО "Лайнсервис"
www.ls-crm.ru
Чтобы находить нужные функции в скриптах используйте 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 не существует".
Может нужно передать ей какие то параметры?
Прошу меня извинить: по памяти на скрипт указывал. Вам нужен wnd_GrepSearchScript.
"Глова Сергей" написал:Вам нужен wnd_GrepSearchScript.
Большое спасибо.
Как раз этого инструмента и не хватало на поприще исследования структуры TSCRM.