SAP’de çeşitli yöntemlerle canlıdaki veriyi geliştirme ortamına taşıyabilmekteyiz. Ancak her seferinde küçük bir çalışma için bu külfetli işlere girmek can sıkabilmektedir.
Bu yüzden canlıya dahi taşımadan geliştirme ortamında yazdığımız program ile dinamik olarak istediğimiz bir tablonun adını parametre olarak verip, canlıdaki veriyi geliştirme ortamındaki tablomuza alabiliriz. Bu konuda internet üzerinden araştırma yaptım. Bulduğum bir Almanca kaynak üzerinden faydalanarak aşağıdaki ihtiyacımı giderecek programı yazdım ve sizlerle Türkçe dilimizle paylaşmak istedim.
Yalnız bu işlem bir birine bağlı tablolarda anlamsız verilerin oluşmasına sebebiyet verir. Ne taşıdığımızı çok iyi bilerek bu programı çalıştırmakta fayda vardır. Tabi bu program ile herkes veri çekemez. Veriyi çekeceğiniz ortamda yetkinizin olup olmadığını sorgulamaktadır.
Bu işlem için RFC_READ_TABLE isimli standart fonksiyonu kullandık. Bu fonksiyon, tablonun ismini (p_table) ve ayraç bilgisini (lv_separator) istemektedir. İsteğe bağlı olarak başka parametreler de alabilmektedir. Detayını araştırmadım, işime yarayacak kadarını aldım. Çıktı olarak ise, tablonun özelliklerini (it_options), tablonun alanlarını (it_fields) ve asıl işimize yarayacak olan tablonun verilerini (it_rfc_data) bize verecektir.
Tablonun verilerini barındıran internal table (it_rfc_data), satır numarası ve veri içeriği yapısındadır. Kısacası fonksiyondan gelen veri, verdiğimiz ayraç bilgisi (lv_separator) tablonun sütunları aralarına gelecek şekilde string olarak bize sunulmaktadır. Örneğin; bir tablo hayal edelim. Sütunları ad bilgisini tutan vorna ve soyad bilgisini tutan nachn olsun. Bu hayali tablonun verilerini çekmek istediğimizde fonksiyon tarafından doldurulacak olan internal table şu şekilde olacaktır.
1 | İsmail | Tekin |
2 | Joe | Dalton |
Tipini bilmediğimiz bu tablodan gelen veriyi kullanabilmek için field symbol’lere ihtiyaç duymaktayız. İç içe loop’lar ile ihtiyacımız olan internal table’lı dolduruyoruz.
Birinci döngüde fonksiyondan gelen veriyi split etmek için, ikinci döngüde ise split ettiğimiz verileri istediğimiz tablonun tipine sahip field symbol’e satır satır atıyoruz. Anlatacak çok detay var. Dilerseniz yorum kısmına yazdığınız sorularınız üzerinden buradaki açıklamamı genişletebilirim. Sizlere aşağıdaki gibi bir örnek kod paylaşıyorum.
*&---------------------------------------------------------------------* *& Report ZISMAIL_TEKIN *&---------------------------------------------------------------------* *& SAP ABAP: Canlıdan Geliştirme Ortamına Nasıl Veri Çekilir? *&---------------------------------------------------------------------* REPORT zismail_tekin. DATA: lv_separator TYPE char1 VALUE '|', it_rfc_data TYPE STANDARD TABLE OF char512, it_fields TYPE STANDARD TABLE OF rfc_db_fld, it_options TYPE STANDARD TABLE OF rfc_db_opt, it_split_values TYPE STANDARD TABLE OF string, o_ref TYPE REF TO data. PARAMETERS: p_table TYPE tabname. FIELD-SYMBOLS:<lt_table> TYPE STANDARD TABLE. SELECT SINGLE tabname FROM dd02l INTO @DATA(tmp_tabname) WHERE tabname EQ @p_table. IF tmp_tabname IS NOT INITIAL. CREATE DATA o_ref TYPE TABLE OF (p_table). ASSIGN o_ref->* TO <lt_table>. CALL FUNCTION 'RFC_READ_TABLE' DESTINATION 'CANLI500' EXPORTING query_table = p_table delimiter = lv_separator TABLES options = it_options fields = it_fields data = it_rfc_data . IF sy-subrc = 0. TRY . LOOP AT it_rfc_data ASSIGNING FIELD-SYMBOL(<rfc_data_line>). APPEND INITIAL LINE TO <lt_table> ASSIGNING FIELD-SYMBOL(<data>). SPLIT <rfc_data_line> AT lv_separator INTO TABLE it_split_values. LOOP AT it_split_values ASSIGNING FIELD-SYMBOL(<value>). ASSIGN COMPONENT it_fields[ sy-tabix ]-fieldname OF STRUCTURE <data> TO FIELD-SYMBOL(<cell>). IF <cell> IS ASSIGNED. <cell> = condense( val = <value> ). ENDIF. ENDLOOP. ENDLOOP. ENDTRY. DELETE FROM (p_table). INSERT (p_table) FROM TABLE <lt_table>. ELSE. WRITE: / 'HATA:', sy-subrc. ENDIF. ENDIF.