XML dökümanları içerisinde yer alan bilgileri SAP’a aktarmak için çeşitli yöntemler bulunuyor. Bu yöntemlerden en yaygın kullanılanlardan birisi olan SMUM_XML_PARSE fonksiyonunun kullanımı ile ilgili ve örnek kod ile oluşturulmuş bir rapora ait bilgileri bu yazıda görebilirsiniz.
Öncelikle XML içerisinden hangi NODE’lara ait verileri alacağımızı belirleyerek bu veriye ait structure oluşturulması ile başlayabiliriz. Örneğin aşağıda ki resimde yer alan bir XML formatımında dökümanımız olduğunu düşünecek olursak ;
Görüldüğü gibi XML içerisinde yer alan NODE listesi içerisinde her bir NODE’a ait alt kalemler bulunmakta. Bu kalemlere ait satırlarda bulunan verileri SAP tarafına aktarmamız için gerekli structure oluşturmamız gerekmekte.
XML’den alacağımız verilere ait structure oluşturduktan sonra aldığımız verileri bir internal tabloda toplamamız için bu yapıdan türettiğimiz bir TABLE TYPE oluşturuyoruz.
Artık XML dosyasından gelen satırlarda structure içerisinde bulunan elemanlara göre tablomuzu doldurabiliriz. Bunun için oluşturacağımız programda ilk olarak parse edeceğimiz xml dosyasını yüklemek için file upload yapısını oluşturmalı ve yüklenen dosyayı ilgili fonksiyon ile parse ettikten sonra ihtiyacımız olan satırlarda ki verileri tek tek tablomuza doldurabiliriz.
REPORT ZSEARCHHELP. DATA : LV_FIELDNAME TYPE DYNFNAM, GCL_XML TYPE REF TO CL_XML_DOCUMENT, GV_SUBRC TYPE SY-SUBRC, GV_XML_STRING TYPE XSTRING, GV_SIZE TYPE SYTABIX, GT_XML_DATA TYPE TABLE OF SMUM_XMLTB, GT_RETURN TYPE TABLE OF BAPIRET2, GT_XML TYPE ZLEARN_TY_XML. CONSTANTS : GC_STR_NAME LIKE DD02L-TABNAME VALUE 'ZLEARN_S_XML'. PARAMETERS: XML_FILE TYPE LOCALFILE OBLIGATORY. AT SELECTION-SCREEN ON VALUE-REQUEST FOR XML_FILE. LV_FIELDNAME = XML_FILE. * XML Dosyasının masaüstü klasörlerden seçilebilmesi için açılan pencere CALL FUNCTION 'F4_FILENAME' EXPORTING PROGRAM_NAME = SYST-CPROG DYNPRO_NUMBER = SYST-DYNNR FIELD_NAME = LV_FIELDNAME IMPORTING FILE_NAME = XML_FILE. START-OF-SELECTION. CREATE OBJECT GCL_XML. * XML Dosyasının yüklenmesi CALL METHOD GCL_XML->IMPORT_FROM_FILE EXPORTING FILENAME = XML_FILE RECEIVING RETCODE = GV_SUBRC. * XML Dosyasının çözümlenmesi ve bilgilerinin alınması IF GV_SUBRC = 0. CALL METHOD GCL_XML->RENDER_2_XSTRING IMPORTING RETCODE = GV_SUBRC STREAM = GV_XML_STRING SIZE = GV_SIZE. IF GV_SUBRC = 0. * XML Data'nın internal Table'a doldurulması CALL FUNCTION 'SMUM_XML_PARSE' EXPORTING XML_INPUT = GV_XML_STRING TABLES XML_TABLE = GT_XML_DATA RETURN = GT_RETURN. ENDIF. ENDIF.
SMUM_XML_PARSE fonskiyonundan dönen GT_RETURN tablosunda XML içerisindeki satırların parse edilmiş halini göreceksiniz.
Ancak bu tablo içerisinde belirli bir hiyerarşiye göre doldurulmuş bir tablo göreceksiniz. XML içerisindeki NODE’lara ait hiyerarşiye göre bizim ihtiyacımız olan Hiyerarşisi 2 olan alanlar içerisindeki veri gerekli. GT_RETURN tablosunda LOOP işlemini bu hiyerarşi kuralına göre belirlersek ihtiyacımız olan satırlara ait isimlerde bulunan bilgiyi tablomuza doldurabiliriz.
DATA: LV_LINES TYPE I, GWA_XML_DATA TYPE SMUM_XMLTB, GV_TABIX TYPE SYTABIX, GWA_XML TYPE ZLEARN_S_XML. DESCRIBE TABLE GT_XML_DATA LINES LV_LINES. LOOP AT GT_XML_DATA INTO GWA_XML_DATA WHERE HIER EQ 2. IF GWA_XML_DATA-TYPE IS INITIAL. CLEAR : GWA_XML . DO LV_LINES TIMES. DATA: TEMINAT_KOD(3). GV_TABIX = SY-TABIX + 1. READ TABLE GT_XML_DATA INTO GWA_XML_DATA INDEX GV_TABIX. CASE GWA_XML_DATA-CNAME. WHEN 'belge-no'. GWA_XML-BELGE_NO = GWA_XML_DATA-CVALUE. WHEN 'kalem-no'. GWA_XML-KALEM_NO = GWA_XML_DATA-CVALUE. WHEN 'doviz'. GWA_XML-DOVIZ = GWA_XML_DATA-CVALUE. WHEN 'tarih'. GWA_XML-TARIH = GWA_XML_DATA-CVALUE. WHEN 'tutar'. GWA_XML-TUTAR = GWA_XML_DATA-CVALUE. ENDCASE. ENDDO. CLEAR GV_TABIX. ENDIF. APPEND GWA_XMLTO GT_XML. CLEAR: GWA_XML_DATA, GWA_XML. ENDLOOP.
Artık XML içerisinde istediğimiz node içerisindeki bilgileri alıp internal table içerisinde topladık. Bu işlemden sonrası topladığımız bu datanın ALV olarak ekrana bastırılması.