Cerca nel blog

giovedì 22 marzo 2018

ABAP: Creare una "Simple Trasformation"per XML in ABAP

Creare una "Simple Trasformation"per XML in ABAP

Per convertire un file XML in una tabella interna SAP, possiamo utilizzare le Trasformation.
Prendiamo come esempio il seguente XML in ingresso a SAP che deve essere convertito:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<FlussoRiversamento xmlns="http://www.digitpa.gov.it/schemas/2011/Pagamenti/">
    <versioneOggetto>1.0</versioneOggetto>
    <istitutoMittente>
        <idunivocomittente>
            <tipoIdentificativoUnivoco>B</tipoIdentificativoUnivoco>
            <codiceIdentificativoUnivoco>CIPBITMM</codiceIdentificativoUnivoco>
        </idunivocomittente >
        <idunivocomittente >
            <tipoIdentificativoUnivoco>D</tipoIdentificativoUnivoco>
            <codiceIdentificativoUnivoco>PIPPO</codiceIdentificativoUnivoco>
        </idunivocomittente >
        <denominazioneMittente>I.C.B.P.I.</denominazioneMittente>
    </istitutoMittente>
</FlussoRiversamento>

La prima cosa da fare è creare una struttura tramite la SE11 che rispecchi la struttura del file XML, escludendo la ROOT (FlussoRiversamento).
Quindi creiamo la seguente struttura ZST_RIVERSAMENTO nel seguente modo:

  
In cui IstitutoMittente è una struttura di questo tipo:


In cui Idunicovomittente è una tabella (perché il file xml prevede più righe per questo tag) con la seguente struttura:


Il tipo dati per ogni campo viene recuperato direttamente dal file XSD dell’XML.
Successivamente dalla transazione XSLT_TOOL creiamo la transformation ZRIVERSAMENTO con tipologia S (Trasformazione semplice).

Dalla schermata iniziale della trasformation, elaboriamo graficamente con il seguente tastino:

Dalla nuova schermata eliminiamo la ROOT di default e inseriamo una nuova ROOT tramite il menu Edit->New Root. Inseriamo come:
Root-Name: FlussoRiversamento ( la ROOT del nostro XML)
Type-Name: ZST_RIVERSAMENTO (La struttura creata precedentemente)
Avremo una situazione del genere:
 

Ora trasciniamo l’oggetto FLUSSORIVERSAMENTO: ZST_RIVERSAMENTO tramite Drag and Drop nella colonna di Simple Transformation. In automatico verrà generata la Simple Transformation.
Non ci resta che adattare i nomi dei campi relativi ai tag XML dando doppio click sul singolo oggetto creato rispettando anche lettere maiuscole e minuscole.
Quindi avremo:
  

Fatto questo, abbiamo generato la nostra Simple Trasformation (SALVIAMO).
Tornando indietro, e selezionando il tab Testo Sorgente, possiamo vedere anche non graficamente cosa abbiamo creato:

ZRIVERSAMENTO
<?sap.transform simple?>
<tt:transform xmlns:tt=
"http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name=
"FLUSSORIVERSAMENTO" type="ddic:ZST_RIVERSAMENTO"/>
  <tt:template>
    <FlussoRiversamento>
      <versioneOggetto tt:value-ref=
".FLUSSORIVERSAMENTO.VERSIONEOGGETTO"/>
      <istitutoMittente>
        <idunivocomittente>
          <tt:loop ref=
".FLUSSORIVERSAMENTO.ISTITUTOMITTENTE.IDUNIVOCOMITTENTE">
            <zst_pefii15_id_uni_mittente3>
              <tipoidentificativounivoco tt:value-ref=
"TIPOIDENTIFICATIVOUNIVOCO"/>
              <codiceidentificativounivoco tt:value-ref=
"CODICEIDENTIFICATIVOUNIVOCO"/>
            </zst_pefii15_id_uni_mittente3>
          </tt:loop>
        </idunivocomittente>
        <denominazionemittente tt:value-ref=
