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 17/05/2011, 13h55   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 57
Points : 12
Points : 12
Par défaut Affichage du contenu d'une table interne

bonjour, j'aimerais afficher le contenu de ma table interne itab, j'ai fait le code ci-joint et je vois pas du tout ce qui pourrait bien ne pas marcher, à l'affichage cela n'affiche rien du tout et même en laissant une trace dans la boucle cela n'affiche rien, ce serait vraiment sympa q'il y a quelqu'un qui pourrait m'aider à avancer.
merci d'avance.
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
*&---------------------------------------------------------------------*
*& Report YABC11 *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT YABC11.
TABLES: /BIC/EZCADETAIL.
 
 
parameters: charge type N.
data: begin of itab_ezcadetail occurs 0,
payeur like /BI0/TCUSTOMER-CUSTOMER ,
orgacom like /BI0/TSALESORG-SALESORG,
ann_civil like /BI0/SCALMONTH-CALMONTH,
materiel like /BI0/SMATERIAL-MATERIAL,
quantite like /BI0/SUNIT-UNIT,
code_venti like /BI0/MCUSTOMER-/BIC/ZCODVENT,
zone_comm like /BI0/MCUSTOMER-/BIC/ZCODVENZC,
hier_prod like /BI0/SPROD_HIER-PROD_HIER,
pays_payeur like /BI0/MCUSTOMER-COUNTRY,
end of itab_ezcadetail.
data: itab like itab_ezcadetail occurs 0 with header line.
 
top-of-page.
" pied de page du rapport
 
start-of-selection.
select CUSTOMER from /BI0/TCUSTOMER INTO itab-payeur.
endselect.
select SALESORG from /BI0/TSALESORG INTO itab-orgacom.
endselect.
select CALMONTH from /BI0/SCALMONTH INTO itab-ann_civil.
endselect.
select MATERIAL from /BI0/SMATERIAL INTO itab-materiel.
endselect.
select UNIT from /BI0/SUNIT INTO itab-quantite.
endselect.
select /BIC/ZCODVENT from /BI0/MCUSTOMER INTO itab-code_venti.
endselect.
select /BIC/ZCODVENZC from /BI0/MCUSTOMER INTO itab-zone_comm.
endselect.
select PROD_HIER from /BI0/SPROD_HIER INTO itab-hier_prod.
endselect.
select COUNTRY from /BI0/MCUSTOMER INTO itab-pays_payeur.
endselect.
 

loop at itab.
if sy-subrc = 0.
write:/ itab-orgacom.
endif.
endloop.
 
end-of-page.
" en-tête du rapport
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h15   #2
Membre expérimenté
 
Avatar de Celdrøn
 
Homme Celdrøn Valdersen
Consultant SAP
Inscription : juillet 2007
Messages : 438
Détails du profil
Informations personnelles :
Nom : Homme Celdrøn Valdersen
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Consultant SAP

Informations forums :
Inscription : juillet 2007
Messages : 438
Points : 579
Points : 579
Envoyer un message via MSN à Celdrøn
Salut,

Essaie d'enlever le test sur SY-SUBRC, je pense qu'il contient le code retour de la dernière requête effectuée et si rien n'est trouvé en base, alors il y a de très grandes chances que la valeur reste indéfiniment différente de 0 jusqu'à la prochaine mise à jour de cette variable.

Il n'y a pas besoin de tester le code retour (SY-SUBRC) dans une boucle car elle n'est pas mise à jour à chaque nouveau tour de boucle.

Essaie pour voir.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h21   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 57
Points : 12
Points : 12
j'avais déjà essayé sans le test mais ça n'a pas marché, et là je l'ai enlevé et donc même résultat ==> ça m'affiche absolument rien, par contre si je fait un write: / itab-orgacom. ça affiche bien la première valeur contenue dans itab.
et moi je veux en fait afficher toutes les valeurs qui sont dans itab.

merci pour ton retour.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h56   #4
Membre expérimenté
 
Avatar de Celdrøn
 
Homme Celdrøn Valdersen
Consultant SAP
Inscription : juillet 2007
Messages : 438
Détails du profil
Informations personnelles :
Nom : Homme Celdrøn Valdersen
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Consultant SAP

Informations forums :
Inscription : juillet 2007
Messages : 438
Points : 579
Points : 579
Envoyer un message via MSN à Celdrøn
Mmmmh ok, laisse tomber, c'est la méthode employée pour alimenter ta table interne qui n'est pas bonne.
Si tu rentres en débogage et que tu regardes le contenu de ta table interne, tu comprendras.

