Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > ERP > SAP
SAP Forum d'entraide sur SAP et sur la programmation avec le langage ABAP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/08/2006, 21h48   #1
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Par défaut [ABAP] Transformation XML -> ABAP data

Bonjour à tous,

Voilà plusieurs semaines que je suis bloquée sur un problème : je cherche à analyser un fichier XML par un programme ABAP, en utilisant un XSLT de transformation.
Je lis le fichier XML et le stocke dans une variable STRING.
J'ai définit une table interne pour accueillir les données contenues dans le fichier XML.
J'ai défini un XSLT de transformation.
J'utilise l'instruction CALL TRANSFORMATION ...

J'ai trouvé divers exemples, mais aucun de fonctionne pour ma structure de fichier.

Est-ce que quelqu'un peut m'aider ?
Merci d'avance.
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2006, 08h20   #2
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Par défaut ... suite

Pour être plus claire, voici les différents bouts de code que j'utilise.
Le fichier source XML que je veux analyser :
Code :
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
<?xml version="1.0" encoding="UTF-8"?>
<Envelope type="Response">
<Header>
<From>Societe</From>         
            <To>Autre_societe</To>          
            <UseCase>Action</UseCase>     
            <SessionID>1</SessionID>   
            <Version>2.5</Version>     
            <Status>0</Status>      
                           
        </Header>
        
    <Body>
            
        <DeliveryInfo>
                <Fileproceed>Yes</Fileproceed>         
                <Reported>33</Reported>             
                <BillerID>10000000000000001</BillerID>           
                <TotalAmount>358.55</TotalAmount>        
            </DeliveryInfo><OK_Result>
                <Proceed>33</Proceed>            
                <TotalAmount_OK>358.55</TotalAmount_OK>       
            </OK_Result><NOK_Result>
                <Not_Proceed>0</Not_Proceed>         
                <TotalAmount_NOK>0.00</TotalAmount_NOK>    
                
            </NOK_Result></Body></Envelope>
Le fichier XSLT de transformation :

Code :
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
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sapxsl="http://www.sap.com/sapxsl">

  <!--  Récupération du contenu du fichier XML  -->
  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <!-- Appliquer les templates dès que la balise ENVELOPE est trouvée  -->
  <xsl:template match="Envelope">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <Envelope>
          <xsl:apply-templates select="Body" />
        </Envelope>
      </asx:values>
    </asx:abap>
  </xsl:template>

  <!--  appliquer la template BODY pour en récupérer son contenu  -->
  <xsl:template match="Body">
    <Body>
      <xsl:apply-templates select="DeliveryInfo" />
      <xsl:apply-templates select="OK_Result" />
      <xsl:apply-templates select="NOK_Result" />
    </Body>
  </xsl:template>

  <!--  Récupération du contenu du bloc DELIVERYINFO  -->
  <!--  les labels sont en lien avec le nom de la colonne du tableau -->
  <!--  le mot-clef utilisé dans la clause select est en lien avec la balise du XML en train d'être lu  -->
  <xsl:template match="DeliveryInfo">
    <Fileprocced><xsl:value-of select="FILE_PROCEED" /></Fileproceed>
    <Reported><xsl:value-of select="REPORTED" /></Reported>
    <BillerID><xsl:value-of select="BILLER_ID" /></BillerID>
    <TotalAmount><xsl:value-of select="TOTAL_AMNT" /></TotalAmount>
  </xsl:template>

  <!--  Récupération du contenu du bloc OK_Result -->
  <xsl:template match="OK_Result">
    <Proceed><xsl:value-of select="PROCEED" /></Proceed>
    <TotalAmount_OK><xsl:value-of select="TOTAL_AMNT_OK" /></TotalAmount_OK>
  </xsl:template>

  <!--  Récupération du contenu du bloc NOK_RESULT -->
  <xsl:template match="NOK_Result">
    <Not_Proceed><xsl:value-of select="NOT_PROCEED" /></Not_Proceed>
    <TotalAmount_NOK><xsl:value-of select="TOTAL_AMNT_NOK" /></TotalAmount_NOK>
  </xsl:template>

