Dynamics AX 2012에서 X++에서 AIF 문서 서비스 직접 호출
게시됨: 2025년 2월 16일 오전 11시 23분 2초 UTC
이 문서에서는 Dynamics AX 2012에서 X++ 코드에서 직접 Application Integration Framework 문서 서비스를 호출하여 인바운드 및 아웃바운드 호출을 모두 에뮬레이션하는 방법을 설명합니다. 이를 통해 AIF 코드에서 오류를 훨씬 더 쉽게 찾고 디버깅할 수 있습니다.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
이 게시물의 정보는 Dynamics AX 2012 R3에 기반합니다. 다른 버전에는 유효할 수도 있고 그렇지 않을 수도 있습니다.
저는 최근 고객이 다른 시스템에서 수신한 데이터를 기반으로 고객을 만드는 Application Integration Framework(AIF) 인바운드 포트를 구현하도록 돕고 있었습니다. Dynamics AX는 이미 이 로직을 구현하는 CustCustomer 문서 서비스를 제공하므로, 우리는 간단하게 유지하고 표준 솔루션을 사용하기로 결정했습니다.
그러나 Dynamics AX가 수용할 XML을 생성하도록 외부 시스템을 만드는 데 많은 문제가 있다는 것이 곧 밝혀졌습니다. Dynamics AX에서 생성한 XML 스키마는 매우 복잡하고 Dynamics 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'을 읽고자 하는 고객의 계좌 번호로 바꿔야 합니다.