dynamics ax tap knowledge transfer wave 2. application integration framework (aif)...
TRANSCRIPT
![Page 1: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/1.jpg)
Dynamics AX TAP
Knowledge Transfer Wave 2
![Page 2: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/2.jpg)
Application Integration Framework (AIF)Document/Interface Development
Søren Vagn AndersenProgram ManagerMicrosoft Dynamics AX
![Page 3: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/3.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 4: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/4.jpg)
Supported XML DocumentsTrade
Price List [out]Price/Discount Agreement [in]Purchase Order [out]Sales Order [in]Picking List [out]Packing Slip [in]Advance Ship Notice [out]Sales Invoice [out]Purchase Invoice [in]Free Text Invoice [in]
FinanceExchange Rates [out,in]GL Chart of Accounts [out,in]GL Dimensions [out,in]
InventoryInventory Counting Journal [in]Inventory Transfer Journal [in]Inventory Balances [out]Inventory Transactions [out]Inventory Profit/Loss Journal [in]
![Page 5: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/5.jpg)
XML Document Development
Model driven approachFocus on data and business logicCustomizations handled (almost) automatically
Generalized framework
Tools supportWizard for generating class skeletonsBest practice check to detect data model changes
![Page 6: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/6.jpg)
Model Driven Approach
SalesTableSalesTable
SalesLineSalesLine
DBDB
XMLXML
HOW ?HOW ?...
...
Axd<Axd<DocumentDocument> query defines> query definesXML structure and contentXML structure and content
Ax<Ax<TableTable> classes manage data access> classes manage data access
Axd<Axd<DocumentDocument> > class performsclass performsserialization and serialization and de-serializationde-serialization
![Page 7: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/7.jpg)
![Page 8: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/8.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 9: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/9.jpg)
XML Schema Structure<?xml version="1.0" encoding="utf-16"?><SalesOrder
xmlns="http://schemas.microsoft.com/dynamics/"> <DocPurpose>Original</DocPurpose> <SenderId>dmo</SenderId>
<SalesTable class="entity"> <CaseTagging>No</CaseTagging> <CovStatus>1</CovStatus> <CurrencyCode>EUR</CurrencyCode> <CustAccount>4020</CustAccount>
<SalesLine class="entity"> <Blocked>No</Blocked> <CaseTagging>No</CaseTagging> <Complete>No</Complete> <CurrencyCode>EUR</CurrencyCode> ...
<InventDim class="entity">…</InventDim>
</SalesLine>
<DocuRefHeader class="entity">…</DocuRefHeader> <DocuRefHeader class="entity">…</DocuRefHeader>
</SalesTable></SalesOrder>
HiddenEmpty
Parm<Property>()methods onAxd<Document>class
![Page 10: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/10.jpg)
Serialization Strategy
Serialize parm<Property>() methods on the Axd<Document> classRead data using Ax<Table> class, if presentRead directly from table, if no Ax<Table> classField list on Axd<Document> query controls what fields are serialized
If Ax<Table> exists, only fields with parm<Field>() method on Ax<Table> class
Calculated fields (display fields) are always serialized
![Page 11: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/11.jpg)
Mapping Simple DatatypesX++ Datatype
XSD Type
String xsd:string, maxLength=StringSize
(maxLength=max(StringSize,50) in case of value mapping)
Integer xsd:intInteger xsd:time, ISO format: HH:MM:SS
(Time stamp if global::isTypeTimeglobal::isTypeTime is true)
Int64 xsd:longReal xsd:decimal,
fractionDigits=NoOfDecimalsDate xsd:date, ISO format: YYYY-MM-DDEnum xsd:string,
enumeration=<EnumName>, ...GUID xsd:string, pattern=’[0-9A-Fa-f]{8}-...’BLOB xsd:string, Base64 encoded
![Page 12: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/12.jpg)
Arrays
All elements are serialized
<Dimension>
<element>Department</element><element>Cost Center</element><element>Purpose</element>
</Dimension>
![Page 13: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/13.jpg)
Null Values
OutboundNull values are not serializedArrays may contain empty elements
InboundEmpty string elements interpreted aszero-length string, not nullUse <element xsi:nil=”true”/> to specify null value
![Page 14: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/14.jpg)
SecurityRespects Microsoft Dynamics AX security
Security keysRecord level securityMaxAccessMode propertyAllowEditOnCreate propertyVisible property
No access to system tablesSystemTable=YesTableType≠Table
![Page 15: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/15.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 16: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/16.jpg)
Axd<Document> Query
Describes structure of XML document
Controls amount of data retrieved from Microsoft Dynamics AX
Disabled fields and data sources are excluded from Schema
Only one (1) ”root” data source allowed
Same name as Axd class
![Page 17: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/17.jpg)
Work Tables and Journals
XMLXML
Insert into Insert into work tableswork tables
XMLXML
Read fromRead fromjournalsjournals
PurchTablePurchTable
PurchLinePurchLine
VendPurchOrderJourVendPurchOrderJour
VendPurchOrderTransVendPurchOrderTrans
PostingPosting
![Page 18: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/18.jpg)
Documents With Header/Lines
SalesTableSalesTable
SalesLineSalesLine
Header = ”Root” data sourceHeader = ”Root” data source
LinesLines
Notes at both header and linesNotes at both header and lines
![Page 19: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/19.jpg)
Axd<Document> Classes
Service classesImplement AifServiceable interfaceExpose document actions
Validation of entire document, e.g.Cross-table dependenciesDocument life-cycle constraints
May invoke business logicPosting
![Page 20: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/20.jpg)
Ax<Table> Classes1-to-1 relationship with tablesName derived from table, e.g. AxSalesLineparm<Field>() method for each fieldDefaulting of fields with no valuesValidation of fields with respect to, e.g.
Referential integrityNumber sequencesBusiness logic
Value mapping of specific fieldsAlso used by other modules
Enterprise Portal...
![Page 21: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/21.jpg)
Class Hierarchy
TableTable
Axd<Axd<DocumentDocument>>AxdBaseAxdBase
AxInternalBaseAxInternalBase Ax<Ax<TableTable>>
AifServiceableAifServiceable
Axd<Axd<DocumentDocument>>
??+getActionList()+getActionList()
Action Axd<Document> Method
SendDocument XML read(entityKey, ...)
ReceiveDocument entityKey create(XML, ...)
... ...
![Page 22: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/22.jpg)
Action Axd<Document> Method
SendDocumentGenerate XML document identified by entity key
XML read(entityKey, ...)
SendDocumentListGenerate list of XML documents each identified by entity key
XML readList(entityKeyList, ...)
QueryDocumentsGenerate list of XML documents matching query criteria
XML findList(queryCriteria, ...)
QueryEntityKeysGenerate list of entity keys for XML documents matching query criteria
entityKeyList findEntityKeyList(queryCriteria, ...)
ReceiveDocumentParse XML document and write data to database
entityKey create(XML, ...)
ReceiveDocumentListParse list of XML documents and write data to database
entityKeyList createList(XML, ...)
![Page 23: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/23.jpg)
Entity KeysIdentify specific document instance
Table
(Field, Value) pairs for primary keys
Use entity keys returned by AIFTable
Must be ”root” data source in query
Use ID in X++
Not needed in XML / Web Client
FieldUse ID in X++
Use Field Name in XML / Web Client
![Page 24: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/24.jpg)
Using Entity KeysXML<?xml version="1.0" encoding="utf-8" ?> <Envelope xmlns="http://schemas.microsoft.com/dynamics/2005/12/documents"> <Header> … <Action>readInventSum</action> </Header> <Body> <EntityKey> <KeyData> <KeyField> <Field>ItemId</Field> <Value>B-R12</Value> </KeyField> <KeyField> <Field>InventDimId</Field> <Value>00001_060</Value> </KeyField> </KeyData> </EntityKey> </Body></Envelope>
Action
Entity Key
![Page 25: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/25.jpg)
Using Entity KeysWeb Services
//Set the Enity Key
EntityKey entityKey = new EntityKey();
entityKey.KeyData = new KeyField[2] { new KeyField(),
new KeyField() };
entityKey.KeyData[0].Field = "ItemId";
entityKey.KeyData[0].Value = "B-R12";
entityKey.KeyData[1].Field = "InventDimId";
entityKey.KeyData[1].Value = "00001_060";
Create entity key object
Populate entity key
![Page 26: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/26.jpg)
Query Criteria
Similar to entity keys
Criteria for identifying range of documents
List of Table
Field
Operator
Operand1
Operand2 (optional; operator dependent)
Table must be ”root” data source or inner-joined with ”root” data source
Query must not contain hidden or locked range for <Table>.<Field>
![Page 27: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/27.jpg)
Valid Operators
X++ Operator
XML Enumeration
# of Operands
== Equals 1!= NotEquals 1> GreaterThan 1
>= GreaterThanEquals
1
< LessThan 1<= LessThanEquals 1.. Range 2
![Page 28: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/28.jpg)
Using Query Criteria<?xml version="1.0" encoding="utf-8" ?> <Envelope xmlns="http://schemas.microsoft.com/dynamics/2005/12/documents"> <Header> … <Action>findListSalesOrder</action> </Header> <Body> <QueryCriteria> <CriteriaElement> <DataSourceName>SalesTable</DataSourceName> <FieldName>CustAccount</FieldName> <Operator>Range</Operator> <Value1>4000</Value1> <Value2>4020</Value2> </CriteriaElement> <CriteriaElement> <DataSourceName>SalesTable</DataSourceName> <FieldName>CurrencyCode</FieldName> <Operator>Equals</Operator> <Value1>USD</Value1> </CriteriaElement> </QueryCriteria> </Body></Envelope>
Action
Querycriteria
![Page 29: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/29.jpg)
Constraints
Enables the AIF to make decisions based on document contents
RoutingSecurity (to prevent spoofing)
Constraint typesCustomerVendorWarehouse
![Page 30: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/30.jpg)
Constraint Based Routing
Micro
soft D
ynam
ics AX
EndpointA
[3001]
EndpointB
[3001,3004]
EndpointC
[3000,3001]
EndpointD
[3001,3002,3004]
EndpointE
[No Constraints]
XML
PurchaseOrder1
[3001]
PurchaseOrder2
[3004]
![Page 31: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/31.jpg)
Constraint Based Security
Micro
soft D
ynam
ics AX
EndpointA
[4000]
EndpointB
[4000,4002]
EndpointC
[4000,4012]
EndpointD
[4000,4002,4012]
EndpointE
[No Constraints]
XML
SalesOrder1
[4000]
SalesOrder2
[4002]
![Page 32: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/32.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 33: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/33.jpg)
Axd<Document> TO DO’s... in code generated by the Axd Wizard
getLabel()
getActionList()
initQueryFromEntityKey(), initQueryFromQuery()
Validate entity key contents
Update query based on configuration settings
prepareForSave()Validate data across tables
Provide defaults for document
getConstraintList()Identify document constraints
![Page 34: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/34.jpg)
Update QueryExample: AxdSalesInvoicepublic void initQueryFromEntityKey(AifEntityKey _aifEntityKey = null, boolean _validateEntityKey = false){ QueryBuildDataSource qbdsFormLetterRem; ... //Disable FormLetterRemarks if no remarks for sales invoice. if (!(select formLetterRemarks where formLetterRemarks.FormLetter == FormTextType::SalesInvoice).RecId) { qbdsFormLetterRem = query.dataSourceTable(tablenum(formLetterRemarks),1); qbdsFormLetterRem.enabled(false); qbdsFormLetterRem = query.dataSourceTable(tablenum(formLetterRemarks),2); if (qbdsFormLetterRem) { qbdsFormLetterRem.enabled(false); } }} Disable data sources not needed
![Page 35: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/35.jpg)
Document Validation/DefaultingExample: AxdSalesOrderpublic boolean prepareForSave(AxdStack _axdStack, str _dataSourceName){ AxSalesTable axSalesTable; ... ;
switch (classidget(_axdStack.top())) { case classnum(AxSalesTable) : axSalesTable = _axdStack.top(); this.checkSalesTable(axSalesTable);
axSalesTable.parmSalesType(this.salesType()); ... } ...}
Verify that elementsrequired by documentare provided
Set default order type
![Page 36: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/36.jpg)
Document Validation LogicExample: AxdSalesOrderprivate void checkSalesTable(AxSalesTable _axSalesTable){ ; if (!_axSalesTable.parmDeliveryDate()) { error(strfmt("@SYS88971")); }
if (!_axSalesTable.parmCustAccount()) { error(strfmt("@SYS88972")); }
if (!_axSalesTable.parmPurchOrderFormNum()) { error(strfmt("@SYS88973")); }}
Verify that valuesare provide
![Page 37: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/37.jpg)
Document Defaults As ParametersExample: AxdSalesOrderprotected SalesType salesType(){ ; switch (AxdDocumentParameters::find().SalesType) { case AxdSalesType::Journal : return SalesType::Journal; case AxdSalesType::Sales : return SalesType::Sales; } return SalesType::Journal;}
![Page 38: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/38.jpg)
Identifying ConstraintsExample: AxdSalesOrder
public void getConstraintList(Common _curRec, AifConstraintList _constraintList){ AifConstraint aifConstraint = new AifConstraint(); SalesTable salesTable; ;
if (_curRec.TableId != tablenum(SalesTable)) { throw error(strfmt("@SYS23396",funcname())); } salesTable = _curRec ; aifConstraint.parmId(salesTable.CustAccount); aifConstraint.parmType(AIFConstraintType::Customer); _constraintList.addConstraint(aifConstraint) ;}
Constraint = Customer ID
Add constraint to list
![Page 39: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/39.jpg)
Ax<Table> TO DO’s... in code generated by the Axd Wizard
Implement defaulting logicAdd to set<Field>() methods
Add parm<Field>() methods for calculated fields (display fields)
Implement caching as appropriateUse cacheObject() as skeleton for objectsUse cacheRecordRecord() as skeleton for records
![Page 40: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/40.jpg)
Resolving Defaulting LogicExample: SalesTable.CashDisc
void initInvoiceAccount(){ CustTable custTable; ;
custTable = this.custTable_InvoiceAccount();
this.NumberSequenceGroup = custTable.NumberSequenceGroup; this.Payment = custTable.PaymTermId; this.initFromPayment(); if (custTable.PaymSched) { this.PaymentSched = custTable.PaymSched; } this.PaymMode = custTable.PaymMode; this.PaymSpec = custTable.PaymSpec;
this.CashDisc = custTable.CashDisc; this.setListCode();} CashDisc is defaulted from CustTable
![Page 41: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/41.jpg)
Ax<Table> Defaulting LogicExample: AxSalesTable.setCashDisc()protected void setCashDisc(){ if (this.isMethodExecuted(funcname(), fieldnum(SalesTable, CashDisc))) { return; }
this.setInvoiceAccount();
if (this.isFieldSet(fieldnum(SalesTable, InvoiceAccount))) { this.parmCashDisc(this.invoiceAccount_CustTableRecord().CashDisc); }}
Default CashDisc from (cached) customerrecord associated with the invoice account
Make sure the invoice account is set
![Page 42: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/42.jpg)
Calculated (Display) Fields
Typically method on table
parm<Field>() method on Ax<Table> class
Always included in XML schema
Always serialized
Read-only
Can not be mandatory
![Page 43: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/43.jpg)
Ax<Table> Class PerformanceCaching Frequently Used DataAvoid duplicate database lookups
Cache table variablesCache Ax<Table> classes
Axd Wizard generates code templatesCopy for each table variable/Ax<Table> classSearch/replace table variable/class name
Use cache for data lookup
![Page 44: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/44.jpg)
Caching Table VariablesExample: AxSalesLinepublic InventTable inventTableRecord(InventTable _inventTable = null){ InventTable inventTable;
if (!inventTableIdx) { inventTableIdx = this.nextCacheIdx(); } if (!prmisdefault(_inventTable)) { this.tableCacheInsert(inventTableIdx, _inventTable); inventTable = _inventTable; } else { if (this.tableCacheExist(inventTableIdx)) { inventTable = this.tableCacheLookup(inventTableIdx); } else { this.setInventTableRecordFields(); inventTable = InventTable::find(this.parmItemId()); this.tableCacheInsert(inventTableIdx, inventTable); } } return inventTable;}
Insertin cache
Lookup recordin cache
Lookup record and insert in cache
![Page 45: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/45.jpg)
Using Cached Table VariablesExample: AxSalesLineprotected void setSalesUnit(){ if (this.isMethodExecuted(funcname(),
fieldnum(SalesLine, SalesUnit))) { return; }
this.setInventTableRecordFields();
if (this.isInventTableRecordFieldsSet()) { this.parmSalesUnit(this.inventTableRecord().salesUnitId()); }} Lookup inventTable in cache
![Page 46: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/46.jpg)
Best Practices
Don’t override AxdBase.getName()
Be careful with inner joins
Use FetchMode=1:n for outer joins
Watch out for display fields
![Page 47: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/47.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 48: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/48.jpg)
Enabling The ApplicationSend Electronically
Calling the AIF Send Service
Using the Send Framework
Integrating with exising business logic, e.g. posting routines
![Page 49: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/49.jpg)
”Send Electronically” ButtonExample: VendPurchOrderJour form
void clicked(){ VendPurchOrderJour vendPurchOrderJourLocal; ; for (vendPurchOrderJourLocal = vendPurchOrderJour_ds.getFirst(true) ?
vendPurchOrderJour_ds.getFirst(true) : vendPurchOrderJour;
vendPurchOrderJourLocal; vendPurchOrderJourLocal = vendPurchOrderJour_ds.getNext()) { vendPurchOrderJourLocal.sendElectronically(XMLDocPurpose::Original); }
super();}
Original
![Page 50: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/50.jpg)
Calling The AIF Send Servicevoid sendElectronically(XMLDocPurpose _xMLDocPurpose,
AifSendMode _aifSendMode = AifSendMode::Async){ AxdSendContext axdSendContext = AxdSendContext::construct(); AifEntityKey aifEntityKey = AifEntityKey::construct(); Map keyData; AifConstraintList aifConstraintList = new AifConstraintList(); AifConstraint aifConstraint = new AifConstraint(); ; keyData = SysDictTable::getKeyData(this);
aifEntityKey.parmTableId(this.TableId); aifEntityKey.parmRecId(this.RecId); aifEntityKey.parmKeyDataMap(keyData);
axdSendContext.parmXMLDocPurpose(_xMLDocPurpose); axdSendContext.parmSecurity(false);
aifConstraint.parmType(AifConstraintType::Vendor) ; aifConstraint.parmId(this.OrderAccount) ; aifConstraintList.addConstraint(aifConstraint) ;
AifSendService::submitDefault( classnum(AxdPurchaseRequisition), aifEntityKey, aifConstraintList, _aifSendMode, axdSendContext.pack());}
Create entity key
Establish document contextIdentify constraints
Call AIF Send Service(”send and forget”)
![Page 51: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/51.jpg)
Send FrameworkExample: General Ledger > Chart of Accounts
Select target endpointsSelect which documents (here: accounts) to send
![Page 52: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/52.jpg)
Using the Send FrameworkExample: AxdSendChartofAccountsclass AxdSendChartofAccounts extends AxdSend
{
}
static public void main(Args args){ AxdSendChartofAccounts axdSendChartofAccounts ; AifConstraintList aifConstraintList; AifConstraint aifConstraint; ;
axdSendChartofAccounts = new AxdSendChartofAccounts(); aifConstraintList = new AifConstraintList(); aifConstraint = new AifConstraint();
aifConstraint.parmType(AifConstraintType::NoConstraint); aifConstraintList.addConstraint(aifConstraint);
axdSendChartofAccounts.parmShowDocPurpose(true) ;
axdSendChartofAccounts.sendMultipleDocuments(classnum(AxdChartOfAccounts),
AifSendMode::Async,
aifConstraintList);}
Configure form
Invoke Send Framework
![Page 53: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/53.jpg)
Sending As Part Of PostingExample: PurchFormLetter_PurchOrder
void printJournal(){ if (journalList.len() > 0) { if (printFormletter) { this.sendAsXML();
vendPurchOrderJour.printJournal(this, journalList); } if (this.proforma()) { this.removeProforma(); } }}
Send document before printing
![Page 54: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/54.jpg)
Sending As Part Of PostingExample: PurchFormLetter_PurchOrder
protected void sendAsXML(){ boolean newLine;
if (new PrintJobSettings(printerSettingsFormletter,
true).getTarget() != PrintMedium::Screen && !this.proforma()) { newLine = journalList.first(vendPurchOrderJour); while (newLine) {
vendPurchOrderJour.sendElectronically(XMLDocPurpose::Original); newLine = journalList.next(vendPurchOrderJour); } }}
Same method as invoked from ”Send Electronically” Button
![Page 55: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/55.jpg)
Agenda
Extensibility Model
XML Document Structure
Key Concepts
Implementing New Documents
Sending Documents
Advanced Topics
![Page 56: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/56.jpg)
Mandatory Fields... or Required Elements?
Mandatory FieldField that must contain a value when a record is inserted into the Microsoft Dynamics AX database, e.g. SalesTable.SalesId
Required ElementElement required to be present in the XML document to satisfy the schema, e.g. <DeliveryDate> on a Sales Order
![Page 57: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/57.jpg)
Required Elements
An XML element is required when Element is required by Axd<Document>
classOR
Field is mandatory on tableANDField value can not be defaulted
![Page 58: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/58.jpg)
Mandatory FieldsExample: Sales Order
SalesTableCurrencyCode
CustAccount
CustGroup
InvoiceAccount
LanguageId
SalesId
ShippingDateRequested
SalesLineCurrencyCode
CustAccount
CustGroup
ItemId
ShippingDateRequested
![Page 59: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/59.jpg)
Defaulting Mandatory FieldsExample: AxSalesTableprotected void initMandatoryFieldsExemptionList(){ super();
this.setParmMethodAsNotMandatory(methodstr(AxSalesTable,
parmSalesId));this.setParmMethodAsNotMandatory(methodstr(AxSalesTable,
parmInvoiceAccount));this.setParmMethodAsNotMandatory(methodstr(AxSalesTable,
parmCustGroup));
this.setParmMethodAsNotMandatory(methodstr(AxSalesTable,
parmLanguageId)); this.setParmMethodAsNotMandatory(methodstr(AxSalesTable,
parmShippingDateRequested));}
Override
Register field as not required
![Page 60: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/60.jpg)
Required By Axd<Document> ClassExample: AxdSalesOrderprotected void initMandatoryFieldsMap(){ super();
this.setParmMethodAsMandatory(classnum(AxSalesLine),
methodstr(AxSalesLine,parmSalesQty));
this.setParmMethodAsMandatory(classnum(AxSalesLine),
methodstr(AxSalesLine,parmSalesUnit));
this.setParmMethodAsMandatory(classnum(AxSalesTable),
methodstr(AxSalesTable,parmPurchOrderFormNum));
this.setParmMethodAsMandatory(classnum(AxSalesTable),
methodstr(AxSalesTable,parmDeliveryDate));}
Override
Register field as required
![Page 61: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/61.jpg)
Inventory Dimensions<SalesLine class=”entity”> ... <ItemId>CL-100B</ItemId> ... <InventDim class="entity"> <inventColorId>Gold</inventColorId> <inventSizeId>30</inventSizeId> </InventDim> ...</SalesLine>
InventDim.inventDimId = 00003_060
![Page 62: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/62.jpg)
AxInventDim_<ParentTable>Example: AxInventDim_SalesLineclass AxInventDim_SalesLine extends AxInventDim{ AxSalesLine axSalesLine;}
public static AxInventDim_SalesLine
newAxSalesLine(AxSalesLine _axSalesLine)
{
AxInventDim_SalesLine axInventDim_SalesLine;
;
axInventDim_SalesLine = new AxInventDim_SalesLine();
axInventDim_SalesLine.axSalesLine(_axSalesLine);
return axInventDim_SalesLine;
}public void save()
{
;
axSalesLine.updateFromInventDim();
}
Register parent SalesLine
Update SalesLine instead of saving InventDim record
Class is specific to SalesLine
![Page 63: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/63.jpg)
AxInventDim_<ParentTable>Example: AxSalesLine.updateFromInventDim
public void updateFromInventDim()
{
ttsbegin;
runState = AxBCRunState::Save;
fieldModified = new Set(Types::Integer);
this.initRecord();
this.inputStatus(InternalExternal::Internal);
this.setInventDimId();
inventDimIdDirtySaved = false;
this.validateFields();
this.validateWrite();
this.write();
this.resetInternalValues();
ttscommit;
}
Invoke defaulting logic for SalesLine.InventDimIdRe-validate data
Update SalesLine SalesLine.InventDimId
![Page 64: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/64.jpg)
Document References (Notes)Accounts Receivable > Setup > Forms > Form Setup
Control whetherdocument referencesare included in XML document
![Page 65: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/65.jpg)
Configuring Document ReferencesExample: AxdSalesOrder
Disable data sources depending on value of ”Include documents on sheet”
Select configured document type
Allow only ”external” notespublic void initQueryFromEntityKey(AifEntityKey _aifEntityKey,
boolean _validateEntityKey)
{
super(_aifEntityKey, _validateEntityKey);
this.docuRefEnabling();
}
![Page 66: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/66.jpg)
Disabling DocuRef Data SourcesExample: AxdSalesOrderprotected void docuRefEnabling(){ CustFormLetterDocument custFormLetterDocument;
void disableDocuRef(tableId _tableId) { ... } ;
custFormLetterDocument = CustFormLetterDocument::find(); switch (custFormLetterDocument.DocuOnConfirm) { case DocuOnFormular::Head: disableDocuRef(tablenum(SalesLine)); break; case DocuOnFormular::Line: disableDocuRef(tablenum(SalesTable)); break; case DocuOnFormular::None: disableDocuRef(tablenum(SalesTable)); disableDocuRef(tablenum(SalesLine)); } ...}
![Page 67: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/67.jpg)
Selecting Correct DocuRef TypeExample: AxdSalesOrderprotected void docuRefEnabling(){ CustFormLetterDocument custFormLetterDocument;
void disableDocuRef(tableId _tableId) { ... } ;
custFormLetterDocument = CustFormLetterDocument::find(); switch (custFormLetterDocument.DocuOnConfirm) { ... } query.dataSourceTable(tablenum(DocuRef),1). findRange(fieldnum(DocuRef,TypeId)). value(custFormLetterDocument.DocuTypeConfirm); query.dataSourceTable(tablenum(DocuRef),2). findRange(fieldnum(DocuRef,TypeId)). value(custFormLetterDocument.DocuTypeConfirm);
}
![Page 68: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/68.jpg)
Allow Only External DocuRef NotesExample: AxdSalesOrder
Place restrictionon data sourcein query
Make sure therange is locked!
Only external notes
![Page 69: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/69.jpg)
Multiple Constraints
Micro
soft D
ynam
ics AX
EndpointA
[WH1]
EndpointB
[WH1,WH2]
EndpointC
[WH2,WH3]
EndpointD
[WH1,WH2,WH4]
EndpointE
[No Constraints]
XML
PickingList1
[WH1,WH2]
PickingList2
[WH1]
![Page 70: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/70.jpg)
Multiple ConstraintsExample: AxdPickingList
class AxdPickingList extends AxdBase{ AifConstraintList aifConstraintList;}
public void getConstraintList(Common _common, AifConstraintList _constraintList)
{ int i ; int noOfConstraints ; ; noOfConstraints = aifConstraintList.getConstraintCount() ; for(i=1 ;i <= noOfConstraints; i++)
{ _constraintList.addConstraint(aifConstraintList.getConstraint(i);
}}
Copy constraints identified while processing document
![Page 71: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/71.jpg)
Multiple ConstraintsExample: AxdPickingListpublic void processingRecord(Common common){ AIFConstraint AIFConstraint ; InventDim inventDim ; ; if (common.TableId == tablenum(InventDim)) { inventDim = common ; AIFConstraint = new AIFConstraint(); if (inventDim.InventLocationId) { AIFConstraint.parmType(AifConstraintType::Warehouse) ; AIFConstraint.parmId(inventDim.InventLocationId) ; } else { AIFConstraint.parmType(AifConstraintType::NotSet ) ; } aifConstraintList.addConstraint(AIFConstraint) ; }}
Called for every data source
Identify constraint
Add constraint to list
![Page 72: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/72.jpg)
Exposing Calculated Data
Problem:
The data to be read is not readily available in Microsoft Dynamics AX
SolutionCreate Axd<Document> query with temporary table as data source Make Axd<Document> class generate data in temporary table
![Page 73: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/73.jpg)
Generating Data In Temporary TableExample: AxdPriceList
class AxdPricelist extends AxdBase{ ... PriceDiscTmpPrintout priceDiscTmpPrintout;}
void prepareForQuery(QueryRun _queryRun){ ;
select firstonly priceDiscTmpPrintout;
if(!priceDiscTmpPrintout) this.insertPriceDiscTmpPrintout();
_queryRun.setCursor(priceDiscTmpPrintout);}
Run before seriallizationand after de-serialization
Generate data
”Connect” query totemporary table
![Page 74: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/74.jpg)
Invoking Business Logic
ProblemWant to invoke business logic, such as a posting routine without reading or creating data
SolutionCreate Axd<Document> class with no queryAdd properties to Axd<Document> class for holding resultsAdd parm<Property>() method per propertyOverride read() method to invoke business logic before serializing data
![Page 75: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/75.jpg)
Axd<Document> Class With No Queryclass AxdOperation extends AxdBase{ str result;}
public Str parmResult(str _result = result){ ;
result = _result;
return result;}
public QueryName getQueryName(){
return '';
}No query!
Property will be serialized
![Page 76: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/76.jpg)
Invoking Business Logicpublic AifDocumentXml read(AifEntityKey _entityKey,
AifSchemaInfo _xsdInfo, AifEndpointActionPolicyInfo _actionPolicyInfo, AifConstraintList _constraintList, AifPropertyBag _aifPropertyBag)
{ AifDocumentXml xml; ;
// Call business logic here using data in _entityKey as // parameters. Save result in ’result’ property.
xml = super(_entityKey, _xsdInfo, _actionPolicyInfo, _constraintList, _aifPropertyBag);
return xml;}
![Page 77: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/77.jpg)
questions?questions?
![Page 78: Dynamics AX TAP Knowledge Transfer Wave 2. Application Integration Framework (AIF) Document/Interface Development Søren Vagn Andersen Program Manager](https://reader033.vdocuments.net/reader033/viewer/2022061515/56649e525503460f94b47b30/html5/thumbnails/78.jpg)
© 2006 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only.
Microsoft makes no warranties, express or implied, in this summary.