Miklix

Dynamics AX 2012'de AIF Belge Hizmetlerini Doğrudan X++'dan Çağırma

Yayınlandı: 16 Şubat 2025 11:23:17 UTC
Son güncelleme: 12 Ocak 2026 08:55:25 UTC

Bu makalede, Dynamics AX 2012'de Uygulama Entegrasyon Çerçevesi (AIF) belge servislerini X++ kodundan doğrudan nasıl çağırabileceğinizi, hem gelen hem de giden çağrıları taklit ederek AIF kodundaki hataları bulmayı ve ayıklamayı önemli ölçüde kolaylaştırabileceğinizi açıklıyorum.


Bu sayfa, mümkün olduğunca çok kişi tarafından erişilebilir olması amacıyla İngilizce'den makine çevirisiyle çevrilmiştir. Ne yazık ki, makine çevirisi henüz mükemmelleştirilmiş bir teknoloji değildir, bu nedenle hatalar meydana gelebilir. Tercih ederseniz, orijinal İngilizce versiyonu buradan görüntüleyebilirsiniz:

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

Bu yazıda yer alan bilgiler Dynamics AX 2012 R3'e dayanmaktadır. Diğer sürümler için geçerli olabilir veya olmayabilir.

Geçtiğimiz günlerde, bir müşterinin başka bir sistemden aldıkları verilere dayanarak müşteri oluşturmak için bir Uygulama Entegrasyon Çerçevesi (AIF) gelen portunu uygulamasına yardımcı oluyordum. Dynamics AX zaten bu mantığı uygulayan CustCustomer belge hizmetini sağladığı için, işi basitleştirmek ve standart çözümü kullanmak istedik.

Ancak, harici sistemin Dynamics AX'in kabul edeceği XML üretmesinde birçok sorun olduğu kısa sürede anlaşıldı. Dynamics AX tarafından üretilen XML şeması oldukça karmaşık ve ayrıca Dynamics AX'te bazen diğer araçlara göre şema açısından geçerli olan XML'i reddetmesine neden olan birkaç hata da mevcut gibi görünüyor; bu nedenle, sonuç olarak düşündüğümden daha karmaşık olduğu ortaya çıktı.

Bu süreçte, AIF tarafından sağlanan hata mesajlarının yeterince bilgilendirici olmaması nedeniyle, bazı XML dosyalarındaki sorunun tam olarak ne olduğunu anlamakta sık sık zorlandım. Ayrıca, hatayı görebilmek için önce harici sistemin MSMQ üzerinden yeni bir mesaj göndermesini, ardından AIF'nin mesajı alıp işlemesini beklemem gerektiğinden, bu süreç oldukça zahmetliydi.

Bu nedenle, daha hızlı test yapabilmek için servis kodunu doğrudan yerel bir XML dosyasıyla çağırmanın mümkün olup olmadığını araştırdım ve bunun mümkün olduğunu, üstelik çok basit olduğunu ve aslında çok daha anlamlı hata mesajları sağladığını gördüm.

Aşağıdaki örnek iş, yerel bir XML dosyasını okur ve bunu AxdCustomer sınıfıyla (CustCustomer servisi tarafından kullanılan belge sınıfı) kullanarak bir müşteri oluşturmaya çalışır. İhtiyaç duyarsanız, diğer tüm belge sınıfları için de benzer işler oluşturabilirsiniz, örneğin AxdSalesOrder için.

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

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, hangi müşterinin oluşturulduğuna dair bilgiler içerir; bu bilgiler arasında oluşturulan CustTable kaydının RecId'si de bulunur.

Eğer test etmeye çalıştığınız şey bir Giden port ise veya sadece Gelen portta XML'in nasıl görünmesi gerektiğine dair bir örneğe ihtiyacınız varsa, bunun yerine "read" servis işlemine karşılık gelen read() yöntemini çağırarak bir müşteriyi dosyaya aktarmak için document sınıfını da kullanabilirsiniz, şöyle:

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

Elbette '123456' yerine okumak istediğiniz müşterinin hesap numarasını yazmalısınız.

Daha Fazla Okuma

Bu yazıyı beğendiyseniz, şu öneriler de ilginizi çekebilir:


Bluesky'de paylaşFacebook'ta paylaşLinkedIn'de paylaşTumblr'da paylaşX'te paylaşLinkedIn'de paylaşPinterest'e Pinleyin

Mikkel Christensen

Yazar Hakkında

Mikkel Christensen
Mikkel miklix.com'un yaratıcısı ve sahibidir. Profesyonel bilgisayar programcısı/yazılım geliştiricisi olarak 20 yılı aşkın deneyime sahiptir ve şu anda büyük bir Avrupa BT şirketinde tam zamanlı olarak çalışmaktadır. Blog yazmadığı zamanlarda, boş zamanlarını çok çeşitli ilgi alanları, hobiler ve aktivitelerle geçirmektedir ve bu da bir dereceye kadar bu web sitesinde kapsanan konuların çeşitliliğine yansıyabilir.