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, 16h53   #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 champs de saisie et récupération après saisie

Bonjour, je débute sur abap mais j'arrive pas à trouver de la bonne doc dans laquelle je me retrouve
j'aurais besoin de savoir comment faire des champs de saisie où on pourrait choisir une valeur depuis des données sources, et par la suite récupérer la valeur qui a été choisie.

Merci bcp de votre aide d'avance.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 17h26   #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
Rebonjour soufiane,

Alors ta question manque de clarté, mais ce n'est grave.

Il faut déjà savoir que sur SAP il y a deux type d'écrans principalement :
  • Les écrans de sélection, qui sont créés à partir d'instructions ABAP
  • les écrans « simples », appelés Dynpro également, qui sont créés depuis l'éditeur d'écran (Screen Painter)

Et du coup, la ou les méthodes pour parvenir au résultat attendu diffèrent.
Donc il faudrait d'abord nous donner des précisions sur le contexte dans lequel tu te trouves afin qu'on puisse t'aider plus efficacement.

Donc écran simple ou écran de sélection?

Sinon, à ce que j'ai compris, c'est une aide à la recherche que tu souhaiterais mettre en place pour un champ en particulier?
Encore une fois, cela dépend du contexte.

Merci donc pour les précisions que tu pourras nous apporter.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 17h54   #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
En fait ce que je veux c'est des champs de sélection, et une fois tous les champs renseignés, on doit aller récupérer ce qu'il y a dedans pour que je puisse formuler une requête et aller chercher les enregistrements correspondants aux valeurs des champs de sélection.

je dois faire ça avec des instructions abap et non pas avec le painter.

je sais pas si c'est assez clair, sinon posez moi des questions.

merci
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 19h19   #4
Membre régulier
 
Inscription : mars 2006
Messages : 198
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 198
Points : 83
Points : 83
Bonjour Soufiane,

Oui maintenant ton besoin est clair.

Alors dans ce cas, il faut que tu déclares un écran de sélection en utilisant l'instruction abap PARAMETERS.

Exemple :
Code :
PARAMETERS : p_toto TYPE <type>.
Si ton type <type> possède déjà une aide à la recherche, un petit bouton apparaît sur ta zone de saisie et qui te permet d'afficher la liste des valeurs.
Sinon, il faut que tu en crée un, et ensuite tu utilises l'instruction MATCHCODE comme suit :

Code :
PARAMETERS : p_toto TYPE <type> MATCHCODE <nom_aide_recherche>.
Pour récupérer ce qui est saisi dans les zones, tu utilises tout simplement le p_toto, ...

J'espère que ça répond à ta question.


Hiraa
Hiraa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2011, 19h27   #5
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
Alors, je vais compléter un peu la réponse de Hiraa.

Alors en effet, tu peux définir des paramètres , via PARAMETERS, et des options de sélection, via SELECT-OPTIONS.

Tu vas donc en même temps créer des zones d'écrans et des variables, et tout ce qui concerne transfert de données des zones d'écrans vers les variables, et inversement, est géré par SAP, donc pas besoin de faire la moindre ligne de code... pour les traitements de base bien entendu.

Une fois que t'as choisi tes valeurs de sélection, tu lances l'exécution qui te mettra « directement » dans le START-OF-SELECTION où sont déclarées normalement tes requêtes SELECT.

Voila.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 09h46   #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
Salut Hiraa merci pour les explications, en fait je vois pas trop comment faire une aide à la recherche qui va aller me proposer toutes les valeurs possibles pour ma sélection.

Merci.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 11h27   #7
Membre régulier
 
Inscription : mars 2006
Messages : 198
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 198
Points : 83
Points : 83
Bonjour soufiane,

Pour créer une aide à la recherche, il faut utiliser la transaction SE11.

Mais normalement, si ton type de données est déjà attaché à une aide à la recherche (voir la zone dans la table, onglet aide/controle saisie, colonne aide rech.).

Bon courage,
Hiraa
Hiraa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 12h39   #8
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
Attention, une aide à la recherche fonctionne également via les plages de valeurs définies dans les Domaines d'éléments de données, donc vérifier la aussi.

