![]() |
| 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é. | |||||||
|
|||||||
| SAP Forum d'entraide sur SAP et sur la programmation avec le langage ABAP |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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 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.
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. |
|
|
|
|
|
#2 (permalink) |
|
Membre du Club
![]() |
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 |
|
|
|
|
|
#3 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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. |
|
|
|
|
|
#4 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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. 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 |
|
|
|
|
|
#5 (permalink) |
|
Membre du Club
![]() |
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. Donc pas d'inquiètude et roulez jeunesse. @++ |
|
|
|
|
|
#6 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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.
Là je ne peux bien sur pas mettre gv_path_fic dans le FILENAME de GUI_DOWNLOAD, ça ne fonctionne pas. |
|
|
|
|
|
#7 (permalink) |
|
Membre du Club
![]() |
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 !!! |
|
|
|
|
|
#8 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
![]() 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 |
|
|
|
|
|
#10 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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... |
|
|
|
|
|
#11 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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.
|
|
|
|
|
|
#12 (permalink) |
|
Membre du Club
![]() |
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.
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à. |
|
|
|
|
|
#13 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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
.
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 |
|
|
|
|
|
#14 (permalink) |
|
Membre du Club
![]() |
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. |
|
|
|
|
|
#15 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2004
Messages: 193
|
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.
|
|
|
|
![]() |
![]() |
||
transférer une table dans un fichier avec séparateurs
|
||
| Outils de la discussion | |
|
|