Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres Logiciels > ERP > SAP

SAP Forum d'entraide sur SAP et sur la programmation avec le langage ABAP

Réponse
 
Outils de la discussion
Vieux 21/08/2008, 15h11   #1 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut transférer une table dans un fichier avec séparateurs

Bonjour,

je bosse sur un programme ABAP qui récupére le résultat d'une BAPI dans une table et qui doit transférer le contenu de cette table dans un fichier csv avec un séparateur de colonnes ';'

J'ai bien récupérer le résultat de la BAPI dans une table, maintenant je cherche a tranférer dans le fichier. actuellement je fais:
Code :
  loop at t_tab_interne.
      TRANSFER t_tab_interne to gv_path_fic .
  endloop.
ça fonctionne , mais ça concatène toutes les colonnes sans séparateurs.
A noter que je ne connais pas le nom des colonnes. Sinon j'aurais fais quelque chose du style:

Code :
  loop at t_tab_interne.
    concatenate t_tab_interne-Col1 t_tab_interne-col2 into str SEPARATED BY separateur.
    TRANSFER str to gv_path_fic.
  endloop.
Connaissez vous une solution a mon problème?

Dans la même problématique, savez vous comment récupérer le nom des colonnes d'un table dans le programme ABAP (de manière a les écrire dans la première ligne de mon fichier).

la je bloque depuis un bout de temps et je ne sais comment me dépêtrer
MERCI d'avance.

PS: je ne fais de l'ABAP que depuis très peu de temps, donc des choses immédiates (une fonction qui fait exactement ce que je cherche a faire par ex) ont pu m'échapper.
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2008, 15h30   #2 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

Salut à toi,

Alors...Tu peux utiliser la fonction suivante pour insérer les données de ta table interne directement dans une table interne avec les ';' qui vont bien pour les fichier CSV : 'SAP_CONVERT_TO_CSV_FORMAT'

Utilise la méthode suivante pour transférer tout dans un fichier CSV
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = Chemin du fichier
filetype = 'ASC'
CHANGING
data_tab = Table provenant de la fonction précédente
.
Nota : Penses aux exceptions et à mettre la bonne extension au niveau du chemin.

Sinon pour récupérer le nom des colonnes d'une table interne dans un programme ABAP: 'LVC_FIELDCATALOG_MERGE'

Voila, je crois que t'as tout là

@++.

Dernière modification par Celdrøn ; 21/08/2008 à 16h12
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2008, 16h14   #3 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

Super! merci. ça a l'air nikel. je vais tester tout de suite.

j'avais testé juste guidownload, mais sans succes pour les ';' avec ton explication je devrais y arriver . merci.

Connaitrais tu un site avec une sorte de 'bible' des fonction abap ? de maniere a vite trouver celle qui convient.
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2008, 17h03   #4 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

y'a un truc que je pige pas.

SAP_CONVERT_TO_CSV_FORMAT mais la convertion de la table donnée en parametre (I_TAB_SAP_DATA) dans une seule variable : I_TAB_CONVERTED_DATA

QUel type donner a cette variable?

Sur un site j'ai trouve :
Code :
data : i_text(4096) type c OCCURS 0.
cela correspond a quoi? car 'c' est une chaine de caractere. Donc ici i-text serait une chaine de 4096 caracteres? C'est petit pour stocker une table entiere. A moins que le fait de mettre OCCURS 0 implique qu'on a une table de chaine de caractere? c'est ça ?

désolé pour mon ignorance mais j'ai du mal a capter certains truc avec abap pour l'instant...

Dernière modification par progamer54 ; 22/08/2008 à 09h36
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/08/2008, 17h15   #5 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

Pas d'inquiétude, pour moi t'es pas un igniard, mais juste un débutant destinée à progresser. Je suis pas du genre à me moquer des personnes qui posent des questions dont la réponse me semble une évidence vu mon expérience (même si petite soit-elle). Voilà.


Sinon, pour ta question...
Le type 'c' sert à déclarer des donnée de type char à longueur fixe, au contraire du type string.

