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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.02.2010, 17:56   #1  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
! Можно ли передать в макрос значение из переменной?
int k = 1;

#localMacro.Macro
...
#endMacro

Можно ли передать в макрос значение переменной k, то есть не "k" а "1"?

если делать так
#macro(k)
то передаваемое значение = "k"
Старый 25.02.2010, 18:01   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от propeller Посмотреть сообщение
int k = 1;

#localMacro.Macro
...
#endMacro

Можно ли передать в макрос значение переменной k, то есть не "k" а "1"?

если делать так
#macro(k)
то передаваемое значение = "k"
посмотрите для примера макрос InventDimJoin.
думаю по аналогии можно что то придумать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 25.02.2010, 18:08   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
навял пример, вроде работает
X++:
ItemId      itemId = 'Моя номенклатура';
    InventTable inventTable;

    #localmacro.SelectInvTable
        select %1
            where %1.ItemId == %2
    #endmacro

    #selectInvTable(inventTable, itemId);

    info(inventTable.ItemName);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 26.02.2010, 08:10   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
Можно ли передать в макрос значение переменной k, то есть не "k" а "1"?
Имя переменной - можно, значение - НЕЛЬЗЯ. Но то это и называется МАКРО подстановка. Если вам необходимо динамически конструировать выполняемый код, то попробуйте поискать в сторону
str to X++

Упс. не посмотрел, что та тема тоже ваша . Может поделитесь, что вы такое делаете, может найдётся вариант попроще

Последний раз редактировалось S.Kuskov; 26.02.2010 в 08:21.
Старый 26.02.2010, 10:39   #6  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Немного изменилась задача: не просто передать параметр, а передать так чтобы можно было его значение сравнить при помощи синтаксиса макроса (#IF.ARG() или что то подобное)

Вот этот job не выдает сообщение.
Но если вызвать так: #cycle(AccountNum,1) то info() jотрабатывает.
Может быть пользуюсь не правильным условием?

X++:
static void Job1(Args _args)
{
    CustTable CustTable;
    AccountNum AccountNum = "Клиент1";
    int int1 = 1;
    ;
    #localMacro.cycle
    #DEFINE.ARG(%2)
    while select *
    from CustTable
    where CustTable.AccountNum == %1
    {
        #IF.ARG(1)
        info (CustTable.AccountNum);
        #ENDIF
    }
    #UNDEF.ARG
    #endMacro
    #cycle(AccountNum,int1)
}
Старый 26.02.2010, 11:03   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
Может быть пользуюсь не правильным условием?
Дело не в условии. Дело в том, что абсолютно все макроподстановки выполняются на этапе компиляции (где, как вы сами понимаете значение переменных ещё не определено). Хотите runtime - используйте подпрограммы.
Цитата:
Сообщение от propeller Посмотреть сообщение
передать так чтобы можно было его значение сравнить при помощи синтаксиса макроса (#IF.ARG() или что то подобное)
А с чем связано это ограничение? почему не простое
X++:
if ((%2) == 1)
За это сообщение автора поблагодарили: Gustav (3).
Старый 26.02.2010, 11:04   #8  
Bober is offline
Bober
Участник
 
311 / 104 (4) +++++
Регистрация: 29.05.2007
Цитата:
Сообщение от propeller Посмотреть сообщение
Может быть пользуюсь не правильным условием?
может быть вы пользуетесь неправильной постановкой задачи? какова исходная цель работы? не с технической точки зрения, а с функциональной, пользовательской ?

Налицо также непонимание вами что такое "макроподстановка". Это не процедура и не метод класса. Это подстановка части кода при компиляции.

Последний раз редактировалось Bober; 26.02.2010 в 11:06.
Старый 26.02.2010, 11:09   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А какая у вас версия? Если тройка, то может вот в этом дело Что такое #if.never ?
Цитата:
Сообщение от vallys Посмотреть сообщение
Хотелось бы отметить, что в тройке (по крайней мере до SP2 включительно) при использовании "сокращенного" варианта в конструкциях #macro, #localmacro, #globalmacro не будут доступны параметры %1, %2, ...
Старый 26.02.2010, 11:37   #10  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Дело не в условии. Дело в том, что абсолютно все макроподстановки выполняются на этапе компиляции (где, как вы сами понимаете значение переменных ещё не определено).
Дело именно в условии, потому что параметр AccountNum передал ИМЕННО значение а не кусок кода.
Второй же параметр попадая в условие #IF.ARG(1)
Сравнил как кусок кода, а не как значение параметра.

Зачем? вопрос чисто теоретический, понятно, что я могу сделать и по-другому но просто интересно.
Версия Ax 4.0 sp2
Старый 26.02.2010, 11:49   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
Сравнил как кусок кода, а не как значение параметра.

Именно, и никак иначе. Именно это и назывется макроподстановкой
Старый 26.02.2010, 12:18   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от propeller Посмотреть сообщение
Дело именно в условии, потому что параметр AccountNum передал ИМЕННО значение а не кусок кода.
Не-а. Именно КУСОК КОДА - грубо говоря, фрагмент текста программы вида "AccountNum".
Измените тип переменной AccountNum и посмотрите, что получится:
X++:
    str AccountNum = "Клиент1";
    // AccountNum AccountNum = "Клиент1";
Имеем сообщение компилятора: "Контейнерные и текстовые поля не могут быть использованы в выражении WHERE."

Еще иллюстрация. Верните всё обратно, после чего внесите такие изменения:
X++:
    AccountNum AccountNum = "Клиент1";
    ..................    
    while select *
    from CustTable
    // where CustTable.AccountNum == %1
    where CustTable.AccountNum %1
    ..................    
    //#cycle(AccountNum,int1)
    #cycle(== AccountNum,int1)
}
Всё компилируется и работает.
Старый 26.02.2010, 12:54   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Gustav Посмотреть сообщение
Не-а. Именно КУСОК КОДА - грубо говоря, фрагмент текста программы вида "AccountNum".
Измените тип переменной AccountNum и посмотрите, что получится:
X++:
    str AccountNum = "Клиент1";
    // AccountNum AccountNum = "Клиент1";
Имеем сообщение компилятора: "Контейнерные и текстовые поля не могут быть использованы в выражении WHERE."
Это старая фича, которая вполне адекватно описана в сообщении об ошибке. И макросы тут совершенно не при чем. Ошибка будет и в тексте программы без макроса. Проблем в том, что не указана размерность символьного переменной.

Для исправления ошибки досточно всего-лишь явно задать размерность символьной переменной

X++:
    str 10 AccountNum = "Клиент1";
За это сообщение автора поблагодарили: Gustav (2).
Старый 26.02.2010, 13:15   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
И макросы тут совершенно не при чем
Ключевым моментом здесь является, не какая-то конкретная ошибка, а тот факт что ошибка вообще возникла на этапе компиляции. Тем самым ещё раз подтверждая, что макросы заменяются их значениями именно во время компиляции!
За это сообщение автора поблагодарили: Gustav (2).
Теги
макрос

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как из формы передать значение? s.alex DAX: Программирование 18 16.05.2013 00:56
Получить значение qbr .. propeller DAX: Программирование 2 07.11.2009 00:19
Каким образом можно получить значение поля, зная fieldId? Lemming DAX: Программирование 10 19.06.2006 12:25
присовить значение контролу отчета Pavel Pustovalov DAX: Программирование 2 29.06.2005 08:56
Можно ли передать котрол формы как параметр метода? nicky DAX: Программирование 6 23.05.2005 18:40

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

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

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