డైనమిక్స్ AX 2012లో X++ నుండి నేరుగా AIF డాక్యుమెంట్ సేవలను కాల్ చేయడం
ప్రచురణ: 16 ఫిబ్రవరి, 2025 11:23:40 AM UTCకి
ఈ వ్యాసంలో, డైనమిక్స్ AX 2012లో అప్లికేషన్ ఇంటిగ్రేషన్ ఫ్రేమ్వర్క్ డాక్యుమెంట్ సేవలను నేరుగా X++ కోడ్ నుండి ఎలా కాల్ చేయాలో నేను వివరిస్తాను, ఇన్బౌండ్ మరియు అవుట్బౌండ్ కాల్లను అనుకరిస్తూ, AIF కోడ్లో లోపాలను కనుగొనడం మరియు డీబగ్ చేయడం చాలా సులభం చేస్తుంది.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
ఈ పోస్ట్లోని సమాచారం డైనమిక్స్ AX 2012 R3 ఆధారంగా రూపొందించబడింది. ఇది ఇతర వెర్షన్లకు చెల్లుబాటు కావచ్చు లేదా చెల్లకపోవచ్చు.
నేను ఇటీవల ఒక కస్టమర్ మరొక సిస్టమ్ నుండి అందుకుంటున్న డేటా ఆధారంగా కస్టమర్లను సృష్టించడానికి అప్లికేషన్ ఇంటిగ్రేషన్ ఫ్రేమ్వర్క్ (AIF) ఇన్బౌండ్ పోర్ట్ను అమలు చేయడంలో సహాయం చేస్తున్నాను. డైనమిక్స్ AX ఇప్పటికే కస్టమరర్ డాక్యుమెంట్ సేవను అందిస్తుంది, ఇది దీని కోసం లాజిక్ను అమలు చేస్తుంది, మేము దానిని సరళంగా ఉంచాలని మరియు ప్రామాణిక పరిష్కారాన్ని ఉపయోగించాలని నిర్ణయించుకున్నాము.
అయితే, డైనమిక్స్ AX అంగీకరించే XMLను రూపొందించడానికి బాహ్య వ్యవస్థను పొందడంలో చాలా సమస్యలు ఉన్నాయని త్వరలోనే తేలింది. డైనమిక్స్ AX ద్వారా రూపొందించబడిన XML స్కీమా చాలా క్లిష్టమైనది మరియు డైనమిక్స్ AXలో కొన్ని బగ్లు ఉన్నాయని కూడా కనిపిస్తుంది, ఇవి కొన్నిసార్లు ఇతర సాధనాల ప్రకారం స్కీమా-చెల్లుబాటు అయ్యే XMLను తిరస్కరించడానికి కారణమవుతాయి, కాబట్టి మొత్తం మీద, ఇది నేను అనుకున్న దానికంటే తక్కువ సరళంగా నిరూపించబడింది.
ఈ ప్రయత్నంలో, AIF అందించిన ఎర్రర్ సందేశాలు సమాచారం కోసం తక్కువగా ఉండటం వలన, కొన్ని XML ఫైల్లలో సమస్య ఏమిటో ఖచ్చితంగా తెలుసుకోవడానికి నేను తరచుగా ఇబ్బంది పడ్డాను. ఇది కూడా చాలా శ్రమతో కూడుకున్నది, ఎందుకంటే బాహ్య వ్యవస్థ MSMQ ద్వారా కొత్త సందేశాన్ని పంపే వరకు మరియు AIF సందేశాన్ని స్వీకరించి, ఎర్రర్ను చూసే ముందు దాన్ని ప్రాసెస్ చేసే వరకు నేను వేచి ఉండాల్సి వచ్చింది.
అందువల్ల కొంత వేగవంతమైన పరీక్ష కోసం స్థానిక XML ఫైల్తో సర్వీస్ కోడ్ను నేరుగా కాల్ చేయడం సాధ్యమేనా అని నేను పరిశోధించాను మరియు అది అలానే ఉందని తేలింది - అంతే కాదు, దీన్ని చేయడం చాలా సులభం మరియు వాస్తవానికి చాలా అర్థవంతమైన దోష సందేశాలను అందిస్తుంది.
కింది ఉదాహరణ జాబ్ స్థానిక XML ఫైల్ను చదివి, కస్టమర్ను సృష్టించడానికి AxdCustomer క్లాస్ (ఇది CustCustomer సర్వీస్ ఉపయోగించే డాక్యుమెంట్ క్లాస్) తో ఉపయోగించడానికి ప్రయత్నిస్తుంది. మీకు అవసరమైతే, మీరు అన్ని ఇతర డాక్యుమెంట్ క్లాసులకు, ఉదాహరణకు AxdSalesOrder కు ఇలాంటి జాబ్లను చేయవచ్చు.
{
FileNameOpen fileName = @'C:\\TestCustomerCreate.xml';
AxdCustomer customer;
AifEntityKey key;
#File
;
new FileIoPermission(fileName, #IO_Read).assert();
customer = new AxdCustomer();
key = customer.create( XmlDocument::newFile(fileName).xml(),
new AifEndpointActionPolicyInfo(),
new AifConstraintList());
CodeAccessPermission::revertAssert();
info('Done');
}
customer.create() పద్ధతి ద్వారా తిరిగి ఇవ్వబడిన AifEntityKey ఆబ్జెక్ట్ (ఇది AIFలో "క్రియేట్" సర్వీస్ ఆపరేషన్కు అనుగుణంగా ఉంటుంది) ఏ కస్టమర్ సృష్టించబడ్డాడనే దాని గురించి సమాచారాన్ని కలిగి ఉంటుంది, ఇతర విషయాలతోపాటు సృష్టించబడిన కస్టటేబుల్ రికార్డ్ యొక్క RecId.
మీరు పరీక్షించడానికి ప్రయత్నిస్తున్నది అవుట్బౌండ్ పోర్ట్ అయితే లేదా ఇన్బౌండ్ పోర్ట్లో XML ఎలా ఉండాలో మీకు ఉదాహరణ మాత్రమే అవసరమైతే, మీరు డాక్యుమెంట్ క్లాస్ని ఉపయోగించి కస్టమర్ను ఫైల్కు ఎగుమతి చేయవచ్చు, బదులుగా read() పద్ధతిని ("read" సర్వీస్ ఆపరేషన్కు అనుగుణంగా) కాల్ చేయడం ద్వారా, ఉదాహరణకు:
{
FileNameSave fileName = @'C:\\TestCustomerRead.xml';
Map map = new Map( Types::Integer,
Types::Container);
AxdCustomer customer;
AifEntityKey key;
XMLDocument xmlDoc;
XML xml;
AifPropertyBag bag;
#File
;
map.insert(fieldNum(CustTable, AccountNum), ['123456']);
key = new AifEntityKey();
key.parmTableId(tableNum(CustTable));
key.parmKeyDataMap(map);
customer = new AxdCustomer();
xml = customer.read(key,
null,
new AifEndpointActionPolicyInfo(),
new AifConstraintList(),
bag);
new FileIoPermission(fileName, #IO_Write).assert();
xmlDoc = XmlDocument::newXml(xml);
xmlDoc.save(fileName);
CodeAccessPermission::revertAssert();
info('Done');
}
మీరు '123456' ని మీరు చదవాలనుకుంటున్న కస్టమర్ ఖాతా నంబర్తో భర్తీ చేయాలి.