Nis 17, 2014 - X++    2 Yorumlar

X++ Yapısı, İf-Else Switch-Case Blokları ve Döngüler

X++, Axaptanın kendine özgü bir geliştirme dilidir. Bu dilinde kurallarında diğer dillere benzer özellikleri olduğu gibi onu diğer dillerden ayıran farklılıkları da vardır. Beraber bu dilin yapısını biraz inceleyelim.

Ax 2012 ile birlikte geliştirme ortamı(IDE) ayrı olarak karşımıza gelmektedir. Bu ortamı açtıktan sonra Tablo, Class, Form, Datasource, Job vb bir çok nesne üzerinde X++ ile kod yazılabilmektedir.

Tanımlama olarak ele aldığımızda diğer programlama dillerinden faklı olarak değişkenler dışında EDT ve tablo tanımlamaları da yapılması gereklidir. Ayrıca Form ve Class gibi yerlerde Global değişken tanımlaması classDeclarations kısmında tanımlanır. Yerel tanımlamalar ise kullanılan metodun en üstünde tanımlanır(Kod blokları içerisinde değişken tanımlanmaz sadece metodun en üstünde değişken tanımlaması yapılır).

Örn: 

CustTable custTable; //Tablo tanımlama örn.
SalesTable salesTable; //Tablo tanımlama örn.
AccountNum accountNum; //EDT tanımlama örn.
int i; //Değişken tanımlama örn.

Her kod satırı tamamlandıktan sonra (döngüler vb hariç) kod satırı noktalı virgülle(;) sonlandırılır.

X++ tablo ile yapılan işlemlerde SQL cümleleriyle benzerlik göstermektedir. Bir tabloyu işlemlerimizde kullanacakken önce tabloyu tanımlamalı ardından da sorgu cümlesi hazırlayarak tabloyu doldurmamız gereklidir. Eğer tablodan bir satırlık bir kayıta ulaşacaksak “select” cümleciği kullanılmalı birden fazla kayıt içersinde dönerek işlem yapacaksak “while select” yapısı kullanılmalıdır.
Şart belirtileceği zaman “where” cümleciği yazılarak ilgili şartlar belirtilir.

Örn:

CustTable   custTable;

    select firstonly custTable
      where custTable.AccountNum == "M00001";    //Sadece M00001 kaydı için bilgileri getirir
    if(custTable)   //custTable M00001 için kayıt döndüyse if bloğuna girer
    {
        info("Kayıt var");
    }
    //-------------------------
    CustTable   custTable;
    int         i;

    while select custTable
      where custTable.CustGroup == "01"    //CustGroup 01 olan kayıtlarda dönülür.
    {
        i++;
    }
    info(strFmt("%1 Kayıt var",i));

Not : “Select” cümlesi noktalı virgülle (;) sonlandırılırken “while selecet” cümlesi noktalı virgülle kapatılmaz parantezler içersindeki işlemleri yapar.

İf-Else bloğu;

İf-else yapısını inceleyecek olursak diğer programlama dilleriyle benzerlik göstermektir. Amacı ise bir şartın sonucunda eğer sonuç olumlu ise “if” bloğu içerisindeki işlemler çalışır, eğer sonuç  şart sağlanmıyor ise “else” bloğu içerisindeki işlemler çalışır.

Eğer birden farklı sonuçlara göre şart verilecekse “else if”  kullanılması gerekmektedir.

    if (....) //Verilecek şart
    {
     //Şart sonucu çalışacak işlemler
    }
    else
    {
     //Şart Sağlanmazsa çalışacak işlemler
    }
   //-------------------------
    if(....) //Verilecek şart
    {
     //Şart sonucu çalışacak işlemler
    }
    else if(....) //İlk şart sağlanmazsa bakılacak ikinci şart
    {
     //İkinci şart sonucu çalışacak işlemler
    }
    else
    {
     //Şart Sağlanmazsa çalışacak işlemler
    }

Örn:

    SalesLine   salesLine;
    SalesPrice  spBes,spIki,spElse;

    while select salesLine
      where salesLine.SalesId == "Sip0005"    //Sipariş nosu Sip0005 olan kayıtlarda dönülür.
    {
        if(salesLine.SalesQty > 5) // Qty yani miktarı 5ten büyük olan kayıtlar için alttaki bloğa girer
        {
            spBes += salesLine.SalesPrice; //spBes değiskenine Birim fiyarları ekleyerek toplamı bulur
        }
        else if(salesLine.SalesQty < 2)
        {
            spIki += salesLine.SalesPrice; //spIki değiskenine Birim fiyarları ekleyerek toplamı bulur
        }
        else
        {
            spElse += salesLine.SalesPrice; //spElse değiskenine Birim fiyarları ekleyerek toplamı bulur
        }
    }
    info(strFmt("%1 Miktar 5ten büyük birim fiyarları toplamı",spBes));
    info(strFmt("%1 Miktar 2ten kücük birim fiyarları toplamı",spIki));
    info(strFmt("%1 Kalan toplamı",spElse));

