Wywoływanie usług dokumentów AIF bezpośrednio z X++ w Dynamics AX 2012
Opublikowano: 16 lutego 2025 11:23:09 UTC
W tym artykule wyjaśnię, jak wywoływać usługi dokumentów Application Integration Framework w systemie Dynamics AX 2012 bezpośrednio z kodu X++, emulując zarówno połączenia przychodzące, jak i wychodzące, co może znacznie ułatwić znajdowanie i debugowanie błędów w kodzie AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Informacje zawarte w tym poście dotyczą systemu Dynamics AX 2012 R3. Mogą być lub nie być ważne dla innych wersji.
Niedawno pomagałem klientowi wdrożyć port przychodzący Application Integration Framework (AIF) do tworzenia klientów na podstawie danych, które otrzymywali z innego systemu. Ponieważ Dynamics AX już zapewnia usługę dokumentów CustCustomer, która implementuje logikę tego, postanowiliśmy zachować prostotę i użyć standardowego rozwiązania.
Jednak wkrótce okazało się, że było wiele problemów z wygenerowaniem XML przez system zewnętrzny, który zaakceptowałby Dynamics AX. Schemat XML generowany przez Dynamics AX jest dość złożony i wydaje się również, że w Dynamics AX jest kilka błędów, które czasami powodują odrzucanie XML, który jest zgodny ze schematem według innych narzędzi, więc ogólnie rzecz biorąc, okazało się to mniej proste, niż myślałem.
Podczas tego przedsięwzięcia często miałem problem ze zrozumieniem, jaki dokładnie był problem z pewnymi plikami XML, ponieważ komunikaty o błędach dostarczane przez AIF były mało informacyjne. Było to również żmudne, ponieważ musiałem czekać, aż system zewnętrzny wyśle nową wiadomość przez MSMQ, a następnie ponownie, aż AIF ją odbierze i przetworzy, zanim mogłem zobaczyć błąd.
Zbadałem zatem, czy możliwe jest wywołanie kodu usługi bezpośrednio z lokalnego pliku XML w celu przyspieszenia testów. Okazało się, że jest to możliwe. Co więcej, jest to naprawdę proste i generuje o wiele bardziej znaczące komunikaty o błędach.
Przykładowe zadanie poniżej odczytuje lokalny plik XML i próbuje go użyć z klasą AxdCustomer (która jest klasą dokumentu używaną przez usługę CustCustomer), aby utworzyć klienta. Możesz utworzyć podobne zadania dla wszystkich innych klas dokumentów, na przykład AxdSalesOrder, jeśli potrzebujesz.
{
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');
}
Obiekt AifEntityKey zwrócony przez metodę customer.create() (odpowiadającą operacji usługi „create” w AIF) zawiera informacje o tym, który klient został utworzony, a także między innymi RecId utworzonego rekordu CustTable.
Jeśli zamiast tego próbujesz przetestować port wychodzący lub po prostu potrzebujesz przykładu, jak powinien wyglądać kod XML na porcie przychodzącym, możesz również użyć klasy document do wyeksportowania klienta do pliku, wywołując metodę read() (odpowiadającą operacji usługi „read”) w następujący sposób:
{
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');
}
Oczywiście należy zastąpić liczbę „123456” numerem konta klienta, którego dane chcesz odczytać.