Sinon, t'as plusieurs manières de faire une aide à la recherche :
  • Utiliser celle attaché à un champ de table en utilisant un type de champ de table (Exemple : PARAMETERS : pa_matnr TYPE mara-matnr)
  • Définir sa propre aide à la recherche en la créant en SE11, puis lier cette dernière via le complément d'instruction MATCHCODE.
  • Définir un événement POV (Process On Value-Request), en déclarant un bloc AT SELECTION-SCREEN ON VALUE-REQUEST FOR zone., puis en utilisant une des fonctions habituellement utilisées, F4IF_INT_TABLE_VALUE_REQUEST ou F4IF_FIELD_VALUE_REQUEST.

Voila les différentes possibilités.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h28   #9
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
Merci beaucoup, finalement j'ai réussi à résoudre le problème.
Merci encore une fois.

Par contre j'aurais un autre souci sur lequel je sollicite vivement votre aide qui m'a été précieuse jusque là .

je fais donc:
Code :
 select SALESORG from TSALESORG INTO corresponding fields of table itab where salesorg in itabsalo
et après pour écrire le résultat de la requête dans un fichier je fais:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CALL FUNCTION 'WS_DOWNLOAD_WAN'
EXPORTING
* BIN_FILESIZE = ' '
* CODEPAGE = ' '
FILENAME = 'H:\tsbite2\Desktop\toto.txt'
FILETYPE = 'ASC'
TABLES
DATA_TAB = itab
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_WRITE_ERROR = 2
INVALID_FILESIZE = 3
INVALID_TABLE_WIDTH = 4
INVALID_TYPE = 5
NO_BATCH = 6
UNKNOWN_ERROR = 7
OTHERS = 8
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
seulement ce que je veux moi c'est de créer un fichier par SALESORG.

Merci pour vos éventuels retours.

je reste à votre dispo pour tout complément.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h37   #10
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
Ben tout simplement, tu tries ta table interne en fonction des SALESORG, tu la parcours, tu remplies une table temporaire pour un même SALESORG, tu créés ton fichier avec cette dernière, puis tu passes au prochain SALESORG ainsi de suite.

PS : GUI_DOWNLOAD (Module Fonction) ou CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD (Méthode) pour créer ton fichier. Les modules fonctions WS_ sont devenus obsolètes depuis le passe des systèmes en Unicode (≥6.40 je crois).
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h31   #11
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
Je vois très bien le raisonnement, mais je vois pas du tout comment faire en abap.
ma table est déjà triée sur le SALESORG, par contre comment prendre un bout de table et le mettre dans ma table tempo ça je sais pas faire, et aussi comment détecter le passage d'un SALESORG à un autre pour pouvoir le copier dans la table tempo.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 16h18   #12
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
Pour faire une table temporaire, c'est comme déclarer une table interne, vu que c'est la même chose, sauf qu'on parle de table temporaire pour des table qui ne sont utiles que temporairement et donc à créer en local ou à détruire après leur utilisation via FREE.

Code :
1
2
3
DATA : itab_tmp LIKE itab[] WITH HEADER LINE en langage obsolète.

DATA : itab_tmp LIKE itab. avec une syntaxe correcte
Ensuite une fois que tu es en train de parcourir ta table interne, tu peux utiliser les instruction AT NEW, AT END OF, AT LAST pour détecter un changement de valeur par rapport à l'entrée précédemment traitée.

Code :
1
2
3
4
5
6
7
8
9
10
11
LOOP AT itab INTO s_itab.

  AT NEW salesorg.

  END AT.

  AT END OF salesorg.

  END AT.

ENDLOOP.
Dans cette boucle tu vas alimenter ligne à ligne itab_tmp, une fois que tu détectes un changement de valeur, tu vas appeler la fonction GUi_DOWNLOAD pour créer ton fichier. Une fois l'opération terminée, pense bien à vider ta table temporaire sous peine d'écrire les lignes qu'elle contient dans le prochain fichier que tu créeras.