</xsl:transform>
Et enfin, mon code ABAP qui est sensé faire le travail :

Code :
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
TYPES : BEGIN OF typ_xml, 
            file_proceed(3),                  
            reported           TYPE i,                    
            biller_id(17),                                
            total_amnt(17),                              
            proceed            TYPE i,                    
            total_amnt_ok(17),                            
            not_proceed        TYPE i,                  
            total_amnt_nok(17),                          
        END OF typ_xml. 

DATA : gt_xml        TYPE STANDARD TABLE OF typ_xml, 
       gt_result     TYPE abap_trans_resbind_tab, 
       gs_xml        TYPE typ_xml, 
       gs_result     TYPE abap_trans_resbind. 

DATA : gv_read_xml TYPE string.      

(...) 
* Ecran de sélection avec P_FILE = chemin complet du fichier XML

start-of-selection. 

  OPEN DATASET p_file FOR INPUT IN BINARY MODE. 
  IF sy-subrc = 0. 
     CLEAR : gv_read_xml. 
     READ DATASET p_file INTO gv_read_xml. 

*   Transformation XML en ABAP-DATA 
     PERFORM check_xml USING gv_read_xml. 

     CLOSE DATASET gv_file. 
  ENDIF. 

*&---------------------------------------------------------------------* 
*&      Form  check_xml 
*&---------------------------------------------------------------------* 
FORM check_xml  USING    p_xml 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. 

  REFRESH : gt_result, gt_xml. 
  CLEAR : gs_result, gs_xml. 
  GET REFERENCE OF gt_xml INTO gs_result-value. 
  gs_result-name = 'Envelope'. 
  APPEND gs_result TO gt_result. 

  TRY. 

      CALL TRANSFORMATION ypmcl001_id 
           SOURCE XML p_xml 
           RESULT (gt_result). 

    CATCH cx_sy_conversion_base64. 
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid. 
      err_text = cx_runtime_error->get_text( ). 
      WRITE :/ 'text = ', err_text. 
    CATCH cx_sy_conv_illegal_date_time. 
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid. 
      err_text = cx_runtime_error->get_text( ). 
      WRITE :/ 'text = ', err_text. 
    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. 

* Contrôle écran du résultat lu 
  LOOP AT gt_xml INTO gs_xml. 
    WRITE / gs_xml. 
  ENDLOOP. 

ENDFORM.                    " check_xml
Le problème est que je ne récupère rien dans la table GT_XML.
Merci d'avance pour vos suggestions.
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 21h09   #3
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Bonsoir,
Je n'ai pas eu le temps de verifier le code, je regarderai demain, mais y'a-t-il des donnees dans gt_result ?

Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 09h17   #4
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Bonjour,

Il n'y a que ce que j'y ai chargé :
GT_RESULT-NAME contient Envelope
GT_RESULT-VALUE contient {A:1}
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2006, 17h25   #5
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Bonjour,
J'ai essayé ce morceau de code mais j'imagine que tu n'as pas fait un simple copié-collé : il ne compile pas. J'ai donc fait quelques modifications (v. ci-dessous), échangé l'appel au DATASET par un appel d'API (parceque je ne ne peux pas importer le fichier XML sur le serveur). Mais j'ai un xslt kernel error : hélas. En outre, je ne vois pas trop pourquoi tu utilises deux tables ?!?

Code :
1
2
3
4
5
6
7
TYPES : BEGIN OF abap_trans_resbind,
         name    TYPE STRING,
         BEGIN OF value,
          INCLUDE TYPE typ_xml,
         END OF value,
        END OF abap_trans_resbind.
Et aussi la transformation :

Code :
1
2
3
4
      CALL TRANSFORMATION ypmcl001_id
           SOURCE XML p_xml
           RESULT para = gt_xml.
De là, j'ai aussi modifié une balise du fichier XSLT pour compiler.

Par contre, j'aimerais avoir un feedback sur ces modifs avant de poursuivre et/ou un code compilable.

Amicalement,
Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 08h51   #6
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Par défaut Nouvelle donne

Bonjour Ludovic,

Mon code n'était effectivement pas un copier/coller et je ne l'avais pas fait fonctionner tel que, désolée
Depuis mon dernier post, j'ai fait quelques modifications pour essayer de m'en sortir ... le résultat n'est pas mieux, mais je te donne les dernières sources.

Merci pour ta réponse en tous cas, ça m'encourage de savoir que quelqu'un est là

Nouveau XSLT :
Code :
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
<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="Envelope">
    <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
      <asx:values>
        <PEOPLE>
          <xsl:apply-templates/>
        </PEOPLE>
      </asx:values>
    </asx:abap>
  </xsl:template>

  <xsl:template match="Header"/>

  <xsl:template match="Body">
    <item>
      <xsl:apply-templates select="DeliveryInfo/item"/>
      <xsl:apply-templates select="OK_Result/item"/>
      <xsl:apply-templates select="NOK_Result"/>
     </item>
 </xsl:template>

  <xsl:template match="DeliveryInfo">
    <item>
    <Fileproceed>     <xsl:value-of select="fileproceed"/>    </Fileproceed>
    <Reported>        <xsl:value-of select="REPORTED"/>       </Reported>
    <BillerID>        <xsl:value-of select="BILLERID"/>       </BillerID>
    <TotalAmount>     <xsl:value-of select="TOTALAMOUNT"/>    </TotalAmount>
    </item>
  </xsl:template>

  <xsl:template match="OK_Result">
    <item>
    <Proceed>        <xsl:value-of select="proceed"/>         </Proceed>
    <TotalAmount>    <xsl:value-of select="totalamount"/>     </TotalAmount>
    </item>
  </xsl:template>

  <xsl:template match="NOK_Result"/>

</xsl:transform>
Nouveau Code pour le programme :
(J'ai mis en rouge les lignes qui manquaient pour que ça compile le coup d'avant)
Code :
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
TYPE-POOLS : abap.

TYPES : BEGIN OF typ_xml,
            file_proceed(3),
            reported           TYPE i,
            biller_id(17),
            total_amnt(17),
            proceed            TYPE i,
            total_amnt_ok(17),
            not_proceed        TYPE i,
            total_amnt_nok(17),
        END OF typ_xml.

DATA : gt_xml        TYPE STANDARD TABLE OF typ_xml,
          gt_result     TYPE abap_trans_resbind_tab,
          gs_xml        TYPE typ_xml,
         gs_result     TYPE abap_trans_resbind.

DATA : gv_read_xml TYPE string.

* Ecran de sélection avec
PARAMETER p_file(200) DEFAULT
          '\\b116b\transfert\sig_20050701203812_back.xml'.

START-OF-SELECTION.

  OPEN DATASET p_file FOR INPUT IN BINARY MODE.
  IF sy-subrc = 0.
    CLEAR : gv_read_xml.
    READ DATASET p_file INTO gv_read_xml.

*   Transformation XML en ABAP-DATA
    PERFORM check_xml USING gv_read_xml.

    CLOSE DATASET p_file.
  ENDIF.

*&---------------------------------------------------------------------*

*&      Form  check_xml
*&---------------------------------------------------------------------*

FORM check_xml  USING    p_xml TYPE string.

