Wednesday, July 13, 2011

ABAP - Debug Yaparken Data Explorer'ı Kullanmak






Arka Planda Program Çalıştırmak ve Görüntülemek

Derlenmesi uzun süren programların biz başka işle meşgulken arka planda çalışmasını isteyebiliriz. Bu durumda aşaüğıdaki adımlar izlenerek programın arka planda çalışması sağlanır.
1- Derkenmek üzere SE38 (ABAP Editor) açılır.


2 - Arka planda çalıştırmak istediğimiz program seçilir. Ben burda daha önce hazıladğım Z_BACKGROUND_PROGRAM 'ı  seçiyorum.


3- Daha sonra direk display demek yerine yukarıda görüldüğü üzere Program>> Execure >> Background Seçilir.


4- Çıkan ekranda "Execute Immed." butonuna basılarak derlenme işlemi gerçekleştirilir.


5- Arka planda çalıştırdığımız prgoramı görüntülemek için ilk menüden SM37'ye girilir.


6- Çıkan ekranda üst menüden Execut butonuna basılır.


7- Arka planda çalıştırdığımız program seçilir.


8- Çıkan ekranda TYPE 'ın altındaki ikona taklanarak programımızın derlenmiş halini görüntüleyebiliriz.


9- Üstte daha önceden yazdığımız program derlenmiş olarak gözükmekte. 
Ben basitçe WRITE:/ 'backgorunda çalışan program görüntüleniyor.'. yazmıştım.

Tuesday, July 12, 2011

ABAP - Subroutine Kullanarak Recursive Program Yapmak

ABAP'ta PERFORM ifadesi program içinde alt bir programa(subroutine) dallanmasını sağlar. Böylece uzun bir program parçasını sadece PERFORM ifadesini yazarak tekrar tekrar çağrılabilir.

Aşağıdaki örnekte SUBROUTINE kullanarak recursive bir şekilde kullanıcıdan alınan rakamdan geriye sayan bir program.



REPORT  Z_PERFORM_REC.

parameters sayi type i.
*
perform test.
*
form test.
     if sayi > 0.
        write :'sayi :'sayi .
        sayi sayi 1.
        PERFORM TEST.
     else.
         write   'islem tamamlandi'.
     endif.
endform.




Programda SAYI değişkenini kullanıcıdan alınıyor. Sonra PERFORM komutu ile TEST formunun içine giriyor. Burda SAYI değişkeni 0'dan büyükse SAYI'yi yazdırıyor, sonra '1' çıkartıp tekrar kendini çağırıyor. Ardından tekrar aynı işlem gerçekleşiyor. Bu işlem SAYI'nın değeri 0 olana kadar devam ediyor. Ardından ENDFORM ifadesiyle SUBROUTINE'den çıkılıyor.

Monday, July 11, 2011

ABAP- Dinamik ve Statik Kaynakta Belirtme

Statik veri çekme database'deki her hangi bir tablodan bir filtre uygulamaksızın belli sayıda satırın getirilmesini sağlar. Aşağıda MARA tablosundan MANDT ve ERNAM kolonlarını çeken ABAP kodları mevcut. Görüldüğü üzere "FROM mara UP TO ROWS." komutu ile tablodan sadece 4 satır çağrılmış.


REPORT demo_select_static_database.

DATA wa TYPE mara.

SELECT *
  INTO wa
  FROM mara UP TO ROWS.
  WRITE/ wa-mandtwa-ernam.
ENDSELECT.
Program çıktısı:








Dinamik'te ise WHERE ifadesi kullanılarak hedef tablo filtre edilerek getirilir. Aşağıdaki kodlarda MANDT kolonunun 800'e eşit olduğu satırlar filtre edilerek ekrana çağrılır.

REPORT demo_select_dynamic_database .

DATA wa TYPE mara.

