0

我正在努力在 AX 2009 中设置电子邮件模板,这些模板会在发布某些文档时自动发送给我们的客户。我有一个框架,允许我将特定的已发布文档与特定的电子邮件模板联系起来。

目前,为了动态填充电子邮件中的信息,我正在使用一个包含键/值对的映射对象,其中键与模板本身中的特定变量相关(请参阅问题Dynamics Ax 2009 中的示例,电子邮件模板)。但是,由于我可以很容易地看到需要显着更改的可用信息,因此我希望能够更改此映射而无需更改类中的实际代码。

我的想法是有一个简单的表,其中包含两个字符串字段 - 一个是映射中的键,另一个是找到信息的字符串表示形式,即"salesTable.SalesId".

是否可以评估值字符串表达式,以便它自动提取“SO-XXXXXXXX”?在这种情况下,我们可以假设 salesTable 缓冲区在评估时已经存在。这将类似于 Javascripteval()命令。它还应该(理想情况下)评估更复杂的表达式,例如"CustTable::find(salesTable.InvoiceAccount).CustGroup", 但此时可能要求太多。

我能看到的唯一另一种选择是创建一个巨大的映射对象,该对象将包含所有可能的映射并在整个框架中使用它,但这仍然存在没有模板中可能需要的所有信息的风险,因此需要额外的代码更改以获取缺失的信息。

4

1 回答 1

3

是否可以评估值字符串表达式,以便它自动提取“SO-XXXXXXXX”?

不是没有自定义代码。基本框架\Data Dictionary\Tables\SysEmailTable\Methods\sendMail处理键/值映射和 XML 数据。

您还应该小心,因为评估这些表达式可能会绕过 AX 安全性并允许用户查看他们不应该能够和/或执行自定义代码的数据。

您正在计划一个可能发生的情况比您想象的要少,但是如果您真的想要一个解决方案,我有一些想法。

  1. 您可以使用 SysDictTable/SysDictField 对象通过爬取您可能需要的几个表(SalesTable、CustTable)来系统地构建一个大型映射,这将为您提供一个非常简单的解决方案。这是一个概念证明工作示例,它接受“_common”参数并构建您的地图。您可以在这里看到另一个使用这种类似样式的地方:( \Classes\BIGenerator\record2DataSetXml)

    静态无效 Job33(Args _args) {

    SysDictTable    sysDictTable;
    SysDictField    sysDictField;
    SalesTable      salesTable;
    Common          _common;
    int             i;
    Map             map = new Map(Types::String, Types::String);
    str             value;
    FieldId         fieldId;
    
    MapEnumerator   me;
    ;
    
    select firstonly salesTable;
    _common = salesTable;
    
    sysDictTable = new SysDictTable(_common.TableId);
    
    if (sysDictTable)
    {
        for(i=1; i<=sysDictTable.fieldCnt(); i++)
        {
            fieldId = sysDictTable.fieldCnt2Id(i);
    
            sysDictField = sysDictTable.fieldObject(fieldId);
    
            if (sysDictField.isSystem())
                continue;
    
            value = '';
    
            if (sysDictField.baseType() == Types::Container)
            {
                value = enum2str(sysDictField.baseType());
            }
            else if (sysDictField.arraySize() == 1)
            {
                value = _common.(fieldId);
            }
    
            map.insert(sysDictTable.name()+'.'+sysDictField.name(), value);
        }
    }
    
    me = map.getEnumerator();
    
    while (me.moveNext())
    {
        info(strfmt("%1 = %2", me.currentKey(), me.currentValue()));
    }
    

    }

  2. 您可以创建一个 XML 和 XSLT 组合,这将允许您将简单生成的 XML 文件传递​​给您的模板,您只需修改 XSLT 并上传它。你可以从我的博客文章中看到如何做到这一点:

http://alexondax.blogspot.com/2013/12/how-to-create-xslt-to-transform-ax-xml.html

于 2014-05-13T16:10:05.553 回答