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

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

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

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

З.Ы. Я так понимаю, что значение ключевого поля в лукапе НЕ уникально?
modified() вызвался после того как я выбрал значение в лукап. Т.е. не успев прописать их, тут же стер все. Придется флаги вводить
Старый 22.03.2012, 17:15   #16  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от RomanK Посмотреть сообщение
не, в момент когда мы вызывали лукап и заполнили значением нужное нам поле, из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные .


Не то чтобы не уникально, просто нужны еще данные из таблицы
какой-то извращенный подход. сделайте лучше как, например, на форме создания заказа на продажу, при выборе кода клиента, заполняются куча полей, и не важно написали руками или выбрали из лукапа
Старый 22.03.2012, 23:07   #17  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,311 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от RomanK Посмотреть сообщение
из таблицы по которой мы сделали лукап надо в фоне затянуть еще другие значения, юзер этого не видит, но поля затягиваются. Поэтому я из лукапа возвращаю курсор и затем забираю нужные мне данные
Не то чтобы не уникально, просто нужны еще данные из таблицы
Цитата:
Сообщение от RomanK Посмотреть сообщение
по лукапу тянуться поля, ручной ввод означает разрыв связи
Цитата:
Сообщение от ice Посмотреть сообщение
какой-то извращенный подход. сделайте лучше как, например, на форме создания заказа на продажу, при выборе кода клиента, заполняются куча полей, и не важно написали руками или выбрали из лукапа
По-моему, надо просто на modified() анализировать значение (делать лишний select) по выбранному значению. Если значение в таблице находится - значит брать его. Если нет - то ничего не брать.
2RomanK: Вообще, я как-то делал объединенный лукап клиентами и поставщиками, а потом пытался "угадывать" - откуда была выбрана запись. По факту, ни к чему хорошему эта идея ни привела - т.к. было много глюков (в коде выбиралась не та запись) именно из-за ручного доввода или какого-нибудь кеша.
Поэтому, я пришел к выводу - что надежнее (с т.з. прогнозируемости работы системы) смириться с тем, что выбор из лукапа и ручной ввод - суть есть неразделимые события и их невозможно в АХ отделить друг от друга.
__________________
Возможно сделать все. Вопрос времени
Старый 23.03.2012, 01:03   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от RomanK Посмотреть сообщение
Только по лукапу тянуться поля, ручной ввод означает разрыв связи
С чего бы это? Зачем вы пытаетесь искоренить в компании продвинутых пользователей, которые наизусть помнят нужные им 5-10 возможных значений поля и чихать хотели на ваши лукапы?
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
надежнее смириться с тем, что выбор из лукапа и ручной ввод - суть есть неразделимые события и их невозможно в АХ отделить друг от друга.
А зачем вообще их отделять? Какая на фиг разница с точки зрения бизнес-логики, каким образом значение попало в поле? Если нужно подтягивать значения по умолчанию для других полей, то это нужно делать по-любому (и не факт, что тот же табличный modifiedField() окажется самым удобным решением). Потому что завтра пользователям надоест лазить по лукапам, и они захотят качать данные из Экселя - и что же, связанные поля при импорте уже не заполнять, "разрыв связи"?..
Старый 23.03.2012, 07:02   #19  
kaw is offline
kaw
Участник
 
122 / 35 (2) +++
Регистрация: 23.03.2004
Адрес: Новосибирск
"Страшно", что-то советовать после таких гуру

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

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
обязательное для заполнения поле в уже созданной записи 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, время: 05:43.