在ax 2012组件中动态添加方法
Add a method dynamically in ax 2012 component
我想在ax 2012中给一个组件动态添加一个方法,如何通过代码实现?可能吗?
这是我写的一份工作,它演示了一堆不同的方法来做你想做的事情:
static void Job79(Args _args)
{
TreeNode treeNode = TreeNode::findNode(@'\Classes\Activities');
SysDictClass sysDictClass = new SysDictClass(treeNode.applObjectId());
FormRun formRun = new FormRun(new Args(formStr(AifAction)));
Form form = new Form(formStr(AifAction));
ClassBuild classBuild;
SysDictTable sysDictTable = new SysDictTable(tableNum(AccountSumMap)); // Maps are treated like tables
SysDictMethod sysDictMethod;
int i;
MemberFunction method;
str methodSource = 'public static str getTime()\n{\n\treturn "3/3/2015";\n}';
// Find if class has a method
if (sysDictClass.hasObjectMethod('delete'))
{
info("Found object method delete");
}
if (sysDictClass.hasStaticMethod('main'))
{
info("Found static method main");
}
// Find if form has a method
if (formHasMethod(formRun, 'init'))
{
info("Found form method 'init'");
}
if (form.AOTfindChild('methods').AOTfindChild('refreshGrid') != null)
{
info("Found 'refreshGrid' method on AifAction");
}
if (sysDictClass.hasStaticMethod('getTime') == false)
{
classBuild = new ClassBuild(sysDictClass.name());
treeNode = classBuild.addMethod('getTime', methodSource);
if (classBuild.classNode().AOTcompile())
{
classBuild.classNode().AOTsave();
info("Added method getTime, compiled, and saved");
}
else
{
info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
// Delete the non-compiling method
if (treeNode)
treeNode.AOTdelete();
classBuild.classNode().AOTsave();
}
}
else
{
info("Method 'getTime' already exists");
}
if (sysDictTable.isMap())
{
if (sysDictTable.doesMethodExist('getTime') == false)
{
treeNode = sysDictTable.treeNode().AOTfindChild('methods').AOTadd('getTime');
method = sysDictTable.treeNode().AOTfindChild('methods').AOTfindChild('getTime');
method.AOTsave();
method.AOTsetSource(methodSource, true);
method.AOTsave();
if (sysDictTable.treeNode().AOTcompile())
{
sysDictTable.treeNode().AOTsave();
info(strFmt("Added 'getTime' to AccountSumMap"));
}
else
{
info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
// Delete the non-compiling method
if (treeNode)
treeNode.AOTdelete();
sysDictTable.treeNode().AOTsave();
}
}
}
}
private void findOrCreateTimeStamp(
SysVersionControlTmpItem _item)
{
str timeStamp;
UtilElements utilElement;
SysDictClass dictClass;
ClassBuild classBuild;
SysVersionControlTmpItem item = _item;
str methodName = "csGetVersion";
int time = timenow();
TreeNode treeNode = TreeNode::findNode(item.ItemPath);
utilElement = treeNode.utilElement();
timeStamp = date2Str(
today(),
321,
DateDay::Digits2,
DateSeparator::Slash,
DateMonth::Digits2,
DateSeparator::Slash,
DateYear::Digits4,
DateFlags::None);
timeStamp = timeStamp + "_" +
num2str0(time div 3600, 2, 0, 0, 0) + "_" +
num2Str0(time mod 3600 div 60, 2, 0, 0, 0) + "_" +
num2Str0(time mod 3600 mod 60, 2, 0, 0, 0);
if (utilElement.recordType == UtilElementType::Class)
{
dictClass = new SysDictClass(className2Id(utilElement.name));
classBuild = new ClassBuild(utilElement.name, true);
if (dictClass.hasStaticMethod(methodName))
{
//Override method here, since the method already exists in the component.
classBuild.overrideMethod(methodName,
@"public static str csGetVersion()" +
"{" +
"return '" + timeStamp + "';" +
"}");
}
else
{
//Make a new method here since it does'nt exist in the component.
classBuild.addMethod(methodName,
@"public static str csGetVersion()" +
"{" +
"return '" + timeStamp + "';" +
"}");
}
classBuild.classNode().AOTcompile();
}
}
以上方法是参考之前的回答和其他专业人士创建的。它首先验证该方法是否存在于 class 中。如果找到它会覆盖其他创建新方法。对于其他元素,如 Tables、Forms 和 Maps,我们可以用类似的方式实现。
我想在ax 2012中给一个组件动态添加一个方法,如何通过代码实现?可能吗?
这是我写的一份工作,它演示了一堆不同的方法来做你想做的事情:
static void Job79(Args _args)
{
TreeNode treeNode = TreeNode::findNode(@'\Classes\Activities');
SysDictClass sysDictClass = new SysDictClass(treeNode.applObjectId());
FormRun formRun = new FormRun(new Args(formStr(AifAction)));
Form form = new Form(formStr(AifAction));
ClassBuild classBuild;
SysDictTable sysDictTable = new SysDictTable(tableNum(AccountSumMap)); // Maps are treated like tables
SysDictMethod sysDictMethod;
int i;
MemberFunction method;
str methodSource = 'public static str getTime()\n{\n\treturn "3/3/2015";\n}';
// Find if class has a method
if (sysDictClass.hasObjectMethod('delete'))
{
info("Found object method delete");
}
if (sysDictClass.hasStaticMethod('main'))
{
info("Found static method main");
}
// Find if form has a method
if (formHasMethod(formRun, 'init'))
{
info("Found form method 'init'");
}
if (form.AOTfindChild('methods').AOTfindChild('refreshGrid') != null)
{
info("Found 'refreshGrid' method on AifAction");
}
if (sysDictClass.hasStaticMethod('getTime') == false)
{
classBuild = new ClassBuild(sysDictClass.name());
treeNode = classBuild.addMethod('getTime', methodSource);
if (classBuild.classNode().AOTcompile())
{
classBuild.classNode().AOTsave();
info("Added method getTime, compiled, and saved");
}
else
{
info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
// Delete the non-compiling method
if (treeNode)
treeNode.AOTdelete();
classBuild.classNode().AOTsave();
}
}
else
{
info("Method 'getTime' already exists");
}
if (sysDictTable.isMap())
{
if (sysDictTable.doesMethodExist('getTime') == false)
{
treeNode = sysDictTable.treeNode().AOTfindChild('methods').AOTadd('getTime');
method = sysDictTable.treeNode().AOTfindChild('methods').AOTfindChild('getTime');
method.AOTsave();
method.AOTsetSource(methodSource, true);
method.AOTsave();
if (sysDictTable.treeNode().AOTcompile())
{
sysDictTable.treeNode().AOTsave();
info(strFmt("Added 'getTime' to AccountSumMap"));
}
else
{
info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
// Delete the non-compiling method
if (treeNode)
treeNode.AOTdelete();
sysDictTable.treeNode().AOTsave();
}
}
}
}
private void findOrCreateTimeStamp(
SysVersionControlTmpItem _item)
{
str timeStamp;
UtilElements utilElement;
SysDictClass dictClass;
ClassBuild classBuild;
SysVersionControlTmpItem item = _item;
str methodName = "csGetVersion";
int time = timenow();
TreeNode treeNode = TreeNode::findNode(item.ItemPath);
utilElement = treeNode.utilElement();
timeStamp = date2Str(
today(),
321,
DateDay::Digits2,
DateSeparator::Slash,
DateMonth::Digits2,
DateSeparator::Slash,
DateYear::Digits4,
DateFlags::None);
timeStamp = timeStamp + "_" +
num2str0(time div 3600, 2, 0, 0, 0) + "_" +
num2Str0(time mod 3600 div 60, 2, 0, 0, 0) + "_" +
num2Str0(time mod 3600 mod 60, 2, 0, 0, 0);
if (utilElement.recordType == UtilElementType::Class)
{
dictClass = new SysDictClass(className2Id(utilElement.name));
classBuild = new ClassBuild(utilElement.name, true);
if (dictClass.hasStaticMethod(methodName))
{
//Override method here, since the method already exists in the component.
classBuild.overrideMethod(methodName,
@"public static str csGetVersion()" +
"{" +
"return '" + timeStamp + "';" +
"}");
}
else
{
//Make a new method here since it does'nt exist in the component.
classBuild.addMethod(methodName,
@"public static str csGetVersion()" +
"{" +
"return '" + timeStamp + "';" +
"}");
}
classBuild.classNode().AOTcompile();
}
}
以上方法是参考之前的回答和其他专业人士创建的。它首先验证该方法是否存在于 class 中。如果找到它会覆盖其他创建新方法。对于其他元素,如 Tables、Forms 和 Maps,我们可以用类似的方式实现。