Miklix

Thirrja e Shërbimeve të Dokumenteve AIF direkt nga X++ në Dynamics AX 2012

Publikuar: 16 shkurt 2025 në 11:23:46 e paradites, UTC

Në këtë artikull, unë shpjegoj se si të thërras shërbimet e dokumenteve të Kornizës së Integrimit të Aplikacioneve në Dynamics AX 2012 direkt nga kodi X++ duke imituar thirrjet hyrëse dhe dalëse, gjë që mund ta bëjë dukshëm më të lehtë gjetjen dhe debugimin e gabimeve në kodin AIF.


Kjo faqe u përkthye me makinë nga anglishtja për ta bërë të aksesueshme për sa më shumë njerëz. Fatkeqësisht, përkthimi me makinë nuk është ende një teknologji e përsosur, kështu që mund të ndodhin gabime. Nëse preferoni, mund ta shikoni versionin origjinal në anglisht këtu:

Calling AIF Document Services Directly from X++ in Dynamics AX 2012

Informacioni në këtë postim bazohet në Dynamics AX 2012 R3. Mund të jetë ose jo e vlefshme për versione të tjera.

Kohët e fundit po ndihmoja një klient të zbatonte një port hyrës të Kornizës së Integrimit të Aplikacioneve (AIF) për krijimin e klientëve bazuar në të dhënat që po merrnin nga një sistem tjetër. Duke qenë se Dynamics AX tashmë ofron shërbimin e dokumenteve CustCustomer, i cili zbaton logjikën për këtë, ne vendosëm ta mbanim të thjeshtë dhe të përdornim zgjidhjen standarde.

Megjithatë, shumë shpejt rezultoi se kishte shumë probleme që sistemi i jashtëm të gjeneronte XML që Dynamics AX do ta pranonte. Skema XML e gjeneruar nga Dynamics AX është mjaft komplekse dhe duket gjithashtu se ka pak bugs në Dynamics AX që ndonjëherë e bën atë të refuzojë XML që është schema-valid sipas mjeteve të tjera, kështu që në tërësi, ajo u vërtetua të jetë më pak e thjeshtë se sa kisha menduar.

Gjatë përpjekjes, shpesh kam luftuar për të kuptuar se cili ishte saktësisht problemi me disa skedarë XML, sepse mesazhet e gabimit të dhëna nga AIF janë më pak se informative. Ishte gjithashtu e lodhshme, sepse m'u desh të prisja që sistemi i jashtëm të dërgonte një mesazh të ri mbi MSMQ dhe pastaj përsëri që AIF të merrte mesazhin dhe ta përpunonte atë para se të mund të shihja një gabim.

Prandaj hetova nëse është e mundur të thirret kodi i shërbimit direkt me një skedar XML lokal për testim disi më të shpejtë dhe rezulton se është - dhe jo vetëm kaq, është vërtet e thjeshtë për t'u bërë dhe në fakt jep shumë më shumë mesazhe gabimi kuptimplotë.

Puna shembull më poshtë lexon një skedar XML lokal dhe përpiqet ta përdorë atë me klasën AxdCustomer (që është klasa e dokumenteve e përdorur nga shërbimi CustCustomer) për të krijuar një klient. Ju mund të bëni punë të ngjashme për të gjitha klasat e tjera të dokumenteve, për shembull AxdSalesOrder, nëse keni nevojë.

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');
}

Objekti AifEntityKey i kthyer nga metoda customer.create() (e cila korrespondon me operacionin e shërbimit "krijo" në AIF) përmban informacione se cili klient është krijuar, ndër të tjera RecId i rekordit të krijuar CustTable.

Nëse ajo që po përpiqeni të testoni është një port Outbound në vend të kësaj ose nëse thjesht keni nevojë për një shembull se si XML duhet të duket në portin Inbound, ju gjithashtu mund të përdorni klasën e dokumentit për të eksportuar një klient në një skedar në vend të kësaj duke thirrur metodën read() (që korrespondon me operacionin e shërbimit "lexo" ) në vend të kësaj, Si kështu:

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');
}

Sigurisht që duhet të zëvendësoni '123456' me numrin e llogarisë së klientit që dëshironi të lexoni.

Shpërndaje në BlueskyShpërndaje në FacebookNdani në LinkedInShpërndaje në TumblrShpërndaje në XNdani në LinkedInPin në Pinterest

Mikkel Bang Christensen

Rreth Autorit

Mikkel Bang Christensen
Mikkel është krijuesi dhe pronari i miklix.com. Ai ka mbi 20 vjet përvojë si programues profesional kompjuteri/zhvillues softuerësh dhe aktualisht është i punësuar me kohë të plotë për një korporatë të madhe evropiane IT. Kur nuk bën blog, ai e kalon kohën e lirë në një gamë të gjerë interesash, hobish dhe aktivitetesh, të cilat mund të reflektohen në një farë mase në shumëllojshmërinë e temave të mbuluara në këtë faqe interneti.