Professional Documents
Culture Documents
programmation ABAP
BC402
0
BC402 ABAP Techniques de programmation ABAP
BC402
Techniques de programmation
ABAP
SAP AG 1999
Système R/3
Version 4.6A
Septembre 1999
Numéro d'article : 5003 4163
Copyright
SAP AG 1999
Marques déposées :
Microsoft ®, Windows ®, NT ®, PowerPoint ®, WinWord ®, Excel ®, Project ®, SQL-Server ®,
Multimedia Viewer ®, Video for Windows ®, Internet Explorer ®, NetShow ®, et HTML Help ®
sont des marques déposées de Microsoft Corporation.
Lotus ScreenCam ® est une marque déposée de Lotus Development Corporation.
Vivo ® et VivoActive ® sont des marques déposées de RealNetworks, Inc.
ARIS Toolset ® est une marque déposée de IDS Prof. Scheer GmbH, Saarbruck
Adobe ® et Acrobat ® sont des marques déposées de Adobe Systems Inc.
TouchSend Index ® est une marque déposée de TouchSend Corporation.
Visio ® est une marque déposée de Visio Corporation.
IBM ®, OS/2 ®, DB2/6000 ® et AIX ® sont des marques déposées de IBM Corporation.
Indeo ® est une marque déposée de Intel Corporation.
Netscape Navigator ®, et Netscape Communicator ® sont des marques déposées de Netscape
Communications, Inc.
OSF/Motif ® est une marque déposée de Open Software Foundation.
ORACLE ® est une marque déposée de ORACLE Corporation, California, USA.
INFORMIX ®-OnLine for SAP est une marque déposée de Informix Software Incorporated.
UNIX ® et X/Open ® sont des marques déposées de SCO Santa Cruz Operation.
ADABAS ® est une marque déposée de Software AG
ABAP/4, InterSAP, RIVA, R/2, R/3, R/3 Retail, SAP (Word), SAPaccess, SAPfile, SAPfind,
SAPmail, SAPoffice, SAPscript, SAPtime, SAPtronic, SAP-EDI, SAP EarlyWatch, SAP
ArchiveLink, SAP Business Workflow, et ALE/WEB sont des marques ou marques déposées de
SAP AG. Le logo SAP et tous les autres produits, services, logos, ou noms de marques sont
également des marques ou marques déposées de SAP AG.
Les autres produits, services, logos, ou noms de marques sont des marques ou marques déposées de
leurs propriétaires respectifs.
ABAP Workbench
Niveau 2 Niveau 3
BC402 3 jours BC414 2 jours
Techniques de BC490 3 jours
Programmation des
programmation ABAP mises à jour de la base Analyses des
de données performances
BC404 3 jours
ABAP
ABAP Objects - BC415 2 jours
Programmation orientée ABAP Workbench -
objets dans R/3 Interfaces de
BC405 3 jours communication
BC425 3 jours
Reporting dans ABAP
Workbench Extensions et
modifications
BC410 5 jours
BC412 2 jours
Programmation interactive Programmation de
BC400 5 jours BC420 5 jours dialogues à l'aide des
Introduction à ABAP Workbench - contrôles EnjoySAP
ABAP Workbench Interface de données BC440 5 jours
BC430 2 jours Développement des
Dictionnaire de données applications sur Internet
MBC40 2 jours
ABAP
Gestion des projets de BC460 3 jours Cours supplémentaires
développement ABAP Edition et impression de recommandés : Business
Process Technologies
formulaires dans CA925, CA926, CA927
SAPscripts BC095 (Technologie
CA610 2 jours d'intégration) BC619 (ALE),
CATT - Test Workbench et BC620, BC621
Computer Aided Test Tool
SAP AG 1999
Connaissances requises
SAP AG 1999
À qui s'adresse ce cours ?
Participants :
Programmeurs
Consultants
Durée : 3 jours
SAP AG 1999
Contenu
SAP AG 1999
SAP AG 1999
Préface
Annexes
SAP AG 1999
Préface
Instructions
Sous-programmes
SAP AG 1999
Contenu
Composantes d'un programme ABAP
Processeurs au sein d'un processus de travail
Programmes ABAP : types et méthodes d'exécution
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
SAP AG 1999
ABAP est un langage de programmation orienté événement et adapté au traitement des dialogues
utilisateur. Le code source d'un programme ABAP est composé de deux parties :
Déclarations
Les déclarations comprennent les instructions pour les objets et les types de données globaux, les écrans
de sélection, ainsi que les classes (dans ABAP Objects) et les interfaces locales au sein du
programme.
Blocs de traitement (unités de programme indivisibles)
Chaque bloc de traitement doit être programmé comme une entité individuelle. Il existe deux types
de blocs de traitement :
Les blocs événement
Ils sont introduits par un mot-clé événement. Ils ne sont pas conclus de manière explicite, mais se
terminent lorsque le bloc de traitement suivant commence.
Les procédures et modules de dialogue
Les procédures et modules de dialogue sont introduits et conclus à l'aide de mots-clés.
Le contenu de l'ensemble des blocs de traitement constitue la logique de traitement.
Lors de la génération du programme, ces parties sont compilées pour former la version d'exécution.
Elle est interprétée au moment de l'exécution.
Create Program Workbench Traiter Saut Autres fonctions Environnement Système Aide
Événements
SAP AG 1999
Dans le cas le plus simple, votre programme est composé d'une seule unité de code source contenant
tous les blocs de traitement appropriés. Pour faciliter la compréhension de vos programmes et
augmenter le niveau d'utilisation de vos programmes, recourez aux programmes INCLUDE.
Lorsque vous créez un programme à partir de Object Navigator, le système vous invite à créer un
TOP include pour le programme. Cette option est particulièrement utile lors de la création de pools
de modules.
Lorsque vous créez un bloc de traitement, le système vous demande toujours dans quel programme
INCLUDE le code ABAP approprié doit être inséré.
Si le programme INCLUDE n'existe pas, le système en crée un, puis insère une instruction
INCLUDE dans le programme principal.
Si vous nommez votre programme d'après la convention d'appellation SAPMZ<suite> ou
SAPMY<suite> et que vous créez un nouveau bloc de traitement, le système propose le nom du
nouveau programme INCLUDE à l'aide de la convention d'appellation suivante :
MZ<suite><numéro> ou MY<suite><numéro>.
Si vous créez des blocs de traitement supplémentaires, le système propose automatiquement le
programme INCLUDE approprié.
Ainsi, le système vous aide à créer des programmes dont les structures sont faciles à comprendre. La
convention d'appellation normalisée vous permet d'opérer une distinction entre vos programmes et
les autres.
Couche
du serveur de
présentation SAPgui SAPgui SAPgui SAPgui SAPgui SAPgui
Dispatcher Dispatcher
Couche
du serveur
d'application Processus Processus Processus Processus
de travail de travail de travail de travail
SAP AG 1999
Le système R/3 est basé sur une architecture client/serveur à trois niveaux comportant un serveur de
base de données, un serveur d'application et un serveur de présentation. Il permet à un grand nombre
d'utilisateurs équipés d'ordinateurs peu coûteux et relativement lents de bénéficier d'un petit nombre de
serveurs d'application rapides et coûteux via l'utilisation des processus de travail. Chaque processus
de travail d'un serveur d'application est affecté à un processus de travail du serveur de base de données
(coûteux et très performant).
La répartition des utilisateurs est le processus permettant aux clients individuels d'être affectés à un
processus de travail pour une durée spécifique au niveau du serveur de présentation. Le processus de
travail est ensuite lié à un processus de travail de la base de données. Une fois l'entrée utilisateur d'une
étape de dialogue traitée, le contexte programme et utilisateur est "déployé" du processus de travail
pour qu'un autre utilisateur puisse utiliser le processus de travail pour une autre étape de dialogue alors
que le premier utilisateur renseigne le dynpro suivant. Ainsi, les ressources disponibles sur le serveur
d'application sont optimisées.
L'architecture à trois niveaux rend le système évolutif. Pour ajouter d'autres utilisateurs, il suffit
d'installer davantage de serveurs de présentation bon marché. Vous pouvez également augmenter
l'efficacité de la totalité du système en ajoutant des serveurs d'application, ainsi que leurs processus de
travail correspondants.
Processeur de
dynpro
Processeur ABAP
Interface de base
de données
SAP AG 1999
Programme ABAP
Bloc de
Déclarations
traitement
passif passif Runtime
system
ABAP
SAP AG 1999
Les blocs de traitement individuels sont appelés dans une séquence prédéterminée au moment de
l'exécution, indépendamment de leur ordre d'apparition dans le programme. Une fois le bloc de
traitement appelé, ses instructions sont traitées de manière séquentielle.
Bloc événement
Si le programme système ou un utilisateur déclenche un événement pour lequel un bloc événement
correspondant a été écrit dans la logique de traitement, ce bloc événement est traité. Le déroulement
du programme est contrôlé par le système ou l'utilisateur.
Unité de modularisation
Lorsque le système rencontre un appel d'unité de modularisation dans un bloc de traitement, il
appelle le bloc de traitement correspondant. Dans ce cas, c'est le programmeur qui contrôle le
déroulement du programme.
Affectation de codes de transaction
Pour rendre possible l'exécution d'un pool de modules, vous devez lui affecter un code de
transaction. Vous pouvez (sans obligation) affecter un code de transaction à un programme (type 1)
exécutable.
LOP LOAD-OF-PROGRAM.
...
SAP AG 1999
Affectez une transaction dialogue à un pool de modules. Lors de l'exécution d'une transaction
dialogue, les étapes suivantes sont exécutées :
En premier lieu, l'événement LOAD-OF-PROGRAM est déclenché. Une fois ce bloc événement
exécuté, le processeur ABAP passe le contrôle au processeur de dynpros. Pour obtenir un exemple
sur le mode d'utilisation de ce nouvel événement, référez-vous à l'exemple contenu dans le chapitre
Groupes de fonctions et modules fonction.
Le processeur de dynpros traite le dynpro initial spécifié dans la définition de la transaction. Ce
dynpro peut être un écran de sélection (indépendamment du type de programme). L'événement
PROCESS BEFORE OUTPUT est déclenché et le contrôle passe au processeur ABAP, lequel
exécute le premier module PBO.
Le processeur ABAP exécute le bloc de traitement, puis renvoie le contrôle au processeur de
dynpros. Une fois tous les modules PBO traités, le contenu de toutes les zones portant le même nom
dans le programme ABAP et sur le dynpro est copié du programme vers le dynpro. Le dynpro est
alors affiché (contenu, titre actif, statut actif).
Quand l'utilisateur a sélectionné une fonction de dialogue (telle que la touche ENTRÉE), le contenu
des zones de dynpro est à nouveau transporté vers les zones correspondantes portant le même nom
dans le programme ABAP, puis les blocs de traitement appartenant à l'événement PROCESS
AFTER INPUT sont traités. Le système passe ensuite au dynpro suivant.
La seule logique de traitement effectuée dans une transaction dialogue est constituée des instructions
appartenant à l'événement LOAD-OF-PROGRAM et celles situées dans les différents modules.
Cependant, vous pouvez également utiliser l'instruction LEAVE TO LIST-PROCESSING. Ainsi,
vous pouvez disposer de tous les événements de traitement de liste.
LOP LOAD-OF-PROGRAM.
INIT INITIALIZATION.
AT SELECTION-SCREEN
ASSO
OUTPUT.
ATSS AT SELECTION-SCREEN.
SOS START-OF-SELECTION.
EOS END-OF-SELECTION.
SAP AG 1999
Vous pouvez affecter une transaction de programme uniquement à un programme exécutable (type
1). Dans une transaction de programme, le système appelle des événements spécifiques dans une
séquence fixe, ainsi qu'une série de dynpros standard. Lors de l'exécution d'une transaction dialogue,
les étapes suivantes sont exécutées :
En premier lieu, l'événement LOAD-OF-PROGRAM est déclenché.
L'événement INITIALIZATION est déclenché à son tour.
L'écran de sélection standard est ensuite appelé (si vous en avez déclaré un) et ses événements
correspondants sont déclenchés : AT SELECTION-SCREEN OUTPUT et AT SELECTION-
SCREEN.
L'événement START-OF-SELECTION est ensuite déclenché. (Il s'agit du bloc événement par
défaut. Si vous omettez ce mot-clé événementiel, toutes les instructions non affectées à un autre bloc
de traitement sont traitées comme si elles lui appartenaient.)
Si vous avez relié une base de données logique à votre programme, le système déclenche les
événements GET <nœud> et GET <nœud> LATE.
L'événement END-OF-SELECTION est ensuite déclenché.
Vous pouvez également inclure le traitement d'un dynpro (comme dans les pools de modules) via
l'instruction CALL SCREEN.
Vous pouvez non seulement lancer des programmes (type 1) exécutables sans utiliser de code de
transaction, mais également les exécuter également en arrière-plan.
TOP TOP-OF-PAGE.
WRITE ...
TextTextText SKIP ...
ULINE.
EOP END-OF-PAGE.
ALS AT LINE-SELECTION.
WRITE ...
SKIP ...
TextTextText ULINE.
AUC AT USER-COMMAND.
Buffer de liste
pour liste détaillée
SAP AG 1999
Si vous renseignez le buffer de la liste de base (à l'aide des instructions WRITE, SKIP et ULINE),
deux événements supplémentaires sont déclenchés : il s'agit des événements TOP-OF-PAGE au
début de chaque page et END-OF-PAGE à la fin.
Une fois le bloc événement END-OF-SELECTION traité, le traitement de liste interactive
commence. Le système affiche la liste de base formatée. L'utilisateur peut désormais déclencher
des événements supplémentaires.
Si l'utilisateur double-clique sur une ligne ou déclenche le code de fonction PICK d'une autre façon,
l'événement AT LINE-SELECTION est déclenché. Dans le statut de liste standard, ce code de
fonction est toujours affecté à la touche de fonction <F2>. À son tour, <F2> revient toujours à
effectuer un double-clic.
Si vous renseignez le buffer de liste de la liste de base (à l'aide des instructions WRITE, SKIP et
ULINE), deux événements supplémentaires sont déclenchés : il s'agit des événements TOP-OF-
PAGE au début de chaque page et END-OF-PAGE à la fin. (Ces événements n'apparaissent pas dans
le graphique). Le traitement de liste interactive est à nouveau lancé. Le système affiche la liste
détaillée formatée (dynpro 120).
Tous les autres codes de fonction n'ayant pas été "capturés" par le système déclenchent l'événement
AT USER-COMMAND.
Programme INCLUDE,
type I
TYPES: ...
DATA: ....
Groupe de fonctions, Interface globale, type J
...
type F Classe globale, type K WRITE ...
SAP AG 1999
Les types de programmes suivants ne peuvent pas être exécutés directement. Ils servent de
conteneurs pour les unités de modularisation appelées à partir d'autres programmes. Lorsque vous
appelez l'une de ces unités de modularisation, le système charge toujours l'intégralité de son
programme conteneur.
Des informations sont disponibles plus loin dans ce cours.
Groupe de fonctions (type F)
Un groupe de fonctions peut contenir des modules fonction, des déclarations de données locales pour
le programme et des dynpros.
Pour plus d'informations, référez-vous au chapitre Groupes de fonctions et modules fonction.
Programme INCLUDE (type I)
Un programme INCLUDE peut contenir n'importe quelle instruction ABAP.
Pour plus d'informations, référez-vous à la section Organisation du programme de ce chapitre.
Interface globale (type J)
Un groupe d'interfaces peut contenir des interfaces globales et des déclarations de données locales.
Pour plus d'informations, référez-vous au chapitre Introduction à ABAP Objects.
Classe globale (type K)
Un groupe de classes peut contenir des classes globales et des déclarations de données locales.
Pour plus d'informations, référez-vous au chapitre Introduction à ABAP Objects.
Groupe de sous-programmes (type S) (sous-programmes externes)
Un groupe de sous-programmes peut contenir des sous-programmes et des déclarations de données
locales.
Attention ! Les programmes de type S sont obsolètes et ont été remplacés par des groupes de
fonctions.
SAP AG 1999
2. Vous devez créer une classe de développement servant de conteneur pour vos objets du
Repository. La classe de développement doit être affectée à un ordre de modification.
Vous devez également créer deux programmes.
## correspond à votre numéro de groupe à deux chiffres.
Solutions de modèle :
BC402
SAPBC402_TYPS_COUNTERLIST1
SAPBC402_TYPS_FLIGHTLIST1
*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_COUNTERLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 relatif aux types et objets de
données . *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_typs_counterlist1.
*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_FLIGHTLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution à l'exercice 2 relatif aux types et objets de
données *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_typs_flightlist1.
Contenu
Types de données
Définition des types de données
Types d'objets de données et leur mode de déclaration
Field symbols et références
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
Programme
ABAP
e n
fac tio
Code er nc
Int le fo
u
source M
od
ABAP Interface
Sous-
programme
Tables de
base de données
SAP AG 1999
Pour utiliser les données au moment de l'exécution, vous devez les mémoriser dans le programme et les
adresser à partir de votre programme. Le système doit connaître le type de données (par exemple,
chaîne de caractères, nombre entier, table composée des zones nom, montant en devise, date, etc.). Un
objet de données est une zone de mémoire nommée, structurée en fonction d'un type de données
spécifique. Le type spécifie généralement tous les attributs de l'objet de données. À l'aide du nom, vous
pouvez accéder directement au contenu, c'est-à-dire aux données. Il peut s'agir d'un nom structuré
comprenant plusieurs noms individuels.
Le type de données peut être considéré comme un plan de construction pour un bâtiment. Les plans
peuvent être utilisés pour plusieurs bâtiments du même type tout en étant capable de les distinguer.
Prenons l'exemple de bâtiments utilisés pour le stockage. Vous pouvez retrouver un élément particulier
si vous connaissez l'adresse du bâtiment, l'étage, la pièce, l'étagère ou l'emplacement où celui-ci a été
stocké. Lors de l'élaboration de vos plans, prenez soigneusement en considération les types d'éléments
à stocker dans vos bâtiments.
Le langage ABAP est très flexible. Certains attributs de type n'ont pas besoin d'être connus avant de
déclarer la variable, et dans certains cas, pas avant l'exécution. Il vous permet aussi d'utiliser les objets
de données déjà déclarés ou les objets du Dictionnaire ABAP servant de base aux nouveaux types ou
objets de données.
Dictionnaire ABAP
(type global)
Type de données
Prédéfini
Type élémentaire
Type group
TYPE-POOL my_tp. Défini par l'utilisateur
SAP AG 1999
ABAP Workbench comporte de nombreux endroits où vous pouvez définir et mémoriser les types de
données :
Dictionnaire ABAP
Il contient 23 types de données prédéfinis servant de base pour tous les autres objets du Dictionnaire
ABAP (tels que les domaines, les éléments de données, les types de données, etc.). Ces types de
données peuvent être utilisés globalement dans l'intégralité du système.
Comme les objets du Dictionnaire utilisés pour accéder aux tables (tables, vues, aides à la recherche,
etc.), vous pouvez également (à partir de la version 4.5) créer des types de données globales dans le
Dictionnaire ABAP.
Auparavant, la seule méthode de définition des types de données globales consistait à utiliser un type
group. Les type groups sont toujours pris en charge, mais le concept est en fait obsolète puisqu'il est
aujourd'hui possible de définir les types de données globales dans le Dictionnaire ABAP.
Programmes ABAP
Les types de données définis dans un programme ABAP sont locaux, c'est-à-dire qu'ils sont corrects
uniquement dans ce programme. Utilisez les dix types de données ABAP prédéfinis comme base
pour vos propres types de données.
Les types de données globales et locales sont représentés dans le schéma ci-dessus. Les noms utilisés
ci-dessus doivent vous permettre de comprendre les diapositives suivantes, ainsi que la
documentation en ligne.
Extension de
table dynamique
Type structuré
SAP AG 1999
Les attributs techniques d'une zone élémentaire sont définis par un type élémentaire.
Un type de structure est constitué par des composantes.
Une type de table est constitué par un type de ligne, un type d'accès, une définition de clé et un
type de clé.
Dans des cas exceptionnels, les types décrivent seulement une partie des attributs d'un objet de
données. Par exemple, un type de table ne spécifie pas le nombre de lignes de la table. Cet attribut
n'est défini qu'au moment de l'exécution et affecte uniquement cet objet de données.
Les types de données peuvent contenir des types eux-mêmes structurés à tous les niveaux. De cette
manière, le type structuré peut être doté de composantes elles-mêmes structurées ou de types de
tables. Vous pouvez ainsi construire des types de données très complexes. Cependant, la plus petite
unité indivisible correspond toujours à un type élémentaire.
SAP AG 1999
Le Dictionnaire ABAP contient une série de types de données prédéfinies pour représenter les types de
données externes des différents systèmes de base de données.
Lorsque vous définissez une zone de type CURR dans le Dictionnaire ABAP, vous devez toujours la
relier à une devise. Pour ce faire, spécifiez une zone de type CUKY. (Lorsque vous créez une liste,
utilisez l'option CURRENCY dans l'instruction WRITE). Il en est de même pour le type QUAN qui
doit être relié à une zone de type UNIT.
Le type FLTP sert aux calculs impliquant des nombres très importants ou très faibles. Ce type est
généralement utilisé dans les applications scientifiques ou lors d'estimations.
Pour des calculs de gestion, utilisez toujours le type DEC ou QUAN. L'arithmétique est identique à
celle utilisée "sur papier" (le système effectue un calcul précis jusqu'à la dernière décimale).
Le type NUMC est très généralement utilisé pour les zones de codes postaux, il s'agit de zones dans
lesquelles seuls les chiffres doivent être autorisés, mais avec lesquelles vous ne souhaitez pas
effectuer de calcul. (Cependant, il est possible d'utiliser des conversions et d'effectuer des calculs
avec des données alphanumériques). Pour plus d'informations sur l'arithmétique et les conversions,
référez-vous au chapitre Instructions.
Selon leur type, certains objets de données sont affichés en fonction des options d'édition (par
exemple, formats de date nationaux). Chaque utilisateur définit ces formats dans ses constantes
utilisateur.
Tous ces types de données, excepté les STRING et RAWSTRING, sont des types élémentaires. Pour
des raisons techniques, ils sont classés comme types structurés. Ceci a des conséquences sur
certaines utilisations, telles que la clause INTO d'une instruction SELECT.
Générateur
Objets du Dictionnaire de Object Navigator de classes
Table de BD
Vue
Type de table
Structure
Élément de données MY_DATA_ELEMENT
Domaine
Aide à la recherche
Objet de blocage
Type group
Domaine Type
Objet de dév. Traiter Saut Autres fonctions Environnement Système Aide prédéfini
Élément de
Objets du Dictionnaire de Object Navigator données
Table de BD
Vue Structure
Type de table Peut être
Structure MY_STRUCTURE imbriqué
Élément de données
Domaine Type de table
Aide à la recherche
Objet de blocage
Type group
SAP AG 1999
Élément de données
Les éléments de données ont une signification commerciale (descripteur de zone, texte d'aide, etc.).
Jusqu'à la version 4.0 incluse, il était possible de spécifier les attributs techniques d'un élément de
données uniquement en définissant un domaine. À chaque domaine était affecté un type prédéfini du
Dictionnaire. Cette opération est toujours possible, cependant, il est désormais possible de saisir
directement un type prédéfini du Dictionnaire. Pour vous assurer que les attributs techniques d'un
groupe d'éléments de données puissent être modifiés de manière centrale, continuez à utiliser les
domaines.
En ce qui concerne ABAP Objects, vous pouvez à présent désigner un élément de données et un
type de référence, puis déclarer des types globaux pour les références aux classes ou interfaces
globales. Notez que, dans ce cas, le type de l'élément de données n'est plus élémentaire, mais
imbriqué. Il en est de même lorsque vous utilisez les types prédéfinis string et rawstring.
Structure
Chaque composante d'une structure doit comporter un nom en vue d'être traitée directement. Pour le
type d'une composante, vous pouvez spécifier un type prédéfini du Dictionnaire, un élément de
données, un type structuré ou un type de table. Vous pouvez ainsi construire des types de données
imbriquées. Prenez en compte les conséquences déjà mentionnées relatives aux différents types
d'accès. Par exemple, si une structure contient une composante avec référence à un type du
Dictionnaire ou string, vous ne pouvez pas utiliser INTO CORRESPONDING FIELDS OF dans
une instruction SELECT. Répertoriez plutôt les composantes dans la clause INTO.
Accès clé
SAP AG 1999
Les types de données d'une table interne sont entièrement spécifiés par :
Son type de ligne
Le type de ligne définit les attributs des zones individuelles. Vous pouvez spécifier tout type de
données ABAP.
Sa définition de clé
Les zones clé et leur séquence déterminent les critères d'identification des lignes de table par le
système.
Son type de clé
Vous pouvez définir la clé comme unique ou non unique. Le caractère unique de la clé doit être
compatible avec le type d'accès choisi pour la table. Si la clé est unique, aucune entrée double ne
peut exister dans la table.
Son type d'accès
Contrairement aux tables de base de données, le système affecte des numéros de ligne à certains
types de tables internes. Par conséquent, vous pouvez utiliser l'index, ainsi que la clé, pour accéder
aux lignes. Le terme "type de table" est parfois utilisé ici pour s'y référer.
ANY TABLE
Accès clé
Analyse de Recherche Fonction
la table binaire de hachage
Accès n
utilisant
Principalement un index Principalement la clé La clé uniquement
SAP AG 1999
Il est également possible de diviser les types de tables internes par type d'accès :
Tables standard. Dans une table standard, il est possible d'accéder aux données à l'aide de l'index ou
de la clé de table. La clé d'une table standard devant toujours être non unique pour des raisons de
compatibilité, le système parcourt la table entière à chaque fois que vous y accédez par la clé. Par
conséquent, vous devez, si possible, toujours utiliser l'index pour accéder à une table standard.
Tables triées. Dans une table triée, le système mémorise automatiquement les entrées, puis insère
de nouvelles entrées triées sur la clé de table. Le système utilise une recherche binaire lorsque vous
accédez à la table à l'aide de la clé. Vous pouvez spécifier la clé d'une table triée comme unique. La
clé est généralement utilisée pour accéder à une table triée, mais il est également possible d'utiliser
l'index. Les tables standard et triées sont connues sous le terme générique de tables à index.
Tables d'adresses calculées. Vous pouvez accéder à une table d'adresses calculées uniquement via
la clé. Dans certains cas, pour réduire considérablement les temps d'accès aux tables importantes,
utilisez une table d'adresses calculées. La clé d'une table d'adresses calculées doit toujours être
unique.
Il n'est pas nécessaire de spécifier entièrement le type d'accès. Vous pouvez également l'omettre ou le
spécifier partiellement (table à index). Le type de table est par conséquent générique et, en omettant
certains attributs, il est possible de l'utiliser pour spécifier les types de paramètres d'interface.
Pour identifier le type d'accès d'une table interne au moment de l'exécution, utilisez l'instruction
DESCRIBE TABLE <tabi> KIND <zonecar>.
Domaine
Type
Élément de prédéfini
Objet de dév. Traiter Saut Autres fonctions Environ. Système Aide
données
SAP AG 1999
Le type de ligne spécifie les attributs sémantiques et techniques des zones individuelles dans une ligne.
Comme mentionné précédemment, vous pouvez spécifier un autre type de table, un type structuré ou
un type élémentaire. Si vous utilisez uniquement un type élémentaire, la table interne comporte une
seule colonne sans nom de composante (table non structurée).
Définition de clé
La clé par défaut comprend toutes les zones sauf celles de P, I ou F, et sauf celles qui sont elles-
mêmesstructurées en type de table. Dans ce cas, elles seraient vides à la définition.
Si la table n'est pas de type structuré, il est particulièrement utile de définir comme clé la ligne tout
entière.
Vous pouvez aussi définir explicitement les composantes de la clé et leur ordre.
Enfin, vous pouvez également choisir de ne pas spécifier de clé, la laissant ainsi générique.
Type de clé
De même que vous définissez la clé comme unique ou non-unique, vous pouvez obtenir un type de clé
générique en omettant cette spécification.
Pour plus d'informations sur le choix des attributs du type de table corrects, référez-vous au chapitre
Opérations sur les tables internes.
Type de
données Signification Valeur initiale Valeurs possibles
I Nombre entier 0 [-2147483648 ; 2147483647]
Nombre en virgule
Numérique
F
flottante 0.0...E+000 [2.2...E-308 ; 1.7...E+308]
Longueur Longueur
par défaut maximale
(carac.) (carac.)
P Nombre condensé 0 15 31
Alphanumérique
SAP AG 1999
Le type F sert aux calculs impliquant des nombres très importants ou très faibles. Ce type est
généralement utilisé dans les applications scientifiques ou lors des estimations.
Pour des calculs de gestion, utilisez toujours le type P. L'arithmétique est identique à celle utilisée
"sur papier" (le système effectue un calcul précis jusqu'à la dernière décimale).
Le type N est très généralement utilisé pour les zones de codes postaux ; il s'agit de zones dans
lesquelles seuls les chiffres doivent être autorisés, mais via lesquels vous ne souhaitez pas effectuer
de calcul). (Cependant, il est possible d'utiliser des conversions et d'effectuer des calculs avec des
données alphanumériques). Pour plus d'informations sur l'arithmétique et les conversions, référez-
vous au chapitre Instructions.
Contrairement aux zones de type C, N ou X, la longueur d'une chaîne ou d'une chaîne hexadécimale
n'est pas définie de manière statique. Au contraire, elle est variable et, au moment de l'exécution,
adopte la longueur de son contenu actuel. La mémoire est gérée par le système de manière
dynamique. La longueur des chaînes et des chaînes hexadécimales importe peu.
Les chaînes STRING ou XSTRING ne peuvent pas être utilisées pour spécifier le type d'une zone de
dynpro.
TYPES:
TYPES Conversion
t_char,
t_name(8) TYPE
TYPE c.
DATA:
d_value(5) TYPE p DECIMALS 2. Domaine Type
prédéfini
TYPES:
TYPES Élément
t_namenew TYPE
TYPE t_name, de données
t_valnew LIKE
LIKE d_value, Table de
t_mydate TYPE
TYPE dats, base de
Structure
t_myfield TYPE
TYPE zmy_data_element, données
t_mycarr TYPE
TYPE spfli-carrid.
Type de table
Type de zone
SAP AG 1999
Vous pouvez définir un nouveau type de données uniquement en fonction d'un type existant. Utilisez
l'option TYPE pour vous référer aux types de données : aux types ABAP prédéfinis, aux types
locaux définis par l'utilisateur, aux types du Dictionnaire ABAP, aux types prédéfinis par l'utilisateur
du Dictionnaire ABAP, aux zones ou aux lignes entières des tables de base de données. Si vous
vous référez à un type du Dictionnaire ABAP, les modifications apportées au type global sont
automatiquement transférées vers votre type. De cette façon, votre type est toujours compatible avec
l'objet du Dictionnaire ABAP correspondant. Les types se référant au Dictionnaire ABAP sont
également dotés d'options d'édition, d'une aide de zone et d'une éventuelle aide à la saisie.
Lorsque le programme est généré, le type de données du Dictionnaire ABAP est converti en type de
données ABAP correspondant. Pour plus d'informations, référez-vous à la documentation de syntaxe
ABAP pour l'instruction TABLES.
Si des types de données globales et locales possèdent le même nom, le système utilise le type local.
Utilisez l'option LIKE pour vous référer au type d'un objet de données déjà déclaré. Il en est de
même pour les diapositives suivantes.
Types élémentaires
L'indication de longueur située après le nom du type pour les types de données C, N et X ABAP
spécifie le nombre de caractères du type. Pour les zones du type P, vous pouvez également définir le
nombre de décimales. Si vous omettez ces spécifications, les valeurs par défaut sont utilisées
(référez-vous à l'écran partagé dans Types prédéfinis du Dictionnaire ABAP).
TYPES:
BEGIN OF <typestruct>,
* ...composantes...
END OF <typestruct>. Conversion
TYPES:
TYPES
BEGIN OF t_linetype,
name TYPE t_name, Domaine Type
val LIKE d_value, prédéfini
mydate TYPE dats, Élément
de données
myfield TYPE zmy_data_element,
mytab TYPE zmy_tabletype,
Table de
END OF t_linetype. Structure base de
données
TYPES:
TYPES Type
t_linenew TYPE t_linetype, de table
t_mystruc TYPE zmy_structure,
t_mysflight TYPE sflight.
Type de ligne
SAP AG 1999
Types structurés
Utilisez les instructions
et
pour inclure la liste des composantes dans votre structure. Toute définition de type peut apparaître
entre les instructions. Vous pouvez également construire des types de données imbriquées.
Pour consulter le type de ligne d'un type de table ou d'une table interne, utilisez respectivement les
options TYPE LINE OF <typetabi> ou LIKE LINE OF <tabi>.
TYPES <typetabi>
TYPE|LIKE [STANDARD]|SORTED|HASHED|INDEX|ANY}
TABLE OF <typestruc>|<structureobjetdonnées>}
[WITH [NON-UNIQUE]|UNIQUE}
KEY <f1> ... <fn>|TABLE LINE |DEFAULT KEY}]
[INITIAL SIZE <n>].
Conversion
TYPES
TYPES t_simptab
TYPE STANDARD TABLE OF t_linetype
KEY
WITH DEFAULT KEY.
Type
Domaine
prédéfini
TYPES t_sophtab
TYPE SORTED TABLE OF t_linenew Élément
de données
WITH UNIQUE
WITH UNIQUE KEY
KEY myfield name. "order! Table
Structure de base
TYPES t_mytabnew TYPE t_sophtab. Type de données
de table
TYPES t_othertab TYPE zmy_tabletype.
SAP AG 1999
Types de tables
À l'instar de la création des types de tables dans le Dictionnaire ABAP, vous devez spécifier les
divers attributs suivants :
Le type de ligne après ... TABLE OF (si vous vous référez à un type de données, utilisez TYPE
et si vous vous référez à un objet de données déjà déclaré, utilisez LIKE).
Le type d'accès avant TABLE OF ... (si vous omettez de renseigner cette zone, le système utilise
le type d'accès par défaut standard. Vous pouvez également spécifier un type de table générique à
l'aide de INDEX ou ANY.).
La définition de clé située après le type de clé (pour spécifier la clé par défaut, utilisez l'option
DEFAULT KEY). Vous pouvez également spécifier les zones à partir du type de ligne (plat) et la
séquence de manière explicite. Si la table n'est pas structurée, vous pouvez utiliser l'option TABLE
LINE).
La type de clé après ...WITH (UNIQUE ou NON-UNIQUE).
(si vous omettez de spécifier la clé de spécification, le système utilise la clé par défaut non unique.
Pour plus d'informations sur l'option facultative INITIAL SIZE <n>, référez-vous à la page
Déclaration des tables internes.
Les types de références qui n'ont pas encore été présentés seront abordés avec les field symbols et les
références.
DATA:
BEGIN OF <structureobjetdonnées>,
* ... composantes ...
END OF <structureobjetdonnées>.
...
DATA d_char, d_name(8) TYPE c VALUE 'SAP AG'.
DATA:
DATA
DATA:
d_valnew LIKE
LIKE d_value,
d_line1 TYPE
TYPE t_linetype,
BEGIN OF d_line2,
Valeur initiale
flag TYPE
TYPE t_char,
name TYPE
TYPE t_name,
mycarr TYPE
TYPE spfli-carrid,
END OF d_line2.
SAP AG 1999
À l'instar de la définition des types de données, vous devez spécifier un type lorsque vous déclarez des
objets de données. Cette opération peut s'effectuer de deux manières :
Vous pouvez vous référer à un type de données (à l'aide de l'option TYPE) ou à un type de données
du programme déjà déclaré (à l'aide de l'option LIKE). Vous pouvez utiliser exactement les mêmes
variantes de syntaxe dans l'instruction DATA que lorsque vous déclarez des types de données locaux
à l'aide de l'instruction TYPES.
Vous pouvez également créer une zone, une structure ou une table interne directement dans une
instruction DATA sans avoir à définir au préalable votre propre type de données.
Dans la plupart des cas, vous procéderez à la modification des valeurs des objets de données au moment
de l'exécution. Par conséquent, elles sont également connues sous le nom de variables. Vous
pouvez affecter une valeur initiale à un objet de données à l'aide de l'option VALUE. Dans le cas
contraire, le système lui affecte une valeur initiale appropriée à son type (référez-vous à la table
contenue dans Types ABAP prédéfinis).
Deux instructions supplémentaires peuvent être utilisées pour déclarer des objets de données
spécifiques :
STATICS déclare les variables locales d'un sous-programme dont les valeurs sont conservées dans
des appels de sous-programmes ultérieurs au lieu d'être initialisées à nouveau. Pour plus
d'informations, reportez-vous au chapitre Sous-programmes.
L'instruction des ABAP Objects CLASS-DATA vous permet de déclarer les attributs de classe
statiques.
DATA <objetdonnéestabi>
{TYPE|LIKE} {[STANDARD]|SORTED|HASHED|INDEX|ANY}
TABLE OF {<typestruc>|<structureobjetdonnées>}
[WITH {[NON-UNIQUE]|UNIQUE}
{KEY {<f1> ... <fn>|TABLE LINE} |DEFAULT KEY}]
[INITIAL SIZE <n>]
[WITH HEADER LINE].
DATA
DATA d_simptab TYPE TABLE OF t_linetype.
DATA
DATA d_sophtab
TYPE SORTED TABLE OF t_linenew
WITH UNIQUE KEY myfield name. "order!
DATA
DATA d_mytabnew LIKE d_sophtab. Extension
de table
DATA
DATA d_othertab TYPE zmy_tabletype. dynamique
SAP AG 1999
À l'exception de l'option WITH HEADER LINE, la syntaxe permettant de déclarer les objets de la
table interne est identique à celle utilisée pour définir les types de table ou d'autres types d'objets de
données. L'option vous permet de créer une table interne avec un en-tête. Cependant, cette technique
de programmation étant obsolète, il est recommandé de ne plus l'utiliser. Pour plus d'informations sur
les en-têtes et les tables internes, référez-vous au chapitre Opérations sur les tables internes.
Extension dynamique de table
Contrairement aux tableaux contenus dans d'autres langages de programmation, le nombre de lignes
d'une table interne augmente automatiquement en fonction de l'environnement d'exécution ABAP
requis. Il est par conséquent inutile de se préoccuper de la gestion de la taille de la table, mais
seulement de l'insertion, de la lecture et de la suppression de lignes. Ainsi, ABAP contient des listes
enchaînées redondantes.
Option INITIAL SIZE
Lorsque vous créez une table interne, le système lui alloue 256 octets. Le système alloue ensuite un
bloc de 8 Ko à la table lorsque vous ajoutez des données pour la première fois, puis d'autres blocs de 8
Ko comme requis. Si vous souhaitez insérer uniquement quelques lignes dans votre table ou si vous
utilisez des tables internes imbriquées, il peut s'avérer judicieux de limiter la première extension
automatique à l'aide de l'option INITIAL SIZE <n>. Cette opération peut être exécutée dans la
définition de l'objet de données ou dans la définition du type. <n> correspond au nombre maximal de
lignes à insérer dans la table. Lors de la première allocation de mémoire, le système alloue le produit
de <n> et de la longueur de la ligne. En second lieu, il alloue deux fois ce montant, puis un montant
compris entre 12 et 16 Ko lors des étapes ultérieures.
PARAMETERS
PARAMETERS pa_carr TYPE spfli-carrid DEFAULT 'LH'.
SAP AG 1999
Les écrans de sélection correspondent à un type d'écran spécifique dont la structure dans la logique de
traitement est programmée directement à l'aide des instructions ABAP. Un programme exécutable
(type 1) comprend un écran de sélection standard (numéro de dynpro 1000). Les instructions
marquant généralement le début et la fin d'une définition de l'écran de sélection, ainsi que les appels
explicites ne sont pas requis pour la définition de l'écran de sélection standard. Les instructions
suivantes vous permettent de créer facilement des dynpros dans lesquels l'utilisateur peut saisir des
données.
PARAMETERS crée une zone de saisie dans l'écran de sélection à l'aide du type spécifié et d'une
variable du programme possédant le même nom. Il est impossible d'utiliser f, string, xstring
ou les références pour spécifier le type.
SELECT-OPTIONS crée des zones "de - à" dans le dynpro dans lesquelles il est possible de saisir
des ensembles de sélections complexes pour une variable spécifiée. Les valeurs saisies par
l'utilisateur sont stockées dans une table interne créée automatiquement par le système. La table
interne comporte quatre zones sign, option, low et high.
Pour plus d'informations sur ces instructions, référez-vous aux cours BC405 (Reporting dans ABAP
Workbench) et BC410 (Programmation interactive).
CONSTANTS:
CONSTANTS c_number1 TYPE i VALUE 123456789,
VALUE
c_number2 TYPE i VALUE
VALUE '1234567890',
c_eurofak(4) TYPE p DECIMALS 5 VALUE
VALUE '1.95583',
c_pi LIKE factor VALUE
VALUE '3.1415E01',
c_factor TYPE f VALUE
VALUE IS
IS INITIAL
INITIAL ,
c_clause(20) TYPE VALUE 'John''s bike is red.',
c VALUE
c_our_carr TYPE VALUE 'LH'.
scarr-carrid VALUE
* programmation incorrecte :
SELECT SINGLE * FROM spfli INTO wa_spfli
WHERE carrid = 'LH' AND connid = pa_conn.
* programmation correcte :
SELECT SINGLE * FROM spfli INTO wa_spfli
WHERE carrid = c_our
c_our_carr
_carr AND connid = pa_conn.
c_our_
SAP AG 1999
Les constantes et les littérales sont des objets de données fixes (il est impossible de modifier leurs
valeurs au moment de l'exécution).
Définissez les constantes à l'aide du mot-clé ABAP CONSTANTS. Pour affecter une valeur à votre
constante, vous devez utiliser l'option VALUE.
Recommandation :
Utilisez, si possible, des constantes plutôt que des littérales. La gestion de vos programmes en sera
ainsi facilitée.
Les valeurs littérales vous permettent de spécifier une valeur directement dans une instruction
ABAP. Il existe deux types de valeurs littérales : les valeurs littérales numériques et
alphanumériques. Les valeurs littérales alphanumériques doivent toujours être contenues entre
apostrophes. Les nombres entiers (y compris le signe moins le cas échéant) peuvent être représentés
comme des valeurs littérales numériques. Ils sont mis en correspondance avec les types de données i
et p (en fonction de l'intervalle représenté par chaque type de données).
Exemple :
DATA: result1 TYPE i, result2 LIKE result1.
result1 = -1000000000 / 300 * 3. "result1: 999.999-
result2 = -10000000000 / 300 * 3. "result2: 10.000.000-
Une valeur littérale numérique peu contenir jusqu'à 31 chiffres.
Les autres valeurs (décimales, nombres en virgule flottante, chaînes, etc.) doivent être spécifiées en
tant que valeurs littérales alphanumériques. Le système convertit le type de données si nécessaire.
Une valeur littérale alphanumérique peut contenir jusqu'à 255 caractères.
Pour insérer une apostrophe dans une valeur littérale alphanumérique, utilisez deux apostrophes afin
que la première soit interprétée comme partie intégrante de la valeur littérale et non comme
l'apostrophe de fin.
<instruction_édition> '<texte_défaut>'(<tsk>).
<instruction_édition> text-<tsk>.
* programmation incorrecte :
***************************
WRITE 'Hello World!'.
Symboles de texte
* programmation correcte :
************************
ts1 EN Hello world!
'Hello World!'(ts1).
WRITE 'Hello World!'(ts1)
World!'(ts1) DE Hallo Welt!
* ou ES ¡Hola mundo!
text-ts2
text-ts2
WRITE text-ts2. :
ts2 EN How are you?
:
SAP AG 1999
<objet_dic>-<zone>
<i_o_zone>
TABLES <objet_dic>.
DATA <zone_s_é> ...
<zone_s_é>
* envoi de données à l'écran:
<objet_dic>-<zone> = ...
<objet_dic>-<zone> <zone_s_é> = ...
SAP AG 1999
Lorsque vous utilisez les dynpros, le système transfère automatiquement le contenu de zone de la
logique de traitement vers le dynpro et inversement, mais seulement si les zones de dynpro et les
zones ABAP possèdent le même nom.
Restriction :
Si vous utilisez les zones de dynpro en vous référant au Dictionnaire ABAP (fonction Get from
Dictionary dans Screen Painter), vous devez utiliser l'instruction TABLES pour déclarer un objet de
données ayant le même nom que l'objet du Dictionnaire ABAP en vue d'assurer le fonctionnement
du transfert des zones. Les structures déclarées de cette façon sont souvent appelées espaces de
travail.
L'utilisation d'une référence à un Dictionnaire ABAP présente de nombreux avantages : les objets du
Dictionnaire comprennent généralement des contrôles de clés externes, une aide de zone, des entrées
possibles et les dialogues d'erreur nécessaires. Par conséquent, vous pouvez identifier les données
incohérentes dès leur saisie et avant de quitter le dynpro.
Si vous programmez vos propres contrôles de zone, le contenu de zone doit déjà avoir été transféré vers
le programme. Si vous omettez de redéfinir la zone en cas d'échec du contrôle, une valeur non
souhaitée demeure dans l'espace de travail. Vous risquez de rencontrer le même problème si vous
ne connaissez pas le nombre de programmes constituant les espaces de travail.
Pour éviter ces erreurs, considérez les espaces de travail TABLES comme des interfaces entre le dynpro
et le programme, puis utilisez-les uniquement dans ce contexte. Ils fournissent des données au
dynpro à la fin de l'événement PBO et les reçoivent à nouveau lorsque les valeurs sont transférés à
partir du dynpro.
REPORT ...
NODES
NODES:
spfli, sflight.
START-OF-SELECTION.
GET spfli.
WRITE: / spfli-carrid, spfli-connid.
GET sflight.
WRITE: /10 sflight-fldate.
SAP AG 1999
Les bases de données logiques sont des programmes ABAP spécifiques que vous pouvez relier à un
programme exécutable (type 1). Elles lisent les données à partir de la base de données, puis les
transfèrent au programme exécutable. La lecture des données étant affectée à la base de données
logique, votre propre programme ABAP s'en trouve considérablement simplifié.
La base de données logique transfère les données vers votre programme à l'aide des espaces de travail
de l'interface déclarés via l'instruction NODES <nœud>. L'instruction crée une variable <nœud>
qui se réfère au même nom du type de données dans le Dictionnaire ABAP.
Les données sont transférées vers votre programme enregistrement par enregistrement. À chaque fois
que la base de données logique rend un enregistrement disponible dans votre programme,
l'événement GET <nœud> ou GET <nœud> LATE correspondant est déclenché. Vous pouvez
coder les blocs événement appropriés dans votre programme.
Il est possible de déterminer le type d'enregistrement de données renvoyé par la base de données
logique à l'aide de l'option TYPE. Cependant, cette opération se limite aux types pris en charge par
la base de données logique. Pour plus d'informations sur cette instruction, référez-vous à la
documentation en ligne ou au cours BC405 (Reporting dans ABAP Workbench).
...
space
SET PF-STATUS space.
...
WRITE:
/ sy-tcode
sy-tcode, "code de transaction courant
sy-mandt
sy-mandt, "mandant courant
sy-uname,
sy-uname "utilisateur courant
sy-datum,
sy-datum "date courante
sy-langu,
sy-langu "langue courante
sy-subrc
sy-subrc. "code retour des instructions ABAP
SAP AG 1999
L'objet de données SPACE est une constante de type C et de longueur 1. Il contient un seul espace.
UNASSIGN <<sz_int>.
> fs_int 17 int
IF <
<sz_int>> IS ASSIGNED.
ASSIGNED
WRITE: / int, < >
<sz_int>.
ELSE.
WRITE: / 'le field symbol n'est pas affecté'(fna).
ENDIF.
SAP AG 1999
Déclarez les field symbols à l'aide de l'instruction FIELD-SYMBOLS <<sz>>. Les crochets (<>)
font partie de la syntaxe.
Les field symbols autorisent un accès symbolique à un objet de données existant. Toutes les
modifications apportées au field symbol s'appliquent à l'objet de données qui lui est affecté. Si
aucun type n'est affecté au field symbol (TYPE ANY), ce dernier adopte le type de l'objet de
données. Si vous spécifiez un type pour le field symbol, seuls les objets compatibles lui sont
affectés.
Les field symbols sont similaires aux pointeurs déréférencés.
Pour affecter un objet de données au field symbol <<sz>>, utilisez l'instruction ASSIGN. Pour
lever la restriction de type, utilisez l'option CASTING. L'objet de données est ensuite interprété
comme si il comportait le type de données du field symbol. Vous pouvez également procéder de la
même manière pour les field symbols sans type à l'aide de l'option CASTING TYPE <type>.
Pour savoir si le field symbol <<sz>> est affecté à une zone, utilisez l'expression <<sz>> IS
ASSIGNED.
L'instruction UNASSIGN <<sz>> définit le field symbol <<sz>> pour qu'il ne pointe vers aucun
endroit. L'expression logique <<sz>> IS ASSIGNED est alors erronée.
Un field symbol sans type ne comportant pas d'objet de données se comporte (pour des raisons de
compatibilité) comme une constante de type C et de longueur 1.
fs_int <adr_int>
ASSIGN d_ref2->*
->* TO
TO <sz_int>.
<adr_int> d_ref1
SAP AG 1999
SAP AG 1999
Vous pouvez utiliser la conversion de type de manière dynamique lorsque vous affectez un objet de
données à un field symbol. Le graphique illustre un exemple de cette opération.
Le nom de la table de base de données (et par conséquent, le type de ligne) est connu uniquement au
moment de l'exécution. Puisqu'il n'est pas possible de spécifier une clause INTO dynamique dans
l'instruction SELECT, le système écrit les enregistrements de données dans la ligne de zone à
caractère.
L'affectation à un field symbol <sz_wa> et la conversion de type permettent alors d'accéder à la zone
comme pour une structure plate. Tous les attributs de type héritent de la table de base de données.
(Vous pouvez également vous référer au type de ligne d'un objet du Dictionnaire ABAP via l'option
TYPE.)
Si vous connaissez les noms des composantes, vous pouvez afficher les zones directement à l'aide de
WRITE <sz_wa>-... .
Cependant, les noms des composantes ne sont généralement pas connues. Dans ce cas, utilisez la
variante ASSIGN COMPONENT dans laquelle les composantes de la structure <fs_wa> sont
affectées une par une au field symbol <sz_comp>, puis affichées. Lorsque la boucle ne rencontre
plus de composantes, le programme lit l'enregistrement de données suivant.
Problème
L'adresse de line doit répondre aux mêmes règles d'adresse que celles d'une structure de table
(l'adresse doit être divisible par 4). Pour ce faire, vous pouvez déclarer une zone de nombre entier
dummy directement avant de déclarer line. (Les nombres entiers sont toujours stockés au niveau
des adresses divisibles par 4.)
SAP AG 1999
Contrairement aux objets de données classiques, vous pouvez spécifier le type d'un objet de données
créé au moment de l'exécution de manière dynamique. L'exemple ci-dessus est une version
légèrement modifiée de l'exemple de la page précédente.
Cette fois-ci, l'idée consiste à créer l'objet de données pour la clause INTO de manière dynamique au
moment de l'exécution. Dans ce cas, le type est déjà connu (vous avez saisi le nom de table) et il
n'existe plus de problème d'alignement. L'instruction ASSIGN d_ref->* to <sz_wa> affecte
l'objet de données au field symbol. Le type de données de la table provient du field symbol, la
conversion de type n'est donc plus nécessaire.
Au lieu d'utiliser une zone de caractère longue, vous pouvez à présent écrire l'enregistrement de
données dans l'objet de données avec le même type vers lequel la référence d_ref pointe, en
utilisant le field symbol <sz_wa>.
Objets Programme
de données ABAP
Code
source
ABAP
SAP AG 1999
Vous devez parfois rechercher les attributs d'un objet de données au moment de l'exécution,
particulièrement lors de l'utilisation de références et de field symbols. L'instruction DESCRIBE
FIELD renvoie différents attributs de type de variables.
Attention :
Si vous lancez une requête sur la longueur d'une zone de type string ou xstring, le système ne
renvoie pas la longueur de la chaîne. Il renvoie à la place la longueur de la référence de chaîne qui
est toujours égale à huit octets. Pour rechercher la longueur de la chaîne, utilisez l'option OUTPUT-
LENGTH.
L'instruction DESCRIBE TABLE <tabi> LINES <n> renvoie le nombre de lignes d'une table
interne.
Depuis l'introduction de ABAP Objects, il existe désormais un système appelé concept RTTI (Run
Time Type Information) permettant de rechercher les attributs de type au moment de l'exécution. Il
est basé sur des classes du système. Le concept comprend tous les types ABAP et couvre toutes les
fonctions des instructions DESCRIBE FIELD et DESCRIBE TABLE.
SAP AG 1999
1-3 Déclarez la table interne it_carr_counter comme table standard avec le type
de ligne t_counter et une clé par défaut non unique.
(C) SAP AG BC402 3-30
1-4 Déclarez la structure wa_counter avec le type de données t_counter.
1-7 Dans l'écran de sélection standard, déclarez l'option de sélection so_carr pour la
zone wa_counter-carrid.
Composante Type
carrid sflight-carrid
connid sflight-connid
fldate sflight-fldate
cityfrom spfli-cityfrom
cityto spfli-cityto
seatsocc sflight-seatsocc
paymentsum sflight-paymentsum
currency sflight-currency
it_planes z##_bc402_planetab
2-6 Déclarez une table interne it_flights avec le type de données t_flighttab.
2-7 Dans l'écran de sélection standard, déclarez l'option de sélection so_carr pour la
zone wa_flight-carrid.
2-8 Déclarez une table de sélection allowed_carriers pour les zones contenant le
type t_flight-carrid.
*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_COUNTERLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 relatif aux types et aux objets de
données *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_typs_counterlist1.
TYPES:
BEGIN OF t_airport,
id TYPE sairport-id,
name TYPE sairport-name,
END OF t_airport,
BEGIN OF t_counter,
airport TYPE scounter-airport,
airp_name TYPE sairport-name,
carrid TYPE scounter-carrid,
countnum TYPE scounter-countnum,
END OF t_counter.
DATA:
*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_FLIGHTLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 2 relatif aux types et objets de
données *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_typs_flightlist1.
TYPES:
BEGIN OF t_flight,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
seatsocc TYPE sflight-seatsocc,
paymentsum TYPE sflight-paymentsum,
currency TYPE sflight-currency,
it_planes TYPE bc402_typs_planetab,
END OF t_flight,
DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.
Contenu
Affectation de valeurs
Traitement de chaînes et de parties de zones
Opérations numériques
Contrôle du déroulement du programme
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
DATA:
char,
name(8) TYPE c,
length(4) TYPE p DECIMALS 2,
carac.
BEGIN OF line,
flag LIKE char, _
name LIKE name, nom
mycarr TYPE spfli-carrid, ________
END OF line,
longueur
itab LIKE TABLE OF line. 0000000
ligne
CLEAR
CLEAR: témoin nom mycarr
char, _ ________ ___
name,
length, tabi
line, témoin nom mycarr
itab.
SAP AG 1999
Utilisez CLEAR pour réinitialiser tout objet de données variable sur la valeur initiale appropriée à son
type.
Dans une structure, chaque composante est réinitialisée individuellement.
Dans une table interne ne comportant pas d'en-tête, toutes les lignes sont supprimées.
DATA: ligne
linenew LIKE line, témoin nom mycarr
itabnew LIKE itab, X SAP_ AG _ _ YZ _
wa_scustom TYPE scustom, nouvelle ligne
time TYPE tims VALUE '083045'. témoinnom mycarr
X SAP_ AG _ _ YZ _
MOVE 'X' TO line-flag.
MOVE
wa_scustom
MOVE name TO line-name.
mandt id nom form....
line-mycarr = 'YZ'.
4 0 0 123 S c h e e r ...
linenew == line. ligne
MOVE itab TO itabnew.
MOVE témoin nom mycarr
X Scheer YZ _
MOVE-CORRESPONDING wa_scustom TO line.
MOVE-CORRESPONDING
temps zonecarac
WRITE time TO charfield.
WRITE 083045 08 : 30 : 45
SAP AG 1999
Utilisez la valeur MOVE pour copier le contenu d'un objet de données dans un autre objet de données
variable.
Avec les objets complexes, vous pouvez traiter les composantes individuellement ou utiliser une "copie
longue". Si les objets source et cible sont compatibles (voir page suivante), le système copie les
composantes de l'objet l'une après l'autre ou ligne par ligne.
Dans le cas contraire, le système convertit les objets tant qu'il existe une règle de conversion
appropriée.
Si vous effectuez une copie entre deux structures et que vous souhaitez copier uniquement les valeurs
comprises entre les zones appelées de manière identique, vous pouvez utiliser l'instruction MOVE-
CORRESPONDING.
Les mécanismes de conversion décrits dans les pages suivantes s'appliquent non seulement aux
instructions MOVE et MOVE-CORRESPONDING, mais également aux calculs et comparaisons de
valeurs.
Contrairement à l'instruction MOVE, lorsque vous utilisez WRITE... TO... pour affecter des
valeurs, la zone cible est toujours considérée comme une zone de caractère indépendamment de son
type réel. WRITE...TO se comporte de la même manière que lorsque vous écrivez une sortie sur une
liste. Vous pouvez ainsi utiliser les options d'édition lors de la copie d'objets de données (par exemple,
édition de la date nationale).
Les types compatibles peuvent être affectés entre eux sans conversion.
Les types non compatibles peuvent être convertis s'il existe une règle de
conversion.
SAP AG 1999
Si deux types de données sont incompatibles mais qu'il existe une règle de conversion lorsque vous
affectez des valeurs, effectuez des calculs ou comparez des valeurs, le système convertit l'objet
source en type d'objet cible.
Les pages suivantes contiennent les principes de base des règles de conversion, ainsi que des exemples
des cas les plus fréquents. Pour obtenir une liste complète des règles de conversion, référez-vous à la
documentation de syntaxe ABAP pour l'instruction MOVE.
Si aucune règle de conversion n'est définie pour une affectation spécifique, le comportement du
système dépend du contexte dans lequel l'affectation a été programmée.
Si les types des objets concernés sont définis de manière statique, une erreur de syntaxe se
produit.
Exemple :
DATA: date TYPE d VALUE '19991231', time TYPE t.
FIELD-SYMBOLS: <date_sz> TYPE d, <heure_sz> TYPE t.
ASSIGN: date TO <date_sz>, time TO <heure_sz>.
<heure_sz> = <date_sz>.
Si les types des objets concernés sont définis de manière dynamique, une erreur runtime se
produit, car le système n'est pas en mesure d'indiquer, lors du contrôle de syntaxe, s'ils sont
convertibles ou non.
Exemple (voir ci-dessus) :
...
FIELD-SYMBOLS: <date_sz> TYPE ANY, <heure_sz> TYPE ANY.
...
C 1 A C 4 A___
C 4 ABCD C 2 AB
C 7 -47110_ P 3 47110-
P 3 12345- C 7 _12345-
SAP AG 1999
En général, il existe une règle permettant de convertir chaque type de données ABAP prédéfini.
Cas spécifiques :
Aucune règle ne permet de convertir un type D en type T ou inversement, ni de convertir des types
de données de ABAP Objects (référence à un objet en référence à un objet, référence à un objet à
référence à une interface). Les affectations ou les comparaisons de ce type entraînent des erreurs de
syntaxe (lorsque le système est en mesure de les identifier).
Lorsque vous affectez une zone de type C à une zone de type P, vous pouvez utiliser uniquement
des chiffres, des espaces, un signe décimal ou un signe plus ou moins. La zone cible doit être
suffisamment grande.
Lorsque vous convertissez un nombre condensé en une zone de type C, les zéros en-tête sont
convertis en espaces.
Pour plus d'informations sur les règles de conversion pour les types élémentaires, référez-vous à la
documentation de l'Éditeur ABAP pour l'instruction MOVE.
SAP AG 1999
? sy-
sy-subrc sy-
sy-fdpos u/l
SEARCH ABAP
REPLACE ABAP BBAP
TRANSLATE ABAP a b ap
SHIFT ABAP BAP
CONDENSE A P AP
CONCATENATE A B +A P ABAP
AB P
OVERLAY ABAP
AAAA
SPLIT ABAP AB AP
SAP AG 1999
Les instructions suivantes peuvent être utilisées pour le traitement des chaînes dans ABAP :
SEARCH Pour effectuer une recherche dans une chaîne
REPLACE Pour remplacer la première occurrence d'une chaîne
TRANSLATEPour remplacer tous les caractères spécifiés
SHIFT Pour déplacer un caractère à chaque fois
CONDENSE Pour supprimer les espaces
CONCATENATE Pour regrouper deux chaînes ou plus
OVERLAY Pour relier deux chaînes
SPLIT Pour fractionner une chaîne
Dans les opérations liées aux chaînes, les opérandes sont traités comme des zones de type C,
indépendamment de leur type de zone réel. Ils ne sont pas convertis.
Toutes les instructions, excepté TRANSLATE et CONDENSE, définissent la zone système sy-
subrc. SEARCH définit également la zone système sy-fdpos avec un décalage du début de la
chaîne.
Toutes les instructions, excepté SEARCH, distinguent les majuscules des minuscules.
Pour rechercher la longueur occupée d'une chaîne, utilisez la fonction standard STRLEN().
DATA:
str(100) TYPE c A b a p o b j e c t
VALUE 'Abap object '.
SAP AG 1999
Ab Ap +
REPLACE <ch1> WITH <ch2> INTO <zone>. Bb Ap +
Ab Ap +
TRANSLATE <zone> USING <ch>. Bb Bp +
Ab Ap +
TRANSLATE <zone> TO {UPPER|LOWER} CASE. AB AP +
Ab Ap +
SHIFT <zone> [<var>] [RIGHT|CIRCULAR]. b Ap +
Ab Ap +
CONDENSE <zone> [NO-GAPS]. Ab Ap +
SAP AG 1999
SPLIT 'ABAP' AT
AT 'BA' INTO
INTO f1 f2. AB AP
A P
OVERLAY f WITH
WITH 'XBAX'. A P X BAX
AB AP
SAP AG 1999
PARAMETERS:
pa_str(40) LOWER CASE,
pa_pos TYPE i,
pa_len TYPE i.
+pa_pos(pa_len)
WRITE pa_str+pa_pos(pa_len).
19991231ttA235959
000000
SAP AG 1999
Pour chaque instruction utilisant une zone de saisie, vous pouvez traiter une partie de la zone ou de la
structure en spécifiant un emplacement de départ et un nombre de caractères. Si les longueurs de
zones sont différentes, le système tronque la zone cible ou la renseigne avec des valeurs initiales.
Les zones source et cible doivent comporter le type X, C, N, D, T ou STRING. Il est également
possible d'utiliser des structures.
Exemple
Cette instruction affecte <lon1> caractères de la zone <zone1> commençant par le décalage
<déc1> sur <lon2> caractères de <zone2> commençant par le décalage <déc2>.
Attention
Sous Unicode *), seules les zones contenant le type C, X et STRING sont appropriées pour un accès
partiel. Dans d'autres cas, utilisez des field symbols avec la conversion.
_________________________________________
*) Jeu de caractères indépendant de la langue et de la culture.
* expressions :
... <op> ( <expr1> <op> <expr2> ) <op> ...
* fonctions :
... <fonc>( <expr> ) ...
* opérateurs possibles :
... <expr1> + <expr2> ... "ADD
... <expr1> - <expr2> ... "SUBSTRACT
... <expr1> * <expr2> ... "MULTIPLY
... <expr1> / <expr2> ... "DIVIDE
... <expr1> ** <expr2> ... "opérateur de référence
... <expr1> DIV <expr2> ... "division du nombre entier
... <expr1> MOD <expr2> ... "reste
SAP AG 1999
Dans ABAP, il est possible de programmer des expressions arithmétiques imbriquées à tout niveau.
Gardez en mémoire que les parenthèses et les opérateurs sont des mots-clés et doivent, par
conséquent, être précédés et suivis d'un espace au minimum.
L'environnement d'exécution ABAP contient une série de fonctions pour différents types de données.
La parenthèse ouvrante appartient au nom de la fonction (et, par conséquent, un espace ne les sépare
pas). Les éléments restants de chaque expression doivent être séparés par des espaces.
Les expressions sont traitées dans une séquence algébrique normale (expressions mathématiques entre
parenthèses suivies de fonctions, de puissances, d'une multiplication, d'une division et enfin d'une
addition et d'une soustraction.
Un calcul peut contenir tous les types de données pouvant être convertis entre eux et en type de zone de
résultats. Le système convertit toutes les zones dans l'un des trois types de données numériques (I,
P ou F), selon les types de données des opérandes. Le runtime system ABAP contient une
arithmétique pour chacun des trois types de données. Le système effectue ensuite le calcul, puis le
convertit en type de données de la zone de résultats.
DIV (division du nombre entier) et MOD (reste d'une division) renvoient toujours des nombres entiers.
Sauvegarder
SAP AG 1999
Dans l'arithmétique d'un nombre entier et condensé, le système arrondit toujours à la décimale
correspondante. Par exemple :
DATA int TYPE i. int = 4 / 10. " résultat : 0
int = 5 / 10. " résultat : 1
ou
DATA: pack TYPE p DECIMALS 2. pack = 4 / 1000. " résultat : 0.00
pack = 5 / 1000. " résultat : 0.01.
Cependant, les résultats intermédiaires à l'aide de nombres condensés comportent toujours 31
décimales. L'arithmétique utilisée dépend du mode d'interprétation des valeurs littérales numériques
par le système :
DATA int TYPE i. int = 1000000000 / 300000000 * 3. " résultat :
9
int = 10000000000 / 3000000000 * 3. " résultat :
10
Si vous ne définissez pas l'option arithmétique en virgule fixe dans les attributs de programme, l'option
DECIMALS dans l'instruction DATA affecte uniquement la sortie et pas l'arithmétique. Dans ce
cas, tous les nombres sont interprétés en interne comme des nombres entiers, indépendamment du
signe décimal. Vous devez ensuite calculer manuellement le nombre de décimales, puis vous
assurer que le nombre est affiché correctement. Dans le cas contraire, les résultats sont insignifiants.
DATA: pack TYPE p DECIMALS 2.
pack = '5000.00' * '0.20'. " résultat : pack = 100000.00
En outre, le système arrondit également en interne (arithmétique de nombre entier - voir ci-dessus).
L'option arithmétique en virgule fixe est toujours sélectionnée par défaut. Acceptez toujours cette
valeur, puis utilisez des nombres condensés pour les calculs de gestion.
1 .5 = 1 ⋅ 2 0 + 1 ⋅ 2 − 1
Uniquement 53 bits
disponibles
1
=1 +
≈
2
| 0 0 | | 0 0 | | ...
−3 −6 −7 −10 −11
0.15 = 1 ⋅ 2 + 1 ⋅ 2 + 1 ⋅ 2 + 1⋅ 2 + 1 ⋅ 2 + Λ
1 1 1 1 1
= + + + + +Λ
8 64 128 1024 2048
Uniquement pour
= 0.125 + Λ
les approximations
= 0.140625 + Λ
= 0.1484375 + Λ
= 0.1494140625 + Λ
= 0.1499023437 Λ
SAP AG 1999
Les calculs effectués à l'aide du type de données F sont toujours, pour des raisons techniques, imprécis.
Exemple
Vous souhaitez calculer 7,72% de 73 050 et afficher le résultat à deux décimales.
La réponse doit être 5 310,74 (73 050 * 0,0727 = 5 310,735). Cependant, le programme renvoie le
message suivant :
DATA: float TYPE f, pack TYPE p DECIMALS 2.
float = 73050 * '0.0727'. " résultat : 5.3107349999999997E+03
pack = float. WRITE pack. " résultat : 5310.73
Vous devez, par conséquent, utiliser uniquement des nombres en virgule flottante pour des
approximations. Lorsque vous comparez des nombres, utilisez toujours des intervalles, puis
arrondissez toujours vos calculs.
Quatre catégories générales d'erreur à l'exécution peuvent se créer lors des calculs :
Une zone qui aurait dû être convertie ne peut pas être interprétée comme un nombre.
Une tranche de numéros est trop petite pour une conversion, une affectation de valeurs ou pour le
stockage de résultats intermédiaires.
Vous avez tenté une division par zéro.
Vous avez transmis un argument incorrect vers une fonction prédéfinie
(Par exemple : ... log( -3 ) ... ).
Pour plus d'informations, référez-vous à la documentation de syntaxe ABAP pour l'instruction
COMPUTE.
DATA:
diffdays TYPE i,
datestring LIKE sy-datum,
BEGIN OF daterec,
year(4) TYPE c,
month(2) TYPE c,
day(2) TYPE c,
END OF daterec.
...
daterec = sy-datum.
Si vous affectez une zone date à une zone numérique, le runtime system calcule le nombre de jours
écoulés depuis le 01/01/0001.
Inversement, lorsque vous affectez une valeur numérique à une zone date, le système l'interprète
comme nombre de jours écoulés depuis le 01/01/0001.
Avant d'effectuer des calculs avec les dates, la valeur de la zone date est convertie en valeur
numérique (nombre de jours depuis le 01/01/0001)
L'exemple ci-dessus calcule le dernier jour du mois précédent.
Lorsque vous procédez à des calculs avec des zones heure, le système utilise une procédure similaire
qui consiste à compter le nombre de secondes écoulées depuis 0:00:00.
* négation :
.. NOT <expr> .. "vraie, si <expr> est fausse
SAP AG 1999
Les comparaisons entre les objets de données non numériques sont interprétées en fonction de leur
type de données.
Si possible : conversion en nombres (hexadécimal, par exemple, comme un numéro double) ;
Date et heure : interprétées comme plus tôt/plus tard, donc 31/12/1999 < 01/01/2000 ;
Autres caractères : interprétation lexicale en fonction des codes de caractère. Les deux opérandes
sont spécifiés avec la même longueur et remplis avec des espaces à droite, si nécessaire ;
Références : le système compare l'adresse et le type de données
uniquement dans le but de comparer l'égalité.
Lorsque vous regroupez, puis niez les comparaisons, les règles habituelles d'expressions logiques
s'appliquent :
NOT est supérieur à AND et AND supérieur à OR.
Exemple
NOT f1 = f2 OR f3 = f4 AND f5 = f6 est identique à
( NOT ( f1 = f2 ) ) OR ( f3 = f4 AND f5 = f6 ).
Par conséquent, mettez les expressions de composante de vos comparaisons entre parenthèses, même
lorsque cela n'est pas nécessaire, en vue de faciliter leur compréhension et pour plus de sécurité.
Vous pouvez également améliorer considérablement l'exécution de vos programmes en optimisant la
structure de vos expressions.
CO
CA
CS
CP
SAP AG 1999
CASE <objd1>.
WHEN <objd2>.
* ... instructions ...
[WHEN <objd3> OR <objd4> .. OR <objdn>.
* ... instructions ...]
[WHEN OTHERS.
* ... instructions ...]
ENDCASE.
IF <expr1_logique>.
* ... instructions ...
[ELSEIF <expr2_logique>.
* ... instructions ...]
[ELSE.
* ... instructions ...]
ENDIF.
CHECK <expr_logique>.
* ... instructions ...
SAP AG 1999
Dans une structure CASE - ENDCASE, testez l'égalité d'un objet de données par rapport à
différentes valeurs. Si le test est réussi, le bloc d'instructions correspondant est exécuté. En cas
d'échec de toutes les comparaisons, le bloc OTHERS programmé est exécuté.
Dans une structure IF - ENDIF, vous pouvez utiliser toute expression logique. Si la condition est
remplie, les instructions correspondantes sont exécutées. Si aucune condition n'est remplie, le bloc
ELSE programmé est exécuté.
Dans les deux cas, le système exécute uniquement un bloc d'instructions, à savoir celui appartenant au
premier cas correct.
Si chaque condition teste l'égalité de ce même objet de données avec un autre objet, utilisez une
structure CASE-ENDCASE. Cette procédure est plus simple et requiert une exécution moins
importante.
En dehors d'une boucle, vous pouvez exécuter toutes les instructions restantes dans le bloc de
traitement courant en utilisant CHECK. En cas d'échec du contrôle, le traitement reprend par la
première instruction dans le bloc de traitement suivant.
LOOP AT ...
* ... instructions ...
ENDLOOP.
DO.
* ... instructions ...
SELECT ... CHECK <condition_interr>.
* ... instructions ... EXIT.
ENDSELECT. ENDDO.
SAP AG 1999
Il existe quatre structures de boucle. Le nombre de passages de boucle courants est toujours disponible
dans la zone système sy-index. Si vous utilisez des boucles imbriquées, la valeur de sy-index
se réfère à la valeur courante. Vous pouvez prendre le contrôle du traitement de boucle via CHECK
<expression logique> et les instructions EXIT. Pour plus d'informations, référez-vous au
chapitre Blocs de traitement. Le graphique illustre le mode de contrôle du traitement supplémentaire
d'une boucle.
Boucles inconditionnelles/indexées
Les instructions entre DO et ENDDO sont exécutées jusqu'à ce que vous terminiez la boucle avec une
instruction d'interruption. Vous pouvez spécifier un nombre maximal de passages de boucle. Dans la
cas contraire, vous êtes en présence d'une boucle infinie.
Boucles conditionnelles
Les instructions entre WHILE et ENDWHILE sont répétées tant que la condition <expression
logique> est remplie.
Accès de lignes multiples à une table interne
Pour plus d'informations, reportez-vous au chapitre Opérations sur les tables internes.
Accès d'enregistrements multiples à une table ou vue de base de données
Référez-vous aux cours BC400 (Introduction à ABAP Workbench)
et BC405 (Reporting dans ABAP Workbench) et à la documentation de syntaxe pour l'instruction
SELECT.
LEAVE
CHECK PROGRAM MESSAGE a..
EXIT
LEAVE TO
TRANSACTION
Boucles : Passage de
Boucle
DO WHILE boucle
de sortie
SELECT LOOP suivant
Afficher le Afficher
Événements I
buffer de le message
LOAD-OF-PROGRAM.
liste et
START-OF-SELECTION. continuer puis
GET <nœud> [LATE]. avec les
END-OF-SELECTION. événements
II
le programme
Fin du programme se termine
Événements II et tous les
AT SELECTION-SCREEN [OUTPUT]. modes
INITIALIZATION. Fin du bloc
internes sont
TOP-OF-PAGE. de traitement courant
supprimés
END-OF-PAGE. et démarrage
AT LINE-SELECTION. du suivant
AT USER-COMMAND.
Unités de modularisation
SAP AG 1999
Rappel
Un bloc de traitement est un bloc événement ABAP ou une unité de modularisation.
Utilisez l'instruction ABAP CHECK <expression logique> en dehors d'une boucle pour
terminer le bloc de traitement si la condition logique n'est pas remplie. Le traitement continue avec
la première instruction dans le bloc de traitement suivant. Dans une boucle, le traitement reprend au
début du passage de boucle suivant.
L'instruction EXIT peut se comporter de trois manières différentes : dans une boucle, elle termine
le traitement de boucle entièrement. En dehors d'une boucle mais dans l'un des événements
répertoriés sous Événements I, elle entraîne l'affichage du contenu courant du buffer de liste par le
système. Les événements provenant d'autres groupes et répertoriés ci-dessus peuvent encore être
déclenchés. Dans le cas de LOAD-OF-PROGRAM, START-OF-SELECTION est déclenché.
Dans d'autres cas, EXIT a les mêmes conséquences que CHECK.
Les instructions LEAVE PROGRAM et LEAVE TO TRANSACTION <codet> terminent le
programme courant.
Lorsque vous envoyez un message d'interruption (type A), le programme courant se termine et la
pile dynamique de programme est supprimée. Pour plus d'informations, référez-vous au chapitre
Appel de programmes et passation de paramètres.
arithmetic_errors
Classes ERROR conversion_errors
...
SAP AG 1999
SAP AG 1999
Les constructions CATCH SYSTEM-EXCEPTIONS ... ENDCATCH peuvent être imbriquées à tout
niveau. En cas d'erreur à l'exécution, le système recherche une affectation dans le bloc de traitement
courant. En cas d'échec, il effectue une recherche dans le premier bloc le plus élevé, etc. Le
traitement reprend après l'instruction ENDCATCH du bloc dans lequel l'affectation a été trouvée.
L'exemple ci-dessus imbrique trois structures CATCH SYSTEM-EXCEPTIONS ... ENDCATCH.
Chaque instruction ENDCATCH est précédée d'une instruction provoquant une erreur à l'exécution.
Au niveau de quelle instruction le système définit-il la zone sy-subrc ? Avec quelle valeur ? Au
niveau de quelle instruction le traitement reprend-t-il ?
SAP AG 1999
La division par zéro du bloc le plus interne déclenche l'erreur à l'exécution bcd_zerodivide.
Cependant, aucune affectation n'existe pour cette erreur dans ce bloc.
Par conséquent, le système recherche l'erreur dans le premier bloc le plus élevé où il est affecté. sy-
subrc est défini sur 4.
SAP AG 1999
SAP AG 1999
SAP AG 1999
SAP AG 1999
Contenu
Informations générales
Accès index
Accès clé
Accès field symbols
Exemple
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
INTO FROM
it_scarr mandt carrid carrname currcode
400 AA American Airlines USD
LOOP AT ...
400 AC Air Canada CAD
...
400 AF Air France FF
ENDLOOP.
400 AZ Alitalia ITL
SAP AG 1999
Il existe deux modes d'accès aux enregistrements dans une table interne :
Vous pouvez copier les enregistrements individuels dans un espace de travail. Cet espace de travail
doit être compatible avec le type de ligne de la table interne.
Vous pouvez accéder à l'espace de travail de n'importe quelle manière tant que la composante à
laquelle vous tentez d'accéder n'est pas une table interne. Si l'une des composantes est une table
interne, utilisez un espace de travail supplémentaire dont le type de ligne est compatible avec celui
de la table imbriquée.
Lorsque vous modifiez la table interne, le contenu de l'espace de travail est écrit à nouveau dans la
table ou ajouté en tant que nouvel enregistrement.
Vous pouvez affecter les enregistrements de données individuels à un field symbol approprié. Une
fois l'entrée lue par le système, vous pouvez traiter ses composantes directement à l'aide de son
adresse. Aucune copie n'est effectuée vers et à partir de l'espace de travail. Cette méthode est
particulièrement appropriée pour l'accès aux tables volumineuses ou complexes.
Pour lire plusieurs enregistrements, utilisez une structure LOOP... ENDLOOP. Vous pouvez ensuite
modifier ou supprimer la ligne déjà lue et le système applique la modification dans la table. Vous
pouvez également modifier ou supprimer des lignes à l'aide d'une condition logique.
Lorsque vous utilisez les instructions ci-dessus avec des tables triées, assurez-vous que la séquence de
tri est gérée.
Dans une boucle, l'instruction INSERT ajoute dans la table l'enregistrement de données avant
l'enregistrement courant. Pour insérer une série de lignes d'une table interne dans une autre table
d'index, utilisez plutôt la variante INSERT LINES OF <tabi>.
Lorsque vous utilisez des enregistrements de données individuels, vous pouvez utiliser deux options
supplémentaires :
Dans l'option COMPARING, le système compare l'égalité entre le contenu de zone d'un
enregistrement de données et le contenu de l'espace de travail.
Dans l'option TRANSPORTING, vous pouvez limiter le transport des données aux zones
sélectionnées.
Instructions supplémentaires pour les tables standard
SORT <tabi> [ASCENDING|DESCENDING]
[BY <f1> [ASCENDING|DESCENDING] ..
<fn> [ASCENDING|DESCENDING]][AS TEXT] [STABLE].
Ces instructions trient la table par clé de table ou séquence de zone spécifique. Si vous n'utilisez pas
d'option, le système effectue un tri par ordre croissant. Si vous utilisez l'option AS TEXT, les zones
de caractères sont triées par séquence spécifique à la culture. L'ordre relatif des enregistrements de
données avec des clés de tri identiques demeure constant uniquement si vous utilisez l'option
STABLE.
APPEND <wa> INTO <classement> SORTED BY <f>.
Cette instruction ajoute l'espace de travail au classement <classement> par ordre décroissant. La
longueur du classement ne peut pas dépasser l'instruction INITIAL SIZE spécifiée et l'espace
de travail doit respecter la séquence de tri de la table.
(C) SAP AG BC402 5-5
Modification, suppression et exécution de boucles
dans les tables d'index
SAP AG 1999
Les instructions répertoriées dans cet exemple peuvent être utilisées avec les tables standard et triées.
Lorsque vous modifiez une ligne individuelle, vous pouvez spécifier les zones à modifier à l'aide de
l'option TRANSPORTING. Dans une boucle, l'option MODIFY modifie l'enregistrement de données
courant.
Pour supprimer un ensemble de lignes d'une table d'index, utilisez la variante DELETE <tabi>
FROM... TO.. ou WHERE... au lieu d'une boucle. Vous pouvez programmer quasiment toute
expression logique après WHERE. La première zone dans chaque comparaison doit être une composante
de la structure de lignes (référez-vous au chapitre "Ouverture des instructions SQL"). Vous pouvez
transmettre les noms de manière dynamique.
Pour supprimer l'intégralité d'une table interne, utilisez l'instruction CLEAR <tabi>.
Dans la structure LOOP AT... ENDLOOP, les instructions situées dans la boucle s'appliquent à leur
tour à chaque enregistrement de données. L'option INTO copie les entrées une par une dans l'espace
de travail.
Le système insère l'index du passage de boucle courant dans la zone système sy-tabix. Une fois la
boucle terminée, sy-tabix comporte une valeur identique à celle précédant le démarrage de la
boucle.
L'insertion et la suppression de lignes dans une boucle affectent les passages de boucle suivants.
wa_scarr mandt carrid Table d'adresses it_scarr mandt carrid carrname currcode
calculées <adr_400_CO> 400 CO USD
400 BA Continental Airlines
Tri
SORT <tabi> [ASCENDING|DESCENDING]
[BY <f1> [ASCENDING|DESCENDING]
..
<fn> [ASCENDING|DESCENDING]]
[AS TEXT][STABLE].
SAP AG 1999
L'accès à une table d'adresses calculées est mis en œuvre à l'aide d'un algorithme de hachage. Le terme
"simplifié" signifie que les enregistrements de données sont répartis de façon aléatoire mais
équitable sur une zone de mémoire spécifique. Les adresses sont stockées dans une table spécifique
appelée table de hachage. Il s'agit d'une fonction de hachage qui détermine l'adresse du pointeur vers
un enregistrement de données avec une clé spécifique. En fait, plusieurs enregistrements de données
peuvent être stockés dans une seule adresse. Cette opération est mise en œuvre en interne comme une
liste enchaînée. Par conséquent, bien que le système doive encore effectuer une recherche séquentielle
dans ces domaines, il doit lire uniquement quelques enregistrements de données (généralement, pas plus
de trois). Le graphique illustre le cas le plus simple représenté par un seul enregistrement de données
stocké à chaque adresse.
L'utilisation d'une technique de hachage signifie que le temps d'accès ne dépend plus du nombre total
d'entrées dans la table. Au contraire, ce temps d'accès est toujours très rapide. Par conséquent, les
tables d'adresses calculées sont particulièrement utiles pour des tables volumineuses pour lesquelles
vous utilisez principalement des accès en lecture.
Les enregistrements de données ne sont pas insérés dans la table par séquence de tri. Comme pour les
tables standard, vous pouvez trier les tables d'adresses calculées à l'aide de l'instruction SORT :
SORT <tabi> [ASCENDING|DESCENDING]
[BY <f1> [ASCENDING|DESCENDING] ..
<fn> [ASCENDING|DESCENDING]][AS TEXT].
Le tri de la table peut être utile si vous souhaitez ultérieurement utiliser une boucle pour accéder à une
table.
Insertion
Pour les tables
Ligne indiv. INSERT <wa> INTO TABLE <tabi>. d'adresses calculées
et standard
Ligne d'origine INSERT INITIAL LINE INTO TABLE <tabi>. comme pour l'ajout
SAP AG 1999
Vous pouvez utiliser les instructions répertoriées dans cet exemple avec les tables contenant les trois
types. Sauf dans quelques cas, vous pouvez identifier les instructions à partir du mot-clé
supplémentaire TABLE. La mise en œuvre technique des instructions varie légèrement en fonction du
type de table.
En règle générale, l'accès à une table interne à l'aide d'un index est la méthode la plus rapide.
Cependant, il est parfois plus judicieux d'accéder à des données à l'aide de valeurs clés. Une clé unique
est possible uniquement avec des tables d'adresses calculées et triées. Si vous utilisez la syntaxe
affichée ici, le codage de votre programme est indépendant du type de table (spécification de type
générique, maintenance facilitée).
En présence d'une table standard, l'insertion d'une entrée a la même incidence que l'ajout. En présence
de tables triées comportant une clé non unique, l'entrée est insérée avant la première entrée (le cas
échéant) avec la même clé.
Pour lire des enregistrements de données individuels à l'aide de la première variante, toutes les zones de
<wa1> qui sont des zones-clés de <tabi> doivent être renseignées. <wa1> et <wa2> peuvent être
identiques. Si vous utilisez l'option WITH TABLE KEY dans la deuxième variante, spécifiez
également l'intégralité de la clé. Dans le cas contraire, le système effectue une recherche en fonction de
la séquence des zones spécifiées à l'aide d'une recherche binaire si possible. Vous pouvez forcer le
système à utiliser une recherche binaire avec une table standard à l'aide de l'option BINARY SEARCH.
Dans ce cas, triez préalablement la table par les zones correspondantes. Le système renvoie la première
entrée répondant au critère de sélection.
Modification
Suppression
Boucle
Comme pour la lecture des entrées, lorsque vous modifiez et supprimez des entrées à l'aide de la clé et
d'un espace de travail, spécifiez toutes les zones-clés.
L'option TRANSPORTING NO FIELDS dans la condition WHERE vous permet d'empêcher la
transmission des zones vers l'espace de travail lors du traitement de boucle. (Cette procédure peut
servir à compter le nombre d'entrées de type spécifique).
Instructions supplémentaires pour tous les types de tables
DELETE ADJACENT DUPLICATES FROM <tabi>
[COMPARING <f1> .. <fn> <fn>}|ALL FIELDS}].
|ALL FIEL
Le système supprime toutes les entrées adjacentes comprenant le même contenu de zone-clé, à
l'exception de la première entrée. Vous pouvez empêcher le système de comparer uniquement la
zone-clé à l'aide de l'option COMPARING. Si vous triez la table par les zones requises au préalable,
seules les entrées uniques demeurent dans la table après l'instruction DELETE ADJACENT
DUPLICATES.
Recherche la chaîne dans toutes les lignes de la table <tabi>. Si la recherche est fructueuse, le
système définit les zones sy-tabix et sy-fdpos.
FREE <tabi>.
Contrairement à CLEAR qui supprime uniquement le contenu de la table, FREE libère également la
mémoire occupée par celle-ci.
TYPES:
BEGIN OF t_cust,
id TYPE scustom-id,
name TYPE scustom-name,
city TYPE scustom-city,
reg_date LIKE sy-datum,
END OF t_cust,
DATA:
wa_cust TYPE t_cust,
wait_list TYPE t_cust_list,
SAP AG 1999
Pour accéder à vos données à l'aide d'un index et pour que votre table ne soit pas forcément gérée par
séquence de tri ou pour obtenir une clé unique, c'est-à-dire, que vous privilégiez la séquence des
entrées par rapport au tri par clé ou à l'obtention d'entrées uniques, utilisez les tables standard. (Si
vous décidez de la nécessité de trier la table ou d'y accéder à l'aide de la clé ou d'une recherche
binaire, vous pouvez toujours programmer ces fonctions manuellement).
Cet exemple traite de la gestion d'une liste d'attente.
Des fonctions standard sont répertoriées ci-dessous :
Ajout d'une entrée individuelle
Suppression d'entrées individuelles en fonction de certains critères
Affichage, puis suppression de la première entrée de la liste
Affichage de la fonction d'une personne dans la liste
Pour plus de simplicité, l'exemple ne couvre pas les fonctions dans les procédures.
Dans l'exemple, la première tâche consiste à déclarer le type de table et de ligne à partir desquels il est
ensuite possible de déclarer un espace de travail et notre table interne. Une zone élémentaire est
également requise pour la transmission des valeurs d'index explicites.
SAP AG 1999
Cet exemple omet les dialogues utilisateur et le transport des données en supposant que les principes
impliqués aient été assimilés. SAP souhaite uniquement mettre l'accent sur l'accès aux tables :
Ajout de nouvelles entrées
L'enregistrement de données pour un client en attente est ajouté à la table uniquement s'il n'existe pas
encore. Si la table comporte déjà une clé unique, il n'est pas nécessaire de programmer ce contrôle.
Suppression d'entrées individuelles en fonction de différents critères
La zone-clé est le critère. Cependant, d'autres critères sont possibles (par exemple, la suppression
d'enregistrements de données antérieurs à une date d'insertion spécifique reg_date).
Affichage et suppression de la première entrée de la liste
Une fois que le client a atteint le haut de la liste, vous pouvez supprimer son entrée. Si la liste
d'attente est vide, une telle action n'a aucune incidence. Par conséquent, il n'est pas nécessaire de
contrôler si des entrées existent dans la liste avant de tenter une suppression.
Affichage de la fonction d'un client dans la liste d'attente
Comme ci-dessus, il n'est pas nécessaire d'insérer des données dans l'espace de travail. Seules les
valeurs sy-subrc et sy-tabix doivent être prises en compte. Si l'entrée ne se trouve pas dans la
table, sy-tabix est défini sur zéro.
À ce stade, SAP renvoie au cas spécifique de classement limité suivant :
DATA <classement> TYPE|LIKE STANDARD TABLE OF ... INITIAL SIZE <n>.
...
APPEND <wa> INTO <classement> SORTED BY <f>.
DATA:
wa_flight TYPE sflight,
Généralement, vous choisissez d'utiliser une table triée, afin de définir une clé unique. Le fait que la
table soit gérée dans une séquence de tri n'est pas importante, car vous pouvez trier toute sorte de table
interne. Cependant, avec des tables triées (contrairement aux tables d'adresses calculées), les nouveaux
enregistrements de données sont insérés dans le bon ordre. Si une table comporte peu d'entrées mais de
nombreux accès modifiant le contenu, une table triée peut s'avérer plus efficace qu'une table d'adresses
calculées en termes de durée d'exécution.
Cet exemple vise à modifier le contenu d'une table de base de données. Pour ce faire, créez une copie
locale de la table dans le programme, apportez les modifications à la copie, puis écrivez à nouveau
toutes ses données dans la table de base de données. Lorsque vous traitez des volumes importants de
données, cette méthode permet de réduire la durée d'exécution et la charge sur le serveur de base de
données.
Puisque, dans ce cas, la table interne représente une table de base de données, assurez-vous, à l'aide de
la définition de clé, que ses enregistrements comportent des clés uniques. Le tri automatique peut
également comporter d'autres avantages.
Lorsque vous modifiez un groupe d'enregistrements de données, seuls les zones price et currency
sont copiées à partir de l'espace de travail.
Pour plus d'informations sur la modification des tables de base de données (cohérence des données,
problèmes d'autorisation et de blocage), référez-vous au cours BC414 (Programmation des mises à
jours de la base de données) et à la documentation en ligne.
TYPES:
BEGIN OF t_city,
city TYPE sgeocity-city,
country TYPE sgeocity-country,
latitude TYPE sgeocity-latitude,
longitude TYPE sgeocity-longitude,
END OF t_city,
DATA:
wa_city TYPE t_city,
city_list TYPE t_city_list.
PARAMETERS:
pa_city TYPE sgeocity-city,
pa_ctry TYPE sgeocity-country.
SAP AG 1999
L'algorithme de hachage calcule l'adresse d'une entrée en fonction de la clé. Ainsi, à l'aide de tables
volumineuses, le temps d'accès est réduit considérablement par rapport à une recherche binaire. Dans
une boucle, cependant, la table d'adresses calculées doit effectuer une recherche dans toute la table (full
table scan). Les entrées de la table étant stockées sans tri préalable, il est préférable d'utiliser une table
triée si vous souhaitez exécuter une boucle à l'aide d'une partie de clé justifiée à gauche. Vous pouvez
également utiliser une table d'adresses calculées à condition de la trier.
Les tables d'adresses calculées peuvent être utilisées, par exemple, pour bufferiser les informations
détaillées requises fréquemment et que vous pouvez identifier à l'aide d'une clé unique. Gardez à
l'esprit que vous pouvez également paramétrer la bufferisation d'une table dans le Dictionnaire ABAP,
afin de traiter exactement le même cas. Cependant, le fait que les tables soient bufferisées dans la table
d'application dépend de la taille de la table de base de données. La bufferisation dans le programme à
l'aide des tables d'adresses calculées vous permet également de réduire le stock de données en fonction
de vos besoins ou de bufferiser les données supplémentaires requises.
Dans cet exemple, SAP souhaite autoriser l'utilisateur à saisir le nom d'une ville et autoriser le système
à afficher ses coordonnées géographiques.
SAP AG 1999
Le "buffer de table" city_list est tout d'abord renseigné avec des valeurs issues de la table de base
de données sgeocity.
L'entrée de la table d'adresses calculées est ensuite lue, en spécifiant la clé complète.
Les détails sont affichés sous forme de liste simple.
À ce stade, il est important de rappeler que cette technique de bufferisation doit être utilisée uniquement
si vous souhaitez conserver localement d'importants volumes de données dans le programme.
Assurez-vous d'avoir spécifié votre table d'adresses calculées de façon à pouvoir définir la clé complète
lorsque vous y accédez à partir de votre programme.
READ TABLE <tabi> INDEX <n> READ TABLE <tabi> INDEX <n>.
INTO <wa>
<wa>.
LOOP AT <tabi> INTO <wa>.
INTO <wa> LOOP AT <tabi>.
WRITE <wa>-<f>. WRITE <tabi>-<f>.
ENDLOOP. ENDLOOP.
Vous pouvez définir des tables internes avec (option WITH HEADER LINE) ou sans en-têtes. Une
table interne avec un en-tête comporte un espace de travail (en-tête) et la table réelle. Traitez les deux
objets avec le même nom. Le mode d'interprétation du nom par le système dépend du contexte. Par
exemple, les instructions MOVE et SEARCH s'appliquent respectivement à l'en-tête et à la table.
Pour éviter les erreurs, il est recommandé d'utiliser des tables internes sans en-têtes, surtout lorsque
vous utilisez des tables imbriquées. Cependant, les tables internes comportant un en-tête ont une
syntaxe plus courte dans plusieurs instructions (APPEND, INSERT, MODIFY, COLLECT, DELETE,
READ, LOOP). Dans ABAP Objects, vous pouvez utilisez uniquement les tables internes sans en-tête.
Vous pouvez toujours traiter le corps d'une table interne <tabi> de manière explicite en suivant la
syntaxe suivante : <tabi>[]. Cette syntaxe est toujours valide, que la table interne comporte un en-
tête ou non.
Exemple
DATA itab1 TYPE TABLE OF i WITH HEADER LINE.
DATA itab2 TYPE TABLE OF i WITH HEADER LINE.
LH 1766669
SELECT carrid price
SQ 492837 FROM sflight
INTO wa.
COLLECT wa INTO it_carr_list
it_carr_list.
ENDSELECT.
SAP AG 1999
Vous pouvez utiliser uniquement l'instruction COLLECT avec les tables internes dont les zones non
clés sont toutes numériques (type I, P ou F).
L'instruction COLLECT ajoute l'espace de travail ou l'en-tête à une entrée interne comportant le même
type ou, s'il n'en existe pas, ajoute une nouvelle entrée à la table. Elle recherche l'entrée en fonction du
type de table et de la clé définie. Si une entrée est trouvée, elle ajoute toutes les zones numériques ne
faisant pas partie de la clé aux valeurs existantes. Si aucune entrée n'est encore présente dans la table,
elle ajoute le contenu de l'espace de travail ou l'en-tête à la fin de la table.
Lecture
READ TABLE <tabi> [INDEX <n> |
FROM <wa> |
WITH [TABLE] KEY ...] ASSIGNING <<ligne_sz>>.
Boucles
LoopsAT <tabi> ASSIGNING <<ligne_sz>> [WHERE ...].
LOOP
...
ENDLOOP.
SAP AG 1999
Lorsque vous lisez une ligne de table à l'aide de l'instruction READ ou une série de lignes de tables à
l'aide de l'instruction LOOP AT, vous pouvez affecter les lignes de la table interne à un field symbol
à l'aide de l'option ... ASSIGNING <<field_symbol>>. Le field symbol
<<field_symbol>> pointe ensuite vers la ligne affectée, vous permettant d'y accéder
directement. Par conséquent, le système ne doit pas copier l'entrée de la table interne vers l'espace de
travail et inversement.
Le field symbol <<field_symbol>> doit comporter le même type que le type de ligne de la table
interne.
Cependant, lorsque vous utilisez cette technique, prenez en compte les limites suivantes :
Vous pouvez modifier le contenu des zones-clés uniquement si la table est une table standard.
Il est impossible d'utiliser l'instruction SUM au niveau du traitement du niveau de groupe.
(L'instruction SUM ajoute toutes les zones numériques dans l'espace de travail).
Cette technique est particulièrement utile pour accéder à de nombreuses lignes de tables ou tables
imbriquées dans une boucle. La durée de copie des valeurs à partir de et vers l'espace de travail dans
ce type d'opération est particulièrement longue.
TYPES:
BEGIN OF t_conn,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
END OF t_conn.
DATA:
conn_list TYPE STANDARD TABLE OF t_conn,
BEGIN OF wa_travel,
dest TYPE spfli-cityto,
cofl_list LIKE conn_list,
END OF wa_travel,
PARAMETERS
pa_start TYPE spfli-cityfrom DEFAULT 'FRANKFURT'.
SAP AG 1999
Dans cet exemple, l'utilisateur doit être en mesure de saisir une ville de départ pour laquelle tous les
vols possibles sont ensuite répertoriés.
Pour ce faire, une table interne (cofl_list) et une table externe ( travel_list) sont déclarées
avec des espaces de travail correspondants.
Une table interne supplémentaire (conn_list) bufferise, puis trie toutes les correspondances.
Remarque
Pour permettre l'accès à la boucle à l'aide des field symbols, les types du buffer de table et de la table
interne doivent être identiques. Par ailleurs, une autre étape consiste à trier la table ultérieurement selon
différents critères. Par conséquent, les tables standard sont utilisées, et non pas celles qui sont triées.
FIELD-SYMBOLS:
<conn_sz> TYPE t_conn,
<int_conn_sz> TYPE t_conn,
<déplacement_sz> LIKE wa_travel.
SAP AG 1999
Il est également nécessaire de déclarer trois field symbols avec les types de lignes des tables internes.
Tout d'abord, les correspondances commençant dans la ville saisie dans pa_start sont affectées au
field symbol <conn_sz>.
Seule la ville d'arrivée de chaque correspondance nous intéresse. Il s'agit de la première entrée dans
une ligne de la table externe travel_list.
Pour obtenir une table triée correctement, la table interne wa_travel-cofl_list doit être
renseignée avec les villes accessibles depuis cette table. Pour ce faire, le programme recherche les
correspondances appropriées, puis les ajoute à la table interne.
La zone cityfrom est ensuite initialisée, car elle est requise pour le traitement du niveau de groupe
dans l'affichage. La table est ensuite triée en fonction des zones cityto et carrid.
*** sortie :
LOOP AT travel_list ASSIGNING <déplacement_sz>.
WRITE: / <déplacement_sz>-dest.
ENDLOOP.
SAP AG 1999
Le traitement du niveau de groupe étant utilisé dans cet exemple, seules les villes d'arrivée sont
répertoriées dans la liste.
Remarque
Ce problème peut être résolu à l'aide des instructions imbriquées SELECT. Cependant, cette solution ne
semble pas réaliste en raison de la charge excessive placée sur le serveur de base de données.
READ TABLE
LOOP AT
MODIFY
DELETE
COLLECT
SAP AG 1999
L'accès index (APPEND, INSERT ... INDEX, LOOP ... FROM TO, etc.) est possible pour les
tables standard et triées. De cette façon, une erreur à l'exécution peut avoir lieu en tronquant la
séquence de tri si vous utilisez INSERT avec un index ou APPEND dans une table triée.
L'instruction SORT peut s'appliquer uniquement aux tables standard et d'adresses calculées. Elle n'a
aucune conséquence positive sur une table triée et peut entraîner une syntaxe d'erreur ou de durée
d'exécution si le tri enfreint la séquence de tri.
Vous pouvez utilisez l'accès clé pour tout type de table mais la durée d'exécution requise varie en
fonction du type de table. La durée d'exécution dépend de l'appartenance ou non des valeurs à la clé (la
séquence dans laquelle elles sont transmises est, par conséquent, également importante). L'instruction
INSERT pour une table standard ou une table d'adresses calculées à l'aide de la clé a les mêmes
conséquences que l'instruction APPEND.
Le système prend en charge le traitement du niveau de groupe pour tous les types de tables. Les
tables standard et d'adresses calculées doivent être triées au préalable.
Aperçu
Pour traiter les enregistrements de données comportant des structures différentes, utilisez des extraits.
Pour plus d'informations sur le traitement du niveau de groupe et les extraits, référez-vous au cours
BC405 (Reporting dans ABAP Workbench).
SAP AG 1999
1-1 Copiez votre solution à l'exercice 1 du dernier chapitre (ou la solution de modèle)
dans le nouveau programme Z##_BC402_COUNTERLIST2.
1-2 Renseignez la table interne it_airport_buffer avec les codes des aéroports
et leurs noms provenant de la table transparente SAIRPORT.
1-3 Utilisez une boucle pour sélectionner des données dans la table transparente
SCOUNTER pour toutes les compagnies aériennes dans la sélection de l'utilisateur.
Vous pouvez renseigner directement les zones carrid, countnum et airport
dans l'espace de travail wa_counter. Pour renseigner la zone airp_name,
utilisez un accès en enregistrement individuel à la table interne
it_airport_buffer. Une fois l'espace de travail renseigné, ajoutez-le à la
table interne it_carr_counter.
1-4 Affichez la table interne it_carr_counter triée par les zones airport et
carrid par ordre croissant.
2-1 Copiez votre solution à l'exercice 2 du dernier chapitre (ou la solution de modèle)
dans le nouveau programme Z##_BC402_FLIGHTLIST2.
2-4 Affichez ensuite le contenu de la table interne it_flights sous forme de liste.
Pour ce faire, utilisez le field symbol <vol_sz>, saisi de manière appropriée.
Affichez uniquement les vols comportant au moins une réservation. Lors de
l'affichage du montant, gardez en mémoire l'option CURRENCY.
*&-----------------------------------------------------------*
*& État SAPBC402_TABS_COUNTERLIST2 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 : opérations sur les tables
internes *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_tabs_counterlist2.
TYPES:
BEGIN OF t_airport,
id TYPE sairport-id,
name TYPE sairport-name,
END OF t_airport,
BEGIN OF t_counter,
airport TYPE scounter-airport,
airp_name TYPE sairport-name,
carrid TYPE scounter-carrid,
countnum TYPE scounter-countnum,
END OF t_counter.
DATA:
ENDSELECT.
* affichage de la liste :
*************************
LOOP AT it_carr_counter INTO wa_counter.
WRITE: / wa_counter-airport,
wa_counter-airp_name,
wa_counter-carrid,
wa_counter-countnum.
ENDLOOP.
*&-----------------------------------------------------------*
*& État SAPBC402_TABS_FLIGHTLIST2 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 2 : opérations sur les tables
internes *
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_tabs_flightlist2.
TYPES:
BEGIN OF t_flight,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
seatsocc TYPE sflight-seatsocc,
paymentsum TYPE sflight-paymentsum,
currency TYPE sflight-currency,
it_planes TYPE bc402_typs_planetab,
END OF t_flight,
DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.
ENDSELECT.
ENDSELECT.
Contenu
Définition de l'interface
Appel de sous-programmes
Durée de vie et visibilité
Utilisation
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
... "instructions
ENDFORM.
SAP AG 1999
Un sous-programme est une unité de modularisation interne dans un programme vers laquelle il est
possible de transférer des données à l'aide d'une interface. Les sous-programmes servent à encapsuler
les parties de votre programme pour faciliter la compréhension du programme ou car une section
spécifique du codage est utilisée à plusieurs points du programme. Votre programme est alors
davantage orienté fonction et comprend une tâche divisée en différentes fonctions de composant,
ainsi qu'un sous-programme différent pour chacune de ces fonctions.
En règle générale, les sous-programmes facilitent également la gestion de vos programmes. Par
exemple, vous pouvez les exécuter de manière "invisible" dans le débogueur, puis visualiser
uniquement le résultat. Par conséquent, si vous savez pertinemment qu'aucune erreur n'est présente
dans le sous-programme, vous pouvez identifier la source de l'erreur plus rapidement.
Organisation d'un sous-programme
Un sous-programme commence par l'instruction FORM et se termine par ENDFORM.
Après le nom du sous-programme, programmez l'interface. Dans l'instruction FORM, spécifiez les
paramètres formels, puis affectez-leur des types le cas échéant. Les paramètres doivent apparaître
dans une séquence fixe (les paramètres d'import, puis les paramètres d'import/export). Dans le sous-
programme, traitez les données que vous lui avez transférées à l'aide des paramètres formels.
Vous pouvez déclarer les données locales dans un sous-programme.
Après chaque déclaration de données locales, programmez les instructions exécutées comme faisant
partie du sous-programme.
SAP AG 1999
Définissez la méthode de transfert des données du programme principal (paramètres effectifs do1,
do2, do3 et do4) vers les objets de données dans le sous-programme (paramètres formels p1, p2,
p3, p4) dans l'interface. Il existe trois possibilités :
Appel par référence (p1, p3)
L'adresse déréférencée du paramètre effectif est transférée au sous-programme.
Les options USING et CHANGING ont les mêmes incidences (d'un point de vue technique).
Cependant, l'option USING entraîne un avertissement dans le contrôle de programme.
Appel par valeur (p2)
Une copie locale en "lecture seule" du paramètre effectif est transférée au sous-programme.
Effectuez cette opération à l'aide de la formule USING value(<paramètre formel>).
Appel par valeur et résultat (p4)
Une copie modifiable locale du paramètre effectif est transférée au sous-programme. Effectuez cette
opération à l'aide de la formule USING value(<paramètre formel>).
Pour vous assurer que la valeur du paramètre effectif n'est pas modifiée si le sous-programme se
termine prématurément, utilisez cette méthode.
Lorsque vous utilisez des tables internes comme paramètres, utilisez la méthode appel par
référence pour vous assurer que le système ne copie pas une table interne volumineuse.
[TYPE i|f|d|t}]
[TYPE LINE OF <type_tabi>|LIKE LINE OF <tabi>]
[TYPE <type_de_données> |LIKE
<objet_de_données>]
[TYPE REF TO ..]
..
ENDFORM.
SAP AG 1999
Les objets de données transférés vers un sous-programme peuvent comporter tout type de données. En
matière de spécification des types de données, il existe différentes règles :
Vous pouvez spécifier le type pour les types élémentaires.
Si tel est le cas, le contrôle de syntaxe renvoie un message d'erreur si vous tentez de transférer un
paramètre effectif de type différent vers le paramètre formel. La non spécification d'un type revient à
écrire TYPE ANY. Dans ce cas, le paramètre formel "hérite" de son type à partir du paramètre effectif
au runtime. Si les instructions contenues dans le sous-programme ne sont pas compatibles avec ce
type de données, une erreur à l'exécution a lieu.
Les types de données I, F, D et T sont déjà entièrement spécifiés. Si, d'autre part, vous utilisez P, N,
C ou X, les attributs manquants sont créés à partir du paramètre effectif. Pour spécifier entièrement
le type, définissez-en un vous-même (bien qu'un type défini par l'utilisateur puisse être générique).
Lorsque vous utilisez STRING ou XSTRING, la spécification complète ne s'effectue pas avant
l'exécution.
Vous devez spécifier le type de structures et de références.
Vous devez définir le type d'une table interne. Cependant, vous pouvez utiliser un type générique, à
savoir, programmez le sous-programme pour rendre corrects les différents types de la table interne,
puis spécifiez le type :
• À l'aide de la spécification d'interface correspondante :
TYPE [ANY|INDEX|STANDARD|SORTED|HASHED] TABLE,
(TYPE TABLE est la formule abrégée de TYPE STANDARD TABLE)
• À l'aide du type de table générique défini par l'utilisateur.
...
...
...
PERFORM <s_prog>
...
DATA: ...
do1 ..,
do2 ..,
do3 ..,
do4 ...
...
PERFORM <sprog> USING do1 do2 CHANGING do3 do4.
...
Lorsque vous appelez un sous-programme, les paramètres sont transférés dans la séquence dans
laquelle ils sont répertoriés.
Les types de paramètres et leur méthode de transfert sont déterminés dans la définition de l'interface.
Lors de l'appel du sous-programme, répertoriez les paramètres effectifs situés après USING et
CHANGING de la même manière. L'appel et la définition de l'interface doivent contenir un nombre
identique de paramètres.
La meilleure solution consiste à définir le sous-programme, puis à utiliser la fonction Modèle dans
l'Éditeur ABAP pour générer l'appel. De cette manière, aucune erreur ne peut survenir dans l'interface.
Votre tâche consiste à remplacer les paramètres formels par les paramètres effectifs appropriés.
Si vous transférez une table interne avec un en-tête, le nom est interprété comme l'en-tête. Pour
transférer le corps d'une table interne avec un en-tête, utilisez la formule <tabi>[]. Dans le sous-
programme, la table interne ne comporte pas d'en-tête.
Exemple
DATA it_spfli TYPE TABLE OF spfli WITH HEADER LINE.
...
PERFORM demosub CHANGING it_spfli[].
...
FORM demosub CHANGING p_spfli LIKE it_spfli[].
DATA wa_p_spfli LIKE LINE OF p_spfli.
...
ENDFORM.
DATA:
do1 ..,
do2 ..,
do3 ..,
do4 ...
...
PERFORM <s_prog> USING do1 CHANGING do2.
...
ENDFORM.
SAP AG 1999
Les paramètres formels et les objets de données locaux définis dans un sous-programme sont visibles
uniquement lorsque le sous-programme est actif. Ceci signifie que l'espace mémoire approprié est
alloué uniquement lors de l'appel du sous-programme, puis est libéré à la fin du sous-programme.
Les données peuvent être uniquement traitées à ce moment. Les règles générales sont présentées ci-
dessous :
Vous pouvez traiter les objets de données globaux à partir du sous-programme. Cependant, cette
opération est déconseillée, car l'interface s'en trouve ignorée et des erreurs de codage peuvent
survenir.
Vous pouvez traiter uniquement les paramètres formels et les objets de données locaux à partir du
sous-programme.
Si un paramètre formel ou un objet de données local comporte le même nom qu'un objet de données
global, l'objet global est dit masqué localement par l'objet local. Ainsi, si vous traitez un objet avec
le nom partagé dans le sous-programme, le système utilise l'objet local, si vous utilisez le même
nom en dehors du sous-programme, le système utilise l'objet global.
Résumé
Traitez les objets de données globaux dans le programme principal puis, pour les utiliser dans le
sous-programme, transférez-les à l'aide de l'interface.
Dans le sous-programme, traitez uniquement les paramètres formels et les objets de données locaux.
Évitez d'affecter des noms identiques aux objets globaux et locaux. Par exemple, utilisez un préfixe,
tel que p_ pour un paramètre et l_ pour les données locales.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Cet exemple appelle le sous-programme demosub. Il contient un objet de données local avec une
valeur initiale et modifie les quatre paramètres formels.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Le système alloue deux zones de mémoire p2 et p4 pour les deux appels à l'aide des paramètres de
valeur d2 et d4, puis les renseigne à l'aide des valeurs correspondantes. Il alloue également de la
mémoire pour l'objet de données local l_do, puis le renseigne avec une valeur initiale.
Aucune option VALUE n'existe pour p1 ou p3. Ainsi, les modifications apportées à l'exécution
affectent les paramètres effectifs directement, puis le traitement de do1 peut être effectué directement
à l'aide de p1.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Il en est de même pour p3 et p1. Si l'option VALUE n'est pas utilisée, USING et CHANGING ont les
mêmes incidences.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Le contenu de do3 est directement affecté par les modifications apportées à p3.
Comme pour p2, une copie locale a été créée pour p4. Par conséquent, les modifications apportées au
paramètre formel n'ont aucune incidence sur le paramètre effectif lors de l'exécution du sous-
programme.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Les modifications sont prises en compte dans les paramètres effectifs uniquement lorsque l'instruction
ENDFORM est terminée.
...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...
DATA:
l_do .. VALUE ..
p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.
ENDFORM.
SAP AG 1999
Si, pour une raison quelconque, demosub est interrompu, do4 reprend la valeur qu'il possédait avant
l'appel.
Une fois l'exécution de demosub terminée, la mémoire occupée par ses objets de données locaux est
libérée. Il n'est désormais plus possible de traiter ces objets de données.
Notez que do2 comporte toujours son ancienne valeur, même si p2 a été modifié dans le sous-
programme.
PARAMETERS:
pa_type TYPE saplane-planetype,
pa_occ TYPE saplane-seatsmax.
WRITE res_seats.
**********************************************************************
FORM get_free_seats USING p_planetype TYPE saplane-planetype
p_seatsocc TYPE saplane-seatsmax
CHANGING value(p_seatsfree) TYPE saplane-seatsmax.
Dans l'exemple ci-dessus, le sous-programme doit calculer le nombre de places disponibles dans un
avion en fonction du type d'appareil et du nombre de places déjà occupées.
Les paramètres p_planetype et p_seatsocc sont transférés par référence au sous-programme
get_free_seats. Dans l'interface, USING indique que seul leur accès en lecture est possible.
D'autre part, le résultat p_seatsfree est renvoyé en copiant sa valeur.
Pour plus de simplicité, le programme principal est limité à un écran de sélection dans lequel
l'utilisateur peut saisir des valeurs, le sous-programme s'appeler et la liste s'afficher.
D'un point de vue technique, il est possible d'appeler des sous-programmes à partir d'autres programmes
principaux. Cependant, cette technique de programmation étant obsolète, utilisez plutôt des modules
fonction. Ces derniers offrent des avantages considérables et constituent des composantes importantes
dans ABAP Workbench. Pour plus d'informations, référez-vous au chapitre Groupes de fonctions et
modules fonction.
FORM find_conn
find_conn USING p_pos TYPE <type_de_ville>
p_dest TYPE <type_de_ville>
CHANGING p_step_list TYPE <type_liste_étapes>.
DATA:
l_poss_list TYPE <type_liste_étape>,
l_wa_poss TYPE <type_étape>.
Vous pouvez également utiliser les sous-programmes par appels récursifs. Bien que d'autres unités de
modularisation puissent, en principe, être appelées de manière récursive, la durée d'exécution requise
est souvent excessive pour les petites récursions facilement programmées.
Cet exemple utilise une solution récursive pour rechercher un lien entre deux villes. Pour rechercher
une correspondance entre A et Z, le programme recherche un vol de A à B, puis de B à Z. Le sous-
programme find_conn s'appelle.
S'il n'existe aucune correspondance directe, le programme utilise la ville courante (p_pos) pour
compiler une liste de toutes les villes disponibles (l_poss_list) et qui ne figurent pas encore
dans la liste des itinéraires (p_step_list). La liste des itinéraires est définie comme une table
standard en vue de conserver l'ordre des villes dans l'itinéraire.
ELSE.
*** tentez de continuer avec les étapes suivantes disponibles :
LOOP AT l_poss_list INTO l_wa_poss.
READ TABLE p_step_list WITH KEY cityto = l_wa_poss-cityto
no_way_out = 'X'
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
...
APPEND wa_step TO p_step_list.
find_conn USING
PERFORM find_conn l_wa_poss-cityto
p_dest
CHANGING p_step_list.
SAP AG 1999
Pour plus de simplicité, le système supprime les doublons présents dans la liste des villes. Ainsi, le
sous-programme se termine par une seule correspondance possible.
Cependant, il est également possible de supprimer cette correspondance et d'examiner toutes celles
qui sont disponibles, par exemple, pour le nombre d'escales, la distance totale, etc.
S'il n'est pas possible d'obtenir d'autres villes que celles déjà visitées lors du même séjour, puis la
ville courante sur l'itinéraire est définie comme une "impasse".
Dans le cas contraire, les villes dans lesquelles il est possible de voyager sont traitées dans une
boucle. Chaque ville est inclue dans la liste des itinéraires, afin que le programme puisse continuer sa
recherche. Cependant, avant cette étape, le programme doit rechercher si la ville a déjà été définie
comme une impasse lors d'une recherche précédente.
SAP AG 1999
Une fois la destination trouvée, le traitement est terminé. À ce stade, toute autre recherche s'avérerait
infructueuse. La ville apparaît dans la liste des itinéraires et la recherche continue d'être effectuée sur
la prochaine ville disponible.
La logique de traitement pour ce sous-programme est contenue dans le groupe de fonctions
LBC402_SURD_RECURSION, programme INCLUDE LBC402_SURD_RECURSIONF01. Le
sous-programme est appelé à partir du module fonction BC402_SURD_TRAVEL_LIST, lui-même
appelé à partir du programme exécutable SAPBC402_SURD_RECURSION. Ce programme
répertorie tous les vols possibles dans le mode des données de vol et particulièrement ceux contenant
des escales.
SAP AG 1999
Chapitre : sous-programmes
Sujet : interface, fonctions et appel
1-1 Copiez votre solution à l'exercice 2 du dernier chapitre (ou la solution de modèle)
dans le nouveau programme Z##_BC402_FLIGHTLIST3.
1-4 Supprimez les instructions utilisées pour créer la liste à partir du programme
principal, puis insérez-les (modifiées de manière appropriée) dans le
sous-programme.
Chapitre : sous-programmes
Sujet : interface, fonctions et appel
*&-----------------------------------------------------------*
*& État SAPBC402_SURS_FLIGHTLIST3 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice : sous-programmes
*
*& *
*&-----------------------------------------------------------*
REPORT sapbc402_surs_flightlist3.
TYPES:
BEGIN OF t_flight,
carrid TYPE spfli-carrid,
connid TYPE spfli-connid,
fldate TYPE sflight-fldate,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
seatsocc TYPE sflight-seatsocc,
paymentsum TYPE sflight-paymentsum,
currency TYPE sflight-currency,
it_planes TYPE bc402_typs_planetab,
END OF t_flight,
DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.
ENDSELECT.
ENDSELECT.
ENDFORM.
Contenu :
Définition de l'interface
Modules fonction dans les groupes de fonctions
Appel d'un module fonction
Comportement de la durée d'exécution
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
Actif/inactif
Paramètres transmis par nom
Concept d'extension
Paramètres facultatifs
Valeurs par défaut
Exceptions
Dictionnaire ABAP
Éditeur ABAP
Mises à jour
SAP AG 1999
Les modules fonction sont plus conviviaux que les sous-programmes et leurs possibilités d'utilisations
sont plus importantes. La liste suivante, qui ne prétend pas être exhaustive, détaille le rôle essentiel
joué par les modules fonction dans ABAP Workbench :
Les modules fonction ...
Sont intégrés de manière active dans ABAP Workbench. Vous les créez, puis les gérez à l'aide du
Générateur de modules fonction.
Peuvent comporter des paramètres d'import et de modification auxquels vous pouvez affecter des
valeurs par défaut.
Peuvent déclencher des exceptions grâce auxquelles la zone code retour sy-subrc est renseignée.
Peuvent être activés à distance.
Peuvent être exécutés de manière asynchrone, ce qui vous permet d'exécuter des processus
parallèles.
Peuvent être activés pour les mises à jour.
Jouent un rôle important dans le concept d'extension SAP.
Par exemple, le calcul du nombre de places disponibles dans un avion sera effectué. Les diapositives
suivantes illustrent les étapes individuelles nécessaires à la création d'un module fonction.
SAP AG 1999
Dans les attributs d'un module fonction, spécifiez ses données de gestion générales et le type de
traitement :
Les modules fonction activés à distance peuvent être appelés de manière asynchrone dans le même
système et également à partir d'autres systèmes (et pas seulement les systèmes R/3). Pour appeler un
module fonction dans un autre système, une connexion système correcte doit être établie. Pour plus
d'informations, référez-vous au chapitre BC415 (ABAP Workbench - Interfaces de
communication).
Les modules fonction de mise à jour contiennent des fonctions supplémentaires permettant de
regrouper les modifications de bases de données. Pour plus d'informations, référez-vous au chapitre
BC414 (Programmation des mises à jour de la base de données) et à la documentation en ligne.
Cette documentation détaille également les limites de l'interface qui s'appliquent aux modules fonction
de mise à jour et activés à distance.
Nom du paramètre Typing Type de réf. Trans. par valeur Désig. synt.
EP_SEATSFREE TYPE S_SEATSMAX ! Places disponibles
SAP AG 1999
Lors de l'échange de données avec les modules fonction, trois types de paramètres sont clairement
définis:
Les paramètres d'import, reçus par le module fonction
Les paramètres d'export, renvoyés par le module fonction
Les paramètres de modification, reçus et renvoyés.
Par défaut, tous les paramètres sont transmis par référence. Pour éviter des effets indésirables, vous
pouvez uniquement modifier les paramètres d'export et de modification dans le module fonction.
Pour transmettre les paramètres par valeur, sélectionnez l'option appropriée lors de la définition de
l'interface.
Vous pouvez également déclarer les paramètres d'import et de modification comme facultatifs. Il n'est
pas nécessaire de transmettre les valeurs vers ces paramètres lors de l'appel d'un module fonction.
Le cas échéant, utilisez cette option lors de l'ajout de nouveaux paramètres aux modules fonction en
cours d'utilisation. Vous pouvez affecter une valeur par défaut à un paramètre facultatif. Si vous ne
transmettez pas une de vos valeurs lors de l'appel du module fonction, le système utilise alors la
valeur par défaut. Les paramètres d'export sont toujours facultatifs.
Vous pouvez spécifier le type d'un paramètre élémentaire. Vous devez spécifier le type d'un paramètre
de table ou de structure. Vous pouvez utiliser les types de Dictionnaire ABAP, les objets du
Dictionnaire ABAP, les types prédéfinis du Dictionnaire ABAP (I, F, P, N, C, STRING,
X, XSTRING, D, T) ou les types définis par l'utilisateur. Tout conflit relatif au type apparaît
dans le contrôle de programme(s) étendu.
Les paramètres de table sont obsolètes pour les modules fonction classiques. Ils sont toutefois conservés
pour s'assurer de la compatibilité des modules fonction avec d'autres modes d'exécution.
FUNCTION bc402_fmdd_get_free_seats.
*"---------------------------------
*"*"Interface locale :
*" IMPORTING
*" EXPORTING
*" EXCEPTIONS
*"---------------------------------
...
ENDFUNCTION.
SAP AG 1999
Lors de la sauvegarde de l'interface, le système génère la structure de l'instruction, ainsi que le bloc de
commentaires répertoriant les paramètres d'interface :
FUNCTION <nom>.
*"--------------
*" ...
*"--------------
...
ENDFUNCTION.
Le bloc de commentaires est mis à jour automatiquement si vous apportez des modifications ultérieures
au module fonction. Ainsi, lors du codage du module fonction, la définition de l'interface est toujours
visible.
Programmez les instructions comme vous le feriez pour tout autre programme de l'Éditeur ABAP.
Dans le module fonction, vous pouvez créer vos propres types et objets de données locaux, puis appeler
les sous-programmes ou d'autres modules fonction.
RAISE <exception>.
SAP AG 1999
SAP AG 1999
Les modules fonction diffèrent des sous-programmes dans le sens où ils seront utilisés par d'autres
programmeurs. Pour cette raison, assurez-vous d'avoir exécuté les étapes énumérés ici.
Documentation (peut être traduite)
Documentez vos paramètres et vos exceptions avec des désignations synthétiques (et des textes
descriptifs, le cas échéant), ainsi que l'intégralité de votre module fonction. Pour ce faire, utilisez
l'éditeur de texte, contenant des sections prédéfinies, telles que Fonctionnalités, Appel d'exemple,
Conseils et Informations supplémentaires.
Liste de travail
Lorsque vous modifiez un module fonction actif, il prend le statut actif (révisé). Lorsque vous le
sauvegardez, une autre version est créée avec le statut inactif. Lorsque vous utilisez un module
fonction, vous pouvez basculer entre la version inactive et la dernière version activée. Lorsque vous
activez la version inactive, la dernière version active est remplacée.
Test de fonction
Une fois le module fonction activé, vous pouvez le tester à l'aide de l'environnement de test prédéfini
dans le Générateur de modules fonction. Si une exception est déclenchée, l'environnement de test
l'affiche, ainsi que tout autre message ayant pu être spécifié. Vous pouvez également basculer entre
le débogueur et l'outil d'analyse de la durée d'exécution. Vous pouvez sauvegarder les données de
test, puis comparer l'ensemble des résultats.
CALL
CALL FUNCTION
FUNCTION ''BC402_FMDD_GET_FREE_SEATS''
EXPORTING
ip_planetype = pa_type
ip_seatsocc = pa_occ " valeur par défaut : 0
IMPORTING
IMPORTING
ep_seatsfree = result Insertion d'un modèle
EXCEPTIONS CALL FUNCTION BC402_FMDD_GET_FREE_SEATS
...
no_seats = 1
...
overload = 2 ...
OTHERS = 3. ...
CASE sy-subrc. ...
WHEN 0.
WRITE: / result COLOR 5.
WHEN 1.
WRITE: / 'Attention, c'est un avion-cargo'(frt).
WHEN 2.
WRITE: / 'L'avion est déjà surchargé '(nos).
WHEN 3.
WRITE: / 'Contactez votre administrateur système'(adm).
ENDCASE.
SAP AG 1999
Lorsque vous insérez un appel du module fonction dans votre programme, utilisez la fonction Modèle.
Il vous suffit ensuite de saisir le nom du module fonction (l'aide à la saisie est disponible). Le
système insère ensuite le traitement des appels et des exceptions (instruction MESSAGE) dans votre
programme.
Affectez les paramètres par nom. Les paramètres formels sont toujours situés à gauche des expressions
:
Les paramètres d'export sont transmis par le programme. Si un paramètre est facultatif, sa
transmission est inutile. Les valeurs par défaut apparaissent si elles existent.
Les paramètres d'import sont reçus par le programme. Tous les paramètres d'import sont facultatifs.
Les paramètres de modification sont à la fois transmis et reçus. Il n'est pas nécessaire de
répertorier les paramètres facultatifs. Les valeurs par défaut apparaissent si elles existent.
Le système affecte une valeur à chaque exception, en commençant par la valeur un et en continuant à
numéroter ces exceptions de manière séquentielle en fonction de leur ordre de déclaration dans la
définition du module fonction. Vous pouvez affecter une valeur à toutes les autres exceptions qui ne
sont pas spécifiquement répertoriées à l'aide de l'exception spécifique OTHERS.
Si vous répertoriez les exceptions et qu'une d'elles est déclenchée dans le module fonction, la valeur
correspondante est insérée dans la zone de code retour sy-subrc. Si l'exception n'a pas été
répertoriée dans l'appel de fonction, un message ou une erreur survient à l'exécution selon
l'instruction utilisée dans le module fonction pour déclencher l'exception.
e n Mo Int
fr ac nctio du erf
e
Int le fo le ac
du FM
1 FM fonc e
Mo 2 tio
n
Sous-
FM3 ction
programme
M od
Interface
face
ul e f
Inter
le fo
F M5
onc t
Inter
u
face
Mod
i on
Module fonction
FM4
Interface
SAP AG 1999
Lorsque vous créez un module fonction, affectez-le à un groupe de fonctions. Ce dernier correspond
au programme principal dans lequel est incorporé un module fonction.
Un groupe de fonctions est un programme de type F et n'est pas exécutable. L'ensemble du groupe de
fonctions est chargé dans un programme lors du premier appel d'un module fonction lui appartenant.
Le système déclenche également l'événement LOAD-OF-PROGRAM pour le groupe de fonctions.
Le groupe de fonctions demeure actif en arrière-plan jusqu'à la fin du programme appelant. Par
conséquent, il s'agit d'un moyen approprié pour conserver les objets de données pendant toute la durée
d'un programme. Tous les modules fonction contenus dans un groupe peuvent accéder aux données
globales du groupe.
Il en est de même pour les dynpros. Pour appeler un dynrpo à partir de plusieurs programmes différents,
créez-le dans un groupe de fonctions. Créez ensuite les objets de données ABAP avec les mêmes noms
que les zones de dynpro du groupe de fonctions. Le dynpro et le transport des données peuvent
désormais être contrôlés à l'aide des modules fonction du groupe.
Exemples : groupes de fonctions SPO1 à SPO6.
Pour plus d'informations sur cette technique, référez-vous au cours BC410 (Programmation
interactive).
ip_cust
Ajouter le client
os
d'a la li oste
_n id
i ip
à la liste
_p
Su t de
clie
ip ip_
_i
tte ste
ew
pp
ns le p
Liste d'attente
d
rim la lis
nte
ie r
er te
dif
le
da
Mo
Structure de transport
Affichage de liste
Re te da tente
te
'at la
po d'a
list
ten
nv
e d er
s
list ffich
oy ns la
e
ip pos
er
ep
A
t
le
_i
_
Déplacer les
d
ep_cust
SAP AG 1999
SAP renvoie à l'exemple de la liste d'attente situé dans le chapitre Opérations sur les tables internes.
La gestion d'une liste d'attente à l'aide de sous-programmes constitue une source d'erreurs, car la liste
représente dans ce cas un objet global et peut être modifiée dans le programme principal.
Par ailleurs, les listes d'attente correspondent à une application commune. Si vous écrivez une solution,
cette dernière est susceptible d'être utilisée par d'autres développeurs. Par conséquent, mettez-la à
disposition de manière centrale dans ABAP Workbench pour que les autres programmeurs n'aient
pas à effectuer à nouveau la même tâche. Si, par exemple, ces programmeurs savent qu'un module
fonction wait_get_first renvoie le nom du client en haut de la liste d'attente, leur unique tâche
consiste à définir les paramètres requis et les exceptions éventuelles.
Dans cet exemple, la liste d'attente est mise en œuvre comme une table interne dans les déclarations de
données globales du groupe de fonctions. Cette liste ne peut donc être modifiée qu'à l'aide d'autres
modules fonction de ce groupe. Ces modules sont accessibles à partir de tout programme.
La mise en œuvre des modules fonction individuels est similaire aux exemples contenus dans le
chapitre Opérations sur les tables internes. Pour optimiser l'espace, seul le codage ABAP approprié
aux fonctions courantes est répertorié.
Les types des paramètres et des objets de données globaux ont été spécifiés en référence aux types
appropriés du Dictionnaire ABAP.
IF wait_list IS INITIAL.
MESSAGE e200(bc402) RAISING list_empty.
ELSE.
CALL SCREEN 100 STARTING AT 5 5
ENDING AT 120 25.
ENDIF.
Afficher la liste
d'attente
MODULE display_list_0100 OUTPUT.
SUPPRESS DIALOG.
LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
Le dynpro 100 appartient au groupe de fonctions. Il s'agit d'un écran de conteneur pour le traitement
invisible de la liste. L'utilisateur peut ainsi afficher le contenu actuel de la liste d'attente dans une boite
de dialogue modale.
Pour plus de simplicité, un table control n'a pas été utilisé dans l'exemple. Dans le cas contraire, la
navigation tout entière aurait pu être encapsulée dans le groupe de fonctions. Pour plus d'informations
sur l'utilisation d'objets de dynpro, tels que les table controls, référez-vous au cours BC410
(Programmation interactive).
ELSE.
INSERT wa_cust INTO wait_list INDEX 1.
ENDIF.
Pour déplacer une entrée dans la liste d'attente, il est tout d'abord nécessaire de supprimer l'entrée
existante. L'utilisateur saisit ensuite une nouvelle entrée au niveau de ip_new_pos.
Cette opération est possible uniquement si le nouvel index est positif et qu'il n'est pas supérieur au
nombre total de lignes dans la liste (last_pos). La valeur de last_pos est définie à l'aide de
l'instruction DESCRIBE TABLE … LINES. Si vous spécifiez un index trop volumineux, l'entrée est
ajoutée à la table interne.
Object Navigator Workbench Traiter Saut Autres fonctions Envir. Système Aide
Object Navigator
Liste d'objets
Classe de dév.
Programme Nom d'objet
Groupe de fonctions BC402_FMDD_WAITLIST > BC402_FMDD_WAITLIST
Classe
< Modules fonction
Objets locaux Zones
<
Afficher < Modules PBO
< Dynpros
< Titres GUI
> Includes
SAP AG 1999
Comme décrit dans le chapitre Environnement d'exécution ABAP, ABAP Workbench vous aide à
structurer votre code source lors de l'utilisation des groupes de fonctions et des modules fonction.
Le navigation forward permet de s'assurer en permanence que l'objet correct est saisi. Les programmes
INCLUDE sont nommés automatiquement et les instructions d'appel appropriées sont insérées
automatiquement dans les postes corrects.
L'unique tâche consiste à observer la convention d'appellation pour les groupes de fonctions :
Y|Z<sup_nom>.
Le système crée ensuite un programme de type F appelé SAPLY|Z<sup_nom>. Il contient des
instructions INCLUDE générées automatiquement. Les programmes INCLUDE sont également
nommés automatiquement : LY|Z<sup_nom><abréviation><numéro>. L'abréviation
<abréviation> est affectée selon le même principe décrit dans la page Organisation du
programme.
Le programme INCLUDE LY|Z<sup_nom>UXX est également inséré. Il contient une instruction
INCLUDE pour chaque module fonction sous la forme LY|Z<sup_nom>U<numéro>.
SAP AG 1999
1. Créez une table interne dans un groupe de fonctions bufferisant tous les types d'appareils
disponibles pour chaque compagnie aérienne. Pour plus de simplicité, la structure de la
table est plate et non imbriquée.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
BC402_FMDS_FLIGHT
2-2 Déclarez le type de ligne t_carr_plane comme un type de données global dans
votre groupe de fonctions. Il doit comporter la structure suivante :
Composante Type
carrid scarplan-carrid
planetype scarplan-planetype
seatsmax saplane-seatsmax
2-5 Déclarez les paramètres d'import suivants pour votre module fonction. Ils doivent
être passés par valeur.
ip_seatsocc (facultatif, avec la valeur par défaut 0), ip_carrid,
ip_paymentsum, ip_currency.
2-6 Déclarez le paramètre d'export ep_planelist. Il doit être passé par valeur.
Spécifiez son type en vous référant à votre type de table global
Z##_BC402_PLANETAB.
(C) SAP AG BC402 7-19
2-7 Déclarez, puis documentez l'exception no_planes.
2-9 Dans la table interne globale, lisez les types d'appareils disponibles transférés au
module fonction et comportant suffisamment de places pour accueillir le nombre de
passagers réservés sur le vol.
Dans cette boucle, calculez la recette moyenne par place pour chaque type
d'appareil. Déclarez un autre espace de travail (l_wa_plane) comme un objet de
données local dans le module fonction. Spécifiez son type en vous référant à votre
structure globale Z##_BC402_PLANE.
Une fois la structure complètement renseignée, transférez-la à la table interne que
vous êtes sur le point d'exporter.
2-10 Avant d'exporter la table, triez-la en fonction de la recette moyenne par place.
2-11 Si aucun type d'appareil n'est approprié, déclenchez l'exception. Pour ce faire,
utilisez le message d'erreur 067. Ajoutez la compagnie aérienne au message.
3-1 Copiez votre solution à partir de votre dernier exercice ou de la solution de modèle.
Nouveau nom : Z##_BC402_FLIGHTLIST4.
3-2 Renseignez la table interne avec ses propres étapes avant l'affichage de liste.
Pour chaque vol sur lequel au moins une place est réservée, appelez votre module
fonction Z_##_BC402_CREATE_PLANELIST (utilisez la fonction Modèle).
La ligne courante doit être uniquement mise à jour si aucune exception n'est
déclenchée par le module fonction.
**************************************************************
* Fichiers INCLUDE définis par le système.
*
**************************************************************
INCLUDE lbc402_fmds_flighttop. " Données globales
INCLUDE lbc402_fmds_flightuxx. " Modules fonction
**************************************************************
* Fichiers INCLUDE définis par l'utilisateur (le cas
échéant). *
**************************************************************
* INCLUDE LBC402_FMDS_FLIGHTF... " Sous-programmes
* INCLUDE LBC402_FMDS_FLIGHTO... " Modules PBO
* INCLUDE LBC402_FMDS_FLIGHTI... " Modules PAI
TYPES:
BEGIN OF t_carr_plane,
carrid TYPE scarplan-carrid,
planetype TYPE scarplan-planetype,
seatsmax TYPE saplane-seatsmax,
END OF t_carr_plane.
DATA:
it_carr_planes TYPE SORTED TABLE OF t_carr_plane
WITH UNIQUE KEY carrid planetype.
*------------------------------------------------------------*
* INCLUDE LBC402_FMDS_FLIGHTE01 *
*------------------------------------------------------------*
LOAD-OF-PROGRAM.
FUNCTION BC402_FMDS_CREATE_PLANELIST.
*"------------------------------------------------------------
*"*"Interface locale :
*" IMPORTING
*" VALUE(IP_SEATSOCC) TYPE SFLIGHT-SEATSOCC DEFAULT 0
*" VALUE(IP_CARRID) TYPE SPFLI-CARRID
*" VALUE(IP_PAYMENTSUM) TYPE SFLIGHT-PAYMENTSUM
*" VALUE(IP_CURRENCY) TYPE SFLIGHT-CURRENCY
*" EXPORTING
*" VALUE(EP_PLANELIST) TYPE BC402_TYPS_PLANETAB
*" EXCEPTIONS
*" NO_PLANES
*"------------------------------------------------------------
DATA:
l_wa_carr_plane TYPE t_carr_plane,
l_wa_plane TYPE bc402_typs_plane.
IF sy-subrc NE 0.
MESSAGE e067 RAISING no_planes WITH ip_carrid.
ELSE.
SORT ep_planelist BY avg_price DESCENDING.
ENDIF.
ENDFUNCTION.
*&-----------------------------------------------------------*
*& État SAPBC402_FMDS_FLIGHTLIST4 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercise 3 : groupes de fonction
*
*& et modules fonction *
*&-----------------------------------------------------------*
REPORT sapbc402_fmds_flightlist4.
TYPES:
BEGIN OF t_flight,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
seatsocc TYPE sflight-seatsocc,
paymentsum TYPE sflight-paymentsum,
currency TYPE sflight-currency,
it_planes TYPE bc402_typs_planetab,
END OF t_flight,
DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.
START-OF-SELECTION.
ENDLOOP.
FIELD-SYMBOLS:
<vol_sz_l> TYPE t_flight,
<avion_sz_l> TYPE bc402_typs_plane.
SKIP.
ENDLOOP.
ENDFORM.
Contenu :
Déclaration et mise en œuvre des classes locales
Création d'objets
Accès aux composantes des objets
Définition des interfaces locales
Déclenchement et gestion des événements
Position dans ABAP Workbench
SAP AG 1999
SAP AG 1999
Préface
Instructions
Sous-programmes
Données
Données Données
Données Données
Données
Méthode
Attributs Données Méthode Abstraction
Données
Données
Données
Données Méthode
s
de
é tho
Fonction M Méthode
Données Méthode Abstraction
Fonction Fonction Fonction Méthode
SAP AG 1999
Dans la programmation fonctionnelle, les fonctions et les données sont toujours distinctes, puis reliées
à l'aide de relations d'entrée et de sortie.
Les objets sont au centre des méthodes orientées objet. Les objets représentent des aspects abstraits et
concrets du monde réel. Décrivez-les par leurs caractéristiques et leur comportement pour obtenir leur
structure interne et leurs attributs. Le comportement d'un objet se caractérise par ses méthodes.
Les objets forment une capsule contenant les attributs et le comportement. Dans la mesure du possible,
le modèle pour un problème et sa solution sont mis en correspondance directement. Dans une
programmation orientée objet, la modélisation est autrement plus importante que dans la
programmation fonctionnelle. Cependant, une fois la modélisation terminée, vous pouvez écrire le
code programme très rapidement. Par ailleurs, le codage est généralement si évident que l'utilisation
d'un nombre de commentaires trop important s'avère inutile.
Ce chapitre continuera de traiter l'exemple de la liste d'attente. Dans le groupe de fonctions, la table
interne est stockée globalement, c'est-à-dire, séparément des modules fonction. Les modules fonction
traitent les données dans la table lorsqu'elles sont appelées en externe.
Dans la vue orientée objet, la liste d'attente joue un rôle central, tel qu'un objet, c'est-à-dire qu'elle
contient non seulement les données relatives aux clients en attente, mais également les méthodes de
traitement des données qui lui permettent de s'autogérer. En externe, l'objet est intégré (l'utilisateur
n'appelle pas un module fonction affichant les données, mais il demande à la liste d'attente de
s'afficher).
SAP AG 1999
L'orientation objet dans ABAP représente une extension à compatibilité ascendante du langage
ABAP existant. Les programmeurs ABAP disposent de l'orientation objet, telle que l'encapsulation,
les interfaces, l'héritage, ce qui permet de faciliter et de simplifier les applications.
Vous pouvez utiliser toutes les instructions ABAP et unités de modularisation classiques dans ABAP
Objects et, inversement, ABAP Objects peut également être utilisé dans les programmes ABAP
existants.
Certaines restrictions syntaxiques s'appliquent à ABAP Objects. Par exemple, vous pouvez
désormais vous référer aux types du Dictionnaire ABAP uniquement à l'aide de l'option TYPE.
Spécifiez les types de paramètres d'interface et les noms des composantes dans les classes (attributs,
méthodes et événements) ; il peut s'agir uniquement des caractères "A-Z", "0-9" et du trait de
soulignement. Ils ne peuvent pas commencer par un chiffre.
Pour garantir la compatibilité avec les versions précédentes, les anciennes formulations ne sont pas
interdites en dehors de ABAP Objects. Ce cours a été conçu pour être entièrement compatible avec
ABAP Objects, aussi toutes les formulations de l'ensemble des instructions doivent également être
correctes dans le contexte de ABAP Objects.
Module Données
Données Module Données
Données
... ...
fonction fonction
… …
SAP AG 1999
Avant la version 4.0, les composantes ABAP ressemblant le plus aux objets étaient les modules
fonction et les groupes de fonctions.
Lors de l'appel d'un module fonction, une instance de son groupe de fonctions est chargée dans la zone
de mémoire du mode interne. Si un programme ABAP individuel appelle les modules fonction à partir
de plusieurs groupes de fonctions, il charge alors plusieurs instances.
La différence principale entre l'orientation objet et les modules fonction réside dans le fait qu'un seul
programme peut utiliser simultanément les instances de plusieurs groupes de fonctions, mais pas
plusieurs instances d'un groupe de fonctions individuel.
L'administration de la liste d'attente sous sa forme actuelle peut uniquement entraîner la création d'une
instance individuelle ou d'une seule liste d'attente. Il peut s'avérer très difficile d'administrer plusieurs
listes d'attente au moment de l'exécution. Il est possible de créer de nouvelles tables internes de
manière dynamique mais qui appartiennent toutes à la même instance, à savoir au groupe de fonctions.
s Data Funktions-
Funktions- Daten
...
... ...
…
Interface Données
Données
…
baustein Données
Interface Données
… ... … ...
… …
SAP AG 1999
Ces problèmes ont été résolus par l'introduction des classes. Il est désormais possible de définir les
données et les fonctions dans une classe plutôt que dans un groupe de fonctions et un programme
ABAP peut utiliser un nombre illimité d'instances d'exécution de la même classe. (Vous pouvez
également créer plusieurs classes dans un programme ABAP individuel.)
Au lieu de charger une instance d'exécution individuelle d'un groupe de fonctions de manière implicite
lors de l'appel d'un module fonction, un programme ABAP génère des instances d'exécution des classes
de manière explicite. Chaque instance d'exécution est un objet pouvant être identifié de manière
exceptionnelle, puis traité à l'aide d'une référence à un objet.
Dans cet exemple, l'administration de la liste d'attente peut ainsi entraîner la création et la suppression
d'un nombre illimité d'instances de la classe de la liste d'attente. Toutes ces instances sont distinctes
mais comportent la même structure. Elles encapsulent leurs données. Il est possible de spécifier de
manière explicite la liste d'attente dans laquelle seront intégrées les données en utilisant la méthode
appropriée à cette liste.
SAP AG 1999
Les classes constituent des modèles de structure pour les objets. Vous pouvez les créer localement dans
tout programme ABAP ou globalement dans le R/3 Repository à l'aide du Générateur de classes.
Une définition de classe comprend une partie déclaration et une partie mise en œuvre.
Les composantes d'une classe définissent les attributs et le comportement de ses instances. Chaque
composante doit être déclarée dans l'une des trois sections de visibilité. Ces sections définissent le
point de contact externe entre d'autres objets et la classe :
PUBLIC - Toutes les composantes publiques peuvent être traitées dans la classe et par tous les
utilisateurs. Elles constituent l'interface externe de la classe.
PROTECTED - Toutes les composantes protégées peuvent être traitées dans la classe et par toutes les
sous-classes de la classe.
PRIVATE - Les composantes privées peuvent être traitées uniquement dans les méthodes de la
classe.
Vous devez mettre en œuvre toutes les méthodes de la classe dans la partie mise en œuvre.
Le côté gauche du graphique illustre les parties déclaration et mise en œuvre d'une classe locale
<c1>.
Le côté droit du graphique illustre la construction de la classe avec les composantes dans leurs
sections de visibilité ainsi que les mises en œuvre de la méthode.
PUBLIC SECTION.
METHODS constructor
[IMPORTING <par> TYPE <type> ... ]
[EXCEPTIONS <exc> ... ].
ENDCLASS.
METHOD constructor.
...
ENDMETHOD.
ENDCLASS.
PROGRAM ... .
DATA <créf> TYPE REF TO <classe_locale>.
SAP AG 1999
Les constructeurs (instance ou statique) sont des méthodes spécifiques appelées de manière implicite
lorsque vous créez un objet ou accédez à une classe pour la première fois. Ils sont exécutés
automatiquement par le système et servent à configurer l'état initial d'un objet (référez-vous également à
l'événement LOAD-OF-PROGRAM dans les groupes de fonctions).
Utilisez un constructeur pour configurer l'état initial d'un objet de manière dynamique, car l'utilisation
de l'option VALUE de l'instruction DATA s'avère insuffisante.
La méthode est toujours appelée CONSTRUCTOR. Il s'agit d'un terme réservé.
Les constructeurs d'instances peuvent comporter des paramètres d'import et des exceptions.
Transmettez les paramètres d'import vers l'instruction CREATE OBJECT.
PRIVATE SECTION.
DATA:
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
SAP AG 1999
METHOD add.
READ TABLE wait_list FROM im_cust TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
APPEND im_cust TO wait_list.
ELSE.
MESSAGE e202 RAISING in_list.
ENDIF.
ENDMETHOD.
ENDCLASS.
SAP AG 1999
Lors de la création d'un objet de liste d'attente, le constructeur écrit les données clés dans les zones
privées.
Lors de l'appel de la méthode add pour un objet de liste d'attente, l'enregistrement de données est
normalement ajouté à la liste, s'il n'existe pas encore dans la table.
DATA
o_list1 TYPE REF TO lcl_waitlist.
o_list1
SAP AG 1999
Pour créer un objet à partir d'une classe, une variable de référence est requise. Dans cet exemple, il
s'agit de o_list1. Pour déclarer une variable de référence, utilisez le type de données REF TO
<classe> prévu à cet effet.
Une variable de référence contient une référence à un objet, c'est-à-dire un pointeur vers un objet
de données (référez-vous au chapitre Types et objets de données).
Les variables de référence utilisent la sémantique de référence. Lorsque vous affectez une variable
de référence à une autre, seule l'adresse de l'objet (référence à l'objet) est transmise. Une fois
l'affectation terminée, la référence pointe vers un autre objet.
Vous pouvez accéder aux objets uniquement à l'aide de références à l'objet.
Vous pouvez utiliser des variables de référence en tant qu'attributs appartenant à d'autres objets.
DATA
o_list1 TYPE REF TO lcl_waitlist.
...
5<LCL_WAITLIST>
LH
o_ list1
SAP AG 1999
Un objet est l'instance d'une classe. Chaque instance comporte sa propre identité et ses propres attributs.
Toutes les instances d'une classe appartiennent au contexte d'un mode interne (zone de mémoire d'un
programme ABAP). Vous pouvez créer un nombre illimité d'instances de la même classe.
Une fois la variable o_list1 définie en référence à une classe, vous pouvez instancier cette dernière.
Pour ce faire, utilisez l'instruction CREATE OBJECT <réfc>. La variable de référence <réfc>
contient désormais une référence à l'instance.
Toutes les classes contiennent une variable de référence implicite appelée me. Dans chaque objet,
elle contient toujours une référence à l'objet et, par conséquent, constitue une référence à elle-même.
Lorsque vous utilisez les attributs d'une classe dans les méthodes de cette même classe, il n'est pas
nécessaire de spécifier une variable de référence. À la place, l'auto-référence me est définie de
manière implicite par le système. Lors de la mise en œuvre du constructeur, l'instruction carrid =
ip_carrid aurait pu être remplacée par me->carrid = ip_carrid. L'auto-référence
s'avère particulièrement utile lors de l'utilisation du débogueur.
Dans le graphique, les instances sont affichées de la même manière que le contenu des variables de
référence dans le débogueur. Le chiffre préfixé est affecté de manière aléatoire.
Les instances sont affichées avec des coins arrondis en vue de les distinguer graphiquement des
classes.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
o_list3
o_ list2
o_ list1
SAP AG 1999
Les différentes variables de référence illustrées ci-dessus sont toutes déclarées avec une référence à la
même classe.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
LH
o_ list3
o_ list2
o_ list1
SAP AG 1999
Dans un programme spécifique, vous pouvez créer un nombre illimité d'instances de la même classe.
Chaque instance est entièrement indépendante des autres et possède son propre identificateur, ainsi que
ses propres attributs. Chaque instruction CREATE OBJECT crée une nouvelle instance.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
o_ list2
o_ list1
SAP AG 1999
Vous pouvez affecter des références à d'autres références à l'aide de l'instruction MOVE. Ainsi, la
référence à plusieurs objets différents peut pointer vers le même objet. Lors de l'affectation entre
plusieurs variables de référence, les types respectifs doivent être compatibles ou convertibles.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
o_ list2
o_ list1
SAP AG 1999
À l'instar d'autres variables, vous pouvez initialiser une variable de référence à l'aide de l'instruction
CLEAR. La valeur initiale d'une variable de référence est toujours une référence qui ne pointe pas vers
un objet (adresse "vide").
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
o_ list1
SAP AG 1999
Si plus aucune référence ne pointe vers un objet, ce dernier ne peut plus être traité dans un programme,
mais il existe toujours dans la mémoire. Cet espace mémoire peut généralement être libéré dans ce cas.
Le mécanisme Nettoyage de mémoire permet de garantir la libération automatique de l'espace
mémoire. Ce mécanisme analyse entièrement le mode interne pour les objets vers lesquels plus aucune
référence ne pointe, puis les supprime.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
o_ list1
SAP AG 1999
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
... 1<LCL_WAITLIST>
o_list3 = o_list1. SQ
3<LCL_WAITLIST>
LH
o_list3
o_ list2
o_ list1
SAP AG 1999
Utilisez à présent l'instruction CREATE OBJECT pour créer un nouvel objet et pour que la référence
o_list3 pointe vers lui. L'instruction CREATE OBJECT a remplacé le contenu précédent de la
variable de référence utilisée dans l'instruction par la nouvelle référence.
DATA
o_list1 TYPE REF TO lcl_waitlist.
Une fois l'instance d'une classe créée, vous pouvez appeler ses méthodes à l'aide de l'instruction CALL
METHOD. Spécifiez le nom de la méthode, ainsi que l'objet auquel vous souhaitez l'appliquer. La
syntaxe est CALL METHOD <réf>-><méth>.
<réf> est une variable de référence pointant vers un objet et <méth> une méthode de la classe à
laquelle elle appartient. L'opérateur -> est appelé sélecteur des composantes de l'objet.
Vous pouvez appeler une méthode de manière dynamique à l'aide de parenthèses dans la syntaxe,
comme dans ABAP. Contrairement aux appels dynamiques de module fonction et de sous-
programme, vous pouvez transmettre les paramètres, puis gérer les exceptions de manière dynamique.
Pour plus d'informations, référez-vous à la documentation en ligne.
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_list2 TYPE REF TO lcl_waitlist,
o_list3 TYPE REF TO lcl_waitlist.
CREATE OBJECT:
o_list1 EXPORTING ... , 8<LCL_WAITLIST>
o_list2 EXPORTING ... ,
o_list3 EXPORTING ... .
Dans l'exemple ci-dessus, la même méthode est appelée pour différents objets.
Chaque objet est doté de son propre ensemble d'attributs correspondant à sa méthode.
n<classe3>
n<classe2>
Interface
<réfi>
n<classe1>
SAP AG 1999
Une interface est un objet public contenant des attributs, des méthodes et des événements. Elle
contient uniquement une déclaration et est définie indépendamment des classes. Les composantes
d'une interface sont mises en œuvre dans les classes utilisant l'interface. Les classes ont alors un point
de contact externe uniforme. Les classes utilisant une interface doivent fournir leurs fonctions par la
mise en œuvre de toutes les méthodes définies dans ces classes.
Bien que des interfaces ne puissent pas être instanciées, vous pouvez toujours créer des variables de
référence à une interface. Une référence à une interface peut pointer vers des instances de toute classe
ayant mis en œuvre les composantes de l'interface appropriée. Vous pouvez accédez à ces composantes
de manière uniforme à l'aide de la référence à l'interface.
Ce concept permet à des classes correspondantes d'offrir des fonctions similaires pouvant être utilisées
de manière uniforme malgré leur mise en œuvre dans des classes différentes. En résumé, les références
à une interface vous permettent de traiter les classes différentes de la même manière. Cette opération est
généralement appelée polymorphisme.
INTERFACE i1.
DATA: a1 ...
METHODS: m1 ... Classe c1
EVENTS: e1 ...
ENDINTERFACE.
Composantes Composantes
publiques privées
CLASS c1 DEFINITION. a2,
a1,...
PUBLIC SECTION. m2,
DATA a1 ... i1~a1, e2
INTERFACES i1 ... i1~m1, Mises en œuvre
PROTECTED SECTION. ... de la méthode
PRIVATE SECTION.
Composantes protégées
ENDCLASS. a3, m3, e3, …
CLASS c1 IMPLEMENTATION.
METHOD i1~m1. Tous les Sous-classes de c1
ENDMETHOD.
utilisateurs
ENDCLASS.
SAP AG 1999
Les composantes publiques d'une classe définissent les points de contact externes.
Une interface est un objet autonome vous permettant de définir ou d'étendre ce point de contact externe.
Les interfaces vous permettent de traiter les composantes de l'objet de classes différentes de manière
uniforme.
Le côté gauche du graphique illustre la définition d'une interface locale i1, ainsi que les parties
déclaration et mise en œuvre d'une classe locale c1, qui met en œuvre l'interface i1 dans sa section
publique.
La méthode d'interface m1 doit être mise en œuvre dans la partie correspondante de la classe c1
comme i1~m1.
Le côté droit du graphique illustre la structure de la classe avec les composantes dans leurs sections
de visibilité ainsi que les méthodes de mise en œuvre. Les composantes de l'interface étendent la
section publique de la classe. De cette manière, tous les utilisateurs peuvent accéder aux
composantes publiques appartenant à cette seule classe et aux composantes déjà ajoutées à l'aide de
la mise en œuvre de l'interface.
Une classe peut mettre en œuvre plusieurs interfaces en parallèle à condition qu'elle implémente toutes
les méthodes de l'ensemble des interfaces.
Les interfaces peuvent être imbriquées. (INTERFACE ... INTERFACES ...
ENDINTERFACE.)
INTERFACE lif_status.
METHODS display.
ENDINTERFACE.
SAP AG 1999
CLASS
CLASS lcl_waitlist
lcl_waitlist IMPLEMENTATION.
IMPLEMENTATION.
...
...
METHOD
METHOD lif_status~display.
lif_status~display.
CALL
CALL FUNCTION
FUNCTION 'BC402_AOOD_WAIT_DISPLAY'
'BC402_AOOD_WAIT_DISPLAY'
EXPORTING
EXPORTING
ip_waitlist
ip_waitlist == wait_list
wait_list
EXCEPTIONS
EXCEPTIONS
list_empty
list_empty == 11
OTHERS
OTHERS == 2.
2.
...
...
ENDMETHOD.
ENDMETHOD.
ENDCLASS.
ENDCLASS.
CLASS
CLASS lcl_clerk
lcl_clerk IMPLEMENTATION.
IMPLEMENTATION.
...
...
METHOD
METHOD lif_status~display.
lif_status~display.
MESSAGE
MESSAGE i194
i194 WITH
WITH cnt_look_for
cnt_look_for ...
... ..
ENDMETHOD.
ENDMETHOD.
ENDCLASS.
ENDCLASS.
SAP AG 1999
Dans la liste d'attente, le statut apparaît en appelant un module fonction qui affiche la liste dans une
boite de dialogue modale.
Dans la classe des employés, la méthode d'interface est mise en œuvre différemment et une méthode
contenant des informations sur le statut de l'employé apparaît.
DATA:
DATA:
o_list1
o_list1 TYPE
TYPE REF
REF TO
TO lcl_waitlist,
lcl_waitlist,
o_clerk1
o_clerk1 TYPE
TYPE REF
REF TO
TO lcl_clerk,
lcl_clerk,
5<LCL_WAITLIST>
i_status1
i_status1 TYPE
TYPE REF
REF TO
TO lif_status.
lif_status.
o_list1
CREATE
CREATE OBJECT
OBJECT o_list1
o_list1
EXPORTING
EXPORTING im_carrid
im_carrid == 'LH'
'LH'
im_connid
im_connid == '400'
'400'
im_fldate
im_fldate == '19991119'.
'19991119'. i_status1
i_status1
i_status1 == o_list1.
o_list1. 3<LCL_CLERK>
CREATE
CREATE OBJECT
OBJECT o_clerk1.
o_clerk1.
o_clerk1
SAP AG 1999
L'exemple crée ensuite une instance de classe o_list1. Il est possible d'accéder normalement à
toutes les composantes de o_list1. Après avoir affecté o_list1 à i_status1, vous pouvez
également utiliser i_status1 pour traiter les composantes de l'interface. Si i_status1 était un objet
de la classe lcl_clerk, les composantes de l'interface auraient un comportement différent lors de
leur accès.
** affichage
affichage du
du statut
statut de
de la
la liste
liste d'attente
d'attente :: 5<LCL_WAITLIST>
*********************************************
*********************************************
CALL
CALL METHOD
METHOD o_list1->lif_status~display.
o_list1->lif_status~display. o_list1
** ou
ou ::
CALL
CALL METHOD
METHOD i_status1->display.
i_status1->display.
i_status1->display appelle
le module fonction
i_status1
** affichage
affichage du
du statut
statut de
de l'employé
l'employé :: 3<LCL_CLERK>
************************************
************************************
CALL
CALL METHOD
METHOD o_clerk1->lif_status~display.
o_clerk1->lif_status~display.
** ou
ou ::
i_status1
i_status1 == o_clerk1.
o_clerk1.
CALL
CALL METHOD
METHOD i_status1->display.
i_status1->display. o_clerk1
i_status1->display affiche
le message
SAP AG 1999
Si une référence de classe <réfc> pointe vers une instance de classe, vous pouvez appeler la
méthode <méth> d'une interface <intf> mise en œuvre par la classe à l'aide de la formulation
CALL METHOD <réfc>-><intf>~<méth> ... .
Si une référence à une interface <réfi>, créée en référence à l'interface <intf>, pointe vers une
instance de classe, vous pouvez appelez la méthode <méth> de l'interface <intf> à l'aide de la
formulation CALL METHOD <réfi>-><méth> ... .
Le même principe s'applique aux attributs d'interface.
En utilisant les références à une interface, vous pouvez accéder aux composantes d'une classe ajoutées à
l'aide de la mise en œuvre d'une interface.
Création d'objets
CREATE
CREATE OBJECT
OBJECT <réfc>
<réfc> ...
... ..
CALL
CALL METHOD:
METHOD: <réfc>-><méthode>
<réfc>-><méthode> ...
... ,,
<réfc>-><interface>~<méthode>
<réfc>-><interface>~<méthode> ...
... ,,
<réfi>-><méthode>
<réfi>-><méthode> ...
... ..
SAP AG 1999
Méthodes fonctionnelles
Attributs et méthodes statiques (y compris le constructeur
statique)
Classes globales
Interfaces globales
Héritage
SAP AG 1999
Les sujets répertoriés ci-dessus constituent une suite logique de l'étape actuelle. Cependant, il n'est pas
possible de les traiter de suite vu le temps qui nous est imparti.
SAP traite plutôt un autre concept important de la programmation orientée objet (événements).
2<HANDLER>
1<RAISER>
1<HANDLER>
SAP AG 1999
ABAP Objects est doté d'une fonction spécifique vous permettant de déclencher des événements et d'y
réagir. Les événements de ABAP Objects ne doivent pas être confondus avec les événements de
l'environnement d'exécution et surviennent lors du traitement du dialogue utilisateur (référez-vous au
chapitre Environnement d'exécution ABAP).
Un événement contenu dans une orientation objet peut être déclenché par un objet individuel pour
indiquer, par exemple, que son statut a été modifié. D'autres objets peuvent ensuite réagir aux
événements sélectionnés. Cette opération est mise en œuvre à l'aide d'événements spécifiques qu'il n'est
pas nécessaire d'appeler de manière explicite. En fait, ils sont appelés de manière implicite lors du
déclenchement de l'événement à condition que vous les ayez enregistrés pour réagir à cet événement.
Lors de la définition et de l'exécution, l'expéditeur d'un événement ne "sait" rien du destinataire et
inversement. Les objets déclenchent des événements sans savoir si un destinataire les recevra et
comment il y réagira. Inversement, les destinataires sont enregistrés pour des événements sans savoir si
l'événement sera déclenché et, si tel est le cas, par quel objet.
Cependant, au moment de l'exécution, il est possible d'identifier le déclencheur de l'événement à l'aide
du paramètre sender.
PUBLIC|PROTECTED|PRIVATE SECTION.
ENDCLASS.
METHOD <événement_raiser>.
...
RAISE EVENT <événement> [EXPORTING <par> = <valeur> ... ].
...
ENDMETHOD.
ENDCLASS.
SAP AG 1999
Déclarez les événements en tant que composantes d'une classe dans la partie déclaration. Ils peuvent
comporter des paramètres d'export à transmettre par valeur.
Pour déclencher un événement dans une méthode, utilisez l'instruction RAISE EVENT. Transmettez
tous ses paramètres (excepté ceux définis comme facultatifs) à l'aide de l'option EXPORTING.
PUBLIC|PROTECTED|PRIVATE SECTION.
ENDCLASS.
METHOD <traitement_événement>.
...
ENDMETHOD.
ENDCLASS.
SAP AG 1999
Toutes les classes peuvent contenir des méthodes de traitement des événements pour des événements
sélectionnés de classes sélectionnées. Ces méthodes réagissent aux événements lorsqu'ils sont
déclenchés.
L'interface d'une méthode de traitement des événements peut comporter des paramètres d'import,
mais également les paramètres formels définis comme paramètres d'export pour l'événement en
question. Les attributs du paramètre proviennent de l'événement (leurs types ne sont pas spécifiés de
manière explicite). Il n'est pas nécessaire que la méthode de traitement reçoive tous les paramètres
transmis dans l'instruction RAISE EVENT.
Les événements comportent un paramètre implicite appelé sender pouvant également être reçu en le
répertoriant dans l'option IMPORTING. La méthode de traitement peut ainsi accéder au déclencheur
et faire dépendre son propre comportement du nom du déclencheur.
En déclarant les méthodes de traitement des événements dans une classe, vous autorisez les instances
de la classe à gérer l'événement.
ENDCLASS. ENDCLASS.
SAP AG 1999
Dans l'exemple ci-dessus, la classe c1 contient un événement e1, qui exporte un nombre entier lors
de son déclenchement à l'aide de la méthode m1.
La classe c2 contient une méthode m2 pouvant gérer l'événement e1 de la classe c1, puis importer
une valeur. Au moment de l'exécution, ce paramètre de la méthode m2 est affecté au type I.
PROGRAM ...
DATA:
o_raiser TYPE REF TO lcl_raiser,
o_handler_1 TYPE REF TO lcl_handler,
o_handler_2 TYPE REF TO lcl_handler.
CREATE OBJECT:
o_raiser, o_handler_1, o_handler_2.
...
SAP AG 1999
Pour qu'une méthode de traitement des événements réagisse à un événement, spécifiez au moment de
l'exécution le (les) déclencheur(s) (objet ou objets) auquel (auxquels) elle doit réagir. Lorsque vous
déclarez la classe, vous pouvez spécifier uniquement la classe de l'objet de déclenchement.
Pour relier une méthode de traitement à un déclencheur d'événements, utilisez l'instruction SET
HANDLER. Pour les événements d'instance, utilisez l'option FOR pour spécifier l'instance de
déclenchement pour laquelle vous souhaitez enregistrer le traitement :
Vous pouvez enregistrer une instance de déclenchement individuelle à l'aide d'une variable de
référence (dans cet exemple, o_raiser).
Vous pouvez également enregistrer le traitement de toutes les instances à l'aide de l'option FOR
ALL INSTANCES. Cet enregistrement comprend également des instances de déclenchement
potentielles qui n'ont pas encore été créées.
L'option facultative ACTIVATION, disponible pour les deux variantes, vous permet d'appeler à
nouveau les enregistrements individuels ou d'en définir de nouveaux de manière dynamique.
L'argument contenu dans cette option doit être une zone de type C et de longueur 1. Vous pouvez
définir l'expression ACTIVATION <témoin> comme suit :
<témoin> = space : annule l'enregistrement de la méthode de traitement des événements
<témoin> = 'X':enregistre la méthode de traitement des événements
L'exemple ci-dessus illustre une extension de la liste d'attente. Si le nombre d'entrées dans la liste atteint
une valeur maximale spécifique, la liste d'attente déclenche alors un événement. Une fois
l'événement déclenché, l'employé doit exécuter un certain nombre de tâches.
Dans la partie déclaration de la classe lcl_waitlist, l'événement list_full est déclaré.
Trois paramètres peuvent être exportés une fois l'événement déclenché.
Dans la partie mise en œuvre, la méthode d'ajout est modifiée en conséquence.
...
METHOD say_something.
MESSAGE i197 WITH ... .
ENDMETHOD.
METHOD change_planetype.
MESSAGE i195 WITH ... ex_carrid ex_connid ex_fldate.
ENDMETHOD.
ENDCLASS.
SAP AG 1999
PROGRAM ...
DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_clerk1 TYPE REF TO lcl_clerk.
SAP AG 1999
Une fois l'instance o_clerk1 de la classe lcl_clerk créée, vous pouvez enregistrer les méthodes
de l'objet afin qu'elle réagissent aux événements déclenchés par l'objet o_list1. Si les méthodes ne
sont pas enregistrées, elles ne sont pas exécutées même si l'événement est déclenché.
Il est ainsi possible de spécifier exactement le moment auquel la méthode doit réagir à l'événement,
puis de définir les groupes de déclencheurs et de traitements.
Si, par exemple, vous créez davantage de listes d'attente à partir de la classe, provoquant également le
déclenchement d'événements, l'employé peut uniquement réagir aux événements de la liste d'attente
o_list1, sauf en cas d'enregistrements de méthodes relatives à d'autres instances.
Inversement, si vous créez plus d'objets à partir de la classe des employés mais que vous n'enregistrez
pas leurs méthodes de réaction à un événement, seul le premier employé o_clerk1 réagit. Il est
également possible d'obtenir une réaction "partielle" en enregistrant uniquement certaines de ses
méthodes de traitement. Vous constatez ainsi que la technique d'enregistrement des événements est très
flexible.
Générateur de classes
Type K Type J
TYPES: TYPES:
... ...
SAP AG 1999
Le Générateur de classes est un outil de ABAP Workbench utilisé pour créer des interfaces et des
classes globales. Définissez les composantes à l'aide de l'interface graphique, le Générateur de classes
génère ensuite automatiquement le code source ABAP correspondant. Écrivez la partie mise en œuvre
de la classe. Pour ce faire, le Générateur de classes appelle l'Éditeur ABAP.
Les classes globales sont stockées dans des programmes de conteneur ABAP spécifiques appelés
groupes de classes (programme de type K). Les interfaces globales sont stockées dans des groupes
d'interfaces (programme de type J). Chaque groupe de classes ou d'interfaces contient la définition
d'une interface ou classe globale individuelle. Le groupe de classes ou d'interfaces est également généré
automatiquement par le Générateur de classes.
Les groupes de classes sont similaires aux groupes de fonctions. Ils contiennent les instructions
déclaratives et exécutables qui ne peuvent pas être lancées directement. Utilisez l'instruction CREATE
OBJECT pour créer l'instance d'une classe globale (un objet) dans un programme.
Informations complémentaires
Des cours supplémentaires, en particulier les cours BC400 (Introduction à ABAP Workbench),
BC410 (Programmation interactive) et BC412 (Programmation de dialogues à l'aide des contrôles
EnjoySAP), expliquent d'autres variantes de syntaxe utilisées dans ABAP Objects, ainsi que le mode
d'utilisation des classes globales.
Il existe également un cours, le BC404, dédié à ABAP Objects - Programmation orientée objet dans
R/3.
SAP AG 1999
Contenu :
Techniques d'appel de programmes
Modèle de mémoire
Techniques de passation de paramètres
Utilisation
SAP AG 1999
SAP AG 1999
Instructions
Sous-programmes
1 2 Programme 2
SAP AG 1999
Il existe deux méthodes de lancement d'un programme ABAP à partir d'un autre programme ABAP en
cours d'exécution :
En interrompant le programme courant pour exécuter le nouveau (le programme appelé est exécuté,
puis le traitement renvoie au programme l'ayant appelé).
En terminant le programme courant, puis en exécutant le nouveau.
Le renseignement de programmes ABAP dans une session utilisateur individuelle s'exécute uniquement
de manière séquentielle. Cette technique est appelée appels synchrones.
Pour exécuter des fonctions en parallèle, utilisez les modules fonction. Pour plus d'informations sur
cette technique, référez-vous au cours BC415 (ABAP Workbench - Interfaces de communication)
et à la documentation relative à l'instruction CALL FUNCTION … STARTING NEW TASK….
Session utilisateur
Mémoire ABAP 2
Programme 1.2
Mémoire SAP
SAP AG 1999
La structure de la mémoire principale, du point de vue du programme, peut être représentée facilement
dans le modèle ci-dessus. Une distinction est opérée entre les modes interne et externe :
Généralement, un mode externe correspond à une fenêtre R/3. Créez de nouveaux modes externes
en sélectionnant Système --> Créer mode ou en saisissant /o<codet> dans la zone de commande.
Vous pouvez ouvrir jusqu'à six modes externes simultanément dans une session.
Les modes externes sont divisés en modes internes. Chaque programme exécuté occupe son propre
mode interne. Chaque mode externe peut contenir jusqu'à neuf modes internes.
Les données d'un programme sont uniquement visibles dans ce mode interne, par le programme.
Les pages suivantes illustrent le mode de modification de la pile contenue dans un mode externe en
fonction des différents appels.
Session utilisateur
Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1
Mémoire SAP
SAP AG 1999
Session utilisateur
Mémoire ABAP 2
Programme 1.2
Mémoire SAP
SAP AG 1999
Lors de l'insertion d'un programme, le système crée un nouveau mode interne contenant le nouveau
contexte du programme.
Le nouveau mode est inséré sur la pile. Le contexte du programme appelant demeure également sur la
pile.
Session utilisateur
Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1
Mémoire SAP
SAP AG 1999
Une fois le programme appelé terminé, son mode interne (en haut de la pile) est supprimé.
Le traitement reprend dans le deuxième mode interne le plus élevé de la pile.
Session utilisateur
Mémoire ABAP 2
Programme 1.3
Programme 1.2
Mémoire SAP
SAP AG 1999
Lorsque vous terminez un programme et que vous en lancez un autre, opérez une distinction entre
l'appel d'un programme exécutable et l'appel d'une transaction.
Session utilisateur
Mémoire ABAP 2
Programme 1.3
Programme 1.2
Mémoire SAP
SAP AG 1999
Si vous lancez un programme exécutable à l'aide de son nom, le mode interne du programme que
vous terminez (en haut) est supprimé.
Le système crée un nouveau mode interne contenant le contexte du programme appelé.
Le nouveau mode est inséré sur la pile. Tous les contextes de programme existants sont conservés. Le
mode interne supérieur sur la pile est remplacé.
Session utilisateur
Mémoire ABAP 2
Programme 1.3
Programme 1.2
Mémoire SAP
SAP AG 1999
Session utilisateur
Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1
Mémoire SAP
SAP AG 1999
Si vous lancez un programme à l'aide de son code de transaction (le cas échéant), tous les modes
internes sont supprimés de la pile.
Le système crée un nouveau mode interne contenant le contexte du programme appelé.
Après l'appel, la mémoire ABAP est réinitialisée.
Session utilisateur
Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1
Mémoire SAP
SAP AG 1999
Lorsque vous appelez un module fonction, le runtime system ABAP vérifie si un module fonction a
déjà été appelé à partir du même groupe de fonctions dans le programme courant.
Session utilisateur
Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1
Groupe de
Programme 1.1 Programme 2.1
fonctions
Mémoire SAP
SAP AG 1999
Dans le cas contraire, le système charge le groupe de fonctions approprié dans le mode interne du
programme appelant. Ses données globales sont initialisées et l'événement LOAD-OF-PROGRAM
est déclenché.
Si votre programme a déjà utilisé un module fonction du même groupe de fonctions avant l'appel, ce
groupe de fonctions réside déjà dans le mode interne et le nouvel appel peut accéder aux mêmes
données globales. Ainsi, le groupe de fonctions demeure actif jusqu'à ce que le programme
l'ayant appelé se termine.
Les données sont uniquement visibles dans le programme correspondant (chaque programme peut
traiter uniquement ses propres données, même si des objets appelés de manière identique existent
dans les deux programmes). Il en est de même lorsque la pile est étendue. Si un programme est
ajouté à la pile qui appelle un module fonction à partir d'un groupe de fonctions déjà appelé par un
autre programme, le groupe de fonctions est à nouveau chargé dans le nouveau mode interne. Le
système crée de nouvelles copies de ses objets de données, puis les initialise. Ils sont à présent à
nouveau visibles uniquement dans le groupe de fonctions et dans le mode interne dans lequel le
groupe de fonctions a été chargé.
Le graphique illustre le premier appel vers un module fonction dans un groupe de fonctions spécifique.
Programme 1 Programme 2
... <nom_prog_2>
SUBMIT <nom_prog_2>. PROGRAM ... Liste
... ...
F3
... <nom_prog_2>
SUBMIT <nom_prog_2> Liste
PROGRAM ...
AND RETURN.
...
...
F3
Écran de sélection
...
SUBMIT <nom_prog_2> <nom_prog_2>
VIA SELECTION-SCREEN PROGRAM ... Liste
AND RETURN. ...
...
F3 F3
SAP AG 1999
SAP AG 1999
Mémoire SAP
(paramètres SET/GET)
3
Mémoire ABAP
2
Interface
Programme A 1 Programme B
4
BD
5
SAP AG 1999
Il existe différentes manières de passer des paramètres aux programmes exécutés dans des modes
internes distincts :
Il est possible d'utiliser :
L'interface du programme appelé (généralement un écran de sélection standard)
La mémoire ABAP
La mémoire SAP
Les tables de base de données
Les fichiers locaux situés sur votre serveur de présentation
Les pages suivantes illustrent les méthodes , ‚ et ƒ.
Pour plus d'informations sur la passation des paramètres à l'aide des tables de base de données ou du
buffer partagé, référez-vous à la documentation relative aux instructions EXPORT et IMPORT.
Pour plus d'informations sur la passation des paramètres entre un programme ABAP et votre serveur de
présentation, référez-vous à la documentation relative aux modules fonction WS_UPLOAD et
WS_DOWNLOAD.
e n
fac tio
er nc
EXPORTATION In t l e fo
ées
Données
du
IMPORTATION Mo
Programme A Donn
EXCEPTIONS
ou
Écran de sélection standard
ées
Données
Donn
Programme A Programme B
SAP AG 1999
Les modules fonction comportent une interface utilisée par le programme appelant et le module
fonction permettant d'échanger des données. Les sous-programmes utilisent également une technique
similaire. Certaines délimitations s'appliquent aux interfaces des modules fonction activés à distance.
Lorsque vous appelez des programmes ABAP comportant un écran de sélection standard, vous pouvez
passer des paramètres pour les zones de saisie dans l'appel. Cette opération s'effectue de deux
manières :
En spécifiant une variante pour l'écran de sélection lors de l'appel du programme
En spécifiant des valeurs pour les zones de saisie lors de l'appel du programme
L'option WITH contenue dans l'instruction SUBMIT vous permet d'affecter des valeurs aux zones dans
un écran de sélection standard. Les abréviations "EQ, NE, … , I, E" ont la même signification que
pour les options de sélection.
Pour transférer plusieurs délimitations à une option de sélection, utilisez l'instruction RANGES plutôt
que les options WITH individuelles. Cette instruction crée une table de sélection que vous pouvez
renseigner comme une option de sélection. Transférez ensuite la table entière au programme exécutable.
L'option VIA SELECTION-SCREEN vous permet d'afficher l'écran de sélection standard lors de
l'appel du programme.
Dans l'instruction SUBMIT, utilisez la fonction Modèle dans l'Éditeur ABAP pour insérer un modèle
d'instruction approprié au programme à appeler. Il fournit automatiquement les noms des paramètres et
des options de sélection disponibles dans l'écran de sélection standard.
L'exemple illustré ci-dessus est extrait de la transaction BC402_CALD_CONN. Lorsque l'utilisateur
demande les coordonnées d'une ville, le programme exécutable SAPBC402_TABD_HASHED est
appelé. Les paramètres sont renseignés avec la ville et l'indicatif pays de la transaction. L'écran de
sélection standard n'apparaît pas.
Pour plus d'informations sur l'utilisation des variantes et sur d'autres variantes de syntaxe de l'option
WITH, référez-vous à la documentation relative à l'instruction SUBMIT.
Session utilisateur
Mémoire ABAP 2
Programme 1.2 Programme 2.2
SAP AG 1999
Pour passer les paramètres entre les programmes, vous pouvez utilisez la mémoire SAP ou ABAP.
La mémoire SAP est une zone de mémoire propre à l'utilisateur pouvant être utilisée pour stocker
des valeurs de zone. Il s'agit uniquement d'une valeur limitée pour la passation des paramètres entre
les modes internes. Les valeurs contenues dans la mémoire SAP sont conservées pendant toute la
session utilisateur. La mémoire peut être utilisée entre les modes dans une même session. Vous
pouvez utiliser le contenu de la mémoire SAP comme des valeurs par défaut pour les zones de
dynpro. Tous les modes externes peuvent utiliser la mémoire SAP.
La mémoire ABAP est également propre à l'utilisateur. Une mémoire locale ABAP existe pour
chaque mode externe. Elle peut être utilisée pour échanger des variables ABAP (zones, structures,
tables internes, objets complexes) entre les modes internes dans un mode externe.
Lorsque l'utilisateur quitte un mode externe (/i dans la zone de commande), la mémoire ABAP
correspondante est initialisée ou libérée automatiquement.
Mode interne 1
PROGRAM p1 ... .
DATA: p1_spfli TYPE spfli,
Mémoire ABAP it_spfli TYPE STANDARD TABLE
OF spfli.
...
MY_ID EXPORT
EXPORT
wa_
wa_fli FROM p1_spfli
wa_fli
it_spfli
TO MEMORY ID 'MY_ID'.
it_spfli
Mode interne 2
PROGRAM p2 ... .
DATA: p2_spfli TYPE spfli,
it_spfli TYPE STANDARD TABLE
MY_ID1 ... OF spfli.
...
IMPORT
IMPORT
wa_
wa_fli TO p2_spfli
it_spfli
FROM MEMORY ID 'MY_ID'.
SAP AG 1999
Utilisez l'instruction EXPORT … TO MEMORY pour copier un nombre illimité de variables ABAP et
leurs valeurs correctes (cluster de données) dans la mémoire ABAP. L'option ID… (32 caractères
maximum) vous permet d'identifier différents clusters.
Si vous utilisez une nouvelle instruction EXPORT TO MEMORY pour un cluster de données existant, la
nouvelle instruction remplace l'ancienne.
L'instruction IMPORT… FROM MEMORY ID… vous permet de copier des données de la mémoire
ABAP vers les zones correspondantes de votre programme ABAP. Dans l'instruction IMPORT, vous
pouvez également limiter le marquage à une partie du cluster de données.
Les variables dans lesquelles vous souhaitez lire les données du cluster dans la mémoire ABAP doivent
comporter des types identiques dans les programmes d'exportation et d'importation.
Pour libérer un cluster de données, utilisez l'instruction FREE MEMORY ID…
N'oubliez pas que, lorsque vous appelez des programmes à l'aide de codes de transaction, vous pouvez
uniquement utiliser la mémoire ABAP pour la passation des paramètres vers la transaction.
Mémoire SAP
CAR LH
CON 400
Programme B
SAP AG 1999
Vous pouvez définir les zones de mémoire (paramètres) dans la mémoire SAP de plusieurs manières :
En créant des zones de saisie/d'édition en référence au Dictionnaire ABAP. Il s'agit du nom du
paramètre de l'élément de données auquel elles se réfèrent.
Vous pouvez également saisir un nom dans les attributs des zones de saisie/d'édition. Vous pouvez
ensuite choisir si les entrées de la zone doivent être transférées vers le paramètre (SET) ou si la zone
de saisie doit être renseignée avec la valeur du paramètre (GET).
Pour identifier les noms des paramètres affectés aux zones de saisie, affichez l'aide de zone pour la
zone (F1), puis sélectionnez Info technique.
Vous pouvez également renseigner directement une zone de mémoire à l'aide de l'instruction,
SET PARAMETER ID '<PAR_ID>' FIELD <var>.
puis la lire à l'aide de l'instruction
GET PARAMETER ID '<PAR_ID>' FIELD <var>.
Vous pouvez également définir des paramètres à l'aide de Object Navigator, puis les renseigner avec
des valeurs.
Cet exemple illustre un extrait de la transaction BC402_CALD_CONN. Lorsque l'utilisateur gère les
temps de vol, le programme appelle la transaction BC402_TABD_SORT. Le nom de la compagnie
aérienne est transféré à l'aide du paramètre CAR (via une instruction). Le numéro de vol est transféré
à l'aide du paramètre CON (option SET sélectionnée pour la zone dans le Screen Painter).
...
DATA: <bi_tabi>
<bi_tabi> TYPE TABLE OF bdcdata,
<bi_wa> TYPE bdcdata.
* renseignement de <bi_tabi>
...
...
LEAVE PROGRAM.
...
SAP AG 1999
Lorsque vous appelez une transaction via l'instruction CALL TRANSACTION '<CODE_T>' USING
<bi_tabi>…, vous pouvez exécuter la transaction <CODE_T> à l'aide des valeurs de <bi_tabi>
dans les zones de dynpro. La table interne doit comporter la structure bdcdata.
L'option MODE vous permet de spécifier si le contenu du dynpro doit être affiché ('A' - option par
défaut) uniquement lorsqu'une erreur survient ('E') ou pas du tout ('N'). L'option MESSAGE
INTO <tabi_mess> vous permet de spécifier une table interne dans laquelle un message système
doit être écrit. La table interne doit comporter la structure bdcmsgcoll.
La zone système sy-subrc vous permet d'identifier si la transaction a été exécutée avec succès.
Cette technique peut être utilisée :
Si vous effectuez un traitement en avant-plan, mais que les zones de saisie n'ont pas été renseignées à
l'aide des paramètres GET.
Si vous souhaitez traiter la transaction de manière invisible. Dans ce cas, transférez également
normalement les codes de fonction dans la table.
Cette technique constitue l'une des méthodes de passation de paramètres à partir de systèmes externes.
Pour ce faire, la table interne comportant la structure bdcdata doit être renseignée entièrement.
SAP AG 1999
Chaque dynpro que vous souhaitez traiter automatiquement dans la transaction doit être identifié par
une ligne dans laquelle seules les zones program, dynpro et dynbegin sont renseignées.
Une fois le dynpro identifié par l'enregistrement, utilisez un nouvel enregistrement bdcdata pour
chaque zone à renseigner. Ces enregistrements utilisent les zones fnam et fval. Vous pouvez
renseigner les zones suivantes :
• Zones de saisie/d'édition (avec données)
• La zone de commande bdc_okcode (avec un code de fonction)
• La zone de position du curseur bdc_cursor (avec un nom de zone)
Pour plus d'informations sur le mode d'utilisation de cette technique pour la passation de paramètres,
référez-vous au cours BC420 (ABAP Workbench - Interface de données) ou à la documentation
en ligne.
SAPBC402_CALD_CREATE_CUSTOMER 0100 X
SCUSTOM-NAME <nom_courant>
SCUSTOM-CITY <ville_courante>
BDC_OKCODE SAVE
Sauvegarde
DATA:
bdcdata
wa_bdcdata TYPE bdcdata,
Indique l'entrée dans
it_bdcdata LIKE TABLE OF wa_bdcdata.
la zone de commande
*** renseignement de la table bdcdata ...
La table interne renseignée, au format bdcdata, est illustrée ci-dessus. Au moment de l'exécution,
<nom_courant> correspond au nom du client provenant de la zone de saisie et
<ville_courante> correspond à la ville.
Utilisez la zone BDC_OKCODE pour traiter la zone de commande dans laquelle vous souhaitez saisir le
code de fonction déclenché par l'utilisateur à l'aide d'une touche de fonction, d'un bouton de commande
ou d'un point de menu en mode dialogué (ou en saisissant un code directement dans la zone de
commande).
SAP AG 1999
1-2 Pour plus de simplicité, la fonction doit être déclenchée lorsque l'utilisateur clique
ou double-clique sur une ligne, puis appuie sur <F2>. Ajoutez un bloc événement
approprié à votre programme.
*&-----------------------------------------------------------*
*& État SAPBC402_CALS_FLIGHTLIST5 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 :
*
*& appel de programmes et passation de paramètres
*
*&-----------------------------------------------------------*
REPORT sapbc402_cals_flightlist5.
...
...
START-OF-SELECTION.
AT LINE-SELECTION.
*------------------------------------------------------------*
* FORM display_flights
*------------------------------------------------------------*
* --> p_it_flights
*------------------------------------------------------------*
FORM display_flights CHANGING p_it_flights TYPE t_flighttab.
...
ENDFORM.