SAP ABAP – Convert XML to internal table / ALV

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 ;

xml

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 Structure

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ı.

File Upload XML ALV internal table display

Reklam

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s