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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.11.2005, 13:24   #1  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Проверка на передачу пустого параметра в макрос
Добрый день. Необходимо в зависимости от того, нужно или нет фильтровать проводки по складу, изменять запрос по проводкам. Возьмем самый простейший пример:


static void Job1(Args _args)
{
#macrolib.InventABC
InventTrans inventTrans;
InventDim inventDim;
InventLocationId location = 'Ск2';
;
while select inventTrans
{
print inventTrans.ItemId;
}
pause;
}


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

/* %1 InventTrans, CustInvoiceTrans...*/
/* %2 InventLocationId */
#localmacro.InventABCDim
#ifnot.empty(%2)
join tableId from InventDim
index hint DimIdIdx
where (InventDim.InventDimId == %1.InventDimId) &&
(InventDim.InventLocationID == %2)
#endif
#endmacro


Но он не в полной мере меня устраивает. Если вызвать макрос с обеими заполненными параметрами, то печатаются все проводки по данному складу, все ок. Если второй параметр не указывать - печатает все проводки. Если в качестве второго параметра задать пустую строку, то, естественно, выводятся все проводки, у которых склад не задан. Мне же в этом случае необходимо, как и в случае с незаданным параметром "%2", выводить все проводки.
Есть ли в макросах, наряду с проверкой #ifnot.empty(%2) возможность проверки, что параметр передан, но он пустой (в случае строки) либо нулевой (в случае числа)? Не хочется в коде плодить лишние условия, ветки, дублировать запрос и т.д. Хотелось бы реализовать все красиво и одной строкой вида:

while select inventTrans #InventABCDim(inventTrans, location)

только не получается как-то сделать обработку условия, что переменная location - пустая (склад не указан). Возможно, решение совсем простое, только я его не вижу... Может, кто-то знает, как это реализовать?
Старый 24.11.2005, 14:04   #2  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
Макросы в тройке были оставлены для совместимости с предыдущими версиями. В новых версиях от них обещают отказаться. (Тебе бы этого не знать, Лен) Может ну их эти макросы?
Одной строкой конечно красиво, но подумай о тех кто возможно будет поднимать это на новую версию
__________________
С уважением, kvan.
Старый 24.11.2005, 14:42   #3  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Просто мне придется делать это в десятках мест и в нескольких классах, вот из-за чего и кажется, что все эти повторы, проверки и разветвления будут выглядеть весьма убого в лучшем случае.:-( Макрос казался все-таки более изящным выходом и универсальным. Ладно, спасибо, Антон, буду искать другой вариант. :-)
Старый 24.11.2005, 15:06   #4  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
А двумя заходами не получиться?
Что то типа:

while select inventTrans
where inventTrans.InventLocationId // Invent location is not empty
#InventABCDim(inventTrans, location)
{
// Do something
}

и

