Axapta 在AX 2009中使用电子邮件模板的动态映射

Axapta 在AX 2009中使用电子邮件模板的动态映射,axapta,x++,dynamics-ax-2009,email-templates,Axapta,X++,Dynamics Ax 2009,Email Templates,我正在AX 2009中设置电子邮件模板,当某些文档发布时,这些模板将自动发送给我们的客户。我有一个框架,允许我将特定的已发布文档绑定到特定的电子邮件模板 目前,为了动态填充电子邮件中的信息,我正在使用一个包含键/值对的映射对象,其中键与模板本身中的特定变量相关(请参见问题中的示例)。但是,由于我可以很容易地看到需要显著更改的可用信息,因此我希望能够更改此映射,而不必更改类中的实际代码 我的想法是有一个简单的表,它包含两个字符串字段——一个是映射中的键,另一个是信息所在位置的字符串表示,即“sal

我正在AX 2009中设置电子邮件模板,当某些文档发布时,这些模板将自动发送给我们的客户。我有一个框架,允许我将特定的已发布文档绑定到特定的电子邮件模板

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

我的想法是有一个简单的表,它包含两个字符串字段——一个是映射中的键,另一个是信息所在位置的字符串表示,即
“salesTable.SalesId”

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

我能看到的另一种选择是创建一个巨大的映射对象,该对象将包含所有可能的映射,并在整个框架中使用这些映射,但这仍然有可能无法在模板中获得所需的所有信息,因此需要进行额外的代码更改以获取缺少的信息

是否可以对值字符串表达式求值,使其自动提取“so-XXXXXXXX”

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

您还应该小心,因为计算这些表达式可能会规避AX安全性,并允许用户查看他们无法查看和/或执行的数据 自定义代码。

你正在计划一个可能比你想象的要少的场景,但是如果你真的想要一个解决方案,我有一些想法

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

    静态无效作业33(Args\u Args) {

    SysDictTable SysDictTable;
    SysDictField SysDictField;
    销售表销售表;
    普通的,普通的;
    int i;
    映射映射=新映射(类型::字符串,类型::字符串);
    str值;
    FieldId-FieldId;
    地图统计员;
    ;
    选择firstonly salesTable;
    _公共=销售表;
    sysDictTable=新的sysDictTable(_common.TableId);
    if(sysDictTable)
    {
    对于(i=1;i
    是否可以对值字符串表达式求值,使其自动提取“so-XXXXXXXX”

    基本框架
    \Data Dictionary\Tables\SysEmailTable\Methods\sendMail
    处理键/值映射和XML数据

    您还应该小心,因为计算这些表达式可能会规避AX安全性,并允许用户查看他们无法查看和/或执行的数据 自定义代码。

    你正在计划一个可能比你想象的要少的场景,但是如果你真的想要一个解决方案,我有一些想法

  • 您可以通过使用SysDictTable/SysDictField对象在可能需要的几个表(SalesTable、CustTable)上爬行来系统地构建一个大型映射,这将为您提供一个非常简单的解决方案参数并构建地图。您可以在此处看到使用类似样式的另一个地方:(
    \Classes\BIGenerator\record2DataSetXml

    静态无效作业33(Args\u Args) {

    SysDictTable SysDictTable;
    SysDictField SysDictField;
    销售表销售表;
    普通的,普通的;
    int i;
    映射映射=新映射(类型::字符串,类型::字符串);
    str值;
    FieldId-FieldId;
    地图统计员;
    ;
    选择firstonly salesTable;
    _公共=销售表;
    sysDictTable=新的sysDictTable(_common.TableId);
    if(sysDictTable)
    {
    对于(i=1;i
    是否可以对值字符串表达式求值,使其自动提取“so-XXXXXXXX”

    基本框架
    \Data Dictionary\Tables\SysEmailTable\Methods\sendMail
    处理键/值映射和XML数据

    您还应该小心,因为计算这些表达式可能会规避AX安全性,并允许用户查看他们无法查看和/或执行的数据 自定义代码。

    你正在计划一个可能比你想象的要少的场景,但是如果你真的想要一个解决方案,我有一些想法

  • 您可以通过使用SysDictTable/SysDictField对象在可能需要的几个表(SalesTable、CustTable)上爬行来系统地构建一个大型映射,这将为您提供一个非常简单的解决方案参数并构建地图。您可以在此处看到使用类似样式的另一个地方:(
    \Classes\BIGenerator\record2DataSetXml

    静态无效作业33(Args\u Args) {

    SysDictTable SysDictTable;
    SysDictField SysDictField;
    销售表销售表;
    公共通信
    
    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()));
    }