Eki 21, 2014 - Query, X++    4 Yorumlar

Query Range Value

Önceki yazılarımda Querylerle ilgili konuları ile Form üzerinden Range(filtre) verme konusunu incelemiştik. Rangelere value verme işlemi kapsamlı bir konu olduğu tek bir makalede incelemek istedim. Böylece elinizin altında bütün bilgileri bir arada bulabileceğiniz bir kaynakta olmuş olacaktır.

Aynı işlemin birden fazla yazım ve kullanım şekilleri olabilir. Bunları tip grupları halinde aşağıda listemeye çalışacağım.

Not : Yazılan kodlar içerisinde istediğiniz range(filtreyi) açıp deneyebilirsiniz. Queryi bir range ile çalıştırdığınızda cashleme işlemi yapabilir yeni deneyeceğiniz range görebilmek için sıfırla butonunu kullanınız.

String değerler için range

static void Erkn_QueryRangeString(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr;
    Query                   q = new Query();
    QueryRun                qr;
    CustInvoiceJour         CustInvoiceJour;
    InvoiceId               preInvoiceId = "987654";

    qbds = q.addDataSource(tablenum(CustInvoiceJour));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(CustInvoiceJour, PreInvoiceId));

    //String
    //Boş olanları listeleme
    //qbr.value(SysQuery::valueEmptyString());
    //qbr.value('=""');

    //Boş olmayanları listeleme
    //qbr.value(SysQuery::valueNotEmptyString());
    //qbr.value('!=""');

    //Direk değer atama
    //qbr.value('12345'); //12345 olanları getirir
    //qbr.value(queryValue('!=' + preInvoiceId)); //987654 den farklı olanları getirir.

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            CustInvoiceJour = qr.get(tableNum(CustInvoiceJour));
            info(strFmt("%1 - %2", CustInvoiceJour.InvoiceId,CustInvoiceJour.PreInvoiceId));
        }
    }
}

İnteger – real değerler için range

static void Erkn_QueryRangeInteger(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr;
    Query                   q = new Query();
    QueryRun                qr;
    SalesLine               SalesLine;
    SalesQty                qty = 10;

    qbds = q.addDataSource(tablenum(SalesLine));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(SalesLine, SalesQty));

    //Integer / Real

    //qbr.value(queryValue('>0')); //Qty değeri Sıfırdan büyük olanlar
    //qbr.value('<0'); //Qty değeri Sıfırdan küçük olanlar
    //qbr.value(queryValue(0));
    //qbr.value(queryValue(10));
    //qbr.value("15");
    //qbr.value(queryValue(qty));

    //Not : queryValue içerine her türlü tipte değer atılabildiği için sıkça kullanılır.

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            SalesLine = qr.get(tableNum(SalesLine));
            info(strFmt("%1 - %2", SalesLine.SalesId,SalesLine.SalesQty));
        }
    }
}

Enum değerler için range

static void Erkn_QueryRangeEnum(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr;
    Query                   q = new Query();
    QueryRun                qr;
    SalesLine               SalesLine;

    qbds = q.addDataSource(tablenum(SalesLine));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(SalesLine, SalesStatus));

    //Enum

    //qbr.value(queryValue('!=' + enum2str(SalesStatus::Invoiced))); //SalesStatus Faturalandıdan farklı olanlar
    //Diğer atama şekilleri
    //qbr.value(enum2str(SalesStatus::Invoiced)); //SalesStatus Faturalandıya eşit olanlar
    //qbr.value(enum2value(SalesStatus::Delivered));
    //qbr.value(SysQuery::value(SalesStatus::Backorder));
    //qbr.value(queryValue(SalesStatus::Canceled));

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            SalesLine = qr.get(tableNum(SalesLine));
            info(strFmt("%1 - %2", SalesLine.SalesId,SalesLine.SalesStatus));
        }
    }
}

Date(Tarih) değerleri için range

