AX2012 XppCompiler create method动态创建方法并运行
在用友系列的软件中经常可以看到可配置的计算公式,AX中其实也有可配置的公式,如call center呼叫中心的欺诈Fraud rule的配置,AX后台可以根据配置规则,变量,条件来动态产生方法并执行,如下:
public static boolean executeRule(MCRUpSellRule _rule, RecId _salesLineRecId)
{
str condition;
str andOr;
MCRUpSellVarRule mcrUpSellVarRule;
MCRUpSellVarRuleDetail mcrUpSellVarRuleDetail;
//BP Deviation Documented
XppCompiler xppCompiler;
MCRFraudRule mcrFraudRule;
MCRUpSellRule rule = _rule;
new ExecutePermission().assert();
// BP Deviation Documented
xppCompiler = new xppCompiler();
condition = "";
andOr = "";
while select Operand, LeftParen, RightParen, ConditionName from mcrUpSellVarRuleDetail where mcrUpSellVarRuleDetail.RuleID == rule
{
switch (mcrUpSellVarRuleDetail.Operand)
{
case MCRUpSellOperandType::None: andOr = ""; break;
case MCRUpSellOperandType::AND: andOr = ' && '; break;
case MCRUpSellOperandType::OR: andOr = ' || '; break;
}
condition = condition
+ enum2str(mcrUpSellVarRuleDetail.LeftParen)
+ 'MCRUpSellCrossSell::executeCondition('
+ strfmt('%1', _salesLineRecId) + ', \''
+ mcrUpSellVarRuleDetail.ConditionName + '\')'
+ enum2str(mcrUpSellVarRuleDetail.RightParen) + andOr;
}
condition = 'boolean retstuff(){ return ' + condition + '; }';
xppCompiler.compile(condition);
if (xppCompiler.errorText() != "")
{
select firstOnly RecId from mcrUpSellVarRule
where mcrUpSellVarRule.RuleID == rule;
select firstonly RecId from mcrFraudRule
where mcrFraudRule.RuleId == rule;
if (!mcrUpSellVarRule && !mcrFraudRule)
{
error(strfmt("@MCR11882", rule));
}
else
{
if (mcrFraudRule)
{
rule = MCRFraudRule::find(rule).RuleName;
error(strfmt("@MCR24889", rule, xppCompiler.errorText()));
}
else //the problem is with an upsellCrossSell Rule
{
error(strfmt("@MCR11883", rule, xppCompiler.errorText()));
}
}
return false;
}
return xppCompiler.execute();
}
配置规则里的逻辑不复杂,下面例子说明,如果创建带参数的动态方法:
new ExecutePermission().assert();
xppCompiler = new XppCompiler();
condition = '';
condition = strFmt(this.Notes,
enum2int(curSettlement.PurchCoalIncentiveClaims),
num2str(curDetails.PurchQty,0,2,0,0),
num2str(curDetails.PurchPrice,0,2,0,0),
num2str(this.LoadPortValue,0,2,0,0),
num2str(this.UnLoadPortValue,0,2,0,0),
num2str(this.LowerLimit,0,2,0,0),
num2str(this.UpperLimit,0,2,0,0));
xppCompiler.compile(condition);
if (xppCompiler.errorText() != '')
error(strfmt("@HVL1634",xppCompiler.errorText()));
return xppCompiler.execute();
this.Notes的方法体如下,其中%1表示接收第一个参数.
public LineAmount executeFormula( )
{
LineAmount curLineAmount1,curLineAmount2;
;
if(%4 ==0)
{
curLineAmount1 = 0;
curLineAmount2 = 0;
}
else
{
curLineAmount1 = decRound((%4-%6)*decRound(%3/%6,3),2)*%2;
curLineAmount2= (%4>=(%6-200) ? 0 : (%4-%6-200)*decRound(%3/%6,3))*%2;
}
return decRound(curLineAmount1+curLineAmount2,2) ;
}
以下例子也可以参考
http://www.van-veldhuizen.eu/blog/2012/04/19/run-custom-code-microsoft-dynamics-ax-2012/
n previous versions we used the RunBuff() method to run configured scripts. This is not allowed when you run in CIL.
There is a simple work around as there is new class: XppCompiler
http://msdn.microsoft.com/en-us/library/xppcompiler.executeex.aspx
A small sample is shown below:
static void Job12(Args _args)
{
XppCompiler compiler = new XppCompiler();
source source = strFmt("anyType runMethod()\n{\n return %1\n}\n", 'today();');
;
compiler.compile(source);
test = compiler.execute();
}
AX2012 XppCompiler create method动态创建方法并运行的更多相关文章
- Python中使用type、metaclass动态创建方法和属性
1: type() 我们知道动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Person的class: class Person(obj ...
- C#动态创建和动态使用程序集、类、方法、字段等
C#动态创建和动态使用程序集.类.方法.字段等 分类:技术交流 (3204) (3) 首先需要知道动态创建这些类型是使用的一些什么技术呢?其实只要相关动态加载程序集呀,类呀,都是使用反射,那么动 ...
- python-获取类名和方法名,动态创建类和方法及属性
获取类名和方法名1.在函数外部获取函数名称,用.__name__获取2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取3.使用inspect模块动态 ...
- silverlight依据json字符串动态创建实体类
1.接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json); ...
- C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求
C# 动态创建SQL数据库(二) 使用Entity Framework 创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...
- ASM(四) 利用Method 组件动态注入方法逻辑
这篇继续结合样例来深入了解下Method组件动态变更方法字节码的实现.通过前面一篇,知道ClassVisitor 的visitMethod()方法能够返回一个MethodVisitor的实例. 那么我 ...
- C#反射动态创建实例并调用方法
在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...
- odoo 动态创建字段的方法
动态创建字段并非一个常见的的需求,但某些情况下,我们确实又需要动态地创建字段. Odoo 中创建字段的方法有两种,一种是通过python文件class中进行定义,另一种是在界面上手工创建,odoo通过 ...
- js动态创建及移除div的方法
本文实例讲述了js动态创建及移除div的方法.分享给大家供大家参考.具体实现方法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
随机推荐
- DELPHI实现百度开放平台
学习百度语音 百度语音开发平台 http://yuyin.baidu.com/ 百度开发者账号 13600514494,短信登录 应用账号 词语听写 App ID: 7799366 API Key: ...
- C++多级指针与多维数组详细介绍
多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=&val; int **pptr= ...
- 当java出现异常,应如何进行处理
Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种 ...
- npm 安装本地包
npm install ../xxx 就行 如果报错,比如 1`Refusing to install as a dependency of itself 说明你的本地模块没npm init ,也就 ...
- 判断一个 int 向量里是否有相同的数(1)
class Solution { public: bool containsDuplicate(vector<int>& nums) { map<int,char> e ...
- 【python】如何在某.py文件中调用其他.py内的函数
假设名为A.py的文件需要调用B.py文件内的C(x,y)函数 假如在同一目录下,则只需 import B if __name__ == "__main__": B.C(x,y) ...
- prince2 证书有用吗
prince2 证书有用吗 ? 项目管理是一件非常困难的事情,新闻里充斥着虽利润高却未能成功支付的项目案例.这是为什么呢? 最主要的原因是项目工作比日常的商业工作要困难的多.日常的商业工作往往是重复 ...
- 【转】eclipse luna 无法安装veloeclipse问题
转载地址:https://code.google.com/p/veloeclipse/issues/detail?id=47 I tried to install veloeclipse 2.0.8 ...
- centos7下搭建nginx+php7.1+mariadb+memcached+redis
一.环境准备 1.首先介绍一下环境,以及我们今天的主角们 我用的环境是最小化安装的centos7,mariadb(江湖传言mysql被oracle收购后,人们担心像java一样毁在oracle手上于是 ...
- clover 在win10下工作不正常
1. 右键兼容性, 选win8 2. 文件夹选项:在同一个窗口中打开每个文件夹