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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.02.2013, 17:31   #1  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Странности с вхождением в условие
Есть такой код

X++:
   if ((smmQuotationPhaseGroup.PhaseId == SalesQuotationLine.Status)
        && (smmQuotationPhaseGroup.IsAskCode == NoYes::Yes))
    {
        SalesQuotationLine_ds.object(fieldnum(SalesQuotationLine,StatusReasonCode)).visible(true);
    }
    else
    {
       SalesQuotationLine_ds.object(fieldnum(SalesQuotationLine,StatusReasonCode)).visible(false);

    }
В дебагере вижу такое

X++:
NAME:SalesQuotationLine.Status
VALUE:09
TYPE:str20

NAME:smm.
VALUE:Yes
TYPE:NoYes

NAME:smm.PhaseId
VALUE:09
TYPE:str20
То есть, значения совпадают и по идее должно заходить в условие, а оно сразу прыгает на else. Натолкните на мысль, где беда? Подозреваю, что мелкое что-то, проглядел...

Последний раз редактировалось user_ax; 19.02.2013 в 17:41.
Старый 19.02.2013, 17:40   #2  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Пробовал сделать отдельное условие так

X++:
 if (str2int(smmQuotationPhaseGroup.PhaseId) == str2int(SalesQuotationLine.Status))
Всё равно, дальше него не заходит...
У обоих полей тип string.. Не знаю, куда копать.
Старый 19.02.2013, 18:03   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,686 / 1190 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
У Вас в коде используется таблица smmQuotationPhaseGroup, а в отладчике информация о полях таблицы smm.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 19.02.2013, 18:04   #4  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
У Вас в коде используется таблица smmQuotationPhaseGroup, а в отладчике информация о полях таблицы smm.
У меня datasource называется smm, он ссылается на таблицу smmQuotationPhaseGroup
Старый 19.02.2013, 18:14   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,686 / 1190 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от user_ax Посмотреть сообщение
У меня datasource называется smm, он ссылается на таблицу smmQuotationPhaseGroup
Так ведь "ссылается", а не "называется". Вы путаете имя объекта АОТ и имя переменной, в которой содержится ссылка на экземпляр этого объекта. Как правило, они совпадают. Но в данном случае они отличаются. По сути, Вы все время используете для сравнения пустые значения.

Укажите в коде имя datasource, а не имя таблицы.

А чтобы было понятно, в чем проблема, добавьте в Вашем коде вывод в infolog непосредственно перед сравнением

X++:
info(strfmt("smmQuotationPhaseGroup recId=%1 PhaseId=%2", smmQuotationPhaseGroup.RecId, smmQuotationPhaseGroup.PhaseId));
info(strfmt("smm recId=%1 PhaseId=%2", smm.RecId, smm.PhaseId));

if (...)
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 19.02.2013 в 18:16.
За это сообщение автора поблагодарили: user_ax (1).
Старый 19.02.2013, 18:19   #6  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Так ведь "ссылается", а не "называется". Вы путаете имя объекта АОТ и имя переменной, в которой содержится ссылка на экземпляр этого объекта. Как правило, они совпадают. Но в данном случае они отличаются. По сути, Вы все время используете для сравнения пустые значения.

Укажите в коде имя datasource, а не имя таблицы.

А чтобы было понятно, в чем проблема, добавьте в Вашем коде вывод в infolog непосредственно перед сравнением

X++:
info(strfmt("smmQuotationPhaseGroup recId=%1 PhaseId=%2", smmQuotationPhaseGroup.RecId, smmQuotationPhaseGroup.PhaseId));
info(strfmt("smm recId=%1 PhaseId=%2", smm.RecId, smm.PhaseId));

if (...)
То есть можно использовать имя датасоурса и не определять табличную переменную? Я ещё не до конца вник.
Получилось.
Спасибо вам большое.
Все эти ошибки - самый лучший урок.
Старый 19.02.2013, 18:39   #7  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Ещё вопрос: после того, как поле отобразилось, нужно чтобы оно сразу же появилось на форме, то есть при потере фокуса либо при переходе на другое поле.
Я так понимаю, нужно дописывать что-то в updatedesign формы?
Старый 19.02.2013, 18:44   #8  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Ещё вопрос: после того, как поле отобразилось, нужно чтобы оно сразу же появилось на форме, то есть при потере фокуса либо при переходе на другое поле.
Я так понимаю, нужно дописывать что-то в updatedesign формы?
а отобразилось и появилось это не одно и тоже? что Вы имеете ввиду?

P.S. возможно речь про
X++:
smmQuotationPhaseGroup_ds.refresh();
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 19.02.2013, 18:47   #9  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от lev Посмотреть сообщение
а отобразилось и появилось это не одно и тоже? что Вы имеете ввиду?