Je pense que tu débutes donc je vais t'expliquer ce qui ne va pas.

Tu utilises l'instruction SELECT. ENDSELECT. pour récupérer tes données, seulement le fonctionnement du SELECT ENDSELECT est similaire à une boucle LOOP, c'est à dire que la base de données va être requêtée autant de fois qu'il y a de correspondances dans la table de BD, et chaque entrée requêtée va être mise provisoirement dans la variable de réception entre le SELECT et le ENDSELECT.
Donc si tu utilises cette méthode, il va falloir faire des APPEND à l'intérieur du bloc SELECT pour alimenter ta table interne. Seulement, je ne recommande pas cette méthode pour des raisons de performances.

Il est préférable que tu fasses des SELECT INTO TABLE pour, en une seule requête, alimenter ta table interne.

Exemple :
Code :
1
2
3
4
SELECT customer
  FROM /bi0/tcustomer 
  INTO TABLE t_tcustomer.
J'ai bien mis T_TCUSTOMER car il faut que la table interne respecte le format de retour de la requête, donc si tu récupères des champs, alors il faut que les premiers champs de ta table interne respectent le même ordre.
Dans mon exemple, on part du principe que la table interne T_TCUSTOMER ne possède qu'un champ CUSTOMER.
Voila pour le début.

Pour la suite, il faut utiliser le complément d'instruction FOR ALL ENTRIES IN dans tes SELECT suivants pour pouvoir ajouter des conditions en fonctions des valeurs récupérées depuis la requête précédente, en veillant à ce que la table interne servant à la comparaison ne contienne pas de doublons.

Exemple qui ne reflète pas forcement la réalité :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
IF NOT t_tcustomer[] IS INITIAL.

* Copie + Tri + Suppression des doublons = Performances
  lt_tcustomer = t_tcustomer.
  SORT lt_tcustomer BY customer.
  DELETE ADJACTENT DUPLICATES FROM lt_tcustomer
    COMPARING customer.

  SELECT salesorg 
    FROM /bi0/tsalesorg
    INTO TABLE t_tsalesorg
    FOR ALL ENTRIES IN lt_tcustomer
    WHERE customer = lt_tcustomer-customer.

ENDIF. "NOT t_tcustomer[] IS INITIAL.
Mais apparemment t'as fait une suite de requêtes sans rapport les unes avec les autres, et donc il n'y a aucune logique dans le croisement de tes données.

Au final, quand t'auras toutes tes données, il faudra que tu les croises pour alimenter ta table interne ITAB, c'est-à-dire que tu parcours ta table de données principale qui est souvent la première remplie, et que tu fasses des lectures sur les autres pour retrouver les bonnes valeurs et ainsi remplir ta table ITAB avec les bonnes valeurs.


Pour finir, une autre méthode consiste à faire des jointures en ABAP, qui permettent de croiser directement tes tables via des liens définis dans l'instruction. Mais il faut rester dans la limite du raisonnable, il ne faut pas croiser 10 tables entre-elles, 3 maximum est recommandé. C'est une méthode que je n'aime pas trop donc je ne vais pas la détailler plus étant donné que je n'ai pas assez de détails en tête à te donner.
Tu peux trouver des exemples dans l'aide.
(ABAP Keyword Documentation - SELECT - Join)

Bon ben, bon courage.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 14h57   #5
Membre actif
 
Avatar de beuzy
 
Femme Marianne
ABAP
Inscription : novembre 2008
Messages : 203
Détails du profil
Informations personnelles :
Nom : Femme Marianne
Âge : 27
Localisation : France

Informations professionnelles :
Activité : ABAP

Informations forums :
Inscription : novembre 2008
Messages : 203
Points : 174
Points : 174
Question bête combien as-tu d'entrées dans ta table?

Car j'ai l'impression que dans ton select - endselect tu ne récupère qu'une seule valeur qui écrase la précédente s'il n'y a pas d'append ITAB
__________________
Pensez à récompenser les réponses utiles et au tag .
beuzy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 15h24   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2009
Messages : 57
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 57
Points : 12
Points : 12
effectivement, ça va à chaque fois écraser ce que contient ma table interne, j'ai une quantité considérables de données.

Merci pour toutes ces explications ça m'a été d'une grande aide.
soufiane669 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 13h43.


 
 
 
 
Partenaires

Hébergement Web