Archive for the ‘ x++ ’ Category

Ax tablolarındaki kontrol(validation) metodları

Merhaba

Ax tablolarında veri kontrolunu sağlayan metodlardan bahsedeceğim. Herhangi bir tablonun metodları üzerinden sağ tıklayıp yöntemi gecersiz kıl derseniz ezebileceğiniz (Override) metodların listesini görürsünüz. Bu metodlar içinde kontrol için kullanılanları da görebilirsiniz.

Bu konuyu anlatabilmek için bir proje yaptım.  Öncelikle iki alanı olan bir tablo ve onun formunu yaptım. Bir job birde sınıf yazdım burada da kod ile insert update ve delete işlemlerini yaptım. Bunlardan maksadım hangi işlemde hangi kontrol metodu çalışıyor bunu size gösterebilmekti.

Kontrol için kullanıla metodları tek tek ezip içlerine şu kodları yazdım.

Read more

Prompt ekranından girilen kriterleri başka bir query’e aktarmak

Merhaba

Prompt ekranı bir query için kriter girme, sıralama ve gruplama gibi farklı işlemleri yapabileceğiniz çok esnek bir uygulamadır. Özellikle rapor ve formlarda çok kullanılan bu ekranı her ax kullanıcısının çok iyi bilmesi gerekir. Bizim bu yazıdaki konumuz Prompt ekranında herhangi bir veri kaynağı için dinamik olarak girilen kriterleri tespit edip başka bir query’e aktarmaktır.

Bunu şöyle bir jobta deneyebiliriz:


static void GetQueryPromtRangeValues(Args _args)
{
CustTable               CustTable;
CustTable               CustTable2;
int                     counter;

Query                   q;
QueryRun                qRun;
QueryBuildRange         qbr;
QueryBuildDataSource    qbds;

Query                   q2;
QueryRun                qRun2;
QueryBuildDataSource    qbds2;

QueryBuildRange         qbrGet;
QueryBuildDataSource    qbdsGet;

;
// Birinci Query
q       = new Query();
qbds    = q.addDataSource(TableNum(CustTable));
qRun    = new QueryRun(q);
// İkinci Query
q2       = new Query();
qbds2    = q2.addDataSource(TableNum(CustTable));

if(qRun.prompt())
{
// CustTable veri kaynağı için girilen kriterleri buluyoruz
qbdsGet = qRun.query().dataSourceTable(TableNum(CustTable));
counter = qbdsGet.rangeCount(); // Kaç adet kriter girilmiş tespit ettik
// Girilen kriterleri bir döngü kullanarak ikinci query ye ekliyoruz
while(counter >0)
{
qbrGet = qbdsGet.range(counter);
info(strfmt("%1 : %2 ",counter , qbrGet.value() ));
qbds2.addRange(qbrGet.field()).value(qbrGet.value());
counter--;
}

setPrefix("Asıl Query ile ");
while(qRun.next())
{
CustTable = qRun.get(TableNum(CustTable));
info(strfmt("%1 : %2 ", CustTable.AccountNum,CustTable.Name ));
}
}

// ikinci query için QueryRun oluşturuyoruz.
// Aynı kriterlerin eklendiğini promt ekranında görebiliyoruz
qRun2    = new QueryRun(q2);

setPrefix("İkinci Query ile ");
if(qRun2.prompt())
{
while(qRun2.next())
{
CustTable2 = qRun2.get(TableNum(CustTable));
info(strfmt("%1 : %2 ", CustTable2.AccountNum,CustTable2.Name ));
}
}
}

Selamlar.

Script menusune otomatik query oluşturan bir kod eklemek

Merhaba

Daha önce ax editörunda bulunan script menusune nasıl ekleme yapılacağından bahsetmiştik. Ben kendi işlerimde kullanmak üzere bir çok ekleme yaptım bir tanesini sizinle paylaşacağım.

İki tablo ismi  ve join tipini soran ve bu bilgilere göre query hazırlayan kod örneğimiz şöyle:

Öncelikle EditorScripts sınıfımıza şu metodu ekliyoruz.


public void FD_Query(Editor editor)
{
    xppSource       xppSource       = new xppSource();
    Dialog          dialog          = new Dialog("Query oluştur");

    DialogField     dlgTablename    = dialog.addField(typeid(TableName));
    DialogField     dlgTablename2   = dialog.addField(typeid(TableName));
    DialogField     dlgExtTypeName  = dialog.addField(typeid(joinMode));
    Source          template;
;
    if (dialog.run())
    {
        template = xppSource.Query2Method(dlgTablename.value() ,
        dlgTablename2.value(),dlgExtTypeName.value() );

        editor.insertLines(template);
    }
}