P.S. возможно речь про
X++:
smmQuotationPhaseGroup_ds.refresh();
Ой, да, это я что-то заговорился...
Нужно чтобы после выполнения visible(true) поле стало видимым на форме.
Сейчас оно не становится таким.
И refresh() не помог.
Старый 19.02.2013, 18:54   #10  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Ой, да, это я что-то заговорился...
Нужно чтобы после выполнения visible(true) поле стало видимым на форме.
Сейчас оно не становится таким.
И refresh() не помог.
Это контрол на форме?
Если да, то тогда ставите ему свойство AutoDeclaration в Yes, а потом в коде в нужный момент к нему обращаетесь и проставляете нужное свойство.
X++:
MyControl.visible(true);
Если это поле таблицы, тогда, по другому, вот пример:
X++:
InventTable_ds.object(fieldnum(InventTable, ItemId)).visible(true);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 19.02.2013, 18:59   #11  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Это контрол на форме, но скрываю\показываю я поле таблицы.

X++:
SalesQuotationLine_ds.object(fieldnum(SalesQuotationLine,StatusReasonCode)).visible(true);
вот так вот. Мне подсказали, что так лучше делать.

Мне нужно при выполнении моего условия(изменение значения в выпадающем списке) сделать скрытие\отображения конкретного поля.
Старый 19.02.2013, 19:08   #12  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
...

X++:
SalesQuotationLine_ds.object(fieldnum(SalesQuotationLine,StatusReasonCode)).visible(true);
вот так вот. Мне подсказали, что так лучше делать.
...
ну я вам ровно это и написал в предыдущем сообщении

так в итоге получилось все?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 19.02.2013, 19:12   #13  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от lev Посмотреть сообщение
ну я вам ровно это и написал в предыдущем сообщении

так в итоге получилось все?
Увы, но нет, не хочет (( Вернее, проверку проходит, а поля не появляются при сохранении либо переходе фокуса.
Старый 19.02.2013, 19:14   #14  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
Увы, но нет, не хочет (( Вернее, проверку проходит, а поля не появляются при сохранении либо переходе фокуса.
Значит вы не там пишите этот код... Где вы прописываете visible(true)? (в каком объекте и в каком методе формы)
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 19.02.2013, 19:15   #15  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Код я прописываю в методе active датасоурса salesquotationtable.
Нужные мне поля из таблицы salesquotatuiontable.
Старый 19.02.2013, 19:23   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
поля не появляются при сохранении либо переходе фокуса.
Цитата:
Сообщение от user_ax Посмотреть сообщение
Код я прописываю в методе active датасоурса
Cохранение данных и вызов метода active() автоматически не происходит при переходе фокуса на соседнее поле той же строки. Для того чтобы инициировать такое поведение нужно в методе modified редактируемого поля явно вызвать метод write() датасорса.
Старый 20.02.2013, 09:14   #17  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Метод active() срабатывает при переходе с одной записи на другую, а также при открытии формы (что собственно является переходом на первую, либо последнюю запись). Как уже сказали выше, при передаче фокуса перекрывайте метод modified на контроле или на поле датасорса.
__________________
// no comments
Старый 20.02.2013, 10:26   #18  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
То есть мне нужно показ\скрытие полей вставить в метод modified поля датасоурса для отображения его? Попробую, спасибо большое!
Старый 20.02.2013, 10:56   #19  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от user_ax Посмотреть сообщение
То есть мне нужно показ\скрытие полей вставить в метод modified поля датасоурса для отображения его? Попробую, спасибо большое!
не совсем так.
1. создайте метод visibleFields, в корне формы (там где метод classDeclaration). в этом методе пропишите необходимый алгоритм отображения и столбцов датасорсов и любых других контролов формы. в будующем везде вы будете использовать этот метод, когда будет необходимо изменить видимость (а не писать одно и тоже тыщу раз). В дальнейшем вызов этого метода выглядит как:
X++:
element.visibleFields();
Для управления видимости столбцов датасорса, можно на самом датасорсе создать метод visibleColums(), в нем прописать логику отображения столбцов. И в методе visibleFields() этот метод вызвать (так мы разделим управление видимостью столбцами и прочих контролов формы). Т.е. в итоге метод visibleFields буде выглядеть примерно так:
X++:
...
MyTable_ds.visibleColums();

AnyControl.visible(...);
AnyControl2.visible(...);
...
2. Если вам необходимо изменять видимости после измененеия значения в каком либо поле, тогда нужно будет вызвать метод определения видимости (который мы создали в первом пункте) из метода modified изменяемого поля. Например, если при изменении поля ItemId (Код номенклатуры) нам необходимо скрыть какое то поле, тогда в методе modified поля ItemId датасорса прописываем после super() код:
X++:
element.visibleFields();
а в методе visibleColum датасорса SalesQuotationLine надо прописать:
X++:
SalesQuotationLine_ds.object(fieldnum(SalesQuotationLine,ItemId)).visible(AnyParameters);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 20.02.2013, 11:03   #20  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
lev, спасибо больше за столь подробное объяснение, сейчас буду делать.

Пока что вставил свои условия в метод modified того контрола, в котором выбирается данное услвоие - отрабатывает лишь одно из двух...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
условие с датой в Query romanja DAX: Программирование 5 07.04.2011 10:25
Условие по агрегатам в запросе cherv DAX: Программирование 5 14.08.2006 14:55
Глючит условие в запросе Sada DAX: Программирование 5 28.04.2006 05:19
Условие на поле NotEmpty Logger DAX: Программирование 3 12.05.2005 12:32
Как в range на одно и тоже контейнерное поле поставить условие: "исключ." && like Pustik DAX: Программирование 15 03.07.2004 11:54

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:21.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.