* Référence aux objets d'exception
  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.

  TYPES: BEGIN OF t_dev_inf,
           fileproceed(3),
           reported TYPE i,
           billerid(17),
         END OF t_dev_inf,

         begin of t_ok,
           proceed type i,
           totalamount type p,
         end of t_ok,

         BEGIN OF t_people,
            deliveryInfo type t_dev_inf,
            ok_result    type t_ok,
         END OF t_people.

  DATA: people_itab   TYPE STANDARD TABLE OF t_people,
        wa_people     TYPE t_people,
        source_xml    TYPE string,
        result_xml    TYPE abap_trans_resbind_tab,
        wa_result_xml TYPE abap_trans_resbind,
        lv_xml_tmp    TYPE string.

  GET REFERENCE OF people_itab INTO wa_result_xml-value.
  wa_result_xml-name = 'PEOPLE'.
  APPEND wa_result_xml TO result_xml.

  TRY.

      CALL TRANSFORMATION ypmcl001_id
      SOURCE XML p_xml
      RESULT (result_xml).

    CATCH cx_sy_conversion_base64.
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
      err_text = cx_runtime_error->get_text( ).
      WRITE :/ 'text = ', err_text.
    CATCH cx_sy_conv_illegal_date_time.
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
      err_text = cx_runtime_error->get_text( ).
      WRITE :/ 'text = ', err_text.
    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 people_itab INTO wa_people.
*    WRITE: / sy-tabix, wa_people-deliveryinfo-fileproceed.
  ENDLOOP.

ENDFORM.                    " check_xml
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 14h26   #7
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Bonjour,
En modifiant legerement la grammaire, j'obtient ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <?xml version="1.0" encoding="utf-8" ?> 
- <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
- <asx:values>
- <PEOPLE>
- <item>
- <item>
  <Fileproceed>Yes</Fileproceed> 
  <Reported>33</Reported> 
  <BillerID>10000000000000001</BillerID> 
  <TotalAmount>358.55</TotalAmount> 
  </item>
- <item>
  <Proceed>33</Proceed> 
  <TotalAmount /> 
  </item>
  </item>
  </PEOPLE>
  </asx:values>
  </asx:abap>
Est-ce le resultat attendu ?
Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 15h20   #8
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Bonjour Ludo,

Je viens de relancer en debug mon XSLT et j'obtiens ceci, moi :
Code :
1
2
3
4
5
6
7
                                                                        
<?xml version="1.0" encoding="iso-8859-1"?>#
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<PEOPLE><item/>  
</PEOPLE>
</asx:values></asx:abap>
Aie aie aie ... y'a un truc là !

C'est ton résultat que je souhaiterai obtenir effectivement.
Qu'as tu changé dans la grammaire ?

