Dynamics AX 2012'de AIF Belge Hizmetlerini Doğrudan X++'dan Çağırma
Yayınlandı: 16 Şubat 2025 11:23:17 UTC
Bu makalede, Dynamics AX 2012'de Application Integration Framework belge servislerinin hem gelen hem de giden çağrıları taklit ederek doğrudan X++ kodundan nasıl çağrılacağını açıklıyorum; bu sayede AIF kodundaki hataları bulmak ve ayıklamak önemli ölçüde kolaylaşabilir.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Bu gönderideki bilgiler Dynamics AX 2012 R3'e dayanmaktadır. Diğer sürümler için geçerli olabilir veya olmayabilir.
Yakın zamanda bir müşterinin başka bir sistemden aldıkları verilere göre müşteriler oluşturmak için bir Uygulama Entegrasyon Çerçevesi (AIF) gelen bağlantı noktası uygulamasına yardımcı oluyordum. Dynamics AX zaten bunun mantığını uygulayan CustCustomer belge hizmetini sağladığından, bunu basit tutmaya ve standart çözümü kullanmaya karar verdik.
Ancak, kısa süre sonra Dynamics AX'in kabul edeceği XML'i harici sistemin üretmesinde çok sayıda sorun olduğu ortaya çıktı. Dynamics AX tarafından üretilen XML şeması oldukça karmaşıktır ve ayrıca Dynamics AX'te diğer araçlara göre şema geçerli olan XML'i reddetmesine neden olan birkaç hata olduğu anlaşılıyor, bu yüzden genel olarak düşündüğümden daha az basit olduğu ortaya çıktı.
Çabam sırasında, AIF tarafından sağlanan hata mesajları yeterince bilgilendirici olmadığından, belirli XML dosyalarındaki sorunun tam olarak ne olduğunu anlamakta sık sık zorlandım. Ayrıca sıkıcıydı, çünkü harici sistemin MSMQ üzerinden yeni bir mesaj göndermesini ve ardından AIF'in mesajı alıp işlemesini beklemek zorunda kaldım, böylece bir hata görebiliyordum.
Bu nedenle, testlerin daha hızlı yapılabilmesi için servis kodunun doğrudan yerel bir XML dosyasıyla çağrılmasının mümkün olup olmadığını araştırdım ve bunun mümkün olduğu ortaya çıktı - ve sadece bu da değil, bunu yapmak gerçekten basit ve aslında çok daha anlamlı hata mesajları sağlıyor.
Aşağıdaki örnek iş yerel bir XML dosyasını okur ve bunu AxdCustomer sınıfıyla (CustCustomer hizmeti tarafından kullanılan belge sınıfıdır) kullanarak bir müşteri oluşturmaya çalışır. İhtiyacınız varsa diğer tüm belge sınıfları için, örneğin AxdSalesOrder için benzer işler yapabilirsiniz.
{
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() metodu tarafından döndürülen AifEntityKey nesnesi (AIF'deki "create" servis işlemine karşılık gelir), diğer şeylerin yanı sıra oluşturulan CustTable kaydının RecId'si gibi hangi müşterinin oluşturulduğuna dair bilgileri içerir.
Test etmeye çalıştığınız şey bir Giden bağlantı noktasıysa veya yalnızca XML'in Gelen bağlantı noktasında nasıl görünmesi gerektiğine dair bir örneğe ihtiyacınız varsa, bunun yerine bir müşteriyi bir dosyaya aktarmak için belge sınıfını da kullanabilirsiniz; bunun için "okuma" servis işlemine karşılık gelen read() metodunu çağırabilirsiniz:
{
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');
}
Elbette '123456'yı okumak istediğiniz müşterinin hesap numarasıyla değiştirmelisiniz.