Posts Tagged ‘ Dialog

Dynamics Ax 2012′de diyaloğa boyut eklemek

Merhaba

Ax 2012′ de bir diyaloğa boyut ekleyip geri dönüşünü alabilmek için şöyle bir kod yazdım.

static void FD_AddDimToDialog(Args _args)
{
    DialogFieldDimensionDefaultingController    dfDialogFieldDim;
    DimensionDefaultingFieldSet                 dimensions;
    Dialog                                      dialog;
    ;

    dialog = new dialog();

    dialog.caption("Diyaloğa boyut eklemek");
    dfDialogFieldDim = dialog.addDimensionDefaultingController();
    dfDialogFieldDim.initWithValues(false,false,true,0,"Boyutlar");

    if(dialog.run())
    {
        dfDialogFieldDim.save();
        dimensions = dfDialogFieldDim.value();

        info(strfmt("DimensionAttributeValueSet RecId = %1 ",dimensions[1]));
    }
}

DialogFieldDimensionDefaultingController sınıfında farklı metotlar mevcut. Bunlar incelenip ihtiyaca göre kullanılabilir. DimensionDefaultingFieldSet dizi tipinde bir EDT 3 elemanı var. diğer 2 elemanı sizin sınıfta kullandığınız metoda göre doluyor. Birinci elemanında DimensionAttributeValueSet tablosunun RecId ‘si var.

Selamlar.

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 txt dosya okuyup SalesLine’ a kayıt atmak

Merhaba

Daha  önce txt formatında bir dosyayı okumakla ilgili bir makale yazmıştım. Buradan okuyabilirsiniz.

Aynı örneği biraz geliştirdim. Öncelikle dosyayı diyalogtan alıyoruz ve tab ile ayrılmış halini pars edip container a atıyoruz. Daha sonra burdaki satırlardan SalesLine oluşturuyoruz.

Örnek text dosyamız böyle olsun boşluklar tab. Editorden dolayı burada net anlaşılamıyor. 

NameAlias  Name                         Vergi  Adet   Fiyat

40306445    DAVIDOFF GOLD      0     2.00     14.00
40318523     KENT WHITE              0    1.00       7.00
40329055    CAMEL KISA BOX     8    7.00      18.00

Örenğimiz şöye :
void TxtTransfer()
{
    FileName            fileName  ;
    container           c;
    FileIOPermission    permission;
    TextBuffer          textBuffer;
    str                 readText;
    str                 readLine , strlineamount;
    int                 etgline  ;
    int                 i = 0;
    Dialog              dialog = new Dialog(“Dosya seçiniz.”);
    DialogField         dfFileName;
    SalesLine           txtSalesLine;
    InventTable         inventTable;
    InventItemSalesSetup InventItemSalesSetup;
    InventDim           txtinventDim;

    Amount              lAmount,KDV;
    ;
    #File

    dfFileName = dialog.addField(typeId(FileNameOpen));
    dialog.filenameLookupFilter(["All files", #AllFiles]);

Read more

Axapta’da arama metodu örneği

Merhaba

8 arama sahası ve 5 farklı tablo içeren bir arama formu istendiğinde nasıl bir metod yazabileceğinizin bir örneğini paylaşıyorum.

Hangi sahanın dolu olacağı belli olmayan ve kombinasyonun çok fazla olduğu bu durumda öncelikle en çok kriter girilebilecek

olan ana tabloyu alıp döngü içinde diğerlerinin varlığı kontrol etmek mantıklı.

Kriterlere uyan bir kayıt olursa bunun bir container a dolduruyoruz.

public Container simpleSearch(  BorAXEmplId  _boraxEmplId

                                ,EMplId _emplId

                                ,HRMIdentificationNumber _number

                                ,EmplName _name

                                ,HrmLastName _lastName

                                ,Birthdate _birthDate

                                ,NameTwenty _birthPlace

                                ,Email _email)

{

Read more

Query & Dialog Örnekleri 6

Merhaba

static void Query6(Args _args)
{
    CustTable   cust;
    CustTrans   custTrans;

    Query                   q = new Query();
    QueryRun                qr;
    QueryBuildDataSource    qbdsCustTable;
    QueryBuildDataSource    qdbsCustTrans;
    QueryBuildRange         qbrCurrency;
    QueryBuildRange         qbrRiskAmount;
    CurrencyCode            currency;
    Amount                  riskAmount;

    dialog                  d = new Dialog(“Müşteriler”);
    dialogField             dfCurrency;
    dialogField             dfRiskAmount;

    ;
    //Dialog
    dfCurrency = d.addField(typeId(CurrencyCode));
    dfRiskAmount = d.addField(typeId(Amount), “Max risk tutarı :”);

    if(d.run())
    {
        //getFromDialog
        currency    = dfCurrency.value();
        riskAmount  = dfRiskAmount.value();

Read more

Query & Dialog Örnekleri 5

Merhaba

static void query5(Args _args)
{
    CustTable   cust;

    Query                   q = new Query();
    QueryRun                qr;
    QueryBuildDataSource    qbdsCustTable;
    QueryBuildRange         qbrCurrency;
    QueryBuildRange         qbrRiskAmount;
    CurrencyCode            currency;
    Amount                  riskAmount;

    dialog                  d = new Dialog(“Müşteriler”);
    dialogField             dfCurrency;
    dialogField             dfRiskAmount;

    ;
    //Dialog
    dfCurrency = d.addField(typeId(CurrencyCode));
    dfRiskAmount = d.addField(typeId(Amount), “Max risk tutarı :”);

    if(d.run())
    {
        //getFromDialog
        currency    = dfCurrency.value();
        riskAmount  = dfRiskAmount.value();

Read more

Query & Dialog Örnekleri 4

Merhaba

static void query4(Args _args)
{
    CustTable   cust;

    Query                   q = new Query();
    QueryRun                qr;
    QueryBuildDataSource    qbdsCustTable;
    QueryBuildRange         qbrCurrency;
    CurrencyCode            currency;
    dialog                  d = new Dialog(“Müşteriler”);
    dialogField             dfCurrency;
    ;
    dfCurrency = d.addField(typeId(CurrencyCode));
    if(d.run())
    {

Read more

Query & Dialog Örnekleri 3

Merhaba

static void query3(Args _args)
{
    CustTable   cust;

    Query                   q = new Query();
    QueryRun                qr;
    CurrencyCode            currency;
    ;
    currency = “USD”;
    warning(“select ile”);
    while select cust
        where cust.Currency == currency
    {
        info(strFmt(“%1″, cust.Name));
    }

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.

Creating Dialogs

Dialogs are a way to present users with a simple input form. They are commonly used for
small user tasks like filling in report values, running batch jobs, presenting only the most
important fields to the user when creating a new record, etc. Dialogs are normally created
from X++ code without storing actual layout in AOT.
The application class Dialog is used to build dialogs. Other application classes like
DialogField, DialogGroup, DialogTabPage, and so on, are used to create dialog
controls. One of the common ways is to use dialogs within RunBase framework classes that
need user input.

Read more