SELECT  *
  INTO  wa
  FROM  ('mara'CLIENT SPECIFIED
  WHERE mandt '800'.
  WRITE/ wa-mandt, wa-ernam.
ENDSELECT.


Programı çıktısı:


Friday, July 08, 2011

ABAP- INNER ve LEFT OUTER JOIN

Aşağıda basit bir LEFT OUTER JOIN örneği mevcut.


REPORT demo_select_left_outer_join .
DATABEGIN OF wa,
        carrid   TYPE scarr-carrid,
        carrname TYPE scarr-carrname,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,        
      END OF wa,

      itab LIKE SORTED TABLE OF wa
                WITH NON-UNIQUE KEY carrid.

SELECT s~carrid s~carrname p~connid p~cityfrom
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM scarr AS s
        LEFT OUTER JOIN spfli AS ON s~carrid   =  p~carrid AND
                           p~cityfrom 'FRANKFURT'.



LOOP AT itab INTO wa.

  WRITE/ wa-carridwa-carrnamewa-connidwa-cityfrom.

ENDLOOP.

Program çıktısı aşağıdaki gibidir. Görüldüğü üzere FRANKFURT ile eşleşmeyen satırlar da çağrılmış durumda.



















Aynı örnek INNER JOIN ile yapıldığında ise FRANKFURT'la eşleşmeyen satırlar gözükmeyecektir.


REPORT demo_select_inner_join .

DATABEGIN OF wa,
        carrid   TYPE scarr-carrid,
        carrname TYPE scarr-carrname,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,        
      END OF wa,



      itab LIKE SORTED TABLE OF wa
                WITH NON-UNIQUE KEY carrid.

SELECT s~carrid s~carrname p~connid p~cityfrom
  INTO CORRESPONDING FIELDS OF TABLE itab
  FROM scarr AS s
        INNER JOIN spfli AS ON s~carrid   =  p~carrid AND
                           p~cityfrom 'FRANKFURT'.

LOOP AT itab INTO wa.
  WRITE/ wa-carridwa-carrnamewa-connidwa-cityfrom.
ENDLOOP.

Program çıktısı aşağıdaki gibidir.

ABAP - TYPES ve DATA ifadeleri kullanımı

TYPES ifadesi programda yerel veri TYPE'ları oluşturmak için kullanılır.
DATA ise programda yeni bir veri objesi oluşturmak için kullanılır.

Aşağıda basit bir örnek mevcut.



REPORT demo_types_statement.

TYPES yazi(10TYPE c.

TYPES sonuc   TYPE DECIMALS 2.

DATA text        TYPE yazi.

DATA amount      TYPE sonuc.

text ' 4 / 3 = '.

amount .

WRITEtextamount.



Program çıktısı aşağıdaki gibidir.

Bu programda yazi ve sonuc, yerel data Type'ları olarak tanımlanmış. Böylelikle amount ve text gibi yeni data objeleri tanımlarken 'c' veya 'p' yazmak yerine bu yerel ifadeler kullanılır. Bu programı aşağıdaki gibi de yazsak bir şey fark etmeyecekti.

REPORT demo_types_statement.

*

*TYPES yazi(10) TYPE c.

*TYPES sonuc   TYPE p DECIMALS 2.

DATA text(10)        TYPE c.
DATA amount      TYPE DECIMALS 2.

text ' 4 / 3 = '.
amount .
WRITEtextamount.



Aşağıda başka bir örnek daha mevcut. Bu örnek biraz daha amaca uygun, tekrar tekrar uzun bir şekilde TYPE yapısı yazmak yerine önceden tanımlanmış yerel TYPE'ı kullanarak DATA objelerine referans veriyor.

REPORT demo_structure.

TYPESBEGIN OF name,
         title(5)       TYPE c,
         first_name(10TYPE c,
         last_name(10)  TYPE c,
       END OF name.


TYPESBEGIN OF mylist,
         client         TYPE name,
         number         TYPE i,
       END OF mylist.



DATA list1 TYPE mylist.
DATA list2 TYPE mylist.
DATA list3 TYPE mylist.


list1-client-title 'Lord'.
list1-client-first_name 'Howard'.
list1-client-last_name 'Mac Duff'.
list1-number 1.



list2-client-title 'Mr.'.
list2-client-first_name 'Kerem izzet'.
list2-client-last_name 'Atam'.
list2-number 2.



list3-client-title 'Sir'.
list3-client-first_name 'Hasan'.
list3-client-last_name 'Huseyin'.
list3-number 3.





WRITE list1-client-title.
WRITE list1-client-first_name.
WRITE list1-client-last_name.
WRITE 'Number'.
WRITE list1-number.
skip.



WRITE list2-client-title.
WRITE list2-client-first_name.
WRITE list2-client-last_name.
WRITE 'Number'.
WRITE list2-number.
skip.



WRITE list3-client-title.
WRITE list3-client-first_name.
WRITE list3-client-last_name.
WRITE 'Number'.
WRITE list3-number.



Program çıktısı aşağıdaki gibidir.


Yukarıdaki örnekte name ve mylist yapıları yerel TYPE olarak tanımlanarak programın sonraki parçalarında list1, list2 ve list3; DATA yapılarına tek bir ifade olarak referans gösterilmiş. Daha sonraki adımlarda ise list1, list2 ve list3 DATA yapısına veriler girilmiş ve yazdırılmış.



LIKE ve TYPE 'ın kullanımı


Yukarıdaki örnekteki gibi yerel TYPE tanımlamayıp, aynı yapıyı tekrar tekrar kullanmak isteseydik. Bu durumda ilk DATA yapısını tanımlayıp sonraki yapılarda LIKE ifadesini kullanarap ilk DATA yapısı referans alınabilir. Aşağıdaki örnkte TYPES ifadesi kullanılmadan aynı program  derlenmiştir program çıktısı yukardakinin aynısı olacaktır.


REPORT demo_structure.


DATA BEGIN OF name,
         title(5)       TYPE c,
         first_name(10TYPE c,
         last_name(10)  TYPE c,
       END OF name.



DATA BEGIN OF list1,
         client         LIKE name,
         number         TYPE i,
       END OF list1.



DATA list2 LIKE list1.
DATA list3 LIKE list1.



list1-client-title 'Lord'.
list1-client-first_name 'Howard'.
list1-client-last_name 'Mac Duff'.
list1-number 1.



list2-client-title 'Mr.'.
list2-client-first_name 'Kerem izzet'.
list2-client-last_name 'Atam'.
list2-number 2.



list3-client-title 'Sir'.
list3-client-first_name 'Hasan'.
list3-client-last_name 'Huseyin'.
list3-number 3.


WRITE list1-client-title.
WRITE list1-client-first_name.
WRITE list1-client-last_name.
WRITE 'Number'.
WRITE list1-number.
skip.



WRITE list2-client-title.
WRITE list2-client-first_name.
WRITE list2-client-last_name.
WRITE 'Number'.
WRITE list2-number.
skip.


WRITE list3-client-title.
WRITE list3-client-first_name.
WRITE list3-client-last_name.
WRITE 'Number'.
WRITE list3-number.

Thursday, July 07, 2011

ABAP'da basit INNER JOIN Uygulaması

SAP GUI'de MARA ve MAKT tabloları arasında basit bir INNER JOIN uygulaması kodlar aşağıdaki gibidir. matnr ve mandt iki tabloda da bulunan key attribute'lar oldukları için JOIN'de tabloları bağlamak için kullanılır.


REPORT demo_select_left_outer_join .



DATABEGIN OF wa,

        matnr   TYPE MARA-matnr,

        ersda   TYPE MARA-ersda,

        spras   TYPE MAKT-spras,

        maktx   TYPE MAKT-maktx,

      END OF wa,

      itab LIKE SORTED TABLE OF wa

                WITH NON-UNIQUE KEY matnr ersda spras maktx.



SELECT MR~matnr MR~ersda MK~spras MK~maktx

  INTO CORRESPONDING FIELDS OF TABLE itab

  FROM MARA AS MR

       INNER JOIN MAKT AS MK ON MR~matnr =  MK~matnr AND

                                MR~mandt =  MK~mandt.



LOOP AT itab INTO wa.

  WRITE/ wa-matnrwa-ersdawa-spras ,wa-maktx.

ENDLOOP.
Programın derleme ekranı şekildeki gibidir.