Code :
data : i_text(4096) type c OCCURS 0.
Cette déclaration est correct car tu définis une table interne ( le OCCURS 0 sert à dire que c'est une table) dont la structure est composé d'un champ de type 'c' d'une longueur de 4096 caractères maximum. Et sinon, chaque ligne de cette table contiendra une ligne de ta table interne d'origine.

Donc pas d'inquiètude et roulez jeunesse.

@++
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 09h07   #6 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

Super!
Merci beaucoup pour tes explications très claires !!

JE t'embête encore pour un dernier point...
Sais tu si on peut , avec GUI-DOWLOAD, créer le fichier dans le système de fichier de SAP?
en effet, avant je faisais quelque chose du genre :
Code :
(fichier_logique : 'Z08_TEST_EXTRACTION'
nom_fichier : 'monFichier.csv)

CALL FUNCTION 'FILE_GET_NAME'
    EXPORTING
      logical_filename              = fichier_logique
      PARAMETER_1                   = nom_fichier
   IMPORTING
     file_name                     = pv_path_fic
   EXCEPTIONS
     file_not_found                = 1
     OTHERS                        = 2
...
...
OPEN DATASET GV_PATH_FIC FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
...
loop at tab_interne.
     TRANSFER tab_interne to gv_path_fic .
endloop.
...
CLOSE DATASET GV_PATH_FIC.
...et j'allais avec la transaction AL11 voir le fichier créé.

Là je ne peux bien sur pas mettre gv_path_fic dans le FILENAME de GUI_DOWNLOAD, ça ne fonctionne pas.
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 09h21   #7 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

Salut,

Alors comme ça !! On commence à m'embêter si tôt le matin maintenant. -_-"
MDR. ^_^

GUI_DOWNLOAD sert à créer un fichier en local...

Pour écrire ton fichier dans le système de fichier de SAP, tu peux reprendre le code que tu utilisais auparavant.

Si ça marchait avant, je ne vois pas de raison que ça ne marche pas...

Voila.

PS : T'inquiète, je vais t'envoyer la facture, mon aide n'est pas gratos !!! Et puis quoi encore !!!
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 09h35   #8 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut



Oui c'est vrai que maintenant que j'ai une table avec 1 seule colonne je peux très bien reprendre mon code, j'y avais pas pensé.

MERCI ENCORE POUR TON AIDE !

ps : je t'envois un RIB sous peu pour les prélèvements
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 10h17   #9 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

Un RIB pour les prélèvements?? SUPER !!!!

J'espère que ton compte est bien alimenté, j'ai besoin d'soussous pour m'acheter ma tuture. ^_^

Allez !! raboules la tune !!!


Sinon, ben de rien.
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 15h12   #10 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

JE viens de tester le loop afin de créer le fichier dans le systeme SAP.

Figure toi que ça marche pas, apparement car la table (celle contenant la version CSV de ma table interne ) n'a pas de header line.

et si je rajoute with header line c'est la convertion CSV qui plante.

Comment je pourrais faire.

Il doit forcément y avoir un moyen de parcourir ma table avec un loop ou un truc dans le genre meme si elle a pas de header... ou alors faudrait pouvoir faire la convertion CSV en ayant une header line dessus...
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 15h17   #11 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

c'est bon j'ai trouvé .

j'ai rajouté un ' into' sur mon loop.

Code :
data : i_text(4096) type c OCCURS 0.
data : ma_ligne(4096) type c.

...

loop at i_text into ma_ligne.
  TRANSFER ma_ligne to gv_path_fic.
endloop.
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/08/2008, 17h54   #12 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

C'est bien que tu ais trouvé par toi même mais je vais te donner ce qui plantait avec le WITH HEADER LINE:

En fait t'as deux façons de créer des tables internes:
Code :
DATA : s_tab1 TYPE dtab, 
       t_tab1 LIKE s_tab1 OCCURS 0.

DATA : t_tab2 TYPE dtab OCCURS 0 WITH HEADER LINE.
La première est une table interne avec structure indépendante et la deuxième est une table interne avec entête.

Mais seulement il y a des subtilité.
t_tab1 ou t_tab1[] revient au même car c'est une table sans entête.
Mais t_tab2 <> t_tab2[] car c'est une table avec entête.
Donc t_tab2 sera l'entête (structure lié à la table) ce qui signifie qu'à ta fonction il aura fallut que tu lui passes ta table avec "[]".

Seulement, je te conseille de prendre l'habitude de travailler avec des structures indépendantes car en ABAP OO (Orienté Objet) les tables avec entête sont interdites (fin j'ai rencontré ce cas, j'en mettrais pas ma main a couper que c'est généralisé à tout l'ABAP OO). Et deuxième point, d'après SAP, c'est plus performant de passer par une table interne avec structure indépendante.

Voilà.
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 08h58   #13 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

OK. merci beaucoup.
C'est le genre de truc qu'on trouve pas tout seul

SI j'ai bien compris, la structure de la table représente les colonnes présentent dans la table? ok, ok

Sinon j'ai pas réussi a récupéré le nom des colonnes de la table retournée par ma bapi avec LVC_FIELDCATALOG_MERGE . J'ai un message : catalogue de zone ne peut pas être défini.

Code :
data : tint_CCLIST like BAPI0012_CCLIST occurs 0 with header line.
data : gt_fieldcat type lvc_t_fcat.

(JE récupere le retour de ma bapi dans tint_CCLIST puis :)

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
 EXPORTING
*   I_BUFFER_ACTIVE              =
*   I_STRUCTURE_NAME             =
*   I_CLIENT_NEVER_DISPLAY       = 'X'
*   I_BYPASSING_BUFFER           =
   I_INTERNAL_TABNAME           = 'tint_CCLIST'
  CHANGING
    CT_FIELDCAT                  = gt_fieldcat
* EXCEPTIONS
*   INCONSISTENT_INTERFACE       = 1
*   PROGRAM_ERROR                = 2
*   OTHERS                       = 3
          .
comme j'ai du mal a visualiser ce que sap fait au moment de cette fonction je n'arrive pas a voir ce qui bloque.
J'ai essayé tint_CCLIST sans les guillemets, mais ça me dit que le type de tint_CCLIST n'est pas celui attendu.
De plus, mettons que la fonction marche, je ne sais pas comment je récupere les nom des colonnes a partir de la variable gt_fieldcat. J'ai vraiment du mal a trouver de la bonne donc claire qui explique toutes les possibilités de cette fonction

EDIT : j'ai reussi a ne plus avoir l'erreur en mettant 'tint_CCLIST' dans I_STRUCTURE_NAME . Je n'ai maintenant plus d'erreur. je devrais donc avoir des infos sur ma table dans gt_fieldcat non ? je cherche maintenant comment faire pour les récupérer
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 09h11   #14 (permalink)
Membre du Club
 
Avatar de Celdrøn
 
Date d'inscription: juillet 2007
Localisation: Bourges(j'y vis plus heureux :P, quelqu'un a des tuyaux pour retourner dans le Poitou? ^_^)
Âge: 23
Messages: 92
Envoyer un message via MSN à Celdrøn
Par défaut

Salut,

Faut que tu mettes tout en 'MAJUSCULE' dans les paramètres de fonctions sauf cas exceptionnels (s'ils existent).

Sinon le nom de ta colonne sera dans la zone FIELDNAME de ta table GT_FIELDCAT.

N'hésite pas à te servir du débugger pour voir ce que tu récupère comme infos depuis ta fonction.

Voili, voilou.
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 25/08/2008, 09h16   #15 (permalink)
Membre actif
 
Avatar de progamer54
 
Date d'inscription: avril 2004
Messages: 193
Par défaut

C'est bon j'ai réussi a récupérer les champs !

ça donnait aucun nom de colonnes avec tint_CCLIST qui est ma table interne. J'ai fais déclarer la table retournée par la bapi au début du programme :

Code :
TABLES: BAPI0012_CCLIST.

...

data : tint_CCLIST like BAPI0012_CCLIST occurs 0 with header line.
data : gt_fieldcat type lvc_t_fcat WITH HEADER LINE.

...

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
 EXPORTING
*   I_BUFFER_ACTIVE              =
   I_STRUCTURE_NAME             = 'BAPI0012_CCLIST'
  CHANGING
    CT_FIELDCAT                  = gt_fieldcat[]
          .


WRITE: / 'fieldname :'.

LOOP AT gt_fieldcat.
    WRITE: / gt_fieldcat-FIELDNAME.
ENDLOOP.
J'espere que c'est la bon moyen de faire. C'est normal que j'arrive pas a savoir le nom des colonnes en donnant tint_CCLIST dans la fonction et que celle la table BAPI0012_CCLIST me donne quelque chose ? ou je peux faire autrement ?
progamer54 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres Logiciels > ERP > SAP



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide