Miklix

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.


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

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 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:

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'yı okumak istediğiniz müşterinin hesap numarasıyla değiştirmelisiniz.

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

Mikkel Bang Christensen

Yazar Hakkında

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