|  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) { ... } | 
|  |