".FLUSSORIVERSAMENTO.ISTITUTOMITTENTE.DENOMINAZIONEMITTENTE"/>
      </istitutoMittente>
    </FlussoRiversamento>
  </tt:template>
</tt:transform>

Adesso possiamo vedere come il tag FlussoRiversamento nel file XML presenta l’attributo di dichiarazione namespace che possiamo aggiungere direttamente dal testo sorgente. Naturalmente il tool grafico si adatterà alla modifica.


ZRIVERSAMENTO
<?sap.transform simple?>
<tt:transform xmlns:tt=
"http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name=
"FLUSSORIVERSAMENTO" type="ddic:ZST_RIVERSAMENTO"/>
  <tt:template>
    <FlussoRiversamento 
xmlns="http://www.digitpa.gov.it/schemas/2011/Pagamenti/">
      <versioneOggetto tt:value-ref=".FLUSSORIVERSAMENTO.VERSIONEOGGETTO"/>
      <istitutoMittente>
        <idunivocomittente>
          <tt:loop ref=
".FLUSSORIVERSAMENTO.ISTITUTOMITTENTE.IDUNIVOCOMITTENTE">
            <zst_pefii15_id_uni_mittente3>
              <tipoidentificativounivoco tt:value-ref=
"TIPOIDENTIFICATIVOUNIVOCO"/>
              <codiceidentificativounivoco tt:value-ref=
"CODICEIDENTIFICATIVOUNIVOCO"/>
            </zst_pefii15_id_uni_mittente3>
          </tt:loop>
        </idunivocomittente>
        <denominazionemittente tt:value-ref=
".FLUSSORIVERSAMENTO.ISTITUTOMITTENTE.DENOMINAZIONEMITTENTE"/>
      </istitutoMittente>
    </FlussoRiversamento>
  </tt:template>
</tt:transform>
        </istitutoMittente>
    </FlussoRiversamento>
  </tt:template>
</tt:transform>


Ora possiamo attivare ed utilizzarla all’interno del nostro report nel seguente modo:
 


ESEMPIO DI PROGRAMMA CHE RICHIAMA LA TRASFORMATION
PROGRAM ZESEMPIO.
 DATAgv_xml_string TYPE string.
 DATAls_xml_table TYPE ZST_RIVERSAMENTO,
 gt_xml_table TYPE STANDARD TABLE OF ZST_RIVERSAMENTO.

START-OF-SELECTION.
PERFORM temp"call proxy
* CALL TRANSFORMATION per convertire XML in Table SAP
    
PERFORM xml_response_to_abap CHANGING ls_xml_table.
END-OF-SELECTION.

FORM temp .

  
DATAlt_string TYPE STANDARD TABLE OF string.

  
CLEARgv_xml_string.

  
CALL FUNCTION 'GUI_UPLOAD'
    
EXPORTING
      filename 
'C:\Cartella\Riversamento.xml'
    TABLES
      data_tab 
lt_string.

  
LOOP AT lt_string ASSIGNING FIELD-SYMBOL(<fs_xml>).
    
CONCATENATE gv_xml_string <fs_xml> INTO gv_xml_string.
  
ENDLOOP.
ENDFORM.

FORM xml_response_to_abap CHANGING ls_xml_table TYPE ZST_RIVERSAMENTO.

  CLEARls_xml_table.

  
TRY .
      
CALL TRANSFORMATION zriversamento
        SOURCE XML gv_xml_string
        RESULT flussoriversamento 
ls_xml_table.

      
APPEND ls_xml_table TO gt_xml_table.
    
CATCH cx_transformation_error.
      
"NO DUMP ONLY NO APPEND
  
ENDTRY.

ENDFORM.

in cui “flussoriversamento” è il nome della ROOT inserita nella trasformation.


Nessun commento:

Posta un commento