while select inventTrans
where !inventTrans.InventLocationId // Invent location is empty
{
// Do something
}
__________________
С уважением, kvan.
Старый 24.11.2005, 16:08   #5  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
Получится, но при этом придется продублировать весь метод. Для примера:
Classes/CustVendTransStatistics/calc
Там запрос встречается четыре раза, и каждый раз придется его "размножать" на два:-(
Старый 24.11.2005, 16:18   #6  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
Так как похоже что макросом тебе не извернуться, я бы попробывал и "размножение на два" и дополнительные проверки.
И оставил бы то что работает быстрее
__________________
С уважением, kvan.
Старый 24.11.2005, 16:43   #7  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
да, душа тянется к совершенству, а приходиться жить в реальном мире...
Старый 24.11.2005, 16:50   #8  
kvan is offline
kvan
Moderator
Аватар для kvan
Дети Юза
 
775 / 49 (3) +
Регистрация: 07.08.2002
Адрес: Donetsk
лучшее враг хорошего ...
__________________
С уважением, kvan.
Старый 24.11.2005, 16:50   #9  
vey is offline
vey
Участник
 
60 / 12 (1) ++
Регистрация: 15.03.2005
Адрес: Киев
приходится
Старый 24.11.2005, 17:08   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А почему не хотите попробовать Query ?

Кроме того в приведенном примере можно написать так
...
where (InventDim.InventDimId == %1.InventDimId) &&
((InventDim.InventLocationID == %2 && %2) || !%2)
Старый 24.11.2005, 17:35   #11  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Сообщение от vey
Есть ли в макросах, наряду с проверкой #ifnot.empty(%2) возможность проверки, что параметр передан, но он пустой (в случае строки) либо нулевой (в случае числа)?
Нет, такой возможности не может быть по определению. Я уже как-то писал об этом, неохота искать. Суть в том, что макрос используется по своему прямому назначению (подстановке) только в момент компиляции. А в этот момент значение переменных, естественно, еще неизвестно
__________________
Андрей.
Старый 24.11.2005, 17:50   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
((InventDim.InventLocationID == %2 && %2) || !%2)
эквивалентно
X++:
(InventDim.InventLocationID == %2 || !%2)
Старый 24.11.2005, 23:28   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от vey
Решила реализовать данную задачу с использованием макроса, который будет подставлять в запрос либо Join с таблицей InventDim, либо ничего. Написанный макрос выглядит следующим образом:
Полностью согласен с kvan - макросы лучше не использовать.
Полностью согласен с belugin

Если вы все же решили использовать макросы, то пользуйтесь стандартными макросами для подстановки в запрос
InventDimJoin
InventDimSelect

Во-первых, вы ничего не забудете
Во-вторых, порядок полей в where у вас всегда будет одинаковым. Что благотворно скажется на производительности.
__________________
полезное на axForum, github, vk, coub.
Старый 25.11.2005, 09:20   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от kvan
Макросы в тройке были оставлены для совместимости с предыдущими версиями. В новых версиях от них обещают отказаться.
А можно об этом подробнее - где можно посмотреть эту информацию (и от чего еще собираются отказаться)
__________________
Axapta v.3.0 sp5 kr2
Старый 25.11.2005, 11:27   #15  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Да, мне тоже интересно, зачем отказываться от достаточно популярного и практичного механизма макросов?
__________________
Андрей.
Старый 25.11.2005, 12:01   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Про макросы было написано в Best Practice, по-моему.

Макросы чертовски неудобная штука. Именно из-за макрософ приходится делать глобальную компиляцию.
Сейчас их рекомендуется использовать только для констант.
__________________
полезное на axForum, github, vk, coub.
Старый 25.11.2005, 12:10   #17  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
>>Именно из-за макрософ приходится делать глобальную компиляцию

можешь пояснить?
Старый 25.11.2005, 12:54   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Синтаксический контроль позволяет выявить все объекты, которые затронутся при изменении любого заданного объекта.
Кроме случаев, когда используются макросы. Поскольку макросы - надсинтаксическая конструкция.

Для того, чтобы гарантировать, что все объекты компилируются правильно при изменении макроса приходится компилировать все объекты. Кроме того, компиляцию приходится делать многопроходной.

Сразу отвечу на вопрос - а можно ли заставить синтаксический анализатор учитывать макросы? Ответ - нет. Поскольку есть условные макросы и могут быть макросы в макросах. (Вспомни, как организована компиляция C и C++ в инструментальных средах - на основании информации об использовании ФАЙЛОВ, а не объектов)

Если макросов нет, то при изменении любого объекта достаточно перекомпилировать объекты, интерфейсно связанные с данным объектом.
__________________
полезное на axForum, github, vk, coub.
Старый 25.11.2005, 17:45   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
если макросы есть достаточно перекомпилировать объекты, которые используют макрос - разве не так?
Старый 11.04.2013, 03:11   #20  
Romb is offline
Romb
Участник
Аватар для Romb
 
79 / 22 (1) +++
Регистрация: 06.01.2004
В теме обсуждения, абстрагируясь от макросов, стоит задача написать универсальный запрос в одну конструкцию, которая бы корректно учитывала значения параметров из условий запроса. Это есть прямая необходимость при построении конструкции запроса использовать логику более высшего уровня, чем предлагает X++ в аспекте работы с данными like SQL. Т.е., очевидно, что тут необходимо конструировать структуру запроса программно. Если уж необходимость в таких "умных" запросах возникает часто, то прямой путь - абстрагировать логику.
Бла-бла-бла

Короче, по моему мнению надо делать метод без макросов (м.б. и статический), который в зависимости от переданных параметров возвращает курсор(ы). Далее по ним бежать next-ом.

Что-то типа:

X++:
cursor = getMySmartCursor(inventTrans, location);

do
{
if (cursor) ...
.....
next cursor;
} while (cursor);
и вызывать его одинаковым образом в коде. При этом логика выделена, при изменениях требуется модификация только одного метода, а внутри него можно хоть вавилонские башни строить.Это уже по желанию.

Как актуален и свеж мой комментарий в 2013 году. 8 лет я готовился к этому...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Значение по умолчанию параметра типа EDT c array elements либо просто массива HorrR DAX: Программирование 16 20.02.2008 19:18
Выполнить макрос Excel из x++ vasiliy DAX: Программирование 2 24.11.2006 17:57
Проверка целостности coja DAX: Администрирование 6 06.09.2006 13:14
Проверка цикличности в спецификации vey DAX: Функционал 2 24.03.2005 11:03
Передача параметра из формы в отчет liza DAX: Программирование 1 29.09.2003 14:04

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

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

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