IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAP Discussion :

[ABAP] Transformation XML - ABAP via XSLT


Sujet :

SAP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut [ABAP] Transformation XML - ABAP via XSLT
    Bonjour

    Je travaille actuellement sur la version ECC6 de SAP.
    Je souhaite effectuer des requêtes à la base de TNT pour récupérer les adresses et les n° des relais colis.
    Merci à Frooty pour son aide précieuse pour dégrossir le terrain. Je bute maintenant sur la transformation du résultat XML en table interne ABAP.
    Je pensais avoir tout bien fait mais le programme ne réussi pas à convertir l'XML...

    Voici le le programme XSLT que j'ai créé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl" version="1.0">
      <xsl:template match="/">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="LISTE_COMMUNES">
        <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
          <asx:values>
            <ENREG>
              <xsl:apply-templates/>
            </ENREG>
          </asx:values>
        </asx:abap>
      </xsl:template>
      <xsl:template match="COMMUNE">
        <CODEPOSTAL>
          <xsl:value-of select="CODE_POSTAL"/>
        </CODEPOSTAL>
        <VILLE>
          <xsl:value-of select="VILLE"/>
        </VILLE>
      </xsl:template>
    </xsl:transform>
    Vous pouvez voir le fichier xml que je reçois en lancant la requête suivante :


    Les champs déclarés dans ma table interne sont les suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TYPES: BEGIN OF typ_xml,
    codepostal(10),
    ville(50),
    END OF typ_xml.
    Voici mon programme de test (je passe par un proxy pour accéder à internet.. J'ai donc mis en commentaire cette partie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    REPORT  YTEST_TNT_V3.
    
    CLASS cl_ixml DEFINITION LOAD.
    DATA: response TYPE string.
    DATA: g_ixml TYPE REF TO if_ixml.
    DATA: g_stream_factory TYPE REF TO if_ixml_stream_factory.
    DATA: headfields TYPE tihttpnvp.
    DATA: client TYPE REF TO if_http_client,
    host TYPE string, port TYPE string,
    proxy_host TYPE string, proxy_port TYPE string,
    path TYPE string, scheme TYPE i.
    DATA: wf_user TYPE string .
    DATA: wf_password TYPE string ,
    if_query_field TYPE LINE OF tihttpnvp,
    it_query_field TYPE tihttpnvp,
    if_query TYPE string.
    
    DATA: cx_runtime_error TYPE REF TO cx_xslt_runtime_error.
    DATA: cx_format_error  TYPE REF TO cx_xslt_format_error.
    DATA: err_text         TYPE string.
    
    * La structure qui receptionne les données du XML doit être définie en
    * local dans la routine (je ne sais pas pourquoi)
    
    TYPES: BEGIN OF typ_xml,
    codepostal(10),
    ville(50),
    END OF typ_xml.
    
    
    DATA: lt_xml TYPE STANDARD TABLE OF typ_xml,
    ls_xml TYPE typ_xml,
    source_xml TYPE string,
    lt_result_xml TYPE abap_trans_resbind_tab,
    ls_result_xml TYPE abap_trans_resbind.
    
    
    data: begin of TAB_CONVERTED_DATA occurs 0,
    data1(250) type c,
    end of TAB_CONVERTED_DATA.
    
    data w_length type i.
    data w_tot type i.
    data w_write type i.
    data w_calc type i.
    
    data ref_document tYPE REF TO  IF_IXML_DOCUMENT.
    
    
    START-OF-SELECTION.
    
    *Setting the parameters needed by the object
    concatenate 'http://www.tnt.fr/public/relaiscolis/rechercheCommuneXML'
      '.do?code=69' into host.
      port = '80'.
    
    *  proxy_host = '192.168.1.254'.
    *  proxy_port = '8080'.
    *  scheme = 1. "1=HTTP 2=HTTPS
    *
    *  CALL METHOD cl_http_client=>create_by_url
    *    EXPORTING
    *      url           = host
    *      proxy_host    = proxy_host
    *      proxy_service = proxy_port
    *    IMPORTING
    *      client        = client.
    *
    ** Envoi user/password du proxy
    *  client->propertytype_logon_popup = client->co_disabled.
    *
    *  wf_user = 'xxxxxx' .
    *  wf_password = 'zzzz'.
    *
    ** proxy server authentication
    *
    *  CALL METHOD client->authenticate
    *    EXPORTING
    *      proxy_authentication = 'X'
    *      username             = wf_user
    *      password             = wf_password.
    
    
      CALL METHOD client->request->set_header_field
        EXPORTING
          name  = '~request_method'
          value = 'POST'.
    
    ***
    * send & receive
      client->send( ).
      client->receive( ).
    * Capture the result data
      response = client->response->get_cdata( ).
    
    * VERY IMPORTANT: close your connection
      client->close( ).
    
    
    **
      clear lt_result_xml.
      GET REFERENCE OF lt_xml INTO ls_result_xml-value.
      ls_result_xml-name = 'ENREG'.
      APPEND ls_result_xml TO lt_result_xml.
    
      TRY.
    
          CALL TRANSFORMATION YTEST
          SOURCE XML response
          RESULT  (lt_result_xml).
    
        CATCH cx_xslt_runtime_error INTO cx_runtime_error.
          WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
          err_text = cx_runtime_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CATCH cx_xslt_format_error INTO cx_format_error.
          WRITE :/ 'kernel_errid = ', cx_format_error->kernel_errid.
          err_text = cx_format_error->get_text( ).
          WRITE :/ 'text = ', err_text.
        CLEANUP.
          WRITE :/ 'passage par cleanup'.
    
      endtry.
    
      LOOP AT lt_xml INTO ls_xml.
        WRITE: / sy-tabix, ls_xml-codepostal, ls_xml-ville.
      ENDLOOP.
    J'aimerai donc bien savoir ce que j'ai raté pour que ca ne fonctionne pas...
    Un peu d'aide me fairait énormément de bien !

    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Par défaut
    y a-t-il une raison particulière pour utiliser une transformation XSLT ?

    je n'ai pas de système ECC sous la main mais il doit y avoir une classe XML PARSER qui fait ça très bien (fais une recherche avec CL*PARSER*)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut
    Merci pour ta réponse.

    Non il n'y a pas de raison particulière.
    Seulement en parcourant les différents sites, je tombe plutôt sur cette technique d'utilisation qu'est le XSLT.
    J'avoue que l'appel des méthodes SAP ne me plait guère. Peu de documentation, ou mal documenté et par rapport à la classe que tu m'as donnée, quasiment rien sur le net...

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    Voilà un exemple commenté de XSLT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl" version="1.0">
    
      <xsl:template match="/">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    
      <!-- Le nom des template doit correspondre exactement à celui qu'on trouve dans le XML (case sensitive) -->
      <xsl:template match="Envelope">
        <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
          <asx:values>
       <!-- <ENVELOPE> fait référence à la table résultat dans l'ABAP -->
            <ENVELOPE>
                <xsl:apply-templates select="Header"/>
                <xsl:apply-templates select="Body"/>
            </ENVELOPE>
          </asx:values>
        </asx:abap>
      </xsl:template>
    
      <xsl:template match="Header"/>
    
      <xsl:template match="Body">
        <!-- C'est la balise <item> qui crée une ligne dans la table ABAP -->
        <item>
          <xsl:apply-templates select="DeliveryInfo"/>
          <xsl:apply-templates select="OK_Result"/>
          <xsl:apply-templates select="NOK_Result"/>
        </item>
      </xsl:template>
    
      <xsl:template match="DeliveryInfo">
        <!-- Les balises font la correspondance avec les colonnes de la table ABAP. -->
        <!-- Elles doivent être en majuscules -->
        <!-- Le nom dans select doit correspondre exactement à la balise lue dans le XML -->
        <FILEP> <xsl:value-of select="Fileproceed"/> </FILEP>
        <REP>   <xsl:value-of select="Reported"/>    </REP>
        <TOTAL> <xsl:value-of select="TotalAmount"/> </TOTAL>
      </xsl:template>
    
      <xsl:template match="OK_Result">
        <OK>       <xsl:value-of select="Proceed"/>        </OK>
        <TOTAL_OK> <xsl:value-of select="TotalAmount_OK"/> </TOTAL_OK>
      </xsl:template>
    
      <xsl:template match="NOK_Result">
        <NOK>       <xsl:value-of select="Not_Proceed"/>     </NOK>
        <TOTAL_NOK> <xsl:value-of select="TotalAmount_NOK"/> </TOTAL_NOK>
      </xsl:template>
    
    </xsl:transform>
    Bonne chance.
    Frooty

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Par défaut Operation terminée !!!!
    Encore merci à Frooty

    C'était une simple connerie dans mon XSLT.
    Je n'avais pas compris comment déclarer le renseignement de la table SAP...

    voici le XSLT et avec le programme d'exemple que je vous ai donné au début de ce message ca marche !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl" version="1.0">
    
      <xsl:template match="/">
        <xsl:copy>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl:template>
    
      <!-- Le nom des template doit correspondre exactement à celui qu'on trouve dans le XML (case sensitive) -->
      <xsl:template match="LISTE_COMMUNES">
        <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
          <asx:values>
       <!-- <ENREG> fait référence à la table résultat dans l'ABAP -->
            <ENREG>
                <xsl:apply-templates select="COMMUNE"/>
            </ENREG>
          </asx:values>
        </asx:abap>
      </xsl:template>
    
      <xsl:template match="COMMUNE">
        <!-- C'est la balise <item> qui crée une ligne dans la table ABAP -->
        <item>
          <CODEPOSTAL> <xsl:value-of select="CODE_POSTAL"/> </CODEPOSTAL>
          <VILLE>   <xsl:value-of select="VILLE"/>    </VILLE>
        </item>
      </xsl:template>
    
    </xsl:transform>
    J'espère que ca aidera d'autres personnes !!

    Bon courage.

    Pat

  6. #6
    Membre averti
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Par défaut
    ça fait plaisir quand ça marche !

    ça fait super plaisir d'aider les autres avec ce qu'on a soi-même eu du mal à comprendre et à décortiquer ... on assimile mieux et on est récompensé de ses efforts !

    Vive la communauté !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SAX] Transformation XML Xquery via saxon9
    Par crischprolch dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 30/10/2009, 17h02
  2. [ABAP] Transformation XML -> ABAP data
    Par Frooty dans le forum SAP
    Réponses: 13
    Dernier message: 31/08/2006, 12h40
  3. transformation XML->TXT via XSLT
    Par manumanien dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 07/06/2005, 20h30
  4. transformation xml via xslt
    Par ronnie dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 10/05/2005, 10h58
  5. [XSLT] [XML->HTML] transformation XML -> HTML via XSL
    Par Great Sayaman dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 11/12/2004, 22h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo