22.03.2012, 12:32 | #1 |
Участник
|
Как отделить ручной ввод данных в поле от заполнения данными по лукапу
Приветствую всех.
Требуется научиться отличать тип ввода данных в поле: ввел ли пользователь значение в поле с клавиатуры или значение было подставлено из лукапа. Как это можно определить? Желательно как минимум на уровне датасорса(не отдельного контрола) |
|
22.03.2012, 12:48 | #2 |
Участник
|
В качестве варианта можно перекрыть метод lookup на поле датасоурса и отслеживать в методе его вызов, например поставить флаг вызова лукапа, объявив его в ClassDeclaration:
X++: public void lookup(FormControl _formControl, str _filterStr) { super(_formControl, _filterStr); flag = true; } X++: public void modified() { super(); if (flag) { //какие-то дествия; } flag = false; }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 22.03.2012 в 12:56. |
|
|
За это сообщение автора поблагодарили: RomanK (1). |
22.03.2012, 12:53 | #3 |
Участник
|
Не знаю чем конкретно это может помочь, но почему-то вспомнился такой факт lookup не закрывается до завершения метода modified
Расскажите лучше зачем? Последний раз редактировалось S.Kuskov; 22.03.2012 в 12:55. |
|
22.03.2012, 12:58 | #4 |
Участник
|
Цитата:
X++: public void lookup(FormControl _formControl, str _filterStr) { flag = true; super(_formControl, _filterStr); flag = false; } |
|
|
За это сообщение автора поблагодарили: RomanK (1). |
22.03.2012, 13:02 | #5 |
северный Будда
|
Предположу, что лукап перекрыт и в него попадают не все значения т.е. выбрать можно меньше, чем ввести руками
я в таком случае просто заводил новый EDT, на котором корректно вешал отношения. правда у меня случай это позволял. В общем случае лучше дописать validate на датасоурсе и вызывать его на сохранении курсора
__________________
С уважением, Вячеслав |
|
22.03.2012, 13:19 | #6 |
Участник
|
лукап перекрыт и возвращает целую запись, потом запись дербанится и заполняются определенные поля в табличке(аля механим связки разных сущностей). Затем если пользователь вводит данные в конкретное поле вручную, а не из лукапа, связь надо разорвать(подчистить все поля которые заполнились в фоне).
Делать кнопку - "разорвать связь" в целом логично, но никто не будет делать 2 действия, сначала разрывать связь, потом еще и дату менять. Поэтому требовалось понимать вручную вводят или по лукапу значение пришло. Спасибо за советы всем, сейчас будем реализовывать )))) |
|
22.03.2012, 15:19 | #7 |
Developer
|
|
|
22.03.2012, 15:22 | #8 |
Developer
|
эксперимент провалится в стандартных лукапах не используется formRun.wait()
|
|
22.03.2012, 15:41 | #9 |
Участник
|
Лукап на таблице использующий, как вы правильно пишете, SysTableLookup
{ formRun.wait(); if (formRun.closedOk()) { табличка ваша = formRun.dataSource(1).cursor(); } return табличка ваша; } |
|
22.03.2012, 15:55 | #10 |
Участник
|
|
|
22.03.2012, 15:56 | #11 |
Developer
|
Цитата:
1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что: 2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait() т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа. З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально? |
|
22.03.2012, 16:17 | #12 |
Участник
|
Цитата:
Цитата:
Сообщение от vallys
Ну тогда вам не нужно знать откуда вы попали в modified()...
1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что: 2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait() т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа. З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально? |
|
22.03.2012, 16:23 | #13 |
Участник
|
И что, если юзер вместо выбора из лукапа сам напечатает в точности такое же значение, то поля затягивать уже не нужно? Какая-то странная логика...
|
|
22.03.2012, 16:24 | #14 |
Участник
|
Именно так. Только по лукапу тянуться поля, ручной ввод означает разрыв связи
|
|
22.03.2012, 16:33 | #15 |
Участник
|
Цитата:
Сообщение от vallys
Ну тогда вам не нужно знать откуда вы попали в modified()...
1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что: 2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait() т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа. З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально? |
|
22.03.2012, 17:15 | #16 |
Участник
|
Цитата:
Сообщение от RomanK
не, в момент когда мы вызывали лукап и заполнили значением нужное нам поле, из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные .
Не то чтобы не уникально, просто нужны еще данные из таблицы |
|
22.03.2012, 23:07 | #17 |
Administrator
|
Цитата:
Цитата:
2RomanK: Вообще, я как-то делал объединенный лукап клиентами и поставщиками, а потом пытался "угадывать" - откуда была выбрана запись. По факту, ни к чему хорошему эта идея ни привела - т.к. было много глюков (в коде выбиралась не та запись) именно из-за ручного доввода или какого-нибудь кеша. Поэтому, я пришел к выводу - что надежнее (с т.з. прогнозируемости работы системы) смириться с тем, что выбор из лукапа и ручной ввод - суть есть неразделимые события и их невозможно в АХ отделить друг от друга.
__________________
Возможно сделать все. Вопрос времени |
|
23.03.2012, 01:03 | #18 |
Участник
|
С чего бы это? Зачем вы пытаетесь искоренить в компании продвинутых пользователей, которые наизусть помнят нужные им 5-10 возможных значений поля и чихать хотели на ваши лукапы?А зачем вообще их отделять? Какая на фиг разница с точки зрения бизнес-логики, каким образом значение попало в поле? Если нужно подтягивать значения по умолчанию для других полей, то это нужно делать по-любому (и не факт, что тот же табличный modifiedField() окажется самым удобным решением). Потому что завтра пользователям надоест лазить по лукапам, и они захотят качать данные из Экселя - и что же, связанные поля при импорте уже не заполнять, "разрыв связи"?..
|
|
23.03.2012, 07:02 | #19 |
Участник
|
"Страшно", что-то советовать после таких гуру
Перекрыть метод textChange() - в котором сделать инциализацию признака "редактиров.ручками" lookup() - в котором ОБНУЛЯТЬ признак "редактиров.ручками" Идея из темы: Запрет редактирования поля Запрет на ввод данных не из lookup'а |
|
23.03.2012, 07:32 | #20 |
Участник
|
Цитата:
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|