static void Erkn_QueryRangeDate(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr;
    Query                   q = new Query();
    QueryRun                qr;
    SalesLine               SalesLine;
    TransDate               startDate = mkDate(1,9,2014); //mkDate fonksiyonu tarih oluşturmak için kullanılır.
    TransDate               endDate = mkDate(1,10,2014);

    qbds = q.addDataSource(tablenum(SalesLine));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(SalesLine, ConfirmedDlv));

    //Date

    //qbr.value(queryValue(dateNull())); //Tarihi boş olanlar
    //qbr.value(queryValue('!0')); //Tarihi boştan farklı olanlar
    //qbr.value(queryValue('>0')); //Boş olmayan tarihler (-li tarih olamayacağı için)
    //qbr.value('>' + queryValue(dateNull())); //Boş olmayan tarihler (-li tarih olamayacağı için)
    //qbr.value('>' + queryValue(startDate)); // verilen tarihten büyük olan değerleri getirir.

    //İki tarih arasındaki değerleri bulmak için aşağıdaki yöntemler kullanılır.
    //qbr.value(queryRange(startDate, endDate));
    //qbr.value(queryValue(startDate) + '..' + queryValue(endDate));

    //Boş tarihler yada bugün ile max tarih değeri arasındaki değerleri getirir.
    //qbr.value(queryValue(dateNull()) + ',' + queryRange(today(), dateMax()));

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            SalesLine = qr.get(tableNum(SalesLine));
            info(strFmt("%1 - %2", SalesLine.SalesId,SalesLine.ConfirmedDlv));
        }
    }
}

STRFMT ile oluşturulacak range yapıları

Strfmt ile çok kompleks range yapıları oluşturabilirsiniz. Her şeyi göstermeye tabiki imkanımız yok ancak bir kaç tane örnekle neler yapabileceğini görmenizi sağlamaya çalışacağım.

static void Erkn_QueryRangeStrfmt(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr;
    Query                   q = new Query();
    QueryRun                qr;
    SalesLine               SalesLine;
    ItemId                  itemId = "hf2200-1";

    qbds = q.addDataSource(tablenum(SalesLine));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(SalesLine, SalesStatus));

    //strFtm
    //Satış sipariş tipi açık sipariş olan ve itemId si yukarıdan girilen itemId olan değerleri döndürür.
    //qbr.value(strfmt('((' + fieldstr(SalesLine, SalesStatus)
    //+ ' == SalesStatus::Backorder) && ('+ fieldstr(SalesLine, ItemId) + ' == "%1"))', itemId));

    //satış sipariş tipi iptal edildi olan yada açık sipariş olup itemId si yukarıdan girilen değer olan kayıtları döndüdür.
    //qbr.value(strFmt('((%1 == %2) || ((%1 == %3) && (%4 == "%5")))',
    //fieldStr(SalesLine, SalesStatus),
    //any2int(SalesStatus::Canceled),
    //any2int(SalesStatus::Backorder),
    //fieldStr(SalesLine, ItemId),
    //queryValue(itemId)));

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            SalesLine = qr.get(tableNum(SalesLine));
            info(strFmt("%1 - %2 - %3", SalesLine.SalesId,SalesLine.SalesStatus,SalesLine.ItemId));
        }
    }
}

Range ile “OR” Kullanımı

Tek bir alan için or kullanımdan bahseceğim.

static void Erkn_QueryRangeOrYapisi(Args _args)
{
    QueryBuildDataSource    qbds;
    queryBuildRange         qbr,qbr2;
    Query                   q = new Query();
    QueryRun                qr;
    SalesLine               SalesLine;
    ItemId                  itemId = "hf2200-1,hf3630-1,ck123-1";
    ItemId                  item1 = "hf2200-1";
    ItemId                  item2 = "hf3630-1";
    ItemId                  item3 = "ck123-1";

    qbds = q.addDataSource(tablenum(SalesLine));
    qbds.clearRanges();
    qbr = qbds.addRange(fieldnum(SalesLine, ItemId));

    //Or kullanımı
    //1.Yöntem
    //qbr.value("hf2200-1,hf3630-1,ck123-1");

    //2.Yöntem
    //qbr.value(itemId);

    //3.Yöntem
    //qbr.value(strFmt("%1 , %2 , %3",item1,item2,item3));

    //4.Yöntem için yeni bir queryBuildRange tanımladık.
    //qbr2 = qbds.addRange(fieldnum(SalesLine, ItemId));
    //qbr2.value("hf2200-1");
    //qbr2 = qbds.addRange(fieldnum(SalesLine, ItemId));
    //qbr2.value("hf3630-1");
    //qbr2 = qbds.addRange(fieldnum(SalesLine, ItemId));
    //qbr2.value("ck123-1");

    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            SalesLine = qr.get(tableNum(SalesLine));
            info(strFmt("%1 - %2", SalesLine.SalesId,SalesLine.ItemId));
        }
    }
}

