Posts Tagged ‘ form

X++ :8- Form Nedir?

Bu yazıda Dynamics 365 Finance and Operations formlarının temellerinden ve basit bir formu nasıl oluşturabiliriz anlatacağım. Form uygulamanın kullanıcıya sunduğu ara yüzdür. Çok gelişmiş özellikleri olan bu yapının benim en çok sevdiğim tarafı tasarımla sizi uğraştırmamasıdır. Ağaç yapısında alanları eklediğinizde otomatik tasarım ortaya çıkar ve siz tasarımla uğraşmazsınız.

Bir örnek ile açıklamaya çalışacağım.

Resim-1

Önceki yazılarımda oluşturduğum FDBookTable için bir tane form yapalım.

Resim-2

Formlardaki temel nesneler aslında 3 tanedir. Öncelikle Data Source formun temel veri kaynağını gösterir. Burada Table, View veya Query kullanabiliriz. Methods kod yazabildiğimiz yerler sadece ana alanda değil her bir nesneye de kod yazabiliyoruz. Form metodları ile ilgili ayrı bir yazı düşünüyorum. Gelelim Design kısmına burası bizim tasarımı yaptığımız yer. Burada Pattern uygulayabiliriz.Uyguladığınızda temel nesneleri oluşturmanızı bekliyor bu sayede standartta uygun tasarım yapmış olursunuz.

Resim-3

Ben Apply pattern -> Simple List seçtim. Listede birçok Pattern var.

Resim-4

Simple List için gerekli olan nesneler kırmızı ile gösteriliyor. Her nesneyi eklediğinizde burası düzelecek.

Resim-5

Bazı nesneler kendi tasarımına ihtiyaç duyabilir. Şimdi 3 tane gerekli olan nesneyi ekliyorum.

Resim-6

Action Pane Filter grup ve Grid ekledim. İstenenler bunlardı. Burada veriyi gridde göstereceğiz.

Resim-7

Bir nesnenin doğru veri kaynağından veri gösterebilmesi için Data Source’un seçilmesi gerekiyor.

Resim-8

Veri kaynağından istediğim anaları gride bıraktım ve kaydettim. Artık formum hazır sayılır.

Resim-9

Derleyip formumu başlangıç nesnesi olarak seçip projemi çalıştırdığımda formum açılacak. Veri girişi veya diğer  işlemleri yapabilirim.

Resim-10

Bu yazıda Form nedir nasıl oluşturulur anlatmaya çalıştım. Tabi Form çok geniş bir konu çok farklı tipte formlar yapılabiliyor. En kolay öğrenme yöntemi standartta olan formları incelemek. Ayrıca farklı formlar yapıp kendinizi geliştirebilirsiniz. Formlar için en önemli konu veri kaynağı mantığını anlamak. Formlarda aslında Query kullanılıyor eğer Query mantığında eksikleriniz varsa öncelikle onları halledin.

Selamlar.

www.fatihdemirci.net

TAGs: X++,Form, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

Dynamics Ax 2012 Form templates

Merhaba,

Ax 2012 ile birlikte form yapısında bir çok değişiklik oldu. Fırsat buldukça bunlardan bahsedeceğim. Bu yazımda form şablonlarından (Form Templates) bahsetmek istiyorum. Ax 2012 ile form arayüzü daha zengin bir yapıya kavuştu. Son kullanıcı için iyi olan bu değişiklik geliştiriciler için fazladan mesai anlamına geliyor. Üstelik standart formlardaki görüntüye benzer bir görüntüyü yakalamak oldukça zor. İşte bu zorluktan dolayı en temel form yapıları için şablonlar hazırlanmış. Şablonları kullanarak kolayca standart form yapısına uygun formlar hazırlanabiliyor.  Şablonlar SysBPStyle_<Şablon ismi> ile başlayan formlar. Siz şablondan  bir form oluşturduğunuzda bu formlar çoğaltılıp yeni pencerede açılıyor. Sekiz  farklı şablon mevcut. AOT de Forms düğümüne sağ tıkladığınızda aşağıdaki resimde görünen liste karşınıza çıkıyor.

Bunlar da AOT deki şablon formlar.

Şimdi tek tek bu şablonları inceleyelim.

  • ListPage

Bir modülün giriş formları genelde ListPage lerdir. ListPage lerde sadece ana veriler görüntülenir. Veri güncelleme eklem gibi işlemler için Edit formalara ihtiyaç vardır. ListPage formaları Enterprise Portale (EP) deploy edilebilir. ListPage formlarında direk kod yazılamaz. ListPageInteraction sınıfı yardımıyla bazı kontroller yazılır. Örnek olarak CustTableListPage ve SalesTableListPage verilebilir. ListPage ile alakalı oluşturduğunuz bütün nesnelerin sonun “ListPage” eklemek en iyi yöntem olarak tavsiye ediliyor.

  • DetailsFormMaster