Essaie de mettre en place cette logique par tes propres moyens, sinon tu risques de ne pas retenir la logique si je te donne une solution possible.
Si tu rencontres des difficultés, poste ton bout de code pour corriger ce que tu auras fait et pour pouvoir t'aiguiller sur la suite des traitements à mettre en place.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 17h15   #13
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
je voulais commencer par faire un test :

Code :
1
2
3
4
5
6
loop at itab.
append itab-SALESORG to itabtemp.
at new salesorg.
write:/ itabtemp.
endat.
endloop.
juste pour que je puisse voir si ça copie bien mes enregistrements dans ma table tempo, mais ça le fait pas du tout je vois pas du tout à quel niveau ça bloque.
en exécution ça m'affiche des 0000000.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 18h12   #14
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
La ligne de code suivante n'est pas correcte :
append itab-SALESORG to itabtemp.

Il faut que tu copies les valeurs d'une entête à l'autre.

itabtemp = itab
append itabtemp.

Pense bien à regarder l'aide F1 pour chaque instruction que tu ne connais pas, car il y a un piège avec l'instruction AT, en effet, dans le bloc AT. END AT., les champs suivant celui testé voient leur valeur être remplacée par un caractère « * ».

Sinon :
write:/ itabtemp.

Cette ligne de code ne va t'afficher que l'entête de table avec les dernières valeurs qui y ont été renseignées et non le contenu de table.

Pour t'aiguiller, la logique à suivre est la suivante :
Code :
1
2
3
4
5
6
7
8
Boucle sur chaque entrée de ITAB
  Je transferts les valeurs de l'entrée actuelle de ITAB dans une table temporaire ITABTEMP.
  Si j’atteins la dernière valeur ITAB-SALESORG (avant changement), 
  Alors je créé le fichier avec les entrées que j'ai récupérées dans ITABTEMP Et 
        j'efface le contenu de ma table temporaire
  Fin Si
Fin Boucle.
Voila l'algorithme de ce que tu dois faire.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 10h30   #15
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
Bonjour, donc j'ai suivi l'algo que tu m'as filé et j'ai fait quelque chose de ce genre:
Code :
1
2
3
4
5
6
7
8
9
10
loop at itab. *je boucle sur la table itab.
append itab to itabtemp. *je copie une ligne à chaque tour de boucle.
at new SALESORG. *si la valeur de SALESORG change
loop at itabtemp. *je boucle sur itabtemp pour l'afficher, c'est un test avant de passer à l'étape écriture dans le fichier
write:/ itabtemp. *j'affiche
endloop.
endat.
stop. *stop pour sortir de la boucle.
endloop.
et cela m'affiche qu'une seule ligne, la toute premiere.

Merci.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 10h35   #16
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
STOP ?
__________________
Pensez à récompenser les réponses utiles et au tag .
beuzy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 10h41   #17
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
oui pour arreter de boucler, une fois la valeur change je veux qu'il sorte de la boucle.
soufiane669 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 11h12   #18
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
Ce n'est pas STOP, mais EXIT qu'il faut utiliser pour sortir d'une boucle.

Sinon, c'est normal que ça ne t'affiche que la première ligne, tu sors au bout d'un tour à cause du STOP.

C'est déjà pas mal ce que t'as fait.

Voila la correction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
LOOP AT itab. *je boucle sur la table itab.

  APPEND itab TO itabtemp. *je copie une ligne à chaque tour de boucle.

  AT NEW salesorg. *si la valeur de SALESORG change

    IF sy-tabix > 1. "Traitement inutile lors de la première boucle

      LOOP AT itabtemp. *je boucle sur itabtemp pour l'afficher, c'est un test avant de passer à l'étape écriture dans le fichier

        WRITE : / itabtemp. *j'affiche

      ENDLOOP. "at itabtemp.

      BREAK. "Pour sortir de la boucle.

    ENDIF. "sy-tabix > 1.

  ENDAT. "NEW salesorg.

ENDLOOP. "AT itab.
Ce bout de code ne va t'afficher, normalement, que les premières entrées ayant un même SALESORG.
__________________
Boaf...signature <= ça suffira ça ??
Celdrøn 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 13h50.


 
 
 
 
Partenaires

Hébergement Web