Not : Aynı if şartı içerisine birden fazla şart ve/veya(ve: && ,  veya: ||) komutlarıyla verilebilir.


Swith – Case Bloğu

Swith – Case bloğu yapı olarak if-else bloğuna çok benzemektedir. Genelde çok şartlı karmaşık if bloklarında kodu daha sadeleştirmek için swith case bloğu kullanılır. Yapı olarak ise switch parantezi içindeki  değişkenin almış olduğu değer case blokları ile karşılaştırılarak uygun olan işlemin gerçekleştirilmesi sağlanır.

switch (değer)
    {
        case koşul1:
            //İşlemler
            break;

        case koşul2:
            //İşlemler
            break;

        case koşul3:
            //İşlemler
            break;
    }

Örn:

    switch (custTable.CustGroup)
    {
        case "001":
            info("Bayi Müşterisi");
            break;

        case "002":
            info("Kurumsal Müşteri");
            break;

        case "003":
            info("Banka Müşterisi");
            break;

        default :
            info("Diğer Müşteriler");
    }

Not : Eğer break kullanılmazsa şart bulunduktan sonra diğer işlemler şarta bakmazsınız break bulana kadar yapılır.

Örn :

switch (custTable.CustGroup) //custgroup 001 olduğunu varsayalım
    {
        case "001":
            info("Bayi Müşterisi");

        case "002":
            info("Kurumsal Müşteri");
            break;

        case "003":
            info("Banka Müşterisi");
            break;
        default :
            info("Diğer Müşteriler");
    }

Çıktı :
	Bayi Müşterisi
	Kurumsal Müşteri

Olarak gelir.

Döngüler :
For Döngüsü ;

For döngüsü ile bir işlemin kaç kez yapılacağı kolayca kontrol edilebilir. Bu yüzden programlamada çok ihtiyaç duyulan bir konudur. Ancak Axapta üzerinde çok fazla kullanılmasada bilinmesi gereklidir.

    for(başlangıç değeri ;koşul ;arttırma/azaltma)
    {
     //Tekrar edilecek işlem
    }

Verilen koşul sağlandığı sürece blok içindeki işlem tekrar edecektir.

Örn :

    int     i;
    int     toplam;

    for(i = 1 ;i <= 5 ;i++)
    {
        toplam += i; //1 den 5e kadar olan sayıların toplamı
    }
    info(strFmt('%1 Toplam',toplam));

While Döngüsü

While döngüsünde parantez içerisindeki koşul sağlandıkça döngü bloğu içerisindeki işlem yapılır. Koşul sağlamazsa döngü sonlanır. Buradaki önemli nokta öncelikle koşul kontrol edilir sonra işlem yapılır.

while (koşul)
    {
      //İşlem
    }

Örn :

 int i = 0;
 int toplam;

 while (i <= 5) //i değişkeni 5ten büyük olduğunda döngü sonlanır
 {
 i++; //i değişkeni 1 arttırılır.
 toplam += i; //1 den 5e kadar olan sayıların toplamı
 }
 info(strFmt('%1 Toplam',toplam));

Do-While Döngüsü

Do-While döngüsü yapı olarak while döngüsüne çok benzemektedir. Farkı ise önce işlemi yapıp sonra kontrolü yapmasıdır. Yani koşul sağlanmasa bile işlemler bir kez yapılır.

do
{
 //İşlemler
}
while (koşul);

Örn :

int i = 0;
 int toplam;

 do
 {
 i++; //i değişkeni 1 arttırılır.
 toplam += i; //1 den 5e kadar olan sayıların toplamı
 }
 while(i < 5); // i değişkeni 5 e eşit olmasa bile 5 için bir kez döndüğünden sonuç doğru olacaktır
 info(strFmt('%1 Toplam',toplam));

Continue ve Break komutları

Break komutu döngünün herhangi bir yerinde döngünün sonlandırılmasını sağlar.

Continue komutu blok içerisinde konulduğu yerden sonraki kodun işletilmesini engeller ve döngünün başlangıcına yönlendirilir.

Continue ve Break komutları yukarıda tanımlanan bütün döngülerde kullanılabilir.

Örn :

 int cnt;

 for(cnt = 1;cnt <= 10 ; cnt++)
 {
 if(cnt > 3 && cnt < 6)
 {
 continue;
 }
 else if(cnt == 8)
 {
 break;
 }
 info(strFmt("%1",cnt));
 }

Çıktı :
1
2
3
6
7

Erkan OĞUZ

Önceki Konu->

<- Sonraki Konu

Benzer yazılar

2 Yorumlar

  • Başarılı bir anlatım olmuş….. Konuların devamını Bekliyorum

    • Takip ettiğiniz için teşekkürler Mesut bey fırsat buldukça konuların devam edecektir.

Yorum Yazın...