1 Eylül 2009 Salı

ABAP : Dinamik Internal Table

Merhabalar;
Bu yazıda, dinamik olarak itab oluşturma ve göstermeyi anlatacağım, aslında anlatmayacağım direk kodu koyacağım en güzeli debug ederek öğrenmek. Zira bu kod çok işinize yarayacaktır. Kendimden örnek vermem gerekirse, bir tabloda bulunan şantiyeleri ve bir ekrandan o şantiyelerin bağlı olduğu cinslere girilen tutarların kümüle olarak ekranda gösterilmesi istendi. Yani tabloya satır satır girilen şantiyeler ALV'nin satır değil sütunlarını oluşturacaktı yani elimde kaç sütun var belli değildi ayrıca adamlar eğer yeni şantiye girerse otomatik olarak ALV'ye sütun olarak gelecek ve onların bağlı olduğu cinslere girilen paralarda otomatik olaraka dağıtılacaktı ve bir cins birden fazla şantiyeye bağlı olabiliyordu. Sonuç olarak Cinsler satırları şantiyeler ise sütunları oluşturdu ve paralar otomatik olarak dağıtıldı. İnternetten bana yardımcı olan kodu aynen yazıyorum buradan örnek olarak yapabilirsiniz.

Önce tanımlamalar ve dynamic internal table' ın yaratılması;

TYPE-POOLS: slis.
FIELD-SYMBOLS: <t_dyntable> TYPE STANDARD TABLE, “ Dynamic internal table name
<fs_dyntable>, “ Field symbol to create work area
<fs_fldval> type any. “ Field symbol to assign values
PARAMETERS: p_cols(5) TYPE c. “ Input number of columns
DATA: t_newtable TYPE REF TO data,
t_newline TYPE REF TO data,
t_fldcat TYPE slis_t_fldcat_alv,
t_fldcat TYPE lvc_t_fcat,
wa_it_fldcat TYPE lvc_s_fcat,
wa_colno(2) TYPE n,
wa_flname(5) TYPE c.

* Create fields .
DO p_cols TIMES.
CLEAR wa_it_fldcat.
move sy-index to wa_colno.
concatenate 'COL'
wa_colno
into wa_flname.
wa_it_fldcat-fieldname = wa_flname.
wa_it_fldcat-datatype = 'CHAR'.
wa_it_fldcat-intlen = 10.
APPEND wa_it_fldcat TO t_fldcat.
ENDDO.

* Create dynamic internal table and assign to FS
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = t_fldcat
IMPORTING
ep_table = t_newtable.
ASSIGN t_newtable->* TO <t_dyntable>.
* Create dynamic work area and assign to FS
CREATE DATA t_newline LIKE LINE OF <t_dyntable>.
ASSIGN t_newline->* TO <fs_dyntable>.


Daha sonra fieldcatalogları oluşturma ve değer atama;

DATA: fieldname(20) TYPE c.
DATA: fieldvalue(10) TYPE c.
DATA: index(3) TYPE c.
DO p_cols TIMES.
index = sy-index.
MOVE sy-index TO wa_colno.
CONCATENATE 'COL'
wa_colno
INTO wa_flname.
* Set up fieldvalue
CONCATENATE 'VALUE' index INTO
fieldvalue.
CONDENSE fieldvalue NO-GAPS.
ASSIGN COMPONENT wa_flname
OF STRUCTURE <fs_dyntable> TO <fs_fldval>.
<fs_fldval> = fieldvalue.
ENDDO.
* Append to the dynamic internal table

APPEND <fs_dyntable> TO <t_dyntable>.


bu da gösterme kısmı ; evet adam abidik gubidik yerlerde data tanımlamaları yapmış ama düzenlersiniz artık :=) sadece örnek olsun diye kopyala yapıştır yapıyorum.

DATA: wa_cat LIKE LINE OF fs_fldcat.
DO p_cols TIMES.
CLEAR wa_cat.
MOVE sy-index TO wa_colno.
CONCATENATE 'COL'
wa_colno
INTO wa_flname.
wa_cat-fieldname = wa_flname.
wa_cat-seltext_s = wa_flname.
wa_cat-outputlen = '10'.
APPEND wa_cat TO fs_fldcat.
ENDDO.

* Call ABAP List Viewer (ALV)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fs_fldcat
TABLES
t_outtab = <t_dyntable>.


kaynak: buyrun
Evet, bu kod dynamic olarak itab yaratma konusunda oldukça işinize yarayacaktır zira beni büyük bir işten kurtarmıştı, umarım sizi de kurtarır.

Bitirirken;
Ece Temelkuran'ın bir yazısından ve Can Dündar'ın bir şiirinden alıntı yapacağım.

İhtiyarlamak azizim, gitmek korkusuyla başlar. içine bir şüphe düşüyorsa kapıyı çarpıp çıkacakken, duraksıyorsan, işte tam o an, yaşlanır insan.
yeni bir başlangıç yapmak için üstat, önce boşlukta durabilmesin. boşlukta "kalmaktan" kortuğun zaman, işte tam o an, bir daha yeni bir şeye başlayamayacak kadar ihtiyarlar, çökersin.
insan, sevgili arkadaş, zaman içinde yaşlanmaz aslında. bir ikindi, zamanın nasıl da geçtiğini düşündüğünde, düşündüğü bütün o zamanların yükü üzerine bindiğinde ihtiyarlar. tam o ikindi gitmeye karar verirse, şöyle yeniden "ne yapmalı?" yaylasına çıkıverirse dirilir yeniden...

...bazen hepimiz büyük bir havaalanındaki, annesiz-babasız yola çıkmış çocuklara benziyoruz. boynumuza asılmış isimlerimizle, ipli torbaların içinde pasaportlarımızla bir kalabalığın içinde gideceğimiz yönleri bulmaya çalışıyoruz. doğru uçağa binmeye uğraşıyoruz hepimiz. bazen kaybolup hangi yöne gidiyorsa büyük kalabalık, o tarafa doğru akıyoruz. hepimiz bir sürü, şaşkın çocuğuz.
azizim, pek seveni yoktur ama ben bayılırım havaalanlarına. çünkü "hiçbir yerdir" oralar. bütün yönlerin tam ortası, yolların yuvası. sadece çantan ve sen varsındır, bir de dünyanın en pahalı kahvesi. tek yapman gereken ne tarafa gideceğini düşünmektir. anonsların peşinden koşturan insanlara bakarak gönül gezdirmektir işin: nereye gideyim?
azizim, daha ne olsun? gidiyorsan hayatta 1-0 öndesindir zaten!
Ece Temelkuran

ve her zamanki gibi şiirle bitiriyoruz;

Bugunlerde herkes gitmek istiyor. Küçük bir sahil kasabasina,
bir baska ülkeye,daglara, uzaklara...
Hayatindan memnun olan yok. Kiminle konussam ayni sey...
Her seyi, herkesi birakip gitme istegi.
Öyle ''yanina almak istedigi üç sey'' falan yok.
Bir kendisi.
...
Can Dündar'ın gitmek isimli şiirinden.