Merci d'avance.
Frooty.
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 15h22   #9
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Oui, la difference est liee a ceci (c'est un peu prise de tete cette histoire ) :
<xsl:apply-templates select="DeliveryInfo/item"/>

As-tu verifie que p_xml contient bien l'ensemble du fichier xml ?

Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2006, 16h00   #10
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Je viens de contrôler : p_xml contient bien la totalité de mon fichier XML.
Je visualise la dernière balise </Envelope> à la fin de la variable.

C'est grâve docteur ?
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 00h57   #11
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Salut Frooty,
Désolé de ne pouvoir t'aider davantage. Hormis par l'utilisation de classe IXML (v. SAP Developer Network) , je ne vois pas de solution à l'heure actuelle.

Bon courage,
Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 08h03   #12
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Bonjour Ludo,

Je te remercie déjà pour les pistes que tu m'as données.
Le SAP developper Network ne m'a pas apporté d'aide jusqu'à présent, mais je vais persévérer, je n'ai pas le choix, il me FAUT la solution.
Je te tiens au courant.

A +
Frooty
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 18h12   #13
Membre à l'essai
 
Inscription : août 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 40
Points : 24
Points : 24
Par défaut Eureka !

J'ai trouvé !
Après avoir encore passé la journée sur le problème ... une connexion neurale a du s'établir et ça marche !
Je vous fais partager le résultat de mes efforts, si cela peut aider quelqu'un ...

Le fichier XML de départ est toujours le même bien sur.

Le fichier de grammaire XSLT a quelque peu changé :
En fait, l'astuce se situe dans les lignes de type :
Code :
<FILEP> <xsl:value-of select="Fileproceed"/> </FILEP>
  • <FILEP> correspond au nom de colonne dans la table interne ABAP qui récupère les données (les majuscules sont obligatoires dans le XSLT).
  • "Fileproceed" correspond exactement à la balise XML qui contient l'information que je souhaite mettre dans ma colonne FILEP.
Dans le code, il faut surtout définir la structure de référence qui reçoit les données en local, sinon cela ne fonctionne pas.

Voici les dernières sources :
Code :
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
<!-- Fichier de transformation -->
<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="Envelope">
    <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="Body">
    <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">
    <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>
    <TOT_OK>    <xsl:value-of select="TotalAmount_OK"/>  </TOT_OK>
  </xsl:template>
  <xsl:template match="NOK_Result">
    <NOK>       <xsl:value-of select="Not_Proceed"/>      </NOK>
    <TOT_NOK>   <xsl:value-of select="TotalAmount_NOK"/>  </TOT_NOK>
  </xsl:template>
</xsl:transform>
Code :
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
Code source :
TYPES: BEGIN OF typ_xml,
         filep(3),
         rep      TYPE i,
         total    TYPE p decimals 2,
         ok       TYPE i,
         tot_ok   TYPE p decimals 2,
         nok      TYPE i,
         tot_nok  TYPE p decimals 2,
       END OF typ_xml.

DATA : gt_xml        TYPE STANDARD TABLE OF typ_xml, 
       gt_result     TYPE abap_trans_resbind_tab.

DATA : gv_read_xml TYPE string.      

(...) 
* Ecran de sélection avec P_FILE = chemin complet du fichier XML

start-of-selection. 

  OPEN DATASET p_file FOR INPUT IN BINARY MODE. 
  IF sy-subrc = 0. 
     CLEAR : gv_read_xml. 
     READ DATASET p_file INTO gv_read_xml. 

*   Transformation XML en ABAP-DATA 
     PERFORM check_xml USING gv_read_xml. 

     CLOSE DATASET gv_file. 
  ENDIF. 

*&---------------------------------------------------------------------* 
*&      Form  check_xml 
*&---------------------------------------------------------------------* 
FORM check_xml  USING    p_xml 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)
  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.

  GET REFERENCE OF lt_xml INTO ls_result_xml-value.
* Le nom de référence de la base de la strucutre est arbitraire
* elle est ajoutée dans le XSLT en plus des balises du XML source
  ls_result_xml-name = 'ENREG'.
  APPEND ls_result_xml TO lt_result_xml.

  TRY.

      CALL TRANSFORMATION ytest_id
      SOURCE XML p_xml
      RESULT (lt_result_xml).

    CATCH cx_sy_conversion_base64.
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
      err_text = cx_runtime_error->get_text( ).
      WRITE :/ 'text = ', err_text.
    CATCH cx_sy_conv_illegal_date_time.
      WRITE :/ 'kernel_errid = ', cx_runtime_error->kernel_errid.
      err_text = cx_runtime_error->get_text( ).
      WRITE :/ 'text = ', err_text.
    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-filep, ls_xml-rep, ls_xml-total.
  ENDLOOP.

ENDFORM.                    " check_xml
Merci à Ludo, qui grâce à ces réponses m'a encouragé à persévérer.
Je suis soulagée d'avoir enfin trouver la solution à mon problème et j'espère que mes explications seront assez claires pour ceux qui voudront s'en inspirer.
Bonne soirée à tous.
Une Frooty toute heureuse !
Frooty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 12h40   #14
Membre expérimenté

 
SAP for Banking
Inscription : juin 2002
Messages : 539
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : SAP for Banking
Secteur : Conseil

Informations forums :
Inscription : juin 2002
Messages : 539
Points : 566
Points : 566
Genial !
A bientot.
Ludo
__________________
TRY.
N/A
CATCH cx_root.
ludovic.fernandez est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h46.


 
 
 
 
Partenaires

Hébergement Web