Sonra xppSource sınıfımıza şu metodu ekliyoruz.

Read more

Parm metod ile nesneler arasında parametre göndermek

Merhaba

Ax’ta iki nesne arasında iletişimi args sınıfıyla sağladığımızdan bahsetmiştik. Bu makelede Args().Celler() metodunun bir kullanımını anlatacağım.

Şöyel bir istek olsun: Bir formum var içerisinde ItemId ve TransDate seçebildiğim iki alanım var. Bu alanlar herhangi bir tablodan gelmiyor. Direk form üzerinde oluştrulmuş alanlar. Ben bu iki alanı doldurduktan sonra bir butonla başka bir form açtırıyorum ve bu iki alanın değerini açtırdığım forma göndermek istiyorum.

Alan isimlerimiz  ItemIdField ve TransDateField  olsun.

Bunlar için birinci forma parm metodlar yazalım.

ItemId parmItemId()
{
    ;
    return ItemIdField.valueStr();
}
TransDate parmTransDate()
{
    ;
    return TransDateField.valueStr();
}

Buton ile açtırdığım ikinci formun init metoduna şöyle bir kod yazarsam bu iki değeri almış olurum.

Read more

Müşteri cirosunu hesaplayan bir query örneği

Merhaba

Müşteri adatandırma adıyla yaptığım bir raporda kullandığım müşterinin belli kriterlere göre cirosunu hesaplayan query’ i paylaşıyorum. Burda Query kullanmamın asıl  sebebi range olarak verilecek olan değerlerin bazen boşta gelebiliyor olması. Boş olma durumununda hesaplanması için query de if le kontroller yapmak zorunda kaldım. 

Metodu çağıran kod şöyle:


 element.sumCiro(CustTrans.AccountNum, CustTrans.OrderAccount,
                         CustTrans.ETGSalesResponsible , CustTrans.ETGSalesUnitId);

Metodumuz şöyle:


void sumCiro(AccountNum _accountNum , CustAccount _custAccount , EmplId _emplId , smmSalesUnitId _unitId)
{
    CustTrans   custTrans;

    Query                   q;
    QueryRun                qRun;
    QueryBuildDataSource    qbdsCustTrans;
    QueryBuildRange         qbrEmplID;
    QueryBuildRange         qbrCustAccount;
    QueryBuildRange         qbrAccountNum;
    QueryBuildRange         qbrUnitId;

    ;
    Ciro = 0;

    q   = new query();
    qbdsCustTrans = q.addDataSource(tableNum(CustTrans));
    qbdsCustTrans.addSelectionField(fieldNum(CustTrans, AmountMst), SelectionField::Sum);

    if(printAccountNum)
    {
        qbrAccountNum = qbdsCustTrans.addRange(fieldNum(CustTrans, AccountNum));
        qbrAccountNum.value(sysQuery::value(_accountNum));
    }
    if(printOrderAccount)
    {
        qbrCustAccount = qbdsCustTrans.addRange(fieldNum(CustTrans, OrderAccount));
        qbrCustAccount.value(sysQuery::value(_custAccount));
    }
    if(printSalesRes)
    {
        qbrEmplID = qbdsCustTrans.addRange(fieldNum(CustTrans, ETGSalesResponsible));
        qbrEmplID.value(sysQuery::value(_emplId));
    }
    if(printUnitID)
    {
        qbrUnitId = qbdsCustTrans.addRange(fieldNum(CustTrans, ETGSalesUnitId));
        qbrUnitId.value(sysQuery::value(_unitId));
    }

    qbdsCustTrans.addRange(fieldNum(CustTrans, ETGReversed)).value(sysQuery::value( ETGReverseType::No));
    qbdsCustTrans.addRange(fieldNum(CustTrans,
               TransType)).value(sysQuery::valueNot( LedgerTransType::Settlement));

    qbdsCustTrans.addRange(fieldnum(CustTrans, TransDate)).value(sysquery::range(startDate , endDate));
    qbdsCustTrans.addRange(fieldnum(CustTrans, AmountMST)).value('( AmountMST > 0 )');

    qRun = new QueryRun(q);
    while(qRun.next())
    {
       custTrans = qRun.get(tableNum(CustTrans));

       Ciro = CustTrans.AmountMST;

    }
}

Selamlar.

Label kodunun dile göre içeriğine kod ekranından ulaşmak

Merhaba

Label kodunun metnine ulaşmak için bu job örneğini kullanabilirsiniz.

static void retrieveLabel(Args args)
{
    Syslabel  label = new label("TR" ); //”En-us”
    Str     someTxt;
    ;
    someTxt = strFmt( label.extractString( literalStr("@SYS92165") ) );
    info(someTxt);
}

Ax’ta formun verikaynağındaki kayıtları kodla seçmek

Merhaba

Örneğin muşteriler formunda CTRL veya Shift tuşlarıyla birden çok kayıt seçebilirsiniz. Bazı durumlarda belli kritere uyan kayıtları seçili hale getirmek isteyebilirsiniz. Mesala para birimi dolardan farklı olan müşterileri seçip onların Id lerini görelim. CustTable formuna bir buton ekleyip click(); metoduna şu kodu yazalim.


void clicked()
{
    CustTable   custTableMark;
    CustTable   buffer;
    ;
    while select custTableMark
        where custTableMark.Currency != "USD" // herhangi bir kriter verebilirsiniz
    {
    // datasource taki kayıtları işaretliyoruz
    // CTRL veya Shift ile seçmişiz gibi davranır
        custTable_ds.markRecord(custTableMark,1); // 0 ve 1  işaretlemeyi belirler
    }

// DataSource'ta seçtiğimiz kayıtları dolanmak için bu kodu kullanabiliriz.
    for (buffer = custTable_ds.getFirst(true) ? custTable_ds.getFirst(true) : custTable_ds.cursor();
                  buffer;
                  buffer = custTable_ds.getnext())
    {
        info(buffer.AccountNum);
    }
}

Selamlar.

Axapta editöründeki Script menusune ekleme yapmak

Merhaba

Axapta editorunda sağ script menusu mevcut bazı uygulamalar mevcut. Sizde bu menuye kendi scriptlerinizi ekleyebilirsiniz.
Öreneğin benim geliştirmelerde kullandığım standart bir yorum satırı var. Şu şekilde ;

// <ETG – etg_fd > GN :002   T : 28.05.2011  A : Stok kartı düzeltmeleri

// <ETG – etg_fd > GN :002

Tanımı şöyle ;

// <ETG – /*Revizyon yapan*/> GN: /*Geliştirme no*/   T: /* Tarihi buraya yazıyoruz*/ A: /* açıklama*/
// Kodu Buraya Yazalım
// <ETG – /*Revizyon yapan*/> GN:

Bu kodu Script menusune eklemek için EditorScript klasına şu metodu eklemeliyiz.

Read more

Benzersiz kayıt anahtarını yeniden adlandırma.(renamePrimaryKey)

Merhaba,

Axaptada örneğin CustTable formunda sağ tıklayıp kayıt bilgileri derseniz aşağıdaki ekran açılır.

Yeniden adlandır butonu ile müşteri kodunu değiştirebilirsiniz. Ax bütün ilişkili tablolarda müşteri kodunu değiştirir. Bu işlem PrimaryKey olan diğer alanlar içinde gecerlidir. Farklı formlarda bu fonksiyonu kullanabilirsiniz. Ancak bu işlem tek bir kayıt için çalışır. Öreneğin siz bütün müşterilerin başında “M-” olsun istiyorsunuz bunu kodla yapmanız gerekir.

Örnek bir job yazalım:

Read more

Form üzerinde ItemId çoğaltmak

Merhaba

InventTable (Madde kartları) formuda bir stok kodunu çoğaltmak isterseniz bir kaç tabloda kayıt oluşturmanız gerekir. Forda bu işlemler için metodlar mevcut. Bizde formda Create() metodunu kullanarak madde kodu hariç bütün alanları aynı olan bir kayıt oluşturuyoruz. Madde kodunu kullanıcının girmesini bekliyoruz kaydettiğinde Madde kodu hariç bire bir aynı kayıtları elde ediyoruz.

Bunun için inventTable a bir buton ekleyelim ve Clicked() metodundan şu metodu çağıralım.

Burada copyTableFields metodumu kullandım. Şu yazımda bu metottan bahsetmiştim.

 void ItemCopy()
{
    InventTable inventTableCopy;
    InventTableModule InventTableModulePurch ,InventTableModuleInvent, InventTableModuleSales;   
    ;   
Read more
Page 10 of 17« First...89101112...Last »