Я добавил в контрагенты пользовательское поле(Boolean), указывающие является ли компания холдингом.Если компания является холдингом, она не имеет юр. реквизитов и только к ней могут быть привязаны(добавлены взаимосвязи) обычные контрагенты.
Суть проблемы:
В окне RelationEdit есть 4 LookupContorl edtFrom,edtTo,edtToBottom,edtFromBottom.Я не могу понять и найти как же они привязываются к определенным справочникам(им устанавливается только DataFieldName, а SelectWindowsUsi нигде не привязывается).Я хотел бы при их привязке профильтровать dataset`ы справочников, к которым они привязываются, чтобы главным элементом в связке мог быть только холдинг, а подчиненным - обычный контрагент.
Не могли бы вы прояснить мне систему привязки этих LookupContorl и подсказать где же в данном примере я мог бы профильтровать их справочники
Нравится
Событие OnPrepareSelectWindow необходимого контрола, использовать ApplyDatasetFilter(Dataset, FilterName, ParamValue, Enabled), предварительно подключив скрипт scr_DB к текущему скрипту.
как я понимаю это надо применять к LookupContorl, я хотел бы найти где же он выбирает соответствующий справочник,чтобы добавить фильтр в DataSet этого справочника(т.е. впринципе я бы хотел понять как он работает)
В окне RelationEdit на закладке "Невизуальные" у dlData в свойстве Dataset указывается набор данных (если не ошибаюсь, он подставляется динамически). У интересующих Вас элементов управления в свойстве DatasetLink указан dlData и в свойстве DataFieldName поле из набора данных dlData.Dataset. Если открыть сервис этого набора данных, то там будут присутствовать эти поля, для каждого из которых в поле "Источник данных для справочника" указан тот справочник, данные из которого отображаются при нажатии на лупу элемента управления, соответствующего в окне редактирования этому полю.
Фильтровать данные справочников Вы можете так, как написал Олег.
Спасибо за помощь)
Есть ещё один вопрос
В RelationEdit есть 2 связанных лукапа в которых выбераются роли. Как можно програмно выбрать эти роли? + Не могли бы подсказать как у окон справочников, типа ролей и контрагентов, появляются кнопки ОК и Отменить, и как происходит процес выбора определенной записи
Денис, если программно установить роль Вы хотите в зависимости от выбранного контрагента, то нужно в обработчике события не визуального компонента dlData dlDataOnDatasetDataChange прописать примерно такое:
if (DataField.Name == 'ContactAID') { DataField.ParentDataFields.ParentDataset('RoleBID') = <значение> }
Если у элемента управления не установлено свойство SelectWindowUSI, то при нажатии на лупу открывается стандартное окно wnd_SelectData, ему передается набор данных, указанный у поля как источник данных справочника. Это окно реализует поиск и выбор нужного значения. При нажатии на кнопку OK окно посылает Notify элементу управления, вызвавшему его, передавая вместе с ним в атрибуте KeyValue выбранное значение, элемент управления в свою очередь принимает и устанавливает соответствующее значение. Если в свойстве SelectWindowUSI указать другое окно, то нужно обеспечить заполнение атрибута KeyValue при нажатии на ОК этого окна.
Денис, программно заполнять значения окна редактирования можно так:
dlData.Dataset.Values('<Название поля в датасете>') = <Значение>;
Где это выполнять - зависит от поставленной задачи. Если при открытии окна - в обработчике события OnPrepare окна редактирования, если при изменении значения в другом поле - в обработчике события OnDatasetDataChange компонента dlData, и т.д.
Кнопки "ОК" и "Отмена" изначально присутствуют в окне выбора. При выборе значения справочника для контрола используется окно wnd_SelectData (если в свойстве SelectWindowUSI контрола не указано другое окно). Во время нажатия на "ОК" этого окна ID выделенных Вами записей сохраняются в атрибуты "KeyValue" и "KeyValues" и с помощью механизма нотификации передаются окну редактирования, точнее, его контролу, с которого вызывалось окно выбора.
Реализацию функциональности выбора из справочника Вы можете посмотреть в скрипте scr_SelectData. Заполнение полей - в большинстве скриптов карточек редактирования системы Terrasoft.
updated Прошу прощения за дубляж, не заметил...
Олег Лабьяк,
инженер-программист
3-я линия Службы поддержки Terrasoft.