Axapta 在AX 2009中使用电子邮件模板的动态映射
我正在AX 2009中设置电子邮件模板,当某些文档发布时,这些模板将自动发送给我们的客户。我有一个框架,允许我将特定的已发布文档绑定到特定的电子邮件模板 目前,为了动态填充电子邮件中的信息,我正在使用一个包含键/值对的映射对象,其中键与模板本身中的特定变量相关(请参见问题中的示例)。但是,由于我可以很容易地看到需要显著更改的可用信息,因此我希望能够更改此映射,而不必更改类中的实际代码 我的想法是有一个简单的表,它包含两个字符串字段——一个是映射中的键,另一个是信息所在位置的字符串表示,即Axapta 在AX 2009中使用电子邮件模板的动态映射,axapta,x++,dynamics-ax-2009,email-templates,Axapta,X++,Dynamics Ax 2009,Email Templates,我正在AX 2009中设置电子邮件模板,当某些文档发布时,这些模板将自动发送给我们的客户。我有一个框架,允许我将特定的已发布文档绑定到特定的电子邮件模板 目前,为了动态填充电子邮件中的信息,我正在使用一个包含键/值对的映射对象,其中键与模板本身中的特定变量相关(请参见问题中的示例)。但是,由于我可以很容易地看到需要显著更改的可用信息,因此我希望能够更改此映射,而不必更改类中的实际代码 我的想法是有一个简单的表,它包含两个字符串字段——一个是映射中的键,另一个是信息所在位置的字符串表示,即“sal
“salesTable.SalesId”
是否可以对值字符串表达式求值,使其自动提取“so-XXXXXXXX”?在这种情况下,我们可以假设salesTable缓冲区在评估点已经存在。这类似于Javascripteval()
命令。它还应该(理想情况下)计算更复杂的表达式,例如“CustTable::find(salesTable.InvoiceAccount).CustGroup”
,但在这一点上可能要求太多
我能看到的另一种选择是创建一个巨大的映射对象,该对象将包含所有可能的映射,并在整个框架中使用这些映射,但这仍然有可能无法在模板中获得所需的所有信息,因此需要进行额外的代码更改以获取缺少的信息
是否可以对值字符串表达式求值,使其自动提取“so-XXXXXXXX”
没有自定义代码。基本框架\Data Dictionary\Tables\SysEmailTable\Methods\sendMail
处理键/值映射和XML数据
您还应该小心,因为计算这些表达式可能会规避AX安全性,并允许用户查看他们无法查看和/或执行的数据
自定义代码。
你正在计划一个可能比你想象的要少的场景,但是如果你真的想要一个解决方案,我有一些想法
\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()));
}