Son olarak da RangeStatus durumlarından bahsedelim.
Range statusler kullanıcı karşısına çıkan ekrande görünen rangelerin görünmeleri veya mühaleleriyle alakalı işlemlere göre belirlenir. Bulunan durumları Tipleri aşağıda açıklayalım.

3 tip RangeStatus bulunur.
RangeStatus::Open  -> Query ekranında bulunan rangelerin kullanıcı müdahelesine açık olacak ise bu durum belirlenir. Default olarak rangelerin durumu “Açıktır(Open)”.

RangeStatus::Locked -> Locked olarak belirlenen range sonucunda query ekranında kullanıcı tarafından görülür ancak kullanıcı müdahelesine izin verilmez. Sadece bilgi amaçlı olarak gösterilir. Range işlevine devam eder.

RangeStatus::Hidden -> Hidden olarak belirlenen range sonucunda query ekranında kullanıcı tarafından görünmez. Bu yüzden kullanıcı bu range üzerinde değişiklik yapamaz. Ancak range işlevinden bir etkilenme olmaz çalışmasına devam eder.

//Kullanımı
    qbr = qbds.addRange(fieldnum(SalesLine, ItemId));
    qbr.value(item1);
    //İstenilen seçilir.
    qbr.status(RangeStatus::Open);
    qbr.status(RangeStatus::Locked);
    qbr.status(RangeStatus::Hidden);

Erkan OĞUZ

Önceki Konu->

<- Sonraki Konu

Benzer yazılar

4 Yorumlar

  • Merhaba,
    “smmActivitiesListPage” formuna method ekleme yapamıyorum. Formun altında Method -> Sağtık-> New Method olması gerekiyor ama New Method çıkmıyor. Bunu nasıl düzeltebilirim. Yardımcı olur musunuz?

    iyi çalışmalar.

    • Merhaba Filiz hanım,

      Ax2012 ile gelen(yaygınlaşan) listpage formlarına direk method yazmak kapalıdır. Çünkü Listpage formları Enterprise Portal ile internet yayını yapabilir. Bu yüzden bu formlar Kendi isminin sonunda Interaction eklenen bir class tarafından yönetilirler(örn. smmActivitiesInteraction). Yapacağınız işlemi class içerindeki methodlarla yöntebilirsiniz. Bu işlemler biraz karışık olduğu için şuan çok detaylı yazmam mümkün değil maalesef.
      Ancak şöyle bir durumda var şirketiniz EP(Enterprise Portal) kullanmıyorsa listpage formu üzerinde design menüsünün altında bulunan grid gibi nesnelere method yazabilmek için o nesnenin özelliklerinden “Display target” alanının özelliğini “Client” yaparsanız ilgili yere method yazabilme şansına sahip olacaksınız. Ancak dediğim gibi dikkat edilmesi gereken nokta şirketin EP kullanıp kullanmaması. Biraz karmaşık oldu farkındayım ancak maalesef konu sıkıntılı bir konu. Kafanıza takılan konu varsa bana ulaşabilirsiniz. Yardımcı olmaya çalışırım :). Kolay gelsin.

  • Merhaba,

    ” smmActivitiesInteraction” CLassının içine gerekli range’i yazınca sorun çözüldü . Cevap için teşekkür ederim :)

    • Rica ederim :) çözbilmenize sevindim. Kolay gelsin

Yorum Yazın...