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
Përditësimi i fundit: 12 janar 2026 në 8:55:35 e paradites, UTC

Në këtë artikull, unë shpjegoj se si të thirren 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, të cilat mund ta bëjnë shumë 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 i vlefshëm për versione të tjera.

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

Megjithatë, shpejt doli se kishte shumë probleme për ta bërë sistemin e jashtëm të gjeneronte XML që Dynamics AX do ta pranonte. Skema XML e gjeneruar nga Dynamics AX është mjaft komplekse dhe gjithashtu duket se ka disa gabime në Dynamics AX që ndonjëherë bëjnë që ajo të refuzojë XML që është i vlefshëm për skemën sipas mjeteve të tjera, kështu që në përgjithësi, doli të ishte më pak e thjeshtë nga sa kisha menduar.

Gjatë kësaj përpjekjeje, shpesh e kisha të vështirë të kuptoja saktësisht se cili ishte problemi me disa skedarë XML, sepse mesazhet e gabimit të ofruara nga AIF nuk ishin shumë informuese. Ishte gjithashtu e lodhshme, sepse më duhej të prisja që sistemi i jashtëm të dërgonte një mesazh të ri nëpërmjet MSMQ dhe pastaj përsëri që AIF ta kapte mesazhin dhe ta përpunonte atë përpara se 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 një testim disi më të shpejtë dhe doli që është - dhe jo vetëm kaq, është shumë e thjeshtë për t’u bërë dhe në fakt ofron mesazhe gabimi shumë më kuptimplote.

Shembulli i punës më poshtë lexon një skedar XML lokal dhe përpiqet ta përdorë atë me klasën AxdCustomer (e cila është klasa e dokumentit 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 është e nevojshme.

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() (që korrespondon me operacionin e shërbimit "krijo" në AIF) përmban informacion në lidhje me klientin që është krijuar, ndër të tjera RecId e regjistrimit të krijuar CustTable.

Nëse ajo që po përpiqeni të testoni është një port Dalës ose nëse ju nevojitet vetëm një shembull se si duhet të duket XML në portin Hyrës, mund të përdorni edhe klasën dokument për të eksportuar një klient në një skedar duke thirrur metodën read() (që korrespondon me operacionin e shërbimit "lexo"), si më poshtë:

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, duhet ta zëvendësoni '123456' me numrin e llogarisë së klientit që dëshironi të lexoni.

Lexime të mëtejshme

Nëse ju pëlqeu ky postim, mund t'ju pëlqejnë edhe këto sugjerime:


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

Mikkel Christensen

Rreth Autorit

Mikkel 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.