Ana veri girişi ve güncellemesi yapılan formlar genelde bu şablon tipindedir. CustTable ve VendTable gibi.

  • DetailsFormTransaction

Hareket girişi yapılan formlar bu tiptedir. SalesTable ve PurchTable gibi. Eskiden bir ana veri ve satırları tipinde bir formu biz iki grid yapıp gösteriyorduk. Eski SalesTable formunda olduğu gibi. Ax 2012 de ise SalesTableListPage ile SalesTable tablosunun kayıtlarını görebilir bu formdan güncelle , yeni kayıt veye grid üzerinde güncelle diyerek SalesTable formunu geçebilirsiniz.

  • SimpleListDetails

Bu şablonda ise bir ana veri ve ona ait detay verilerin listelenir. Sol tarafta bir grid liste var. Sağ tarafta ise o listede hangi satır üzerinde iseniz onun detay bilgileri var. DimensionDetails ve MainAccount formları gibi.

  • SimpleList

Bir grid içinde verilerin listelendiği ve  Grid dışında bir eklentisi olmayan basit bir şablon. MainAccountCategory gibi.

  • TableOfContents

Ax 2012 deki parametre formları bu tiptedir. Sol tarafta tablar listelenir. Bir taba tıkladığınızda sağ tarafta içeriği görürsünüz. SalesParemeters gibi.

  • Dialog

Belli bir veriyi göstermek veye bazı basit bilgileri kullanıcıdan almak için kullanılan şablondur. Ok ve Cancel butonları vardır. EcoResProductCreate formu gibi.

  • DropDialog

Kullanıcıdan basit verileri almaya yaran bir şablon. Sadece Ok butonu vardır. EcoResCategoryHierarchyCreate gibi.

Bir şablondan form oluşturduğunuzda Design kısmındaki Style özelliğinde şablonun ismi yazılır. Style Auto ise bir şablondan oluşturulmamış demektir. Şablon ile oluşturulmuş bir formun yapısını aşağıdaki resimde görünen Check form style best practices butonu ile kontrol edebilirsiniz.

Açıkça söylemek gerekirse ilk yaptığım formlarda çok vakit kaybettim. Neyin ne olduğunu nereye ne gelmesi gerektiğini anlayana kadar çalışmam gerekti. Özellikle ListPage ve   DetailsFormTransaction tiplerinde form yaparken ciddi uğraşmam gerekti. Yapıyı kavradıktan sonra ise işler basitleşiyor ve hızlanıyor. Şablonlar sizin için tasarımın büyük bir kısmını hallediyor. Siz sadece Datasource’ları belirleyip gerekli alanları forma yerleştiriyorsunuz.

Bence bu yapı standart oluşturması ve tasarım bütünlüğü açısından iyi olmuş. Son kullanıcıların hoşuna gider mi bilmiyorum ama ben beğendim.

Selamlar.

Axaptada hiyerarşık bir tabloyu ağaç yapısıyla yönetmek

Merhaba

Bazı durumlarda hiyerarşık yapılar kurmak zorunda kalabilirsiniz. Bunu yönetmenin en iyi yolu ağaç(Tree) yapısını kullanmaktır. Axapta standardında bir çok yerde ağaç yapısını görebilirsiniz. Örneğin: LedgerRowDefDesigner formunda sürükle bırakla çalışan bir ağaç yapısı mevcut. Ayrıca  tutorial_Form_TreeControl örnek formu da size fikir verebilir.

Ben örneğimde bir hiyerarşi tablosunun form açıldığında ağaç yapısıyla görüntülenmesini ve  ağaç elemanlarının (Node)  bu form vasıtasıyla düzenlenmesinin (güncelleme , silme ve ekleme) nasıl yapılacağını anlatacağım.

Örnek olarak şöyle bir tablomuz  olsun :

ETGItemGroupTable :    ItemGroupId    ,    ItemGroupName    ,    ItemGroupLevel   ,    ItemGroupIdParent
ItemGroupId  ,   ItemGroupIdParent   =  EDT – DTItemGroupId

ItemGroupId  ,   ItemGroupIdParent   aynı EDT den oluşturuyoruz. Hiyerarşik yapıyı ItemGroupIdParent sayesinde kuracağız.

ItemGroupLevel   Burada  hiyerarşiyle pek ilgisi olmayan benim kurgumla alakalı olan bir seviye kodu var. Ben bu hiyerarşideki bütün elamanların birer seviye kodu olsun istiyorum ve bu kod 1-8 arasında olabilir. Formda gerekli kontrolleri buna göre yazıyorum.

Ulaşmak istediğim form görünümü şu şekilde

Yeni bir form oluşturup veri kaynağını ekleyip tasarımdada gerekli elemanları ekleyelim. Ağaç elemanımızı da ekledikten sonra bazı metodlar yazmamız gerekiyor onlara gecelim.

Read more

Formda CTRL veya Shift ile seçilmiş kayıtlarda işlem yapmak

