ਡਾਇਨਾਮਿਕਸ AX 2012 ਵਿੱਚ X++ ਤੋਂ ਸਿੱਧੇ AIF ਦਸਤਾਵੇਜ਼ ਸੇਵਾਵਾਂ ਨੂੰ ਕਾਲ ਕਰਨਾ
ਪ੍ਰਕਾਸ਼ਿਤ: 19 ਮਾਰਚ 2025 9:35:25 ਬਾ.ਦੁ. UTC
ਇਸ ਲੇਖ ਵਿੱਚ, ਮੈਂ ਸਮਝਾਉਂਦਾ ਹਾਂ ਕਿ ਡਾਇਨਾਮਿਕਸ AX 2012 ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਇੰਟੀਗ੍ਰੇਸ਼ਨ ਫਰੇਮਵਰਕ ਦਸਤਾਵੇਜ਼ ਸੇਵਾਵਾਂ ਨੂੰ ਸਿੱਧੇ X++ ਕੋਡ ਤੋਂ ਕਿਵੇਂ ਕਾਲ ਕਰਨਾ ਹੈ, ਇਨਬਾਉਂਡ ਅਤੇ ਆਊਟਬਾਊਂਡ ਕਾਲਾਂ ਦੋਵਾਂ ਦੀ ਨਕਲ ਕਰਦੇ ਹੋਏ, ਜੋ AIF ਕੋਡ ਵਿੱਚ ਗਲਤੀਆਂ ਨੂੰ ਲੱਭਣਾ ਅਤੇ ਡੀਬੱਗ ਕਰਨਾ ਕਾਫ਼ੀ ਆਸਾਨ ਬਣਾ ਸਕਦਾ ਹੈ।
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
ਇਸ ਪੋਸਟ ਵਿੱਚ ਦਿੱਤੀ ਜਾਣਕਾਰੀ ਡਾਇਨਾਮਿਕਸ AX 2012 R3 'ਤੇ ਆਧਾਰਿਤ ਹੈ। ਇਹ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਹੋਰ ਵਰਜਨਾਂ ਲਈ ਸਹੀ ਨਾ ਹੋਵੇ।
ਮੈਂ ਹਾਲ ਹੀ ਵਿੱਚ ਇੱਕ ਗਾਹਕ ਦੀ ਮਦਦ ਕਰ ਰਿਹਾ ਸੀ ਜੋ ਐਪਲੀਕੇਸ਼ਨ ਇੰਟੀਗ੍ਰੇਸ਼ਨ ਫਰੇਮਵਰਕ (AIF) ਇੰਬਾਊਂਡ ਪੋਰਟ ਨੂੰ ਇੱਕ ਸਿਸਟਮ ਤੋਂ ਪ੍ਰਾਪਤ ਹੋ ਰਹੇ ਡੇਟਾ ਦੇ ਆਧਾਰ 'ਤੇ ਗਾਹਕ ਬਣਾਉਣ ਲਈ ਲਾਗੂ ਕਰ ਰਿਹਾ ਸੀ। ਕਿਉਂਕਿ ਡਾਇਨਾਮਿਕਸ AX ਪਹਿਲਾਂ ਹੀ ਕਸਟਮਰ ਦਸਤਾਵੇਜ਼ ਸੇਵਾ ਮੁਹੱਈਆ ਕਰਦਾ ਹੈ ਜੋ ਇਸਦਾ ਲੌਜਿਕ ਲਾਗੂ ਕਰਦੀ ਹੈ, ਅਸੀਂ ਇਸ ਨੂੰ ਸਧਾਰਣ ਰੱਖਣ ਦਾ ਫੈਸਲਾ ਕੀਤਾ ਅਤੇ ਸਧਾਰਣ ਹੱਲ ਨੂੰ ਵਰਤਿਆ।
ਹਾਲਾਂਕਿ, ਜਲਦੀ ਹੀ ਇਹ ਸਪੱਸ਼ਟ ਹੋ ਗਿਆ ਕਿ ਬਾਹਰੀ ਸਿਸਟਮ ਨੂੰ XML ਜਨਰੇਟ ਕਰਵਾਉਣ ਵਿੱਚ ਕਾਫੀ ਸਮੱਸਿਆਵਾਂ ਆ ਰਹੀਆਂ ਹਨ ਜੋ ਡਾਇਨਾਮਿਕਸ AX ਨੂੰ ਕਬੂਲ ਹੋਵੇਗਾ। ਡਾਇਨਾਮਿਕਸ AX ਦੁਆਰਾ ਜਨਰੇਟ ਕੀਤੀ ਗਈ XML ਸਕੀਮਾ ਕਾਫੀ ਜਟਿਲ ਹੈ ਅਤੇ ਇਹ ਵੀ ਲੱਗਦਾ ਹੈ ਕਿ ਡਾਇਨਾਮਿਕਸ AX ਵਿੱਚ ਕੁਝ ਬੱਗ ਹਨ ਜੋ ਕਦੇ-ਕਦੇ ਉਹ XML ਨੂੰ ਰੱਦ ਕਰ ਦਿੰਦੇ ਹਨ ਜੋ ਹੋਰ ਟੂਲਾਂ ਦੇ ਅਨੁਸਾਰ ਸਕੀਮਾ-ਵੈਧ ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਸਭ ਕੁਝ ਮਿਲਾ ਕੇ ਇਹ ਜਿੰਨਾ ਸਧਾਰਣ ਸੋਚਿਆ ਸੀ, ਉਸ ਤੋਂ ਘੱਟ ਸਧਾਰਣ ਨਿਕਲਿਆ।
ਇਸ ਯਤਨ ਦੌਰਾਨ, ਮੈਨੂੰ ਅਕਸਰ ਇਹ ਸਮਝਣ ਵਿੱਚ ਮਸ਼ਕਲ ਆਈ ਕਿ ਕੁਝ XML ਫਾਇਲਾਂ ਵਿੱਚ ਖਾਸ ਤੌਰ 'ਤੇ ਸਮੱਸਿਆ ਕੀ ਸੀ ਕਿਉਂਕਿ AIF ਦੁਆਰਾ ਦਿੱਤੇ ਗਏ ਤ੍ਰੁਟੀਆਂ ਦੇ ਸੁਨੇਹੇ ਕਮ ਇਨਫੋਮੈਟਿਵ ਹੁੰਦੇ ਹਨ। ਇਹ ਬਹੁਤ ਥਕਾਵਟ ਵਾਲਾ ਵੀ ਸੀ, ਕਿਉਂਕਿ ਮੈਨੂੰ ਬਾਹਰੀ ਸਿਸਟਮ ਤੋਂ ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ 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 ਵਿੱਚ "create" ਸੇਵਾ ਓਪਰੇਸ਼ਨ ਨਾਲ ਸੰਬੰਧਤ ਹੈ) ਇਸ ਗੱਲ ਦੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਿਲ ਕਰਦਾ ਹੈ ਕਿ ਕਿਹੜਾ ਗਾਹਕ ਬਣਾਇਆ ਗਿਆ ਸੀ, ਅਤੇ ਹੋਰ ਗੱਲਾਂ ਦੇ ਨਾਲ-साथ ਬਣਾਏ ਗਏ CustTable ਰਿਕਾਰਡ ਦਾ 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' ਨੂੰ ਉਸ ਗਾਹਕ ਦੇ ਖਾਤੇ ਦੇ ਨੰਬਰ ਨਾਲ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਪੜ੍ਹਨਾ ਚਾਹੁੰਦੇ ਹੋ।