25.02.2010, 17:56 | #1 |
Участник
|
Можно ли передать в макрос значение из переменной?
int k = 1;
#localMacro.Macro ... #endMacro Можно ли передать в макрос значение переменной k, то есть не "k" а "1"? если делать так #macro(k) то передаваемое значение = "k" |
|
25.02.2010, 18:01 | #2 |
Ищущий знания...
|
Цитата:
думаю по аналогии можно что то придумать.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
25.02.2010, 18:08 | #3 |
Ищущий знания...
|
навял пример, вроде работает
X++: ItemId itemId = 'Моя номенклатура'; InventTable inventTable; #localmacro.SelectInvTable select %1 where %1.ItemId == %2 #endmacro #selectInvTable(inventTable, itemId); info(inventTable.ItemName);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
25.02.2010, 18:21 | #4 |
Moderator
|
|
|
26.02.2010, 08:10 | #5 |
Участник
|
Цитата:
str to X++ Упс. не посмотрел, что та тема тоже ваша . Может поделитесь, что вы такое делаете, может найдётся вариант попроще Последний раз редактировалось S.Kuskov; 26.02.2010 в 08:21. |
|
26.02.2010, 10:39 | #6 |
Участник
|
Немного изменилась задача: не просто передать параметр, а передать так чтобы можно было его значение сравнить при помощи синтаксиса макроса (#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 |
Участник
|
Дело не в условии. Дело в том, что абсолютно все макроподстановки выполняются на этапе компиляции (где, как вы сами понимаете значение переменных ещё не определено). Хотите runtime - используйте подпрограммы.
Цитата:
X++: if ((%2) == 1) |
|
|
За это сообщение автора поблагодарили: Gustav (3). |
26.02.2010, 11:04 | #8 |
Участник
|
может быть вы пользуетесь неправильной постановкой задачи? какова исходная цель работы? не с технической точки зрения, а с функциональной, пользовательской ?
Налицо также непонимание вами что такое "макроподстановка". Это не процедура и не метод класса. Это подстановка части кода при компиляции. Последний раз редактировалось Bober; 26.02.2010 в 11:06. |
|
26.02.2010, 11:09 | #9 |
Участник
|
А какая у вас версия? Если тройка, то может вот в этом дело Что такое #if.never ?
|
|
26.02.2010, 11:37 | #10 |
Участник
|
Цитата:
Второй же параметр попадая в условие #IF.ARG(1) Сравнил как кусок кода, а не как значение параметра. Зачем? вопрос чисто теоретический, понятно, что я могу сделать и по-другому но просто интересно. Версия Ax 4.0 sp2 |
|
26.02.2010, 11:49 | #11 |
Участник
|
|
|
26.02.2010, 12:18 | #12 |
Moderator
|
Цитата:
Измените тип переменной AccountNum и посмотрите, что получится: X++: str AccountNum = "Клиент1"; // AccountNum AccountNum = "Клиент1"; Еще иллюстрация. Верните всё обратно, после чего внесите такие изменения: 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 |
Участник
|
Цитата:
Сообщение от Gustav
Не-а. Именно КУСОК КОДА - грубо говоря, фрагмент текста программы вида "AccountNum".
Измените тип переменной AccountNum и посмотрите, что получится: X++: str AccountNum = "Клиент1"; // AccountNum AccountNum = "Клиент1"; Для исправления ошибки досточно всего-лишь явно задать размерность символьной переменной X++: str 10 AccountNum = "Клиент1"; |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
26.02.2010, 13:15 | #14 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Gustav (2). |