AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.03.2012, 12:32   #1  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Как отделить ручной ввод данных в поле от заполнения данными по лукапу
Приветствую всех.
Требуется научиться отличать тип ввода данных в поле: ввел ли пользователь значение в поле с клавиатуры или значение было подставлено из лукапа. Как это можно определить?
Желательно как минимум на уровне датасорса(не отдельного контрола)
Старый 22.03.2012, 12:48   #2  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
В качестве варианта можно перекрыть метод lookup на поле датасоурса и отслеживать в методе его вызов, например поставить флаг вызова лукапа, объявив его в ClassDeclaration:
X++:
public void lookup(FormControl _formControl, str _filterStr)
{
    super(_formControl, _filterStr);
    flag = true;
}
Затем на modified этого поля повесить проверку вызова lookup'a и сброс флага:
X++:
public void modified()
{
    super();

    if (flag)
    {
        //какие-то дествия;
    }
    flag = false;
}
__________________
С уважением, Александр.

Последний раз редактировалось samolalex; 22.03.2012 в 12:56.
За это сообщение автора поблагодарили: RomanK (1).
Старый 22.03.2012, 12:58   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от samolalex Посмотреть сообщение
В качестве варианта можно перекрыть метод lookup на поле датасоурса и отслеживать в методе его вызов, например поставить флаг вызова лукапа, объявив его в ClassDeclaration:
С учётом вышесказанного, наверное должно быть вот так:
X++:
public void lookup(FormControl _formControl, str _filterStr)
{
    flag = true;
    super(_formControl, _filterStr);
    flag = false;
}
Нужен эксперимент .
За это сообщение автора поблагодарили: RomanK (1).
Старый 22.03.2012, 15:22   #4  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
С учётом вышесказанного, наверное должно быть вот так:
X++:
public void lookup(FormControl _formControl, str _filterStr)
{
    flag = true;
    super(_formControl, _filterStr);
    flag = false;
}
Нужен эксперимент .
эксперимент провалится в стандартных лукапах не используется formRun.wait()
Старый 22.03.2012, 12:53   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Не знаю чем конкретно это может помочь, но почему-то вспомнился такой факт lookup не закрывается до завершения метода modified

Расскажите лучше зачем?

Последний раз редактировалось S.Kuskov; 22.03.2012 в 12:55.
Старый 22.03.2012, 13:02   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,508 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Предположу, что лукап перекрыт и в него попадают не все значения т.е. выбрать можно меньше, чем ввести руками
я в таком случае просто заводил новый EDT, на котором корректно вешал отношения. правда у меня случай это позволял. В общем случае лучше дописать validate на датасоурсе и вызывать его на сохранении курсора
__________________
С уважением,
Вячеслав
Старый 22.03.2012, 13:19   #7  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
лукап перекрыт и возвращает целую запись, потом запись дербанится и заполняются определенные поля в табличке(аля механим связки разных сущностей). Затем если пользователь вводит данные в конкретное поле вручную, а не из лукапа, связь надо разорвать(подчистить все поля которые заполнились в фоне).
Делать кнопку - "разорвать связь" в целом логично, но никто не будет делать 2 действия, сначала разрывать связь, потом еще и дату менять. Поэтому требовалось понимать вручную вводят или по лукапу значение пришло.

Спасибо за советы всем, сейчас будем реализовывать ))))
Старый 22.03.2012, 15:19   #8  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от RomanK Посмотреть сообщение
лукап перекрыт и возвращает целую запись
Для лукапа вы используете класс SysTableLookup?
Старый 22.03.2012, 15:55   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от RomanK Посмотреть сообщение
лукап перекрыт и возвращает целую запись, потом запись дербанится и заполняются определенные поля в табличке(аля механим связки разных сущностей).
А не проще сдеалать лукап по уникальному полю, а потом в методе modifiedField на его основании заполнить все остальные?
Старый 22.03.2012, 15:41   #10  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Лукап на таблице использующий, как вы правильно пишете, SysTableLookup
{


formRun.wait();
if (formRun.closedOk())
{
табличка ваша = formRun.dataSource(1).cursor();
}

return табличка ваша;
}
Старый 22.03.2012, 15:56   #11  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от RomanK Посмотреть сообщение
Лукап на таблице использующий, как вы правильно пишете, SysTableLookup
{
formRun.wait();
if (formRun.closedOk())
{
табличка ваша = formRun.dataSource(1).cursor();
}

return табличка ваша;
}
Ну тогда вам не нужно знать откуда вы попали в modified()...

1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что:
2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait()

т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа.

З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально?
Старый 22.03.2012, 16:17   #12  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А не проще сдеалать лукап по уникальному полю, а потом в методе modifiedField на его основании заполнить все остальные?
не, в момент когда мы вызывали лукап и заполнили значением нужное нам поле, из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные .

