第九章:XML文档集成(三)AxdBase API

本文仅供AX从业者和爱好者交流之用,由于原文版权问题,请勿转载。
AxdBase提供了一个API使得只需要少量的工作就可以实现新的XML文档,正如前面提到的那样,这个框架可以实现的基本操作如创建XML,读取XML和生成XSD。在这种情况下,AX不支持删除和更新操作。当使用XML文档接口时,只能读取或者在AX中创建新的文档。
表9-1列出了AxdBase实现的方法,并且简要描述了一下提供的功能。

方法                                                                                          描述
read                                                                  从数据库中读取一条已过帐的交易并以XML字符串的方式返回
readList                                                            从数据库中读取已过帐的交易并以XML字符串的方式返回
create                                                               将XML字符串文档创建为数据库表中的一条记录并返回创建的交易的主键
createList                                                          与Create类似,只是可以接受多个XML字符串文档
findList                                                              从数据库中返回已过账的交易并将其写入XML字符串中
getSchema                                                        返回AX XML文档的XSD
getActionList                                                     返回指定XML文档所有可用的 操作列表
getLabel                                                            返回本地化文档名称对应的标签
getName                                                           返回文档名称
getQueryName                                                 返回使用的Query的名称,该Query与AX文档相对应
setTableFieldAsMandatory                               设定某个字段为必输字段。为了设定额外的必输字段,Axd类必须 扩展initMandatoryFieldsMap 方法,
                                                                        如果一个字段是必输字段,但在数据模型层面上不是必输的,该方法必须调用
                                                                        setParmMethodAsMandatory
  或者setTableFieldAsMandatory 来表示某个字段是必输的。

prepareForSave                                                准备一个Ax<Table>类以便保存
prepareForQuery                                              抽象方法,如果相应的Query在执行前需要准备的话派生类需要重写该方法,比如临时表,在查询之前
                                                                         需要给它赋值。
updateNow                                                       抽象方法,如果想实现针对文档的更新(比如过账文档或者运行业务逻辑)派生类可以覆盖该方法,在
                                                                         处理进站文档时,该方法的调用是最后一步。

validateDocument                                             抽象方法,如果想实现文档范围内(译注:document-wide,不知道怎么翻译好)实现业务逻辑派生类可以覆盖
                                                                        该方法,该方法在处理进站文档之后,交易持久化到数据库之前调用。
为了提高生产力,默认情况下,框架启用所有实现了的操作,这意味着,如果不想支持某操作(译注:某操作在原文中没有,添加之使其通顺)比如create,必须在派生文档类中覆盖该方法抛出一个异常解释说不支持该操作,下面的例子是AX中的AxdASN类不支持create操作。

public AifEntityKey create(AifDocumentXml _xml,
                           AifEndpointActionPolicyInfo _actionPolicyInfo,
                           AifConstraintList _constraintList)
{
    ;
    
throw error(strfmt("@SYS94924"this.getName(), 'create'));
}

当创建一个全新的文档时,必须覆盖如下方法:
1.getActionList
2.getConstraintList
3.getLabel
如果在查询中包含多个表,并且其中一个表的字段(译注:原文为 the field values in one query rely on field values in,感觉其中的in one query应该为in one table,因为Query包含表,表包含字段,并且这里上下文没有提到另一个Query,所以这里按照in one table翻译)的值依赖于其他值(译注:原文没有其他值 这个表述,为了通顺添加),比如,其父表的字段值,必须覆盖prepareForSave 方法,仅当需要支持create和createList操作时需要覆盖。下面的例子中,类AxdChartOfAccountprepareForSave 方法,通过父表主键的值得到外键值,特别注意加粗的行(译注:由于不知道怎么将代码加粗,这里用注释标出),它们建立关联。

public boolean prepareForSave(AxdStack _axdStack, str _dataSourceName)
{
    AxLedgerTable               axLedgerTable;
    AxledgerTableInterval       axledgerTableInterval;
    ;

    
switch (classidget(_axdStack.top()))
    
{
        
case classnum(AxLedgerTable) :
            axLedgerTable  
=  _axdStack.top();
            
return true;

        
case classnum(AxledgerTableInterval)  :
            axledgerTableInterval 
= _axdStack.top();

            
if(classidget(axledgerTableInterval.parentAxBC()) == classnum(AxLedgerTable))
            
{
                axLedgerTable 
= axledgerTableInterval.parentAxBC();

                
//注意以下两行
                axledgerTableInterval.parmAccountTableId(axLedgerTable.currentRecord().TableId);
                axledgerTableInterval.parmAccountRecID(axLedgerTable.currentRecord().RecId);
                
//注意以上两行
                
                
return true;
            }

            
else
                error(strfmt(
"@SYS97762"));
                
return false;

        
default :
            error(strfmt(
"@SYS88979", classId2Name(classidget(_axdStack.top()))));
            
return false;

    }

    
return false;
}

 

原文地址:https://www.cnblogs.com/Farseer1215/p/821464.html