23.07.2007, 16:47 | #1 |
Участник
|
Результат арифметического выражения: "2*2" в 4. Как?
В старом, добром Fox'е это решалось очень просто: val = &str
А как это можно сделать в Axapta? Спасибо. |
|
23.07.2007, 16:49 | #2 |
Участник
|
поищите по runBuf
|
|
23.07.2007, 16:55 | #3 |
Banned
|
evalbuf('2*2')
|
|
|
За это сообщение автора поблагодарили: e@gle (1), CDan (1). |
23.07.2007, 16:58 | #4 |
Участник
|
Вот пример из Tabax:
X++: //src = 'AnyType mainFun(Object tabax){return '+_s+";}" void runIt(str _src, boolean _doWrite=true) { XPPCompiler comp=new XPPCompiler(); ; if(comp.compile(_src)) if (_doWrite) this.write(runBuf(_src, element)); else runBuf(_src, element); else info(comp.errorText()); } |
|
23.07.2007, 17:17 | #5 |
Участник
|
|
|
26.07.2007, 15:22 | #6 |
Участник
|
Выяснилось, что при выполнении функции evalBuf с некорректным выражением в качестве аргумента (например, с нечисловыми символами), молча прерывается выполнение текущего класса (формирование отчета, например).
Приведенный ниже пример работает и для некорректных выражений, и для случаев деления на 0: X++: real getResult(str _function) { XPPCompiler comp=new XPPCompiler(); real ret; _function = 'real result(){return ' + _function + ';}'; if(comp.compile(_function)) { try ret = runBuf(_function); catch (Exception::Error) infolog.clear(); } return ret; } |
|
26.07.2007, 18:04 | #7 |
Banned
|
Да. Только не забывайте про trustworthy computing и возможность code injection. В 4.0 рекомендуется вызывать ExecutePermission.assert():
X++: try { permission = new ExecutePermission(); if (permission == null) return ...; pseudoFunc = "static real func() { return " + expression + "; }"; permission.assert(); if(comp.compile(pseudoFunc)) { result = runBuf(expression); } else { ... } CodeAccessPermission::revertAssert(); } catch (Exception::Error) { ... } |
|