Цитата:
Сообщение от vallys Посмотреть сообщение
Ну тогда вам не нужно знать откуда вы попали в modified()...

1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что:
2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait()

т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа.

З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально?
Не то чтобы не уникально, просто нужны еще данные из таблицы
Старый 22.03.2012, 16:23   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от RomanK Посмотреть сообщение
не, в момент когда мы вызывали лукап и заполнили значением нужное нам поле, из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются.
И что, если юзер вместо выбора из лукапа сам напечатает в точности такое же значение, то поля затягивать уже не нужно? Какая-то странная логика...
Старый 22.03.2012, 16:24   #14  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Именно так. Только по лукапу тянуться поля, ручной ввод означает разрыв связи
Старый 22.03.2012, 17:15   #15  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от RomanK Посмотреть сообщение
не, в момент когда мы вызывали лукап и заполнили значением нужное нам поле, из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные .


Не то чтобы не уникально, просто нужны еще данные из таблицы
какой-то извращенный подход. сделайте лучше как, например, на форме создания заказа на продажу, при выборе кода клиента, заполняются куча полей, и не важно написали руками или выбрали из лукапа
Старый 22.03.2012, 23:07   #16  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от RomanK Посмотреть сообщение
из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные
Не то чтобы не уникально, просто нужны еще данные из таблицы
Цитата:
Сообщение от RomanK Посмотреть сообщение
по лукапу тянуться поля, ручной ввод означает разрыв связи
Цитата:
Сообщение от ice Посмотреть сообщение
какой-то извращенный подход. сделайте лучше как, например, на форме создания заказа на продажу, при выборе кода клиента, заполняются куча полей, и не важно написали руками или выбрали из лукапа
По-моему, надо просто на modified() анализировать значение (делать лишний select) по выбранному значению. Если значение в таблице находится - значит брать его. Если нет - то ничего не брать.
2RomanK: Вообще, я как-то делал объединенный лукап клиентами и поставщиками, а потом пытался "угадывать" - откуда была выбрана запись. По факту, ни к чему хорошему эта идея ни привела - т.к. было много глюков (в коде выбиралась не та запись) именно из-за ручного доввода или какого-нибудь кеша.
Поэтому, я пришел к выводу - что надежнее (с т.з. прогнозируемости работы системы) смириться с тем, что выбор из лукапа и ручной ввод - суть есть неразделимые события и их невозможно в АХ отделить друг от друга.
__________________
Возможно сделать все. Вопрос времени
Старый 22.03.2012, 16:33   #17  
RomanK is offline
RomanK
Участник
 
41 / 11 (1) +
Регистрация: 08.11.2006
Записей в блоге: 1
Цитата:
Сообщение от vallys Посмотреть сообщение
Ну тогда вам не нужно знать откуда вы попали в modified()...

1. в методе контрола modified() реализовать очистку "связанных полей" без всяких проверок, потому что:
2. метод контрола modified() вызывается ядром в рамках вызова formRun.wait()

т.е. "связанные поля" будут очищаться всегда при изменении ключевого поля, а заполняться только при успешной отработке лукапа.

З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально?
modified() вызвался после того как я выбрал значение в лукап. Т.е. не успев прописать их, тут же стер все. Придется флаги вводить
Старый 23.03.2012, 07:02   #18  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
"Страшно", что-то советовать после таких гуру

Перекрыть метод
textChange() - в котором сделать инциализацию признака "редактиров.ручками"
lookup() - в котором ОБНУЛЯТЬ признак "редактиров.ручками"

Идея из темы:
Запрет редактирования поля
Запрет на ввод данных не из lookup'а
Старый 23.03.2012, 07:32   #19  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от kaw Посмотреть сообщение
Перекрыть метод
textChange() - в котором сделать инциализацию признака "редактиров.ручками"
то же сначала хотел посоветовать, но
Цитата:
Сообщение от RomanK Посмотреть сообщение
Приветствую всех.
Требуется научиться отличать тип ввода данных ......
Желательно как минимум на уровне датасорса(не отдельного контрола)
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 23.03.2012, 08:22   #20  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
В этом случае, можно использовать метод tooltip()
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
обязательное для заполнения поле в уже созданной записи vanokh DAX: Программирование 12 27.09.2011 22:09
Одновременно поле и метод данных таблицы в отчете wojzeh DAX: Программирование 2 19.03.2010 17:47
ввод данных через буффер Daido DAX: Программирование 11 27.07.2007 16:42
Ввод исторических данных по ОС (Axapta) nat DAX: Функционал 4 08.11.2005 12:04
Запрет на ввод данных не из lookup'а petr DAX: Программирование 7 09.08.2005 16:30

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:12.