Miklix

ਡਾਇਨਾਮਿਕਸ 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, ਜੇਕਰ ਤੁਹਾਨੂੰ ਲੋੜ ਹੋਵੇ।

static void CustomerCreate(Args _args)
{
    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" ਸੇਵਾ ਓਪਰੇਸ਼ਨ ਨਾਲ ਸੰਬੰਧਤ ਹੈ), ਇਸ ਤਰ੍ਹਾਂ:

static void CustomerRead(Args _args)
{
    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' ਨੂੰ ਉਸ ਗਾਹਕ ਦੇ ਖਾਤੇ ਦੇ ਨੰਬਰ ਨਾਲ ਬਦਲਣਾ ਚਾਹੀਦਾ ਹੈ ਜਿਸ ਨੂੰ ਤੁਸੀਂ ਪੜ੍ਹਨਾ ਚਾਹੁੰਦੇ ਹੋ।

ਬਲੂਸਕੀ 'ਤੇ ਸਾਂਝਾ ਕਰੋਫੇਸਬੁੱਕ 'ਤੇ ਸਾਂਝਾ ਕਰੋਲਿੰਕਡਇਨ 'ਤੇ ਸਾਂਝਾ ਕਰੋਟਮਬਲਰ 'ਤੇ ਸਾਂਝਾ ਕਰੋX 'ਤੇ ਸਾਂਝਾ ਕਰੋਲਿੰਕਡਇਨ 'ਤੇ ਸਾਂਝਾ ਕਰੋPinterest 'ਤੇ ਪਿੰਨ ਕਰੋ

ਮਿੱਕੇਲ ਕ੍ਰਿਸਟਨਸਨ

ਲੇਖਕ ਬਾਰੇ

ਮਿੱਕੇਲ ਕ੍ਰਿਸਟਨਸਨ
ਮਿਕੇਲ miklix.com ਦਾ ਸਿਰਜਣਹਾਰ ਅਤੇ ਮਾਲਕ ਹੈ। ਉਸਨੂੰ ਇੱਕ ਪੇਸ਼ੇਵਰ ਕੰਪਿਊਟਰ ਪ੍ਰੋਗਰਾਮਰ/ਸਾਫਟਵੇਅਰ ਡਿਵੈਲਪਰ ਵਜੋਂ 20 ਸਾਲਾਂ ਤੋਂ ਵੱਧ ਦਾ ਤਜਰਬਾ ਹੈ ਅਤੇ ਉਹ ਵਰਤਮਾਨ ਵਿੱਚ ਇੱਕ ਵੱਡੇ ਯੂਰਪੀਅਨ ਆਈਟੀ ਕਾਰਪੋਰੇਸ਼ਨ ਲਈ ਪੂਰਾ ਸਮਾਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਜਦੋਂ ਉਹ ਬਲੌਗ ਨਹੀਂ ਲਿਖਦਾ, ਤਾਂ ਉਹ ਆਪਣਾ ਖਾਲੀ ਸਮਾਂ ਬਹੁਤ ਸਾਰੀਆਂ ਰੁਚੀਆਂ, ਸ਼ੌਕ ਅਤੇ ਗਤੀਵਿਧੀਆਂ 'ਤੇ ਬਿਤਾਉਂਦਾ ਹੈ, ਜੋ ਕਿ ਕੁਝ ਹੱਦ ਤੱਕ ਇਸ ਵੈੱਬਸਾਈਟ 'ਤੇ ਕਵਰ ਕੀਤੇ ਗਏ ਵਿਸ਼ਿਆਂ ਦੀ ਵਿਭਿੰਨਤਾ ਵਿੱਚ ਪ੍ਰਤੀਬਿੰਬਤ ਹੋ ਸਕਦਾ ਹੈ।