Merhaba.

Axaptada grid üzerinde CTRL veya shift ile çoklu seçim yapılabilir.

Bu özelliği kullandığım bir örneği sizinle paylaşıyorum.

Öreneğimizde seçilen kayıtları bir buton aracılığıyla artan numara atanacak.

Öncelikle eklediğimiz butonun propertisinden MultiSelecet  = Yes yapıyoruz.

daha  sonra  click() metodundan   preNumbering() metodnu çağırıyoruz.

Element.preNumbering();

preNumbering() metodumuz inceleyelim ;

void preNumbering()
{
    CustInvoiceJour localCustInvoiceJour;

    boolean         isPreExist;
;
    isPreExist = false;
    localCustInvoiceJour = CustInvoiceJour_ds.getFirst(1); // çoklu seçim varsa içinde dolanıp  PreInvoiceId dolu olan varsa  uyarı verdiriyoruz

   <!--more-->

 if(localCustInvoiceJour)
    {
        while (localCustInvoiceJour)
        {
            if(localCustInvoiceJour.PreInvoiceId)
            {
                isPreExist = true;
            }
            localCustInvoiceJour = CustInvoiceJour_ds.getNext();
        }
    }
    else // eğer çoklu seçim yapılmamış tek satır seçilmişse burası çalışıyor
    {
         if(CustInvoiceJour.PreInvoiceId)
            {
                isPreExist = true;
            }
  �
    }
    if(isPreExist) // eğer PreInvoiceIddolu olan bir kayıt varsa  uyarı veriyoruz
    {
       if(box::yesNo("Seçilen kayıtlarda matbu numara var, değiştirmek istiyor musunuz?",  dialogbutton::Yes) == dialogbutton::Yes)
       {

           // dolu olmasına rağmen değiştirmek isterse
            element.dialogPreNumbering();
       }
    }
    else // PreInvoiceId  eğer dolu değilse diyaloğumuzu çağırıyoruz
    {
        element.dialogPreNumbering();
    }
}

şidide  dialogPreNumbering() metodumuza bakalım

void dialogPreNumbering()
{
    dialog                  d = new Dialog("Numara başlangıcı");
    dialogField             dfPrefix;
    dialogField             dfSufix;

    DTSeries                Prefix;
    DTStartingNum           Sufix;
    CustInvoiceJour         localCustInvoiceJour;
    CustInvoiceJour         upCustInvoiceJour;
;
    d.addGroup().columns(2);
    dfPrefix = d.addField(typeId(DTSeries),"Seri");
    dfSufix  = d.addField(typeId(DTStartingNum), "Başlangıç");

    if(d.run())
    {
        Prefix      = dfPrefix.value();
        Sufix       = dfSufix.value();

        localCustInvoiceJour = CustInvoiceJour_ds.getFirst(1);

        if(localCustInvoiceJour) // yine seçilen kayıtlarda dolanıp gerekli updateişlemini yapıyoruz.
        {
            while (localCustInvoiceJour)
            {
                ttsbegin;
                upCustInvoiceJour = CustInvoiceJour::findRecId(localCustInvoiceJour.RecId,true);
                upCustInvoiceJour.PreInvoiceId = strfmt("%1%2",Prefix,Sufix);
                upCustInvoiceJour.update();
                ttscommit;

                Sufix += 1;

                localCustInvoiceJour = CustInvoiceJour_ds.getNext();
            }
        }
        else
        {
                ttsbegin;
                upCustInvoiceJour = CustInvoiceJour::findRecId(CustInvoiceJour.RecId,true);
                upCustInvoiceJour.PreInvoiceId = strfmt("%1%2",Prefix,Sufix);
                upCustInvoiceJour.update();
                ttscommit;
      �
        }
    }
  �
    CustInvoiceJour_ds.executeQuery(); // formu tazeledik update işlemleri artık görünür halde

}

Selamlar.

Bir satır kaydedildiğinde başka tabloya kayıt atmak

Merhaba

Bir tabloya yeni bir kayıt  kaydedildiğin de bu kayıtla ilişikli olarak başka bir tabloya kayıt atmakla  ilgili bir çalışmam  oldu paylaşmakta fayda gördüm.

Bir tanım tablomuz var ve orda zorunlu sütünü var. Eğer zorunluysa çalışanlar tablosundaki kişilere birer kayıt açmak zorundayız.

Bunu tablonun insert medtoduna şu kodları yazarak yapabiliriz.

  public void insert()
{

    ETGDocuMan  eTGDocuMan; // kayıtları oluşturacağımız tablo
    EmplTable   emplTable;

Read more

Formdaki bir alanın değerini başka forma aktarmak.

Merhaba

Formdan başka bir form açtırıyorsunuz açılan forma diğer formdaki herhangi bir alanın değerini göndermek isterseniz parm kullanabilirsiniz.

Örneğin, 

void clicked()
{