You are on page 1of 246

BC402 ABAP Techniques de

programmation ABAP
BC402

R/3 System Release 46A 02/16/2001

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

Copyright 2000 SAP AG. Tous droits réservés.


Toute représentation ou reproduction de ce manuel, même
partielle, par quelque procédé et à quelque fin que ce soit, est
interdite sans l’autorisation écrite explicite de SAP AG. Les
informations contenues dans ce manuel peuvent être modifiées
ou complétées sans préavis.

Tous droits réservés.

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 50 (Technologie de base)


 BC400 (Introduction à ABAP Workbench)
 Recommandations :
 BC430 (Dictionnaire ABAP)
 Expérience minimale en matière de programmation ABAP

SAP AG 1999
À qui s'adresse ce cours ?

 Participants :
 Programmeurs
 Consultants
 Durée : 3 jours

SAP AG 1999

 Notes aux participants

Les supports de formation ne constituent pas un programme d'auto-formation. Il sont conçus


uniquement dans le but de compléter les explications fournies par l'animateur. Un espace est
laissé à votre disposition sur ces supports pour vous permettre de prendre des notes.
Vue d'ensemble du cours

Contenu

 Objectif général du cours


 Objectifs du cours
 Table des matières
 Synoptique
 Scénario de gestion

SAP AG 1999

(C) SAP AG BC402 1-1


Objectif général du cours

Ce cours vous permettra :


 De comprendre les principes de base du langage de
programmation ABAP
 De choisir la technique de programmation ABAP
appropriée à la résolution d'un problème spécifique
 D'écrire et de gérer vos propres programmes ABAP

SAP AG 1999

(C) SAP AG BC402 1-2


Objectifs du cours

À la fin de ce cours, vous serez en mesure :

 De décrire le mode de fonctionnement du runtime


system ABAP
 D'utiliser les instructions ABAP et leurs variantes de
syntaxe
 De créer, tester, comparer et classer les programmes
ABAP
 De concevoir, écrire et modifier vos propres
programmes ABAP
 D'évaluer les solutions alternatives de programmation
en fonction de leur garantie de cohérence de
données, des erreurs éventuelles à l'exécution et de
l'efficacité des techniques de modularisation utilisées
SAP AG 1999

(C) SAP AG BC402 1-3


Table des matières

Préface

Chapitre 1 Vue d'ensemble Chapitre 6 Sous-programmes


du cours
Chapitre 7 Groupes de
Chapitre 2 Environnement fonctions et
d'exécution ABAP modules fonction
Chapitre 3 Types et objets de Chapitre 8 Introduction à ABAP
données Objects
Chapitre 4 Instructions Chapitre 9 Appel de programmes et
passation de paramètres
Chapitre 5 Opérations sur les
tables internes

Les exercices et solutions se situent à la fin du chapitre correspondant.

Annexes
SAP AG 1999

(C) SAP AG BC402 1-4


BC402 - Vue d'ensemble du cours

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 1-5


Scénario de gestion

 Vous allez utiliser ABAP Workbench pour


développer des applications de gestion simples.
Elles sont basées sur les tables, les données et
les objets du Dictionnaire ABAP du modèle de
données de vol. Ce cours vous permet de lire
uniquement les données de vol. Vous allez traiter
les données dans vos programmes. Les données
réelles de la base de données ne seront pas
modifiées.
 Vous allez utiliser, analyser, copier et modifier
également les objets du référentiel.

SAP AG 1999

(C) SAP AG BC402 1-6


Environnement d'exécution ABAP

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

(C) SAP AG BC402 2-1


Environnement d'exécution ABAP : objectifs du
chapitre

À la fin de ce chapitre, vous serez en mesure :

 De nommer les composantes d'un programme


ABAP
 De décrire la structure d'un programme ABAP
 De prendre en compte les aspects techniques de
l'exécution du programme lors de l'écriture d'un
programme ABAP

SAP AG 1999

(C) SAP AG BC402 2-2


BC402 - Environnement d'exécution ABAP

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 2-3


Composantes d'un programme ABAP

Dynpros Valeurs dans


les variantes
xy 007
Code source xz 008 Documentation
Éléments de texte Aide à l'application

INCLUDE mz_test_top. Utilisation


INCLUDE mz_test_i01. Hallo Welt!
...
INCLUDE mz_test_o01.
INCLUDE mz_test_f01. Hello world! Intégration
... ...
PROGRAM sapmz_test_.
Interface ¡Hola mundo!
TYPES: ...
Objet Traiter Saut Autres fonctions Options Système Aide
DATA: ....
... Suite fonctions Environnement
Objet Traiter Saut Autres Système Aide
Suite Première ligne
MODULE s_100 OUTPUT. Première ligne
Letzte Zeile
... Dernière ligne
Zurück
ENDMODULE. Retour Mehr Ziele < Erstes Bild
Premier dynpro
Autres < Tabellentyp Letztes Bild
MODULE ok_100 INPUT. Type de table Dernier dynpro
Zurück Erstes Feld
... Retour PremièreLetztes
zone Feld
ENDMODULE. Dernière zone

FORM calc using ....


Changing .
...
ENDFORM.

SAP AG 1999

Un programme ABAP contient les composantes suivantes :


 Un code source
...contenant les instructions ABAP.
 Des dynpros
... composés de la structure d'écran et d'une logique d'exécution correspondante. Vous créez
généralement la structure d'un écran à l'aide du Screen Painter. Cependant, il existe des écrans de
type spécial, appelés écrans de sélection et listes, dont la structure et la logique d'exécution sont
conçues exclusivement à l'aide d'instructions ABAP.
 Une interface
...contenant toutes les entrées de menus, la barre d'outils, la barre d'outils d'application ainsi que les
allocations des touches de fonction. Elle comprend les titres et les statuts. Un statut est un groupe de
menus et d'allocations des touches de fonction.
 Des éléments de texte
... spécifiques à la langue. Ils peuvent être convertis directement à partir de l'outil de gestion des
éléments de texte ou à l'aide d'un outil de conversion spécifique.
 Une documentation
... également spécifique à la langue. Écrivez toujours la documentation d'un point de vue utilisateur.
Pour documenter les techniques de programmation utilisées, recourez aux commentaires du code
programme.
 Des variantes
... vous permettant de prédéfinir les valeurs des zones de saisie dans l'écran de sélection d'un
programme.

(C) SAP AG BC402 2-4


Structure d'un programme

Déclarations PROGRAM sapbc402_rund_test.


TYPES: ...
DATA: ....
Module de CONSTANTS: ...
dialogue MODULE s_100 OUTPUT.
...
ENDMODULE.
...
...
Bloc événement
événement
INITIALIZATION.
...
...
START-OF-SELECTION.
...
...
...
...
...
Procédure
Procédure FORM calc USING ...
CHANGING ...
...
ENDFORM.
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.

(C) SAP AG BC402 2-5


Organisation du programme

Create Program Workbench Traiter Saut Autres fonctions Environnement Système Aide

Programme SAPMZ402_RUND_TEST Object Navigator

! Avec TOP include Désignation d'objet


> SAPMZ402_RUND_TEST
< Structures des dictionnaires
< Zones
< Modules PBO
< Modules PAI
< Sous-programmes
< Dynpros
< Statuts GUI
Déclarations globales < Titres GUI
< Transactions
> Includes
Modules PBO MZ402_RUND_TESTTOP
MZ402_RUND_TESTO01
Modules PAI MZ402_RUND_TESTI01
MZ402_RUND_TESTF01
MZ402_RUND_TESTE01
Sous-programmes

É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.

(C) SAP AG BC402 2-6


Architecture client/serveur à trois niveaux du
système R/3

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

Processus Processus Processus Processus


Base de de travail de travail Processus de travail
de travail
données de BD de BD de travail
de BD de BD
de BD

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.

(C) SAP AG BC402 2-7


Structure d'un processus de travail

Processeur de
dynpro

Processeur ABAP

Interface de base
de données

SAP AG 1999

Les processus de travail de la couche intermédiaire (généralement appelés serveur d'application)


correspondent à des composantes logicielles responsables du traitement des étapes de dialogue. Elles
sont mises en œuvre en tant qu'"ordinateurs virtuels". Ainsi, les programmes ABAP peuvent être
exécutés indépendamment de la plate-forme matérielle sur laquelle le système R/3 est installé.
Les processus de travail contiennent d'autres composantes logicielles responsables de différentes
tâches dans une étape de dialogue :
 Processeur de dynpros
Le processeur de dynpros est responsable de la communication entre SAPgui et le processus de
travail (via le dispatcher). Il traite la logique de séquence des dynpros, puis transfère le contenu de
zone vers la logique de traitement dans le programme.
 Processeur ABAP
Le processeur ABAP exécute la logique de traitement dans le programme ABAP et communique
avec l'interface de base de données. Le processeur de dynpros communique au processeur ABAP la
partie du programme (module) à traiter (en fonction de la logique de séquence des dynpros).
 Interface de base de données
L'interface de base de données est responsable de la communication avec la base de données. Elle
permet d'accéder aux tables et aux objets du Repository (y compris les objets du Dictionnaire
ABAP), de contrôler l'exécution de la transaction (COMMIT et ROLLBACK), puis d'administrer le
buffer de table sur le serveur d'application.

(C) SAP AG BC402 2-8


Éxécution générale du programme ABAP

Programme ABAP

Bloc de
Déclarations
traitement
passif passif Runtime
system
ABAP

Bloc de Bloc de actif


traitement traitement
passif passif

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.

(C) SAP AG BC402 2-9


Exécution de la transaction dialogue

LOP LOAD-OF-PROGRAM.
...

PBO MODULE ... OUTPUT.


ENDMODULE.

PAI MODULE ... INPUT.


ENDMODULE.

PBO MODULE ... OUTPUT.


ENDMODULE.

PAI MODULE ... INPUT.


ENDMODULE.

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.

(C) SAP AG BC402 2-10


Exécution de la transaction de programme

LOP LOAD-OF-PROGRAM.

INIT INITIALIZATION.

AT SELECTION-SCREEN
ASSO
OUTPUT.

ATSS AT SELECTION-SCREEN.

SOS START-OF-SELECTION.

GET GET ...

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.

(C) SAP AG BC402 2-11


Événements de traitement de liste

Buffer de la liste de base

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.

(C) SAP AG BC402 2-12


Programmes non exécutables
Générateur de
modules fonction Générateur de classes Éditeur ABAP

Programme INCLUDE,
type I

TYPES: ...
DATA: ....
Groupe de fonctions, Interface globale, type J
...
type F Classe globale, type K WRITE ...

CLASS-POOL ... Sous-programmes externes,


FUNCTION-POOL ...
type S

TYPES: ... TYPES: ...


SUBROUTINE-POOL ...
DATA: .... DATA: ....
TYPES: ...
FUNCTION ... CLASS ...
DATA: ....
ENDFUNCTION. ENDCLASS.
FORM ...
INTERFACE ...
ENDFORM.
ENDINTERFACE.

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.

(C) SAP AG BC402 2-13


Environnement d'exécution ABAP : résumé du
chapitre

Vous êtes maintenant capable :


 De nommer les composantes d'un programme
ABAP
 De décrire la structure d'un programme ABAP
 De prendre en compte les aspects techniques de
l'exécution du programme lors de l'écriture d'un
programme ABAP

SAP AG 1999

(C) SAP AG BC402 2-14


Environnement d'exécution ABAP : exercices

Chapitre : environnement d'exécution ABAP


Sujet : création d'objets du Repository

À la fin de ces exercices, vous serez en mesure :


• de créer des classes de développement
• de créer des programmes

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

1. Connectez-vous au système d'exploitation, puis au système de formation R/3 (votre


animateur vous indiquera le nom du système) avec le nom d'utilisateur BC402-##.
Saisissez un nouveau mot de passe.
## correspond à votre numéro de groupe à deux chiffres.

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

2-1 Créez la classe de développement Z##_BC402.

2-2 Créez un programme exécutable (type 1) Z##_BC402_COUNTERLIST1


sans TOP include.

2-3 Créez un programme exécutable Z##_BC402_FLIGHTLIST1


sans TOP include.

À partir de là, vous devez toujours utiliser Object Navigator. Vous


obtenez ainsi une vue d'ensemble de tous les objets du Repository
dans votre classe de développement. Vous pouvez sélectionner les
objets que vous souhaitez utiliser.

(C) SAP AG BC402 2-15


(C) SAP AG BC402 2-16
Environnement d'exécution ABAP : solutions

Chapitre : environnement d'exécution ABAP


Sujet : création d'objets du Repository

2-2 Solution de modèle SAPBC402_TYPS_COUNTERLIST1

*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_COUNTERLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 relatif aux types et objets de
données . *
*& *
*&-----------------------------------------------------------*

REPORT sapbc402_typs_counterlist1.

2-3 Solution de modèle SAPBC402_TYPS_FLIGHTLIST1

*&-----------------------------------------------------------*
*& État SAPBC402_TYPS_FLIGHTLIST1 *
*& *
*&-----------------------------------------------------------*
*& solution à l'exercice 2 relatif aux types et objets de
données *
*& *
*&-----------------------------------------------------------*

REPORT sapbc402_typs_flightlist1.

(C) SAP AG BC402 2-17


Types et objets de données

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

(C) SAP AG BC402 3-1


Types et objets de données : objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 De distinguer les différents types et objets de


données
 De définir les types de données et de déclarer les
objets de données
 D'utiliser les field symbols et références

SAP AG 1999

(C) SAP AG BC402 3-2


BC402 - Types et objets de données

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types de données et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 3-3


Types et objets de données

Les types décrivent les attributs des...


Zones de saisie/édition
Paramètres d'interface
des fonctions et méthodes
Paramètres d'interface
Objets de données des 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.

(C) SAP AG BC402 3-4


Types de données ABAP : vue d'ensemble

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

TYPES my_tp_type1 ...


TYPES my_tp_type2 ... Type élémentaire
...
Type complexe

Programme ABAP ... Type structuré


(type local
dans le programme) Type de table
TYPES local_type ...
Type de référence
...

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.

(C) SAP AG BC402 3-5


Construction des types de données

Type élémentaire Type de table

Extension de
table dynamique
Type structuré

Type de structure ou type de table ?

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.

(C) SAP AG BC402 3-6


Types prédéfinis du Dictionnaire ABAP

ACCP ............... Période comptable AAAAMM


CHAR ............... Chaîne de caractères
CLNT ............... Mandant
CUKY ............... Clé de devise référencée par une zone CURR
CURR ............... Zone devise stockée comme DEC
DATS ............... Zone date (AAAAMMJJ) stockée comme CHAR(8)
DEC ................. Zone de calcul ou zone montant comportant un signe plus ou moins
FLTP ................ Nombre en virgule flottante avec huit octets
INT1 ................. Nombre entier à 1 octet. Nombre entier <= 255
INT2 ................. Nombre entier à 2 octets. Uniquement pour la zone de longueur avant LCHR ou LRAW
INT4 ................. Nombre entier à 4 octets. Nombre entier avec un signe plus ou moins
LANG ............... Code langue
LCHR ............... Chaîne de caractères longue. Doit être précédée d'une zone INT2.
LRAW .............. Chaîne d'octets longue. Doit être précédée d'une zone INT2.
NUMC .............. Chaîne de caractères contenant uniquement des chiffres
PREC ............... Précision d'une zone QUAN.
QUAN .............. Zone de quantité. Pointe vers une zone d'unités avec le type UNIT.
RAW ................ Séquence d'octets non interprétée
TIMS ................ Zone heure (HHMMSS) stockée comme CHAR(6)
VARC ............... Chaîne de caractères longue (non prise en charge après la version 3.0) Pas de type
STRING ........... Chaîne de caractères d'une longueur variable élémentaire
RAWSTRING ... Séquence d'octets d'une longueur variable
UNIT ................. Clé d'unité pour une zone QUAN

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.

(C) SAP AG BC402 3-7


Éléments et structures de données dans le
Dictionnaire ABAP
Objet de dév. Traiter Saut Autres fonctions Environnement Système Aide

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.

(C) SAP AG BC402 3-8


Attributs de la table interne (types)

CARRID CONNID DISTANCE Type de ligne


Définition de la clé
AA 0017 2 572
LH 0400 6 162
? LH 0400 7 273 Type de clé
QF 0005 10 000 Accès index
SQ 0866 1 625 5
Type d'accès
UA 0007 2 572 UA 0007

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.

(C) SAP AG BC402 3-9


Types d'accès : vue d'ensemble

ANY TABLE

INDEX TABLE HASHED TABLE

STANDARD TABLE SORTED 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

Caractère unique NON UNIQUE UNIQUE | NON UNIQUE UNIQUE

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>.

(C) SAP AG BC402 3-10


Types de tables dans le Dictionnaire ABAP

Domaine
Type
Élément de prédéfini
Objet de dév. Traiter Saut Autres fonctions Environ. Système Aide
données

Objets du Dictionnaire de Object Navigator


Structure
Table de BD
Vue
Type de table MY_TABLETYPE Type de table
Structure
Élément de données
Domaine
Aide à la recherche
Objet de blocage
Type group

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.

(C) SAP AG BC402 3-11


Types d'ABAP prédéfinis

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

N Chaîne numérique 00 ... 0 1 65535


C Chaîne de caractères _ _ ... _ 1 65535
STRING Chaîne de caractères vide 0 indifférent
D Date JJMMAAAA 00000000 8 8
T Temps HHMMSS 000000 6 6
X Code hexadécimal X'00' 1 65535
XSTRING Code hexadécimal vide 0 indifférent

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.

(C) SAP AG BC402 3-12


Définition des types élémentaires dans un
programme

TYPES <type> [TYPE <type>|LIKE <objetdonnées>].

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).

(C) SAP AG BC402 3-13


Définition des types structurés dans un
programme

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

TYPES BEGIN OF <typestruc>.

et

TYPES END OF <typestruc>.

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>.

(C) SAP AG BC402 3-14


Définition des types de tables dans un programme

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.

(C) SAP AG BC402 3-15


Déclaration de zones et de structures

DATA <objetdonnées> [TYPE <type>|LIKE <objetdonnées>]


[VALUE <valeur>].

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.

(C) SAP AG BC402 3-16


Déclaration des tables internes

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.

(C) SAP AG BC402 3-17


Zones de saisie dans les écrans de sélection et les
tables de sélection

PARAMETERS <paramètre> [TYPE <type>|LIKE <objetdonnées>][...].

SELECT-OPTIONS <sélection> FOR <objetdonnées> [...].

DATA <set> TYPE RANGE OF <type>|LIKE RANGE OF <objetdonnées>}.

PARAMETERS
PARAMETERS pa_carr TYPE spfli-carrid DEFAULT 'LH'.

DATA d_conn TYPE spfli-connid.


SELECT-OPTIONS
SELECT-OPTIONS so_conn FOR d_conn OBLIGATORY.
DATA set_connection LIKE RANGE OF d_conn.

MOVE so_conn TO set_connection.


SELECT ... FROM spfli
INTO ...
WHERE carrid EQ pa_carr
AND IN set_connection.
connid IN

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.

 Vous pouvez également créer ce type de table à l'aide de …TYPE|LIKE RANGE OF … .


Cependant, les tables déclarées de cette manière ne sont pas reliées à l'écran de sélection.

Pour plus d'informations sur ces instructions, référez-vous aux cours BC405 (Reporting dans ABAP
Workbench) et BC410 (Programmation interactive).

(C) SAP AG BC402 3-18


Constantes et littérales

CONSTANTS <constante> TYPE <typedonnées>|LIKE <objetdonnées>


VALUE <littéral>|IS INITIAL}.

DATA factor TYPE f.

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.

(C) SAP AG BC402 3-19


Symboles de texte

<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

Les symboles de texte correspondent à un type de valeurs littérales alphanumériques spécifique.


Il est possible de créer un ensemble de symboles de texte pour tout programme. Ils peuvent être utilisés
pour l'édition de plusieurs manières. Les symboles de texte, contrairement aux valeurs littérales
alphanumériques classiques, présentent l'avantage de pouvoir être convertis. Par ailleurs, les
éléments de texte sont stockés séparément dans le code source du programme, facilitant ainsi la
compréhension de votre programme.
Les symboles de texte sont souvent utilisés pour créer des listes non spécifiques à la langue. Vous
pouvez également les utiliser pour affecter des textes aux objets de dynpro de manière dynamique.
(Les éléments de texte statiques pour les objets de dynpro constituent un cas spécifique et peuvent
être convertis).
Il est possible d'afficher les symboles de texte de deux manières différentes à l'aide de l'instruction
WRITE :
 WRITE text-<ts1>. (où <ts1> peut être un ID composé de trois caractères).
 WRITE '<textedéfaut>'(<ts2>). (où <ts2> peut être un ID composé de trois caractères).
Dans ce cas, si un texte existe dans la langue de travail courante, <ts2> apparaît. Dans le cas
contraire, le texte par défaut apparaît.

(C) SAP AG BC402 3-20


Transfert des données vers et à partir des dynpros

<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_é> = ...

* obtention des données de


l'écran:
... = <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.

(C) SAP AG BC402 3-21


Transfert des données vers et à partir des
programmes de base de données logique

NODES <nœud> [TYPE <type>].

REPORT ...

NODES
NODES:
spfli, sflight.

START-OF-SELECTION.

GET spfli.
WRITE: / spfli-carrid, spfli-connid.

GET spfli LATE


LATE.
WRITE: / 'tous les vols de cette connexion :'(afc).
SKIP. ULINE.

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).

(C) SAP AG BC402 3-22


Objets de données prédéfinis

...

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.

En fonction de la structure syst du Dictionnaire ABAP, le système crée automatiquement une


structure appelée sy pour chaque programme. Les composantes individuelles de la structure sont
appelées zones système. Elle contiennent des valeurs vous informant de l'état courant du système.
Ces valeurs sont mises à jour automatiquement par l'environnement d'exécution ABAP.
Vous pouvez accéder aux zones système individuelles à l'aide de la notation sy-<zone_système>.
Les zones système sont variables et, par conséquent, modifiables dans vos programmes. Cependant,
effectuez cette opération uniquement si elle est recommandée dans la documentation de manière
explicite (par exemple, navigation entre les niveaux de liste en utilisant sy-lsind). Dans tous les
autres cas, lisez uniquement le contenu des zones système, car en les modifiant, des informations
importantes pour des étapes ultérieures du programme risquent d'être écrasées.
La documentation en ligne contient une liste de toutes les zones système avec des remarques relatives à
leur utilisation. Vous pouvez également afficher la structure syst dans le Dictionnaire ABAP.

(C) SAP AG BC402 3-23


Field symbols
FIELD-SYMBOLS <<fs>> {{TYPE|LIKE} ... |TYPE ANY}.
ASSIGN ... <objetdonnées> TO <<fs>> [CASTING [TYPE <type>|...]
].
UNASSIGN <<sz>>.
... <<sz>> IS ASSIGNED ...

DATA int TYPE i VALUE 15. 15 int


FIELD-SYMBOLS <<sz_int>
> TYPE i.
fs_int 15 int

ASSIGN int TO <<sz_int>.


> fs_int <adr_int> int
15
WRITE: / int, <<sz_int>.
>

<<sz_int>> = 17. fs_int <adr_int> 17 int


WRITE: / int, <<sz_int>.
>

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.

(C) SAP AG BC402 3-24


Field symbols et références

TYPES <typeréf> TYPE REF TO data.


DATA <référence> TYPE REF TO data.

GET REFERENCE OF <objetdonnées> INTO <référence>.

ASSIGN <référence>->* TO <<sz>> [CASTING [TYPE <type>|...] ].

CREATE DATA <référence> TYPE|LIKE ... .

DATA int TYPE i VALUE 15. 15 int


FIELD-SYMBOLS <sz_int> LIKE int.
fs_int
DATA d_ref1 TYPE REF TO data
data.
DATA d_ref2 LIKE d_ref1. d_ref1
d_ref2
GET REFERENCE OF int INTO d_ref1.
d_ref2 = d_ref1. 15 int

fs_int <adr_int>
ASSIGN d_ref2->*
->* TO
TO <sz_int>.
<adr_int> d_ref1

WRITE: / int, <sz_int>. <adr_int> d_ref2

SAP AG 1999

 L'instruction TYPES <typeréf> TYPE REF TO data. *) définit un type de référence à un


objet de données. DATA... définit elle-même la référence correspondante. Une telle référence
correspond à une zone dans laquelle une adresse peut être stockée.
 L'instruction GET REFERENCE OF <objetdonnées> INTO <référence> écrit l'adresse
de l'objet de données (déjà déclaré) dans la variable de référence. En d'autres termes, la référence
pointe vers l'objet de données dans la mémoire.
ABAP utilise ensuite la sémantique de référence (les modifications s'appliquent à l'adresse), ainsi
que la sémantique de valeur, telles qu'elles sont utilisées dans les field symbols (dans lesquels les
modifications s'appliquent aux objets de données). Cependant, dans ABAP, la sémantique de
référence se limite aux affectations.
 L'opérateur de déréférencement ->* dans l'instruction ASSIGN vous permet d'affecter l'objet de
données vers lequel la référence pointe vers un field symbol. Vous pouvez alors accéder à la valeur
de l'objet de données.
 Il est possible de créer un objet de données avec un type spécifié au moment de l'exécution à l'aide de
l'instruction CREATE DATA <référence>. Cet objet de données ne possède pas de nom mais la
référence pointe vers son adresse. (Référez-vous également à GET REFERENCE OF...)
 Pour plus d'informations sur l'utilisation des références dans ABAP Objects, référez-vous au chapitre
Introduction à ABAP Objects.
 __________________________
 *) Remarque : les données dans ce contexte ne correspondent pas à un mot-clé mais plutôt à un nom
prédéfini comme espace ou p.

(C) SAP AG BC402 3-25


Exemple d'un type de conversion dynamique

PARAMETERS: pa_dbtab TYPE dd02l-tabname.

DATA dummy TYPE i. "l'adresse de la ligne mod 4 doit être zéro !!


DATA: line(65535).
FIELD-SYMBOLS: <sz_wa> TYPE ANY, <sz_comp> TYPE ANY.

SELECT * FROM (pa_dbtab) INTO line.


ASSIGN line TO <sz_wa> CASTING TYPE (pa_dbtab).
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <sz_wa> TO <sz_comp>.
IF sy-subrc NE 0.
SKIP.
EXIT.
ENDIF.
WRITE <sz_comp>.
ENDDO.
ENDSELECT.

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.)

(C) SAP AG BC402 3-26


Déclaration des objets de données de manière
dynamique : exemple
PARAMETERS: pa_dbtab(30) DEFAULT 'SFLIGHT'.

DATA: d_ref TYPE REF TO data.


FIELD-SYMBOLS: <sz_wa> TYPE ANY, <sz_comp> TYPE ANY.

CREATE DATA d_ref TYPE (pa_dbtab).


ASSIGN d_ref->* TO <sz_wa>.

SELECT * FROM (pa_dbtab) INTO <sz_wa>.


DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <sz_wa> TO <sz_comp>.
IF sy-subrc NE 0.
SKIP.
EXIT.
ENDIF.
WRITE <sz_comp>.
ENDDO.
ENDSELECT.

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>.

(C) SAP AG BC402 3-27


Attributs des objets de données

DESCRIBE FIELD <zone>


LENGTH <lon> "longueur
TYPE <type> [COMPONENTS <nom>] "type [nombre de composantes]
OUTPUT-LENGTH <lon> "longueur (WRITE-statement)
DECIMALS <nom> "nombre de décimales
...

DESCRIBE TABLE <tabi>


LINES <nom> "nombre de lignes renseignées
...

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.

(C) SAP AG BC402 3-28


Types et objets de données : résumé du chapitre

Vous êtes maintenant capable :


 De distinguer les différents types et objets de
données
 De définir les types de données et de déclarer les
objets de données
 D'utiliser les field symbols et références

SAP AG 1999

(C) SAP AG BC402 3-29


Types et objets de données : exercices

Chapitre : types et objets de données


Sujet : définition des types et objets de données

À la fin de ces exercices, vous serez en mesure :


• de définir les types de données
• de définir les variables et les options de sélection
• de déclarer les field symbols

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

1. Complétez le programme Z##_BC402_COUNTERLIST1.


Créez une table interne appropriée vous permettant de bufferiser le nom des aéroports, ainsi
que leurs codes. Créez une deuxième table interne pour les compagnies aériennes, les
aéroports et les numéros de comptoirs.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
SAPBC402_TYPS_COUNTERLIST1

1-1 Définissez le type de structure t_airport. Il doit comporter la structure suivante


:
Composante Type
id sairport-id
name sairport-name

1-2 Définissez le type de structure t_counter. Il doit comporter la structure suivante


:
Composante Type
airport scounter-airport
airp_name sairport-name
carrid scounter-carrid
countnum scounter-countnum

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-5 Déclarez la table interne it_airport_buffer comme une table d'adresses


calculées avec le type de ligne t_airport. La clé unique doit contenir la
composante id.

1-6 Déclarez la structure wa_airport avec le type de données t_airport.

1-7 Dans l'écran de sélection standard, déclarez l'option de sélection so_carr pour la
zone wa_counter-carrid.

1-8 Gérez un texte de sélection.

(C) SAP AG BC402 3-31


2. Complétez le programme Z##_BC402-FLIGHTLIST1 :
Déclarez une table interne contenant le calendrier des vols de différentes compagnies
aériennes.
L'affectation d'un ou de plusieurs types d'appareils disponibles pour chaque compagnie
aérienne devrait être possible ultérieurement. Il doit s'agir d'une deuxième table interne,
imbriquée dans le type de ligne de la table d'origine.
Pour saisir la table interne, créez en premier lieu deux objets du Dictionnaire ABAP.
Déclarez également une table de sélection pour les compagnies aériennes ayant subi avec
succès le contrôle des autorisations.
## correspond à votre numéro de groupe à deux chiffres.
Solutions de modèle :
BC402_TYPS_PLANE
BC402_TYPS_PLANETAB
SAPBC402_TYPS_FLIGHTLIST1

2-1 Dans le Dictionnaire ABAP, créez la structure globale Z##_BC402_PLANE. La


structure doit être la suivante (gardez à l'esprit que vous devez relier une zone
devise à une zone montant) :

Composante Type utilisant l'élément de données


PLANETYPE S_PLANETYE
SEATSMAX S_SEATSMAX
AVG_PRICE S_PRICE
CURRENCY S_CURRCODE

2-2 Dans le Dictionnaire ABAP, créez la structure globale Z##_BC402_PLANETAB.


Pour le type de ligne, utilisez la structure globale Z##_BC402_PLANE. Définissez
la table interne comme table standard avec une clé non unique comprenant la
composante PLANETYPE.

2-3 Dans le programme, définissez le type de structure t_flight. La structure doit


être la suivante (notez que la dernière composante comporte un type de table
global).

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

(C) SAP AG BC402 3-32


2-4 Définissez le type de table interne t_flighttab avec le type de ligne
t_flight. Il doit s'agir d'une table triée avec la clé unique carrid connid
fldate.

2-5 Déclarez une structure wa_flight avec le type de données t_flight.

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.

... TYPE RANGE OF ...

2-9 Déclarez un espace de travail wa_allowed_carr pour la table de sélection


allowed_carriers.

2-10 Gérez les textes de sélection.

(C) SAP AG BC402 3-33


Types et objets de données : solutions

Chapitre : types et objets de données


Sujet : définition des type et objets de données

1 Solution de modèle SAPBC402_TYPS_COUNTERLIST1

*&-----------------------------------------------------------*
*& É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:

it_carr_counter TYPE STANDARD TABLE OF t_counter,

wa_counter TYPE t_counter,

it_airport_buffer TYPE HASHED TABLE OF t_airport


WITH UNIQUE KEY id,

wa_airport TYPE t_airport.

SELECT-OPTIONS so_carr FOR wa_counter-carrid.

(C) SAP AG BC402 3-34


2 Solution de modèle SAPBC402_TYPS_FLIGHTLIST1

*&-----------------------------------------------------------*
*& É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,

t_flighttab TYPE SORTED TABLE OF t_flight


WITH UNIQUE KEY carrid connid fldate.

DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.

SELECT-OPTIONS so_carr FOR wa_flight-carrid.

* pour le contrôle de l'habilitation :


*************************************
DATA:
allowed_carriers TYPE RANGE OF t_flight-carrid,
wa_allowed_carr LIKE LINE OF allowed_carriers.

(C) SAP AG BC402 3-35


(C) SAP AG BC402 3-36
Instructions

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

(C) SAP AG BC402 4-1


Instructions : objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 D'écrire des expressions arithmétiques et


d'effectuer des calculs
 De traiter des chaînes et des parties de zones
 D'affecter des valeurs entre les zones compatibles
et non compatibles
 D'écrire des expressions logiques et de contrôler
le déroulement du programme
 D'intercepter les erreurs à l'exécution

SAP AG 1999

(C) SAP AG BC402 4-2


BC402 - Instructions

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 4-3


Initialisation des objets de données
CLEAR <objetdedonnées>.

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.

(C) SAP AG BC402 4-4


Affectation de valeurs

MOVE <source> TO <cible>.


nom
MOVE-CORRESPONDING <s_struc> TO <t_struc>.
WRITE <source> TO <cible>. SAP_ AG _ _

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).

(C) SAP AG BC402 4-5


Compatibilité et conversion

 Quand peut-on parler de deux types compatibles ?


 Deux types élémentaires sont compatibles s'ils comportent exactement
le même type et la même longueur (et pour les zones de type P, le même
nombre de décimales).

 Deux types structurés sont compatibles s'ils comportent exactement la


même structure et si leurs composantes sont compatibles.

 Deux types de table sont compatibles si leurs types de ligne sont


compatibles et si leurs séquences de clé, leurs attributs d'unicité et
leurs types de table sont identiques.

 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) SAP AG BC402 4-6


Règles de conversion pour les types élémentaires

 Les zones de saisie sont renseignées dans la partie


gauche si elles contiennent des caractères et dans la partie
droite si elles contiennent des chiffres
 Les zones numériques sont renseignées à partir de la
droite et avec des zéros en-tête si nécessaire
 Le système doit pouvoir interpréter le contenu de la zone
source en fonction du type de données de la zone cible

Zone source Zone cible


Type Longueur Valeur Type Longueur Valeur

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.

(C) SAP AG BC402 4-7


Règles de conversion pour les types structurés

DATA: BEGIN OF rec1,


rec1
text1(3) TYPE c VALUE 'AAA',
text2(4) TYPE c VALUE 'BBCC',
pack TYPE p DECIMALS 2 VALUE '2.26',
text3(10) TYPE c VALUE 'DD',
END OF rec1
rec1,
rec2
BEGIN OF rec2,
text1(5) TYPE c VALUE 'YYYYY',
pack TYPE p DECIMALS 2 VALUE '72.34',
text3 TYPE c VALUE 'Z',
END OF rec2
rec2.
rec2
MOVE rec1 TO rec2.

rec1 text1 text2 pack text3


AAA BBCC 0000000000002.26 DD _ _ _ _ _ _ _ _
rec2 text1 pack text3 rec2 text1 pack text3
YYYYY 0000000000072.34 Z AAABB C ? ? ? ?

SAP AG 1999

L'environnement d'exécution ABAP dispose de règles pour convertir :


 les structures en structures non compatibles ;
 les zones élémentaires en structures ;
 les structures en zones élémentaires.
Dans chaque cas, le système convertit les variables source en zones de caractère, puis remplit les
structures cibles octet par octet. Les règles de conversion appropriées aux zones élémentaires sont
ensuite appliquées.
Les tables internes peuvent être uniquement converties en d'autres tables internes. Le système convertit
les types de lignes en fonction de la règle appropriée aux structures.
L'exemple ci-dessus montre que la copie entre des types non compatibles peut entraîner la création de
zones cible contenant des valeurs ne pouvant pas être interprétées correctement. Pour éviter ce
problème, effectuez une copie des valeurs zone par zone. Le système applique ainsi la règle de
conversion correcte pour les zones élémentaires.
Pour traiter les chaînes, il est préférable d'utiliser les instructions prévues à cet effet.

(C) SAP AG BC402 4-8


Vue d'ensemble : traitement de chaîne

? 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().

(C) SAP AG BC402 4-9


Recherche dans une chaîne

SEARCH <zone> FOR <chaînederecherche>.


SEARCH <tabi> FOR <chaînederecherche>.

DATA:
str(100) TYPE c A b a p o b j e c t
VALUE 'Abap object '.

SEARCH str FOR 'X'.


SEARCH str FOR 'ObjecT'.
SEARCH str FOR '. .'.
SEARCH str FOR 'OBj*'.
SEARCH str FOR '*ect'.

Zone système sy-fdpos: 0 1 2 3 4 5 6 7 8 9 10 11

SAP AG 1999

Le système recherche la chaîne <chaînederecherche> dans la zone <zone>. La chaîne de recherche


peut comporter la structure suivante :
 '<ch>' Chaîne (les espaces à droite sont ignorés)
 '.<ch>.' Toute chaîne contenue entre les points
(les espaces sont inclus dans la recherche)
 '<ch>*' Une chaîne commençant par et incluant '<ch>'
 '<ch>*' Une chaîne commençant par et incluant '<ch>'
Le décalage de la chaîne est inséré dans la zone système sy-fdpos. Si la chaîne de recherche est
introuvable, sy-fdpos contient la valeur 0 et sy-subrc est défini sur 4.
Utilisez SEARCH <tabi> plutôt que SEARCH <zone>. Le système recherche ensuite la chaîne de
recherche <chaînederecherche> dans la table interne <tabi>. Dans cette variante, le
système définit également la zone système sy-tabix en fonction de l'index de la ligne contenant la
chaîne de recherche.

(C) SAP AG BC402 4-10


Modification des chaînes

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

 REPLACE <ch1> WITH <ch2> INTO <zone>.


Remplace la première occurrence de <ch1> dans <zone> avec <ch2>.
 TRANSLATE <zone> USING <ch>.
Remplace toutes les lettres dans <zone> en fonction de <ch>. <ch> contient les caractères de
recherche et de remplacement dans les paires. Par exemple : TRANSLATE ... USING 'AB'.
 TRANSLATE <zone> TO UPPER|LOWER CASE
Remplace toutes les lettres en minuscules dans <zone> par des majuscules (ou inversement).
 SHIFT <zone> [<var>] [RIGHT] [CIRCULAR].
<var> peut être l'une des suivantes :
BY <n> PLACES Décale <zone> de <n> caractères
UP TO <ch> Décale <zone> jusqu'au début de <ch>
Les ajouts entraînent les conséquences suivantes :
RIGHT Décale vers la droite
CIRCULAR Décale vers la droite (les caractères décalés du côté droit de la zone réapparaissent à
gauche).
 CONDENSE <zone> [NO-GAPS].
Les espaces consécutifs sont remplacés par un seul espace ou supprimés.
Remarque :
Vous pouvez supprimer les espaces à gauche ou à droite en utilisant
SHIFT <zone> LEFT DELETING LEADING SPACE ou
SHIFT <zone> RIGHT DELETING TRAILING SPACE.

(C) SAP AG BC402 4-11


Fractionnement et regroupement de chaînes

SPLIT <zone> AT <sép> INTO <f1> ... <fn>|TABLE <tabi>}.

SPLIT 'ABAP' AT
AT 'BA' INTO
INTO f1 f2. AB AP

A P

CONCATENATE <f1> ... <fn> INTO <zone> [SEPARATED BY <sép>].

CONCATENATE 'AB' 'AP' INTO f. AB + AP


AB AP

OVERLAY <f1> WITH <f2> [ONLY <ch>].

OVERLAY f WITH
WITH 'XBAX'. A P X BAX
AB AP
SAP AG 1999

 SPLIT <zone> AT <sép> INTO <f1> ... <fn>|TABLE <tabi>}.


Fractionne <zone> à chaque occurrence de la chaîne séparateur <sép>, puis insère les parties dans
les zones <f1> .... <fn> ou dans les lignes consécutives de la table interne <tabi>.
 CONCATENATE <f1> ... <fn> INTO <f> [SEPARATED BY <séparateur>].
Combine les zones <f1>... <fn> dans <zone>. Les espaces à droite sont ignorés dans les
zones de composantes. Vous pouvez utiliser l'option SEPARATED BY <séparateur> pour
insérer la chaîne <séparateur> entre les chaînes <f1>... <fn>.
 OVERLAY <f1> WITH <f2> [ONLY <ch>].
<f2> relie <f1> aux endroits où <f1> contient un espace ou l'un des caractères dans <ch>.
Remarque
Référez-vous également au chapitre "Accès aux parties de zones".

(C) SAP AG BC402 4-12


Accès aux parties de zones

<instruction> <zone>+<déc>(<lon>) ...


Possible avec tout
type de zone de saisie
REPORT ...

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

MOVE <zone1>+<déc1>(<lon1>) TO <zone2>+<déc2>(<lon2>).

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.

(C) SAP AG BC402 4-13


Calculs : syntaxe

[COMPUTE] <résultat> = <expression_arithmétique>.

* 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.

(C) SAP AG BC402 4-14


Calculs : nombres entiers et condensés

ABAP : attributs de programme pour CALCULATOR

Titre Démo : calculs


Utilisez le type
de données
dec ou P
Attributs

Blocage de l'éditeur ! Arithmétique en virgule fixe

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.

(C) SAP AG BC402 4-15


Calculs : nombres en virgule flottante et erreurs à
l'exécution
| |

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.

(C) SAP AG BC402 4-16


Calculs : zones date

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.

daterec-day = '01'. " premier jour du mois


datestring = daterec.
datestring = datestring -
- 1. " dernier jour du mois
précédent
-
diffdays = sy-datum - datestring. " jours de différence
SAP AG 1999

 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.

(C) SAP AG BC402 4-17


Expressions logiques

* comparaisons de tous les types de données :


.. <objd> EQ|= <littéral>|<objd>} .. "égal
.. <objd> NE|<> <littéral>|<objd>} .. "différent de
.. <objd> GT|> <littéral>|<objd>} .. "supérieur à
.. <objd> GE|>= <littéral>|<objd>} .. "supérieur ou égal
.. <objd> LT|< <littéral>|<objd>} .. "inférieur à
.. <objd> LE|= <littéral>|<objd>} .. "inférieur ou égal
.. <objd> BETWEEN <lit>|<objd> AND <lit>|<objd>} ..
.. <objd> IS INITIAL ..

* imbrication d'expressions logiques :


.. <op_imbri> ( <expr1> <op_imbri> <expr2> ) <op_imbri> ..

* opérateurs possibles <op_imbri> :


.. AND .. "toutes les expressions doivent être vraies
.. OR .. "l'une des expressions doit être vraie

* 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.

(C) SAP AG BC402 4-18


Comparaison des chaînes

* comparaisons des types de données de caractère :


.. <ch1> CO <ch2> .. "contient uniquement
.. <ch1> CA <ch2> .. "contient tout
.. <ch1> CS <ch2> .. "contient chaîne
.. <ch1> CP <ch2> .. "contient modèle

u/l espace sy-


sy-fdpos

CO

CA

CS

CP

SAP AG 1999

À chaque opérateur relationnel mentionné ci-dessus correspond une expression négative.


L'expression logique ... <ch1> <op> <ch2> .. peut contenir un opérateur <op> comme suit :
 CO <ch1> contient uniquement des caractères provenant de <ch2> ;
 CN <ch1> ne contient pas seulement des caractères provenant de <ch2> (correspond à NOT
<ch1> CO <ch2>) ;
 CA <ch1> contient au moins un caractère provenant de <ch2> ;
 NA <ch1> ne contient aucun caractère provenant de <ch2> ;
 CS <ch1> contient la chaîne <ch2> ;
 NS <ch1> ne contient pas la chaîne <ch2> ;
 CP <ch1> contient le modèle <ch2> ;
 NP <ch1> ne contient pas le modèle <ch2> ;
La zone système sy-fdpos contient le décalage du caractère répondant à la condition ou la longueur
de <ch1>.
Dans les quatre premières expressions, le système prend en compte les lettres en minuscules et en
majuscules et la longueur totale de la chaîne (colonne SPACE).
Pour spécifier les modèles, utilisez "*" pour toutes les chaînes et "+" pour tous les caractères. Le
symbole d'échappement est représenté par "#".

(C) SAP AG BC402 4-19


Branchement conditionnel

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.

(C) SAP AG BC402 4-20


Boucles

DO [<n> TIMES] [...].


* ... instructions ...
ENDDO.
Compteur de boucles :
sy-index
WHILE <expr_logique>.
* ... instructions ...
ENDWHILE.

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.

(C) SAP AG BC402 4-21


Vue d'ensemble : blocs de traitement

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.

(C) SAP AG BC402 4-22


Interception des erreurs à l'exécution

CATCH SYSTEM-EXCEPTIONS <except1> = <rc1> ...<exceptn> =


<rcn>.
...
ENDCATCH.
bcd_zerodivide
Erreur à l'ex.
convt_no_number
simple ...

arithmetic_errors
Classes ERROR conversion_errors
...

Toutes les erreurs


à l'ex. pouvant autres
être interceptées

SAP AG 1999

Dans un bloc de traitement, vous pouvez utiliser la structure CATCH SYSTEM-EXCEPTIONS...


ENDCATCH pour intercepter les erreurs à l'exécution. Si une exception a lieu dans le système
spécifié, le système conserve les instructions dans le bloc, puis continue le traitement après
l'instruction ENDCATCH. Cette construction intercepte uniquement les erreurs à l'exécution au
niveau des appels courants. Si vous appelez un sous-programme dans lequel une erreur à
l'exécution est déclenchée, interceptez cette erreur dans le sous-programme lui-même.
Chaque erreur à l'exécution est affectée à une classe ERROR. Pour obtenir une liste complète, référez-
vous à la documentation de syntaxe pour l'instruction CATCH.
Vous pouvez spécifier l'un des éléments suivants comme l'exception du système <excep> à intercepter :
 Une erreur simple (par exemple, convt_no_number) ;
 Classes ERROR (par exemple, arithmetic_errors) ;
 Toutes les erreurs à l'exécution pouvant être interceptées
Les valeurs du code retour <rc1>... <rcn> doivent être des valeurs littérales numériques.
Le code retour affecté à l'erreur d'exécution survenue est inséré dans la zone système sy-subrc. Si
plusieurs valeurs lui sont affectées, le système utilise la première. Ceci s'avère particulièrement
important si vous spécifiez deux classes ERROR différentes contenant la même erreur à l'exécution.

(C) SAP AG BC402 4-23


Exemple : interception des erreurs à l'exécution

DATA pack(4) TYPE p DECIMALS 2 VALUE '3.14'.


...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 1
convt_overflow = 2.
...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 3
bcd_zerodivide = 4.
...
CATCH SYSTEM-EXCEPTIONS remote_call_errors = 5.
...
pack = pack / 0.
ENDCATCH.
...
pack = 'ABC'.
ENDCATCH.
...
pack = '123456789.987654321'.
ENDCATCH.
...

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 ?

(C) SAP AG BC402 4-24


Exemple : solution (partie 1)

DATA pack(4) TYPE p DECIMALS 2 VALUE '3.14'.


...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 1
convt_overflow = 2.
...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 3
bcd_zerodivide = 4.
...
CATCH SYSTEM-EXCEPTIONS remote_call_errors = 5.
...
pack = pack / 0.
ENDCATCH.
...
pack = 'ABC'.
ENDCATCH.
...
pack = '123456789.987654321'.
ENDCATCH.
...

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.

(C) SAP AG BC402 4-25


Exemple : solution (partie 2)

DATA pack(4) TYPE p DECIMALS 2 VALUE '3.14'.


...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 1
convt_overflow = 2.
...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 3
bcd_zerodivide = 4.
...
CATCH SYSTEM-EXCEPTIONS remote_call_errors = 5.
...
pack = pack / 0.
ENDCATCH.
...
pack = 'ABC'.
ENDCATCH.
...
pack = '123456789.987654321'.
ENDCATCH.
...

SAP AG 1999

Le système reprend le traitement au niveau de la première instruction après l'instruction intermédiaire


ENDCATCH. L'affectation d'une chaîne (ne pouvant être interprétée comme un nombre condensé) à
une zone de nombre condensé n'est, par conséquent, pas exécutée, même si l'erreur à l'exécution qui
s'ensuit convt_no_number avait été interceptée dans notre programme.

(C) SAP AG BC402 4-26


Exemple : solution (partie 3)

DATA pack(4) TYPE p DECIMALS 2 VALUE '3.14'.


...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 1
convt_overflow = 2.
...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 3
bcd_zerodivide = 4.
...
CATCH SYSTEM-EXCEPTIONS remote_call_errors = 5.
...
pack = pack / 0.
ENDCATCH.
...
pack = 'ABC'.
ENDCATCH.
...
pack = '123456789.987654321'.
ENDCATCH.
...

SAP AG 1999

L'erreur à l'exécution convt_overflow est déclenchée en affectant un nombre à la zone condensée


qui est trop volumineuse pour lui. Un code retour est affecté à cette erreur dans le bloc extérieur.
sy-subrc est défini sur 2.

(C) SAP AG BC402 4-27


Exemple : solution (partie 4)

DATA pack(4) TYPE p DECIMALS 2 VALUE '3.14'.


...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 1
convt_overflow = 2.
...
CATCH SYSTEM-EXCEPTIONS convt_no_number = 3
bcd_zerodivide = 4.
...
CATCH SYSTEM-EXCEPTIONS remote_call_errors = 5.
...
pack = pack / 0.
ENDCATCH.
...
pack = 'ABC'.
ENDCATCH.
...
pack = '123456789.987654321'.
ENDCATCH.
...

SAP AG 1999

Le système reprend le traitement après l'instruction ENDCATCH correspondante.

(C) SAP AG BC402 4-28


Instructions : résumé du chapitre

Vous êtes maintenant capable :


 D'écrire des expressions arithmétiques et
d'effectuer des calculs
 De traiter des chaînes et des parties de zones
 D'affecter des valeurs entre les zones compatibles
et non compatibles
 D'écrire des expressions logiques et de contrôler
le déroulement du programme
 D'intercepter les erreurs à l'exécution

SAP AG 1999

(C) SAP AG BC402 4-29


Opérations sur les tables internes

Contenu
 Informations générales
 Accès index
 Accès clé
 Accès field symbols
 Exemple

SAP AG 1999

(C) SAP AG BC402 5-1


Tables internes : objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 D'insérer des enregistrements de données


 De les lire
 De les modifier
 De les supprimer
 D'identifier la syntaxe des tables internes avec
des en-têtes
 D'évaluer les avantages et inconvénients de
l'utilisation des différents types de tables internes
dans vos applications

SAP AG 1999

(C) SAP AG BC402 5-2


BC402 - Opérations sur les tables internes

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 5-3


Accès aux enregistrements de données

wa_scarr mandt carrid carrname currcode


400 BA British Airways GBP

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

400 BA British Airways GBP

400 BL Pacific Airlines USD


ASSIGNING
400 CO Continental Airlines USD
<fs_scarr>
400 DL Delta Airlines USD
mandt carrid currname currcode
400 FC Berliner Spez. Flug DEM

400 LH Lufthansa DEM

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.

(C) SAP AG BC402 5-4


Ajout, insertion et lecture avec les tables d'index

Ajout Tables standard Tables triées

Ligne indiv. APPEND <wa> TO <tabi>.


Ligne d'origine APPEND INITIAL LINE TO <tabi>.

Lignes d'une APPEND LINES OF <tabi1> [FROM <n1>]


table [TO <n2>]
(des index) TO <tabi2>. Uniquement
possible si
Insertion la séquence
de tri
Ligne indiv. INSERT <wa> INTO <tabi> INDEX <n>. n'a subi
aucune
Ligne d'origine INSERT INITIAL LINE INTO <tabi> INDEX <n>. violation
Plusieurs lignes INSERT <wa> INTO <tabi>. Uniquement
possible
Lignes d'une INSERT LINES OF <tabi1> dans une boucle
table [FROM <n1>] [TO <n2>]
(des index) INTO <tabi2>. sy- tabix
contient l'index
Lecture de la lecture
de ligne
Ligne indiv. READ TABLE <tabi> INDEX <n> INTO <wa>
[COMPARING ...]
SAP AG 1999
[TRANSPORTING ...].

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

Modification Tables standard Tables triées

Ligne indiv. MODIFY <tabi> FROM <wa> INDEX <n>


[TRANSPORTING ...].

Plusieurs lignes MODIFY <tabi> FROM <wa>. Uniquement


possible
Suppression dans une boucle

Individuelle DELETE <tabi> INDEX <n>.


Uniquement
Plusieurs DELETE <tabi> [FROM <n1>] possible dans
[TO <n2>] une boucle
sauf
[WHERE <expr_logique>]. si vous
utilisez une option
Boucles

LOOP AT <tabi> INTO <wa>


[FROM <n1>]
[TO <n2>].
sy- tabix
... contient
ENDLOOP. l'index de
ligne courant

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.

(C) SAP AG BC402 5-6


Tables d'adresses calculées

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

<adr_400_LH> 400 LH Lufthansa DEM

Fonction de hachage <adr_400_AF> 400 AF Air France FF

<adr_400_BL> 400 BL Pacific Airlines USD

<adr_400_BA> 400 BA British Airways GBP

<adr_400_DL> 400 DL Delta Airlines USD

<adr_400_AA> 400 AA American Airlines USD

<adr_400_FC> 400 FC Berliner Spez. Flug DEM

<adr_400_AZ> 400 AZ Alitalia ITL

<adr_400_AC> 400 AC Air Canada CAD

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.

(C) SAP AG BC402 5-7


Insertion et lecture à l'aide de l'accès clé

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

Lignes INSERT LINES OF <tabi1>


d'une table [FROM <n1>] [TO <n2>]
(des index) INTO TABLE <tabi2>. sy- tabix
contient l'index
de la lecture
Lecture de ligne
Clé READ TABLE <tabi> FROM <wa1> INTO <wa2>.
READ TABLE <tabi> WITH [TABLE] KEY
<k1> = <val1> .. <kn> = <valn>
Zones
[clés]
INTO <wa> Identique
[COMPARING ...] aux tables
[TRANSPORTING ...]. des index

READ TABLE <tabi> WITH [TABLE] KEY


Non structuré table_line = <val>
INTO <wa>.

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.

(C) SAP AG BC402 5-8


Modification, suppression et traitement de boucle à
l'aide de l'accès clé

Modification

Ligne MODIFY TABLE <tabi> FROM <wa>


individuelle [TRANSPORTING ...].

Plusieurs MODIFY <tabi> FROM <wa>


lignes TRANSPORTING <f1> .. <fn>
WHERE <expr_logique>.

Suppression

Individuelle DELETE TABLE <tabi> FROM <wa>.

Zones-clés DELETE TABLE <tabi> WITH TABLE KEY


<k1> = <val1> .. <kn> = <valn>.

Plusieurs DELETE <tabi> WHERE <expr_logique>.

Boucle

LOOP AT <tabi> INTO <wa> [WHERE <expr_logique>


[TRANSPORTING NO FIELDS]].
... sy- tabix
ENDLOOP. contient
l'index de ligne
SAP AG 1999 courant

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.

(C) SAP AG BC402 5-9


Exemple : déclaration des tables standard

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,

t_cust_list TYPE STANDARD TABLE OF t_cust


WITH NON-UNIQUE KEY id.

DATA:
wa_cust TYPE t_cust,
wait_list TYPE t_cust_list,

position TYPE sy-tabix.

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.

(C) SAP AG BC402 5-10


Exemple : opérations sur les tables standard

*** ajout d'un client en attente :


READ TABLE wait_list FROM wa_cust TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
APPEND wa_cust TO wait_list.
ENDIF.

*** suppression d'un client en attente :


DELETE wait_list WHERE id = wa_cust-id.

*** accès au premier client en attente :


READ TABLE wait_list INTO wa_cust INDEX 1.
DELETE wait_list INDEX 1.

*** obtention de la fonction d'un client en attente :


READ TABLE wait_list FROM wa_cust TRANSPORTING NO FIELDS.
position = sy-tabix.

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>.

(C) SAP AG BC402 5-11


Exemple : table triée

DATA:
wa_flight TYPE sflight,

flight_list TYPE SORTED


SORTED TABLE OF sflight
WITH UNIQUE KEY carrid connid fldate.

SELECT * FROM sflight


INTO CORRESPONDING FIELDS OF TABLE flight_list.

*** insertion des dates de vol supplémentaires :


INSERT wa_flight INTO TABLE flight_list.

*** ajustement du prix :


wa_flight-price = '1250.00'. wa_flight-currency = 'USD'.
MODIFY flight_list FROM wa_flight TRANSPORTING price currency
WHERE carrid = wa_flight-carrid
AND connid = wa_flight-connid.

*** modification de la table de base de données à partir de la


table interne ...
SAP AG 1999

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.

(C) SAP AG BC402 5-12


Exemple : déclaration des tables d'adresses
calculées

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,

t_city_list TYPE HASHED


HASHED TABLE OF t_city
WITH UNIQUE KEY city country.
country

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.

(C) SAP AG BC402 5-13


Exemple : opérations sur les tables d'adresses
calculées

SELECT city country latitude longitude


FROM sgeocity
INTO CORRESPONDING FIELDS OF TABLE city_list.

READ TABLE city_list WITH TABLE KEY city = pa_city


country = pa_ctry
INTO wa_city.
CHECK sy-subrc = 0.
WRITE: / wa_city-city,
wa_city-country,
wa_city-latitude,
wa_city-longitude.

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.

(C) SAP AG BC402 5-14


Table interne avec en-tête

Espace de travail En-tête


wa_scarr mandt carrid carrname currcode it_scarr mandt carrid carrname currcode
400 CO Continental Airlines USD 400 CO Continental Airlines USD

Table interne Table interne


it_scarr mandt carrid carrname currcode it_scarr mandt carrid carrname currcode
400 CO Continental Airlines USD 400 CO Continental Airlines USD

400 LH Lufthansa DEM 400 LH Lufthansa DEM

400 AF Air France FF 400 AF Air France FF

APPEND <wa> TO <tabi>. APPEND <tabi>.


INSERT <wa> INTO <tabi> INDEX <n>. INSERT <tabi> INDEX <n>.
MODIFY <wa>
<tabi> INDEX <n> FROM <wa>. MODIFY <tabi> INDEX <n>.
DELETE TABLE <tabi> FROM <wa>
<wa>. DELETE TABLE <tabi>.

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.

Syntaxe explicite Syntaxe implicite


SAP AG 1999

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.

itab1 = itab2. " Seuls les en-têtes seront copiés


itab1[] = itab2[]. " Copie le corps de la table

(C) SAP AG BC402 5-15


Table interne avec valeurs cumulées

COLLECT [<wa> INTO] <itab>. TYPES:


BEGIN OF t_carr_info,
carrid TYPE sflight-carrid,
Type p price TYPE sflight-price,
END OF t_carr_info.
wa carrid prix
LH 100000 DATA:
it_carr_list TYPE HASHED
TABLE OF t_carr_info
it_carr_list carrid prix WITH UNIQUE KEY carrid,
AA 2090938
+
DL 933338 wa TYPE t_carr_info
t_carr_info.

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.

(C) SAP AG BC402 5-16


Accès field symbols

Lecture
READ TABLE <tabi> [INDEX <n> |
FROM <wa> |
WITH [TABLE] KEY ...] ASSIGNING <<ligne_sz>>.

Boucles
LoopsAT <tabi> ASSIGNING <<ligne_sz>> [WHERE ...].
LOOP
...
ENDLOOP.

Vous pouvez à présent accéder directement à la composante <<ligne_sz>>

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.

(C) SAP AG BC402 5-17


Exemple I : déclaration des tables imbriquées

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,

travel_list LIKE SORTED TABLE OF wa_travel WITH UNIQUE KEY dest.

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.

(C) SAP AG BC402 5-18


Exemple II : accès aux boucles à l'aide des field
symbols

FIELD-SYMBOLS:
<conn_sz> TYPE t_conn,
<int_conn_sz> TYPE t_conn,
<déplacement_sz> LIKE wa_travel.

SELECT carrid connid cityfrom cityto


FROM spfli
INTO CORRESPONDING FIELDS OF TABLE conn_list.
SORT conn_list BY cityfrom cityto ASCENDING AS TEXT.

*** construisez une table imbriquée :


LOOP AT conn_list ASSIGNING <conn_sz> WHERE cityfrom = pa_start.
wa_travel-dest = <conn_sz>-cityto.

LOOP AT conn_list ASSIGNING <int_conn_sz>


WHERE cityfrom = wa_travel-dest.
APPEND <int_conn_sz> TO wa_travel-cofl_list.
ENDLOOP.

SORT wa_travel-cofl_list BY cityto carrid ASCENDING AS TEXT.


INSERT wa_travel INTO TABLE travel_list.
ENDLOOP.

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.

(C) SAP AG BC402 5-19


Exemple III : accès aux boucles à l'aide des field
symbols

*** sortie :
LOOP AT travel_list ASSIGNING <déplacement_sz>.
WRITE: / <déplacement_sz>-dest.

LOOP AT <déplacement_sz>-cofl_list ASSIGNING <int_conn_sz>.


AT NEW cityto.
WRITE: /8 <int_conn_sz>-cityto.
ENDAT.

WRITE: /16 <int_conn_sz>-carrid,


<int_conn_sz>-connid.
ENDLOOP.

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.

(C) SAP AG BC402 5-20


Opérations sur les tables internes : résumé
Table standard Table triée Table d'adresses
Accès index n La séquence calculées
de tri
APPEND peut subir
une violation
INSERT
Pas d'accès index
READ TABLE aux tables
d'adresses
LOOP AT calculées
MODIFY
DELETE
SORT
Accès clé

INSERT Identique à APPEND Identique à APPEND

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).

(C) SAP AG BC402 5-21


Tables internes : résumé du chapitre

Vous êtes maintenant capable :


 D'insérer des enregistrements de données
 De les lire
 De les modifier
 De les supprimer
 D'identifier la syntaxe des tables internes avec
des en-têtes
 D'évaluer les avantages et inconvénients de
l'utilisation des différents types de tables internes
dans vos applications

SAP AG 1999

(C) SAP AG BC402 5-22


Opérations sur les tables internes : exercices

Chapitre : opérations sur les tables internes


Sujet : renseignement des tables internes
et accès à leurs entrées

À la fin de ces exercices, vous serez en mesure :


• de renseigner les tables internes
• d'accéder à leurs entrées

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

1. Commencez votre programme par la tâche 1 des exercices précédents :


renseignez la table avec la liste des noms d'aéroports et l'autre table avec l'affectation des
compagnies aériennes aux aéroports et aux numéros de comptoirs. Affichez ensuite la
deuxième table dans une liste.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
SAPBC402_TABS_COUNTERLIST2

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.

(C) SAP AG BC402 5-23


2. Étendez votre programme à la section 2 des exercices précédents :
Exécutez à présent un contrôle des autorisations pour savoir si l'utilisateur est autorisé à
visualiser les données des compagnies aériennes inclues dans la délimitation de l'écran de
sélection.
Insérez ensuite, dans une table interne appropriée, les compagnies aériennes sélectionnées
par l'utilisateur et pour lesquelles il détient une autorisation.
Affichez ensuite le résultat dans une liste.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
SAPBC402_TABS_FLIGHTLIST2

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-2 Bloc événement AT SELECTION-SCREEN:


Utilisez une boucle dans la table transparente SCARR pour renseigner la zone low
de l'espace de travail wa_allowed_carr.
Effectuez à présent un contrôle des autorisations par rapport à l'objet d'autorisation
S_CARRID pour cette compagnie aérienne et à l'activité "Afficher" (utilisez la
fonction Modèle dans l'Éditeur ABAP).
Si le contrôle est réussi, renseignez les zones sign et option de l'espace de
travail, puis ajoutez-le à la table de sélection.

2-3 Bloc événement START-OF-SELECTION:


Utilisez la vue BC402_FLIGHTS pour renseigner les zones élémentaires de la
table interne it_flights. Cependant, à ce stade, maintenez la table interne
it_planes d'origine.
Il n'est pas possible d'utiliser la variante "array fetch" de l'instruction SELECT avec
des tables internes imbriquées. Vous devez, par conséquent, programmer une
boucle avec les zones cibles répertoriées dans la clause INTO, puis insérer l'espace
de travail dans la table dans la séquence de tri appropriée.

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.

2-5 Gérez les intitulés de liste appropriés.

Vous pouvez exécuter le programme, puis gérer les intitulés de liste


à partir de la liste affichée.

(C) SAP AG BC402 5-24


(C) SAP AG BC402 5-25
Opérations sur les tables internes : solutions

Chapitre : opérations sur les tables internes


Sujet : renseignement des tables internes
et accès à leurs entrées

1 Solution de modèle SAPBC402_TABS_COUNTERLIST2

*&-----------------------------------------------------------*
*& É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:

it_carr_counter TYPE STANDARD TABLE OF t_counter,

wa_counter TYPE t_counter,

it_airport_buffer TYPE HASHED TABLE OF t_airport


WITH UNIQUE KEY id,

wa_airport TYPE t_airport.

SELECT-OPTIONS so_carr FOR wa_counter-carrid.

(C) SAP AG BC402 5-26


START-OF-SELECTION.

* bufferisation des noms d'aéroports :


*************************************************
SELECT id name
FROM sairport
INTO CORRESPONDING FIELDS OF TABLE it_airport_buffer.

* renseignement d'une table interne avec tous les comptoirs des


transporteurs sélectionnés :
********************************
SELECT carrid countnum airport
FROM scounter
INTO CORRESPONDING FIELDS OF wa_counter
WHERE carrid IN so_carr.

READ TABLE it_airport_buffer


INTO wa_airport
WITH TABLE KEY id = wa_counter-airport.
wa_counter-airp_name = wa_airport-name.
APPEND wa_counter TO it_carr_counter.

ENDSELECT.

SORT it_carr_counter BY airport carrid ASCENDING AS TEXT.

* 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.

(C) SAP AG BC402 5-27


2 Solution de modèle SAPBC402_TABS_FLIGHTLIST2

*&-----------------------------------------------------------*
*& É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,

t_flighttab TYPE SORTED TABLE OF t_flight


WITH UNIQUE KEY carrid connid fldate.

DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.

SELECT-OPTIONS so_carr FOR wa_flight-carrid.

FIELD-SYMBOLS <fs_flight> TYPE t_flight.

* pour le contrôle de l'habilitation :


*************************************
DATA:
allowed_carriers TYPE RANGE OF t_flight-carrid,
wa_allowed_carr LIKE LINE OF allowed_carriers.

(C) SAP AG BC402 5-28


START-OF-SELECTION.

* renseignement d'une table range avec les transporteurs


autorisés:
**************************************************************
SELECT carrid
FROM scarr
INTO wa_allowed_carr-low
WHERE carrid IN so_carr.

AUTHORITY-CHECK OBJECT 'S_CARRID'


ID 'CARRID' FIELD wa_allowed_carr-low
ID 'ACTVT' FIELD '03'. " affichage
IF sy-subrc <> 0.
CLEAR wa_allowed_carr.
ELSE.
wa_allowed_carr-sign = 'I'.
wa_allowed_carr-option = 'EQ'.
APPEND wa_allowed_carr TO allowed_carriers.
ENDIF.

ENDSELECT.

* renseignement d'une table interne avec les données de


correspondance et de vol pour les transporteurs autorisés :
***********************************************************
SELECT carrid connid fldate cityfrom cityto
seatsocc paymentsum currency
FROM bc402_flights
INTO (wa_flight-carrid, wa_flight-connid,
wa_flight-fldate,
wa_flight-cityfrom, wa_flight-cityto,
wa_flight-seatsocc,
wa_flight-paymentsum, wa_flight-currency)
WHERE carrid IN allowed_carriers.

INSERT wa_flight INTO TABLE it_flights.

ENDSELECT.

(C) SAP AG BC402 5-29


* affichage de la liste à l'aide du field symbol :
*****************************************************
LOOP AT it_flights ASSIGNING <vol_sz>
WHERE seatsocc > 0.
WRITE: / <vol_sz>-carrid,
<vol_sz>-connid,
<vol_sz>-fldate,
<vol_sz>-cityfrom,
<vol_sz>-cityto,
<vol_sz>-seatsocc,
<vol_sz>-paymentsum
CURRENCY <vol_sz>-currency,
<vol_sz>-currency.
ENDLOOP.

(C) SAP AG BC402 5-30


Sous-programmes

Contenu
 Définition de l'interface
 Appel de sous-programmes
 Durée de vie et visibilité
 Utilisation

SAP AG 1999

(C) SAP AG BC402 6-1


Sous-programmes : objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 De définir des sous-programmes


 De les appeler
 D'utiliser les différentes techniques existantes de
transfert et de saisie des paramètres d'interface

SAP AG 1999

(C) SAP AG BC402 6-2


BC402 - Sous-programmes

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 6-3


Organisation d'un sous-programme

FORM <s_prog> [...]


[USING ... ] "paramètres d'import
[CHANGING ... ] "paramètres d'import/export

[TYPES ...] "types de données locaux


[DATA ...] "objets de données locaux

... "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.

(C) SAP AG BC402 6-4


Méthodes de passation de paramètres

DATA: do1 .., do2 .., do3 .., do4 ..

FORM <s_prog> USING p1 .. value(p2) .. CHANGING p3 .. value(p4)


..
..
ENDFORM.
appel par appel appel par appel par
référence par référence valeur et
valeur résultat

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.

(C) SAP AG BC402 6-5


Saisie des paramètres d'interface

FORM .. <fp> [TYPE ANY]


[TYPE p|n|c|string|x|xstring}]
[TYPE [ANY|INDEX|STANDARD|SORTED|HASHED] TABLE]

[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.

Programme Traiter Saut Utilitaires Environ. Système Aide


Autre objet
Afficher <-> Modifier
Actif <-> Inactif
Contrôler < Syntaxe
Sauvegarder Contrôle de programme(s) étendu
Générer Programme principal
Activer
Tester
Imprimer
Terminer

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.

(C) SAP AG BC402 6-6


Appel d'un sous-programme

Insertion d'un modèle

...
...
...
PERFORM <s_prog>
...
DATA: ...
do1 ..,
do2 ..,
do3 ..,
do4 ...
...
PERFORM <sprog> USING do1 do2 CHANGING do3 do4.
...

FORM <sprog> USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..


...
ENDFORM.
SAP AG 1999

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.

(C) SAP AG BC402 6-7


Visibilité des objets de données globaux et locaux

DATA:
do1 ..,
do2 ..,
do3 ..,
do4 ...
...
PERFORM <s_prog> USING do1 CHANGING do2.
...

FORM <s_prog> USING value(p1) .. CHANGING p2


..
 DATA:
l_do1 ..  
l_do2 ..
 Masquage
* ... instructions ... local

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.

(C) SAP AG BC402 6-8


Comportement de la durée d'exécution I

do1 old1 do2 old2 do3 old3 do4 old4

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-9


Comportement de la durée d'exécution II

do1 old1 do2 old2 do3 old3 do4 old4

l_do v_new p2 old2 p4 old4

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-10


Comportement de la durée d'exécution III

do1 v_new do2 old2 do3 old3 do4 old4

l_do v_new p2 old2 p4 old4

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

DATA:
l_do .. VALUE ..

p1 = l_do.
p2 = l_do.
p3 = l_do.
p4 = l_do.

ENDFORM.

SAP AG 1999

Les modifications apportées à p1 affectent directement le contenu de do1.


Le paramètre formel p2 est déclaré comme une copie locale en mode lecture. Ainsi, aucune
modification ne peut affecter le paramètre effectif do2.

(C) SAP AG BC402 6-11


Comportement de la durée d'exécution IV

do1 v_new do2 old2 do3 old3 do4 old4

l_do v_new p2 v_new p4 old4

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-12


Comportement de la durée d'exécution V

do1 v_new do2 old2 do3 v_new do4 old4

l_do v_new p2 v_new p4 old4

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-13


Comportement de la durée d'exécution VI

do1 v_new do2 old2 do3 v_new do4 old4

l_do v_new p2 v_new p4 v_new

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-14


Comportement de la durée d'exécution VII

do1 v_new do2 old2 do3 v_new do4 v_new

...
PERFORM demosub USING do1 do2 CHANGING do3 do4.
...

FORM demosub USING p1 .. value(p2) .. CHANGING p3 .. value(p4) ..

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.

(C) SAP AG BC402 6-15


Exemple : modularisation locale dans les
programmes
DATA
res_seats TYPE saplane-seatsmax.

PARAMETERS:
pa_type TYPE saplane-planetype,
pa_occ TYPE saplane-seatsmax.

PERFORM get_free_seats USING pa_type


pa_occ
CHANGING res_seats.

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.

SELECT SINGLE seatsmax FROM saplane


INTO p_seatsfree
WHERE planetype = p_planetype.

p_seatsfree = p_seatsfree - p_seatsocc.


ENDFORM.
SAP AG 1999

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.

(C) SAP AG BC402 6-16


Exemple : appel récursif I

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>.

*** étape jusqu'à p_dest ?


READ TABLE conn_list INTO wa_conn
WITH TABLE KEY cityfrom = p_pos
cityto = p_dest.
IF sy-subrc = 0.
...
ELSE.
*** toutes les étapes suivantes qui n'ont pas encore été utilisées :
LOOP AT conn_list INTO wa_conn WHERE cityfrom = p_pos.
READ TABLE p_step_list WITH KEY cityto = wa_conn-cityto
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
...
APPEND l_wa_poss TO l_poss_list.
ENDIF.
ENDLOOP.
SAP AG 1999

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.

(C) SAP AG BC402 6-17


Exemple : appel récursif II

SORT l_poss_list BY cityto ASCENDING.


DELETE ADJACENT DUPLICATES FROM l_poss_list COMPARING cityto.

*** aucune étape correcte disponible :


IF l_poss_list IS INITIAL.
...
MODIFY p_step_list FROM wa_step TRANSPORTING no_way_out
WHERE cityto = p_pos.

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.

(C) SAP AG BC402 6-18


Exemple : appel récursif III

*** destination atteinte ?


READ TABLE p_step_list WITH KEY cityto = p_dest
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
EXIT.
ELSE.
CLEAR wa_step.
wa_step-no_way_out = 'X'.
MODIFY p_step_list FROM wa_step TRANSPORTING no_way_out
WHERE cityto = l_wa_poss-cityto.
ENDIF.

ENDIF. " no_way_out = ' '

ENDLOOP. " continuer

ENDIF. " étapes suivantes correctes disponibles

ENDIF. *** étapes suivantes qui n'ont pas encore été


utilisées :

ENDFORM. " find_conn

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.

(C) SAP AG BC402 6-19


Sous-programmes : résumé du chapitre

Vous êtes maintenant capable :


 De définir des sous-programmes
 De les appeler
 D'utiliser les différentes techniques existantes de
transfert et de saisie des paramètres d'interface

SAP AG 1999

(C) SAP AG BC402 6-20


Sous-programmes : exercices

Chapitre : sous-programmes
Sujet : interface, fonctions et appel

À la fin de ces exercices, vous serez en mesure :


• de mettre en œuvre des sous-programmes
• de les appeler

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

1. Étendez votre programme à la section 2 des exercices précédents :


Utilisez un sous-programme pour encapsuler le code servant à afficher les vols sur la liste.
Transférez la table interne appropriée par référence au sous-programme.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
SAPBC402_SURS_FLIGHTLIST3

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-2 À la fin de la logique de traitement, définissez le sous-programme


display_flights. Déclarez un paramètre pour la table interne afin de la
transférer par référence. Définissez-lui un type approprié.

1-3 Supprimez le field symbol <vol_sz> du programme principal, puis déclarez-le


comme un objet de données local dans le sous-programme.

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.

1-5 Dans le programme principal, appelez le sous-programme display_flights


(utilisez la fonction Modèle).

(C) SAP AG BC402 6-21


(C) SAP AG BC402 6-22
Sous-programmes : solutions

Chapitre : sous-programmes
Sujet : interface, fonctions et appel

1 Solution de modèle SAPBC402_SURS_FLIGHTLIST3

*&-----------------------------------------------------------*
*& É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,

t_flighttab TYPE SORTED TABLE OF t_flight


WITH UNIQUE KEY carrid connid fldate.

DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.

SELECT-OPTIONS so_carr FOR wa_flight-carrid.

* pour le contrôle de l'habilitation :


*************************************
DATA:
allowed_carriers TYPE RANGE OF t_flight-carrid,
wa_allowed_carr LIKE LINE OF allowed_carriers.

(C) SAP AG BC402 6-23


START-OF-SELECTION.

* renseignement d'une table range avec les transporteurs


autorisés:
**************************************************************
SELECT carrid
FROM scarr
INTO wa_allowed_carr-low
WHERE carrid IN so_carr.

AUTHORITY-CHECK OBJECT 'S_CARRID'


ID 'CARRID' FIELD wa_allowed_carr-low
ID 'ACTVT' FIELD '03'. " display
IF sy-subrc <> 0.
CLEAR wa_allowed_carr.
ELSE.
wa_allowed_carr-sign = 'I'.
wa_allowed_carr-option = 'EQ'.
APPEND wa_allowed_carr TO allowed_carriers.
ENDIF.

ENDSELECT.

* renseignement d'une table interne avec les données de


correspondance et de vol pour les transporteurs autorisés :
***********************************************************
SELECT carrid connid fldate cityfrom cityto
seatsocc paymentsum currency
FROM bc402_flights
INTO (wa_flight-carrid, wa_flight-connid,
wa_flight-fldate,
wa_flight-cityfrom, wa_flight-cityto,
wa_flight-seatsocc,
wa_flight-paymentsum, wa_flight-currency)
WHERE carrid IN allowed_carriers.

INSERT wa_flight INTO TABLE it_flights.

ENDSELECT.

PERFORM display_flights CHANGING it_flights.

(C) SAP AG BC402 6-24


*------------------------------------------------------------*
* FORM display_flights
*------------------------------------------------------------*
* --> p_it_flights
*------------------------------------------------------------*
FORM display_flights CHANGING p_it_flights TYPE t_flighttab.

FIELD-SYMBOLS <vol_sz_l> TYPE t_flight.

LOOP AT p_it_flights ASSIGNING <vol_sz_l>


WHERE seatsocc > 0.
WRITE: / <vol_sz_l>-carrid,
<vol_sz_l>-connid,
<vol_sz_l>-fldate,
<vol_sz_l>-cityfrom,
<vol_sz_l>-cityto,
<vol_sz_l>-seatsocc,
<vol_sz_l>-paymentsum
CURRENCY <vol_sz_l>-currency,
<vol_sz_l>-currency.
SKIP.
ENDLOOP.

ENDFORM.

(C) SAP AG BC402 6-25


Groupes de fonctions et modules fonction

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

(C) SAP AG BC402 7-1


Groupes de fonctions et modules fonction :
objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 De créer des groupes de fonctions


 De créer des modules fonction
 D'appeler des modules fonction
 De gérer les exceptions rencontrées dans les
modules fonction

SAP AG 1999

(C) SAP AG BC402 7-2


BC402 - Groupes de fonctions et modules fonction

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 7-3


Modules fonction par rapport aux sous-programmes
Générateur de classes

Actif/inactif
Paramètres transmis par nom
Concept d'extension
Paramètres facultatifs
Valeurs par défaut
Exceptions

Dictionnaire ABAP

Éditeur ABAP

Exécution Appel de fonction


asynchrone à distance

Menu Painter Screen Painter

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.

(C) SAP AG BC402 7-4


Attributs

Module fonction Traiter Saut Utilitaires Environnement Système Aide

Gén. de module fon. : Display BC402_FMDD_GET_FREE_SEATS


Documentation du module fonction

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Attributs Import Export Modif. Tables Exceptions Code source


Classification
Groupe de fonctions BC402_FMDD_FLIGHT Module fonction de démonstration

Désig. synt. Calcul du nombre de places libres

Type de trait. Données générales


Normal
Activé à distance Classe de BC402
développement
Mise à jour

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.

(C) SAP AG BC402 7-5


Interface

Module fonction Traiter Saut Utilitaires Environnement Système Aide

Gén. de mod.fonc. : Display BC402_FMDD_GET_FREE_SEATS


Documentation du module fonction

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Attributs Import Export Modif. Tables Exceptions Code srce


Gén. de mod. fonc. : Display BC402_FMDD_GET_FREE_SEATS
Nom du paramètre Typing Type de réf. Valeur par déf. Facultatif Trans. par valeur Désig. synt.
Funktionsbausteindokumentation
IP_PLANETYPE TYPE S_PLANETYE Type d'avion
IP_SEATSOCC TYPE S_SEATSMAX 0 ! ! Occ. devise
Funktionsbaustein BC402_FMDD_GET_FREE_SEATS aktiv

Attributs Import Export Modif. Tables Exceptions Code srce

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.

(C) SAP AG BC402 7-6


Logique de traitement

Module fonction Traiter Saut Utilitaires Environnement Système Aide

Gén. de mod. fonc. : Display BC402_FMDD_GET_FREE_SEATS


Documentation du module fonction

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Attributs Import Export Modif. Tables Exceptions Code srce

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.

(C) SAP AG BC402 7-7


Exceptions

Module fonction Traiter Saut Utilitaires Environnement Système Aide

Gén. de mod. fonc. : Display BC402_FMDD_GET_FREE_SEATS


Documentation du module fonction

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Attributs Import Export Modif. Tables Exceptions Code srce

Exceptions Désig. synt.


NO_SEATS Avion-cargo
OVERLOAD Surréservé
DB_FAILURE Aucune donnée

RAISE <exception>.

*** avec un message par défaut :


MESSAGE <type><num>(<id>)
RAISING <exception>.

SAP AG 1999

Un module fonction peut entraîner le déclenchement d'exceptions.


Pour ce faire, déclarez tout d'abord les exceptions dans la définition de l'interface, à savoir, affectez un
nom différent à chacune d'elles.
Dans le code source de votre module fonction, programmez les instructions déclenchant une exception
dans les conditions requises. Au runtime, le module fonction est interrompu lorsqu'une exception
est déclenchée. Les modifications apportées aux paramètres d'export et de modification sont
identiques à celles des sous-programmes. Deux instructions peuvent être utilisées pour déclencher
une exception. Dans les formules spécifiées ci-dessous, <exception> correspond au nom d'une
exception déclarée dans l'interface. Le système réagit différemment selon que l'exception a été
répertoriée dans l'appel du module fonction ou non :
 RAISE <exception>.
Si l'exception est répertoriée dans le programme appelant, le système lui renvoie le contrôle
directement. Si l'exception n'est pas répertoriée, un erreur survient à l'exécution.
 MESSAGE <type><nom>(<id>) RAISING <exception>.
Si l'exception est répertoriée dans le programme appelant, l'instruction a la même incidence que
RAISE <exception>. Dans le cas contraire, le système envoie le message <nom> à partir de la classe
de messages <id> avec le type <type> et aucune erreur ne survient à l'exécution.

(C) SAP AG BC402 7-8


Documentation, activation et test

 Documentation du module fonction


 Description synthétique et texte descriptif
 Paramètres
 Exceptions
 Fonctions, remarques, etc.
 Liste de travail
 Version révisée
 Version inactive
 Version active
 Test et débogage
 Valeurs de paramètre
 Exceptions
 Messages

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.

(C) SAP AG BC402 7-9


Appel d'un module fonction

DATA: result TYPE s_seatsmax.


PARAMETERS: pa_type TYPE s_planetye, pa_occ TYPE s_seatsmax.

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.

(C) SAP AG BC402 7-10


Groupes de fonctions

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).

(C) SAP AG BC402 7-11


Exemple

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

clients dans la liste

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.

(C) SAP AG BC402 7-12


Exemple : mise en œuvre des fonctions I

READ TABLE wait_list FROM ip_cust TRANSPORTING NO FIELDS.


IF sy-subrc <> 0.
APPEND ip_cust TO wait_list.
ELSE. MESSAGE e202(bc402) RAISING in_list.
ENDIF. Ajouter un client
en attente
DELETE wait_list WHERE id = ip_id.
IF sy-subrc <> 0.
MESSAGE e203(bc402) RAISING not_in_list. Supprimer le client
ENDIF. en attente

READ TABLE wait_list INTO ep_cust INDEX 1.


IF sy-subrc = 0.
DELETE wait_list INDEX 1.
ELSE. MESSAGE e200(bc402) RAISING list_empty. Déplacer les clients
ENDIF. dans la liste

READ TABLE wait_list WITH KEY id = ip_id TRANSPORTING NO FIELDS.


IF sy-subrc = 0.
ep_pos = sy-tabix.
ELSE. MESSAGE e200(bc402) RAISING not_in_list.
ENDIF. Renvoyer le poste
SAP AG 1999
dans la liste

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.

(C) SAP AG BC402 7-13


Exemple : mise en œuvre des fonctions II

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.

LOOP AT wait_list INTO wa_cust.


WRITE: / sy-tabix,
wa_cust-id COLOR COL_KEY,
wa_cust-name,
wa_cust-city,
wa_cust-app_date.
ENDLOOP.
Liste dans la boite
ENDMODULE.
de dialogue modale
SAP AG 1999

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).

(C) SAP AG BC402 7-14


Exemple : mise en œuvre des fonctions III

DATA last_pos LIKE sy-tabix.

READ TABLE wait_list WITH KEY id = ip_id INTO wa_cust.


IF sy-subrc = 0.

DELETE wait_list INDEX sy-tabix.


IF ip_new_pos > 0.

DESCRIBE TABLE wait_list LINES last_pos.


IF ip_new_pos > last_pos.
APPEND wa_cust TO wait_list.
ELSE.
INSERT wa_cust INTO wait_list INDEX ip_new_pos.
ENDIF.

ELSE.
INSERT wa_cust INTO wait_list INDEX 1.
ENDIF.

ELSE. Modifier le poste


MESSAGE e203(bc402) RAISING not_in_list. dans la liste
ENDIF. d'attente
SAP AG 1999

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.

(C) SAP AG BC402 7-15


Structure d'un groupe de fonctions

Liste d'objets Traiter Saut Utilitaires Envir. Système Aide

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

Modules PBO LBC402_FMDD_WAITLISTO01


LBC402_FMDD_WAITLISTTOP
LBC402_FMDD_WAITLISTU01 Ajouter un client en attente
Déclarations globales
LBC402_FMDD_WAITLISTU02 Supprimer le client en attente
LBC402_FMDD_WAITLISTU03 Afficher la liste d'attente
Funktionsbausteine
Modules fonction LBC402_FMDD_WAITLISTU04 Déplacer la liste d'attente
LBC402_FMDD_WAITLISTU05 Renvoyer le poste dans la liste
LBC402_FMDD_WAITLISTU06 Modifier le poste
Modules INCLUDE
LBC402_FMDD_WAITLISTUXX
dans le programme

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>.

(C) SAP AG BC402 7-16


Groupes de fonctions et modules fonction : résumé
du chapitre

Vous êtes maintenant capable :


 De créer des groupes de fonctions
 De créer des modules fonction
 D'appeler des modules fonction
 De gérer les exceptions rencontrées dans les
modules fonction

SAP AG 1999

(C) SAP AG BC402 7-17


Groupes de fonctions et modules fonction : exercices

Chapitre : groupes de fonctions et modules fonction


Sujet : création et appel des groupes de fonctions et des
modules fonction
s

À la fin de ces exercices, vous serez en mesure :


• de créer et de mettre en œuvre des groupes de fonction
• d'écrire des modules fonction
• d'appeler des modules fonction

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

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

1-1 Créez un groupe de fonctions Z##_BC402_FLIGHT.

1-2 Affectez-lui la classe de messages BC402.

L'ID de programme se trouve dans TOP include


(LBC402_FLIGHTTOP).

1-3 Documentez votre groupe de fonctions.

(C) SAP AG BC402 7-18


2. Vous êtes sur le point d'écrire un module fonction en vue de renseigner les tables internes
pour les types d'appareils. Ce module doit uniquement écrire un type d'appareil de
remplacement dans la table pour une compagnie aérienne spécifique si le type d'appareil
comporte suffisamment de places.
Il doit également calculer la recette moyenne par place en fonction de la recette totale
transférée. Votre module fonction doit ensuite trier la liste des appareils par cette valeur par
ordre décroissant avant de la renvoyer au programme appelant.
## correspond à votre numéro de groupe à deux chiffres.
Solutions de modèle :
BC402_FMDS_FLIGHT
BC402_FMDS_CREATE_PLANELIST

2-1 Créez le module fonction Z_##_BC402_CREATE_PLANELIST dans votre


groupe de fonctions Z##_BC402_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

Utilisez ce schéma pour l'affectation du type de compagnie aérienne↔appareil.

2-3 Déclarez la table interne it_carr_planes comme un objet de données global


dans votre groupe de fonctions. Elle doit comporter le type de ligne
t_carr_plane. Il doit s'agir d'une table triée avec la clé unique carrid et
planetype.

2-4 Renseignez la table interne it_carr_planes à l'aide de la méthode "array


fetch"avec la vue BC402_CARPLAN.

Sélectionnez un événement approprié. Gardez à l'esprit que les


groupes de fonctions ne peuvent pas être exécutés directement.
Mettez en œuvre le bloc événement dans un programme INCLUDE
approprié. Observez la convention d'appellation pour les
programmes INCLUDE dans les groupes de fonctions.

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-8 Dans le module fonction, créez la structure locale l_wa_carr_plane avec le


type t_carr_plane.

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.

2-12 Documentez votre module fonction.

2-13 Testez votre module fonction.

(C) SAP AG BC402 7-20


3. Étendez votre programme à la tâche 1 des exercices précédents :
renseignez la table interne avec les types d'appareils pour chaque vol, à l'aide du module
fonction créé dans le dernier exercice.
Solution de modèle :
SAPBC402_FMDS_FLIGHTLIST4

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.

3-3 Étendez le sous-programme dans lequel vous affichez la liste :


si (et seulement si) il existe au moins un appareil de remplacement pour un vol,
affichez tous les types d'appareils, leur nombre maximal de places et leurs recettes
moyennes (ainsi que la devise appropriée) dans la liste.
Pour ce faire, utilisez un field symbol saisi de manière appropriée.
S'il n'existe aucun appareil de remplacement pour un vol spécifique, affichez un
texte approprié.

(C) SAP AG BC402 7-21


Groupes de fonctions et modules fonction : solutions

Chapitre : groupes de fonctions et modules fonction


Sujet : création et appel de groupes de fonction et de
modules fonction

1-1, 2-4 Solution de module SAPLBC402_FMDS_FLIGHT

**************************************************************
* 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

INCLUDE lbc402_fmds_flighte01. " Événements

1-2, 2-2, 2-3 Solution de modèle LBC402_FMDS_FLIGHTTOP

FUNCTION-POOL bc402_fmds_flight MESSAGE-ID bc402.

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.

(C) SAP AG BC402 7-22


2-4 Solution de modèle LBC402_FMDS_FLIGHTE01

*------------------------------------------------------------*
* INCLUDE LBC402_FMDS_FLIGHTE01 *
*------------------------------------------------------------*

LOAD-OF-PROGRAM.

SELECT carrid planetype seatsmax


FROM bc402_carplan
INTO CORRESPONDING FIELDS OF TABLE it_carr_planes.

2-1, 2-5 – 2-11 Solution de modèle BC402_FMDS_CREATE_PLANELIST

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.

LOOP AT it_carr_planes INTO l_wa_carr_plane


WHERE carrid EQ ip_carrid
AND seatsmax GE ip_seatsocc.
l_wa_plane-planetype = l_wa_carr_plane-planetype.
l_wa_plane-seatsmax = l_wa_carr_plane-seatsmax.
l_wa_plane-avg_price =
ip_paymentsum / l_wa_carr_plane-seatsmax.
l_wa_plane-currency = ip_currency.
APPEND l_wa_plane TO ep_planelist.
ENDLOOP.

IF sy-subrc NE 0.
MESSAGE e067 RAISING no_planes WITH ip_carrid.
ELSE.
SORT ep_planelist BY avg_price DESCENDING.
ENDIF.

ENDFUNCTION.

(C) SAP AG BC402 7-23


3 Solution de modèle SAPBC402_FMDS_FLIGHTLIST4

*&-----------------------------------------------------------*
*& É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,

t_flighttab TYPE SORTED TABLE OF t_flight


WITH UNIQUE KEY carrid connid fldate.

DATA:
wa_flight TYPE t_flight,
it_flights TYPE t_flighttab.

SELECT-OPTIONS so_carr FOR wa_flight-carrid.

* pour le contrôle de l'habilitation :


*************************************
DATA:
allowed_carriers TYPE RANGE OF t_flight-carrid,
wa_allowed_carr LIKE LINE OF allowed_carriers.

(C) SAP AG BC402 7-24


AT SELECTION-SCREEN.
...

* renseignement d'une table range avec les transporteurs


autorisés:
**********
...
...

START-OF-SELECTION.

* renseignement d'une table interne avec les données de


correspondance et de vol pour les transporteurs autorisés :
***********************************************************
...
...

* renseignement de toutes les tables internes avec d'autres


types d'avions :
****************
LOOP AT it_flights INTO wa_flight WHERE seatsocc > 0.

CALL FUNCTION 'BC402_FMDS_CREATE_PLANELIST'


EXPORTING
ip_seatsocc = wa_flight-seatsocc
ip_carrid = wa_flight-carrid
ip_paymentsum = wa_flight-paymentsum
ip_currency = wa_flight-currency
IMPORTING
ep_planelist = wa_flight-it_planes
EXCEPTIONS
no_planes = 1
OTHERS = 2.
IF sy-subrc = 0.
MODIFY TABLE it_flights FROM wa_flight
TRANSPORTING it_planes.
ENDIF.

ENDLOOP.

PERFORM display_flights CHANGING it_flights.

(C) SAP AG BC402 7-25


*------------------------------------------------------------*
* FORM display_flights
*------------------------------------------------------------*
* --> p_it_flights
*------------------------------------------------------------*
FORM display_flights CHANGING p_it_flights TYPE t_flighttab.

FIELD-SYMBOLS:
<vol_sz_l> TYPE t_flight,
<avion_sz_l> TYPE bc402_typs_plane.

LOOP AT p_it_flights ASSIGNING <vol_sz_l>


WHERE seatsocc > 0.
WRITE: / <vol_sz_l>-carrid,
<vol_sz_l>-connid,
<vol_sz_l>-fldate,
<vol_sz_l>-cityfrom,
<vol_sz_l>-cityto,
<vol_sz_l>-seatsocc,
<vol_sz_l>-paymentsum
CURRENCY <vol_sz_l>-currency,
<vol_sz_l>-currency.

* * affichage des tables internes renseignées uniquement :


************************************************************
IF <vol_sz_l>-it_planes IS INITIAL.
WRITE: /29 'no alternate planes available'(npa).
ELSE.
LOOP AT <avion_sz_l>-it_planes ASSIGNING <avion_sz_l>.
WRITE: /29 <avion_sz_l>-planetype,
<avion_sz_l>-seatsmax,
<avion_sz_l>-avg_price
CURRENCY l_fs_plane>-currency,
<avion_sz_l>-currency.
ENDLOOP.
ENDIF.

SKIP.
ENDLOOP.

ENDFORM.

(C) SAP AG BC402 7-26


Introduction à ABAP Objects

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

(C) SAP AG BC402 8-1


Introduction à ABAP Objects : objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 De déclarer et mettre en œuvre des classes


locales
 De créer des objets
 D'accéder aux composantes des objets
 De définir des interfaces locales
 D'accéder aux composantes des interfaces
 De déclencher et de gérer les exceptions

SAP AG 1999

(C) SAP AG BC402 8-2


BC402 - Introduction à ABAP Objects

Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 8-3


Programmations fonctionnelle et orientée object

Fonctions et données Objets logiciels Objets réels


Modèle de données comme Modèle d'objet comme
abstraction du monde réel abstraction du monde réel

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

Fonction Fonction Fonction Fonction

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).

(C) SAP AG BC402 8-4


Position de ABAP Objects

 ABAP Objects représente une extension à compatibilité


ascendante du langage ABAP existant
 Vous pouvez utiliser les instructions ABAP existantes dans
ABAP Objects
 Vous pouvez utiliser ABAP Objects dans les programmes
ABAP existants
 ABAP Objects est entièrement intégré au débogueur ABAP

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.

(C) SAP AG BC402 8-5


Des groupes de fonctions aux classes I

Groupe de fonctions 1 Groupe de fonctions 2

Module Données
Données Module Données
Données
... ...

fonction fonction
… …

Programme ABAP avec les


données

CALL FUNCTION ...


Mode interne d'un programme ABAP
Mode externe

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.

(C) SAP AG BC402 8-6


Des groupes de fonctions aux classes II

nième instance, classe 1 nième instance, classe m


1ère instance, classe 1 1ère instance,
Donnée
Donnée Daten classe m
Schnitt-stelle
...

s Data Funktions-
Funktions- Daten
...

... ...

Interface Données
Données

baustein Données
Interface Données
… ... … ...

… …

Programme ABAP avec les


données

CREATE OBJECT ...


Mode interne d'un programme ABAP
Mode externe

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.

(C) SAP AG BC402 8-7


Définition des classes

CLASS <c1> DEFINITION.


PUBLIC SECTION. Classe <c1>
DATA: a1 …
METHODS: m1 … Composantes Composantes
EVENTS: e1 … publiques privées
PROTECTED SECTION.
DATA: a2 … a3,
METHODS: m2 … a1, m3,
EVENTS: e2 … m1,
PRIVATE SECTION. e3
DATA: a3 … e1
METHODS: m3 … Mises en œuvre
EVENTS: e3 … … de la méthode
ENDCLASS.
CLASS <c1> IMPLEMENTATION. Composantes protégées
a2, m2, e2, …
METHOD m1. … ENDMETHOD.
METHOD m2. … ENDMETHOD.
Tous les Sous-classes de c1
METHOD m3. … ENDMETHOD.
utilisateurs
ENDCLASS.

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.

(C) SAP AG BC402 8-8


Constructeurs

CLASS <classe_locale> DEFINITION.

PUBLIC SECTION.
METHODS constructor
[IMPORTING <par> TYPE <type> ... ]
[EXCEPTIONS <exc> ... ].
ENDCLASS.

CLASS <classe_locale> IMPLEMENTATION.

METHOD constructor.
...
ENDMETHOD.

ENDCLASS.

PROGRAM ... .
DATA <créf> TYPE REF TO <classe_locale>.

CREATE OBJECT <créf> [EXPORTING <par> = <valeur> ... ].

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.

(C) SAP AG BC402 8-9


Exemple : déclaration

CLASS lcl_waitlist DEFINITION.


PUBLIC SECTION.
METHODS constructor IMPORTING im_carrid TYPE sflight-carrid
im_connid TYPE sflight-connid
im_fldate TYPE sflight-fldate.
METHODS add IMPORTING im_cust TYPE bc402_typd_cust
EXCEPTIONS in_list.

PRIVATE SECTION.
DATA:
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,

wait_list TYPE bc402_typd_cust_list.


ENDCLASS.

SAP AG 1999

SAP renvoie à l'exemple de la classe locale lcl_waitlist du programme


SAPBC402_AOOD_WAITLISTS. Cette classe contient :
 Un constructeur d'instances vers lequel doivent être transmises les données clés d'une
correspondance.
 Une méthode publique add vers laquelle doit être transmis un enregistrement de données client.
 Les données clés pour la correspondance, une table interne et un espace de travail approprié sont
définis en tant qu'objets de données privés.

(C) SAP AG BC402 8-10


Exemple : mise en œuvre

CLASS lcl_waitlist IMPLEMENTATION.


METHOD constructor.
carrid = im_carrid.
connid = im_connid.
fldate = im_fldate.
ENDMETHOD.

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.

(C) SAP AG BC402 8-11


Déclaration des variables de référence

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.

(C) SAP AG BC402 8-12


Création d'objets

DATA
o_list1 TYPE REF TO lcl_waitlist.

...

CREATE OBJECT o_list1


EXPORTING im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.

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.

(C) SAP AG BC402 8-13


Sémantique de référence I

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.

(C) SAP AG BC402 8-14


Sémantique de référence II

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 im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.
6<LCL_WAITLIST>
CREATE OBJECT o_list2
EXPORTING im_carrid = 'AA'
im_connid = '17' AA
im_fldate = '19991231'.
3<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.

(C) SAP AG BC402 8-15


Sémantique de référence III

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 im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.
6<LCL_WAITLIST>
CREATE OBJECT o_list2
EXPORTING im_carrid = 'AA'
im_connid = '17' AA
im_fldate = '19991231'.
3<LCL_WAITLIST>
o_list3 = o_list2.
LH
o_ list3

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.

(C) SAP AG BC402 8-16


Initialisation des variables de référence

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 im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.
6<LCL_WAITLIST>
CREATE OBJECT o_list2
EXPORTING im_carrid = 'AA'
im_connid = '17' AA
im_fldate = '19991231'.
3<LCL_WAITLIST>
o_list3 = o_list2.
LH
CLEAR o_list2. o_ list3

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").

(C) SAP AG BC402 8-17


Nettoyage de mémoire I

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 im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.
6<LCL_WAITLIST>
CREATE OBJECT o_list2
EXPORTING im_carrid = 'AA'
im_connid = '17' AA
im_fldate = '19991231'.
3<LCL_WAITLIST>
o_list3 = o_list2.
LH
CLEAR o_list2. o_ list3

o_list3 = o_list1. o_ list2

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.

(C) SAP AG BC402 8-18


Nettoyage de mémoire II

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 im_carrid = 'LH'
im_connid = '400'
im_fldate = '19991119'.

CREATE OBJECT o_list2


EXPORTING im_carrid = 'AA'
im_connid = '17'
im_fldate = '19991231'.
3<LCL_WAITLIST>
o_list3 = o_list2.
LH
CLEAR o_list2. o_ list3

o_list3 = o_list1. o_ list2

o_ list1

SAP AG 1999

(C) SAP AG BC402 8-19


Réinstantiation

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

CREATE OBJECT o_list3


EXPORTING im_carrid = 'SQ'
im_connid = '866'
im_fldate = '20000101'.

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.

(C) SAP AG BC402 8-20


Appel de méthodes

DATA
o_list1 TYPE REF TO lcl_waitlist.

CREATE OBJECT o_list1


EXPORTING ... .

CALL METHOD o_list1->add


EXPORTING
im_cust = wa_cust
EXCEPTIONS
in_list = 1
OTHERS = 2.
CASE sy-subrc.
WHEN 0.
WRITE 'ok, inséré'(ins). 9<LCL_WAITLIST>
WHEN 1.
WRITE 'déjà dans la liste'(itl).
WHEN 2.
WRITE 'administrateur'(adm).
ENDCASE.

o_list1->wait_list contient o_list1


désormais le contenu de of wa_cust.
SAP AG 1999

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.

(C) SAP AG BC402 8-21


Indépendance des instances

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 ... .

wa_cust-name = 'SAP AG'.


2<LCL_WAITLIST>
CALL METHOD o_list1->add
EXPORTING im_cust = wa_cust ...

wa_cust-name = 'Dr. Einstein'.


CALL METHOD o_list2->add 9<LCL_WAITLIST>
EXPORTING im_cust = wa_cust ...

wa_cust-name = 'IDS Scheer'. o_list3


CALL METHOD o_list3->add
EXPORTING im_cust = wa_cust ... o_list2

wait_list contient des valeurs o_list1


différentes dans chaque instance
SAP AG 1999

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.

(C) SAP AG BC402 8-22


Interfaces

 Définition d'un point de contact dans une classe sans


aucune mise en œuvre
 Les classes peuvent mettre en œuvre plusieurs interfaces
 Uniformisez l'accès à l'aide de références d'interface

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.

(C) SAP AG BC402 8-23


Définition des interfaces

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.)

(C) SAP AG BC402 8-24


Exemple : déclarations

INTERFACE lif_status.
METHODS display.
ENDINTERFACE.

CLASS lcl_waitlist DEFINITION.


PUBLIC SECTION.
...
INTERFACES lif_status.
...
ENDCLASS.

CLASS lcl_clerk DEFINITION.


PUBLIC SECTION.
...
INTERFACES lif_status.
...
PRIVATE SECTION.
DATA cnt_look_for TYPE i.
ENDCLASS.

SAP AG 1999

SAP renvoie à l'exemple de l'interface locale lif_status du programme


SAPBC402_AOOD_WAITLISTS. Elle contient un affichage de déclaration de la méthode. Cette
méthode permet aux objets de types différents d'indiquer leur statut.
La seconde classe lcl_clerk décrit les statuts des agents de comptoir de l'aéroport. Vous trouverez
des informations détaillées dans les sections suivantes. Le comptoir cnt_look_for correspond au
statut spécifique d'un employé.
Cette méthode d'interface doit à présent être mise en œuvre dans les deux classes. Cependant, l'interface
doit préalablement être déclarée dans la section publique des classes.

(C) SAP AG BC402 8-25


Exemple : mises en œuvre

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.

(C) SAP AG BC402 8-26


Références d'interface : sémantique

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

Une variable de référence est toujours requise pour accéder à un objet.


Pour créer des variables de référence, référez-vous à une interface (dans ce cas i_status1) plutôt
qu'à une classe. Le type de variable de référence peut contenir des références à des objets de toute
classe mettant en œuvre l'interface correspondante.

 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.

(C) SAP AG BC402 8-27


Appel de méthodes d'interface

** 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.

(C) SAP AG BC402 8-28


Résumé

 Déclaration des variables de référence


DATA:
DATA: <réfc>
<réfc> TYPE
TYPE REF
REF TO
TO <classe>,
<classe>,
<réfi>
<réfi> TYPE
TYPE REF
REF TO
TO <interface>.
<interface>.

 Création d'objets
CREATE
CREATE OBJECT
OBJECT <réfc>
<réfc> ...
... ..

 Accès aux attributs et appel de méthodes


xx == <réfc>-><attr>
<réfc>-><attr>
++ <réfc>-><interface>~<attr>
<réfc>-><interface>~<attr>
-- <réfi>-><attr>.
<réfi>-><attr>.

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

(C) SAP AG BC402 8-29


ABAP Objects : sujets avancés

 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).

(C) SAP AG BC402 8-30


Événements

 Les événements sont des composantes des classes


 Les méthodes peuvent déclencher les événements de leur
classe
 Les méthodes de traitement peuvent réagir aux é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.

(C) SAP AG BC402 8-31


Déclenchement d'événements

CLASS <classe_raiser> DEFINITION.

PUBLIC|PROTECTED|PRIVATE SECTION.

METHODS <événement_raiser> ...

EVENTS <événement> [EXPORTING value(<par>) TYPE <type>


[OPTIONAL]].

ENDCLASS.

CLASS <classe_raiser> IMPLEMENTATION.

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.

(C) SAP AG BC402 8-32


Gestion d'événements

CLASS <classe_traitement> DEFINITION.

PUBLIC|PROTECTED|PRIVATE SECTION.

METHODS <traitement_événement> FOR EVENT <événement> OF


<classe_raiser>
[IMPORTING ... [sender] ].

ENDCLASS.

CLASS <classe_traitement> IMPLEMENTATION.

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.

(C) SAP AG BC402 8-33


Vue d'ensemble

Déclencheur d'événements Traitement d'événements

CLASS c1 DEFINITION. CLASS c2 DEFINITION.


PUBLIC SECTION. PUBLIC SECTION.
EVENTS e1 EXPORTING VALUE(p1) METHODS m2 FOR EVENT e1 OF c1
TYPE i. IMPORTING p1.
METHODS m1.

PRIVATE SECTION. PRIVATE SECTION.


DATA a1 TYPE i. DATA a2 TYPE i.

ENDCLASS. ENDCLASS.

CLASS c1 IMPLEMENTATION. CLASS c2 IMPLEMENTATION.


METHOD m1. METHOD m2.
a1 = ... ...
RAISE EVENT e1 a2 = p1.
EXPORTING p1 = a1. ...
ENDMETHOD. ENDMETHOD.
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.

(C) SAP AG BC402 8-34


Enregistrement des traitements d'événements

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.

SET HANDLER o_handler_1->event_handler FOR o_raiser.


SET HANDLER o_handler_2->event_handler FOR o_raiser.

...

CALL METHOD o_raiser->event_raiser.

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

(C) SAP AG BC402 8-35


Exemple : déclenchement d'événements

CLASS lcl_waitlist DEFINITION.


...
EVENTS list_full EXPORTING value(ex_carrid) TYPE sflight-carrid
value(ex_connid) TYPE sflight-connid
value(ex_fldate) TYPE sflight-fldate.
...
ENDCLASS.

CLASS lcl_waitlist IMPLEMENTATION.


CONSTANTS max_entries LIKE sy-tabix VALUE '10'.
DATA last_pos LIKE sy-tabix.
METHOD add.
...
DESCRIBE TABLE wait_list LINES last_pos.
IF last_pos < max_entries.
APPEND ip_cust TO wait_list.
ELSE.
RAISE EVENT list_full EXPORTING ex_carrid = carrid
ex_connid = connid
ex_fldate = fldate.
...
ENDMETHOD.
ENDCLASS.
SAP AG 1999

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.

(C) SAP AG BC402 8-36


Exemple : gestion des exceptions

CLASS lcl_clerk DEFINITION.


PUBLIC SECTION.
...
METHODS say_something FOR EVENT list_full OF lcl_waitlist.
METHODS change_planetype FOR EVENT list_full OF lcl_waitlist
IMPORTING ex_carrid ex_connid ex_fldate.
ENDCLASS.

CLASS lcl_clerk IMPLEMENTATION.

...

METHOD say_something.
MESSAGE i197 WITH ... .
ENDMETHOD.

METHOD change_planetype.
MESSAGE i195 WITH ... ex_carrid ex_connid ex_fldate.
ENDMETHOD.

ENDCLASS.

SAP AG 1999

La classe supplémentaire lcl_clerk est à présent créée pour cet employé :


 Dans la partie déclaration, spécifiez que les deux méthodes peuvent être exécutées lorsque les
instances de la classe lcl_waitlist déclenchent l'événement list_full. La méthode
change_planetype doit pouvoir traiter les trois paramètres d'export.
 Dans la partie mise en œuvre, programmez normalement les fonctions des méthodes Dans ce cas
(pour plus de simplicité), les méthodes envoient des messages différents. Dans la méthode
change_planetype, les paramètres reçus lors de l'exécution peuvent également être affichés
avec le message.

(C) SAP AG BC402 8-37


Exemple : enregistrement des traitements
d'événements

PROGRAM ...

DATA:
o_list1 TYPE REF TO lcl_waitlist,
o_clerk1 TYPE REF TO lcl_clerk.

CREATE OBJECT o_list1 EXPORTING im_carrid = 'LH'


im_connid = '400'
im_fldate = '19991119'.

CREATE OBJECT o_clerk1.

SET HANDLER o_clerk1->say_something FOR o_list1.

SET HANDLER o_clerk1->change_planetype FOR o_list1.

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.

(C) SAP AG BC402 8-38


Aperçu : Générateur de classes (vue technique)

Générateur de classes

Type K Type J

CLASS-POOL ... . CLASS-POOL ... .

TYPES: TYPES:
... ...

CLASS ... DEFINITION. INTERFACE ... DEFINITION.


... ...
ENDCLASS. ENDINTERFACE.

CLASS ... IMPLEMENTATION.


...
ENDCLASS.

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.

(C) SAP AG BC402 8-39


Introduction à ABAP Objects : résumé du chapitre

Vous êtes maintenant capable :


 De déclarer et de mettre en œuvre des classes
locales
 De créer des objets
 D'accéder aux composantes des objets
 De définir des interfaces locales
 D'accéder aux composantes des interfaces
 De déclencher et de gérer les exceptions

SAP AG 1999

(C) SAP AG BC402 8-40


Appel de programmes et passation de paramètres

Contenu :
 Techniques d'appel de programmes
 Modèle de mémoire
 Techniques de passation de paramètres
 Utilisation

SAP AG 1999

(C) SAP AG BC402 9-1


Appel de programmes et passation de paramètres :
objectifs du chapitre

À la fin de ce chapitre, vous serez en mesure :

 De décrire le modèle de mémoire R/3


 D'appeler des programmes exécutables
 D'appeler des transactions
 D'utiliser les différentes zones de mémoire pour la
passation des paramètres

SAP AG 1999

(C) SAP AG BC402 9-2


BC402 - Appel de programmes et passation de
paramètres
Préface

Vue d'ensemble du cours

Environnement d'exécution ABAP

Types et objets de données

Instructions

Opérations sur les tables internes

Sous-programmes

Groupes de fonctions et modules fonction

Introduction à ABAP Objects

Appel de programmes et passation de paramètres


SAP AG 1999

(C) SAP AG BC402 9-3


Appels de programmes synchrones

Temps Mémoire Mémoire


principale principale
1 1
Appel du nouveau Démarrage du nouveau
programme programme
2 2
Fin du programme
appelé 1 Programme 1

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….

(C) SAP AG BC402 9-4


Modèle de mémoire logique

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2

Mode interne 1.2


Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

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.

(C) SAP AG BC402 9-5


Insertion d'un programme I

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mémoire ABAP 1

Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

Mémoire SAP

SAP AG 1999

(C) SAP AG BC402 9-6


Insertion d'un programme II

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2

Mode interne 1.2


Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

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.

(C) SAP AG BC402 9-7


Fin de l'insertion du programme

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mémoire ABAP 1

Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 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.

(C) SAP AG BC402 9-8


Lancement d'un nouveau programme exécutable
(type 1) I

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mode interne 1.3
Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.3

Mode interne 1.2

Programme 1.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

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.

(C) SAP AG BC402 9-9


Lancement d'un nouveau programme exécutable
(type 1) II

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mode interne 1.3
Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.3

Mode interne 1.2

Programme 1.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

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é.

(C) SAP AG BC402 9-10


Lancement d'une transaction I

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mode interne 1.3
Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.3

Mode interne 1.2

Programme 1.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

Mémoire SAP

SAP AG 1999

(C) SAP AG BC402 9-11


Lancement d'une transaction II

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mémoire ABAP 1

Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 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.

(C) SAP AG BC402 9-12


Appel de modules fonction I

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mémoire ABAP 1

Mémoire ABAP 2
Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 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.

(C) SAP AG BC402 9-13


Appel de modules fonction II

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2


Mémoire ABAP 1

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.

(C) SAP AG BC402 9-14


Lancement d'un programme exécutable (type 1)

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

Pour lancer un programme exécutable (type 1), utilisez l'instruction SUBMIT.


Si vous utilisez l'option VIA SELECTION-SCREEN, le système affiche l'écran de sélection standard
du programme (si l'un deux a été défini).
L'option AND RETURN permet au système de reprendre le traitement par l'instruction suivant SUBMIT,
une fois le programme appelé terminé.
Pour plus d'informations, référez-vous à la documentation relative à l'instruction SUBMIT.

(C) SAP AG BC402 9-15


Appel d'une transaction

Programme 1 Programme 2 : transaction <CODET>

... 1er dynpro


LEAVE TO TRANSACTION '<CODE_T>' SAPM<nom_t>
[AND SKIP FIRST SCREEN].
...
...
2nd dynpro PROGRAM.
LEAVE PROGRAM.
...
F15

... 1er dynpro


CALL TRANSACTION '<CODE_T>' SAPM<nom_t>
[AND SKIP FIRST SCREEN].
...
...
2nd dynpro PROGRAM.
LEAVE PROGRAM.
...
F15

SAP AG 1999

Lorsque vous utilisez l'instruction LEAVE TO TRANSACTION '<CODE_T>', le système termine le


programme courant, puis lance la transaction à l'aide du code <CODE_T>. Cette instruction revient à
saisir /n<CODE_T> dans la zone de commande.
L'instruction CALL TRANSACTION '<CODE_T>'vous permet d'insérer un programme ABAP avec
un code de transaction dans la chaîne d'appel.
Pour terminer un programme ABAP, utilisez l'instruction LEAVE PROGRAM. Si l'instruction survient
dans un programme appelé via CALL TRANSACTION '<CODE_T>' ou SUBMIT <nom_prog>
AND RETURN, le système reprend le traitement à l'instruction suivant l'appel dans le programme
appelant. Dans les autres cas, l'utilisateur retourne au menu d'application à partir duquel le programme a
été lancé.
Si vous utilisez l'option …AND SKIP FIRST SCREEN, le système n'affiche pas le contenu de
dynpro du premier dynpro de la transaction. Cependant, il traite la logique d'exécution.
Si vous avez lancé une transaction à l'aide de l'instruction CALL TRANSACTION utilisant des
techniques de mise à jour, vous pouvez utiliser l'option UPDATE… pour spécifier la technique de mise à
jour (asynchrone (par défaut), synchrone ou locale) devant être utilisée par le programme. Pour plus
d'informations, référez-vous au cours BC414 (Programmation des mises à jour de la base de
données) et à la documentation en ligne.

(C) SAP AG BC402 9-16


Passation de paramètres entre les programmes :
vue d'ensemble

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.

(C) SAP AG BC402 9-17


Passation de paramètres à l'aide de l'interface de
programme

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

(C) SAP AG BC402 9-18


Passation de paramètres pour les zones de saisie

DATA <set> TYPE|LIKE RANGE OF <type>|<objetdonnées}.

SUBMIT <nom_prog> AND RETURN [VIA SELECTION-SCREEN]


WITH <paramètre> EQ|NE|... } <val>
< va

WITH <opt_sél> EQ|NE|... } <val>


< va l> SIGN {'I'|'E'}
SIGN

WITH <opt_sél> BETWEEN <val1> AND <val2> SIGN {'I'|'E'}


WITH <opt_sél> NOT BETWEEN <val1> AND <val2> SIGN {'I'|'E'}
WITH <opt_sél> IN <set>
... . Insertion du modèle
...
...
MODULE user_command_0200 INPUT. ...
...
CASE save_ok. Autre modèle SUBMIT
WHEN 'COORDFR'.
SUBMIT sapbc402_tabd_hashed
WITH
WITH pa_city = sdyn_conn-cityfrom
WITH
WITH pa_ctry =
= sdyn_conn-countryfr
RETURN.
AND RETURN
...
ENDCASE.
ENDMODULE. " USER_COMMAND_0200 INPUT
SAP AG 1999

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.

(C) SAP AG BC402 9-19


Mémoire ABAP et mémoire SAP

Session utilisateur

Mode externe (fenêtre) 1 Mode externe (fenêtre) 2

Mode interne 1.2 Mode interne 2.2


Mémoire ABAP 1

Mémoire ABAP 2
Programme 1.2 Programme 2.2

Mode interne 1.1 Mode interne 2.1

Programme 1.1 Programme 2.1

Mémoire SAP (paramètres SET/GET)

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.

(C) SAP AG BC402 9-20


Passation de paramètres à l'aide de la mémoire
ABAP

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.

(C) SAP AG BC402 9-21


Passation de paramètres à l'aide de la mémoire
SAP

Programme A SET PARAMETER ID


'CON' FIELD sdyn_conn-connid.
Cgnie aér. LH ou
N° vol 400 CALL TRANSACTION
! 'BC402_TABD_SORT'.
SET

Mémoire SAP
CAR LH
CON 400

Programme B

Cgnie aér. LH ! GET


N° vol 400
GET PARAMETER ID
ou 'CON' FIELD sdyn_conn-connid.

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).

(C) SAP AG BC402 9-22


Aperçu : passation de paramètres à l'aide d'une
table interne

Programme 1 Programme 2 : transaction <CODE_T>

...
DATA: <bi_tabi>
<bi_tabi> TYPE TABLE OF bdcdata,
<bi_wa> TYPE bdcdata.

* renseignement de <bi_tabi>
...

* appel d'un autre programme


CALL TRANSACTION '<CODE_T>'
USING <bi_tabi>. 2nd dynpro
IF sy-subc = 0. 1er dynpro
F15
...
ELSE.
... SAPM<nom_t>

...
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.

(C) SAP AG BC402 9-23


Zones dans le type global BDCDATA

Nom de zone : program dynpro dynbegin fnam fval

Longueur : 40 4 1 132 132

Signification : Nom du Numéro de 1er enregis. Nom de Valeur de


programme dynpro zone zone

Uniquement pour Uniquement pour 'X' pour le 1er Majuscules/


Renseignée le 1er le 1er enregistrement minuscules
enregistrement enregistrement sur le dynpro
du nouveau du nouveau sinon
dynpro dynpro ''

SAP AG 1999

Renseignement de la table interne au format batch input.

 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.

(C) SAP AG BC402 9-24


Exemple : passation de paramètres à l'aide d'une
table interne

program dynpro dynbegin fnam fval

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 ...

CALL TRANSACTION 'BC402_CALD_CRE_CUST'


USING it_bdcdata
MODE 'N'.
IF sy-subrc <> 0.
MESSAGE ... WITH sy-subrc.
ENDIF.
SAP AG 1999

L'exemple ci-dessus se réfère à la transaction BC402_FMDD_FG. Lorsque l'utilisateur crée une


nouvelle entrée client, le programme appelle la transaction BC402_CALD_CRE_CUST. Cette
transaction n'a pas mis en œuvre l'importation à partir de la mémoire ABAP et ses zones de saisie ne
sont pas définies en tant que paramètres GET. Les données client sont, par conséquent, passées à l'aide
d'une table interne, puis traitées de manière invisible.
Si l'opération est réussie, le nouvel enregistrement client peut être saisi dans la liste d'attente.

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).

(C) SAP AG BC402 9-25


Appel de programmes et passation de paramètres :
résumé du chapitre

Vous êtes maintenant capable :


 De décrire le modèle de mémoire R/3
 D'appeler des programmes exécutables
 D'appeler des transactions
 D'utiliser les différentes zones de mémoire pour la
passation des paramètres

SAP AG 1999

(C) SAP AG BC402 9-26


Appel de programmes et passation de paramètres : exercices

Chapitre : appel de programmes et passation de


paramètres
Sujet : appel d'un programme exécutable

À la fin de ces exercices, vous serez en mesure :


• d'appeler un programme exécutable à partir d'un autre programme
• de préaffecter des valeurs à ses options de sélection

Vous êtes programmeur pour un groupe de compagnies aériennes et votre


activité consiste à écrire des programmes d'analyse pour plusieurs
compagnies aériennes.

1. Étendez votre programme à la tâche 3 des exercices précédents :


l'utilisateur doit être en mesure d'afficher une liste de tous les comptoirs de vente des
compagnies aériennes saisies sur l'écran de sélection s'il est autorisé à visualiser les
données.
## correspond à votre numéro de groupe à deux chiffres.
Solution de modèle :
SAPBC402_CALS_FLIGHTLIST5

1-1 Copiez votre solution du dernier exercice ou la solution de modèle.


Nouveau nom : Z##_BC402_FLIGHTLIST5.

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.

1-3 Programmez un appel à votre programme exécutable Z##_BC402_COUNTLIST2


ou la solution de modèle SAPBC402_TABS_COUNTLIST2 (utilisez la fonction
Modèle).
Assurez-vous que l'écran de sélection standard du programme appelé n'apparaît pas.
Une fois que le programme ne s'exécute plus, l'utilisateur doit être en mesure de
renvoyer le programme d'origine.

(C) SAP AG BC402 9-27


(C) SAP AG BC402 9-28
Appel de programmes et passation de paramètres : solutions

Chapitre : appel de programmes et passation de


paramètres
Sujet : appel d'un programme exécutable

1 Solution de modèle SAPBC402_CALS_FLIGHTLIST5

*&-----------------------------------------------------------*
*& État SAPBC402_CALS_FLIGHTLIST5 *
*& *
*&-----------------------------------------------------------*
*& solution de l'exercice 1 :
*
*& appel de programmes et passation de paramètres
*
*&-----------------------------------------------------------*

REPORT sapbc402_cals_flightlist5.
...
...

* pour le contrôle de l'habilitation :


*************************************
DATA:
allowed_carriers TYPE RANGE OF t_flight-carrid,
wa_allowed_carr LIKE LINE OF allowed_carriers.

START-OF-SELECTION.

* renseignement d'une table range avec les transporteurs


autorisés:
**********
...
...

* renseignement d'une table interne avec les données de


correspondance et de vol pour les transporteurs autorisés :
***********************************************************
...
...

(C) SAP AG BC402 9-29


* renseignement de toutes les tables internes avec d'autres
types d'avions :
****************
...
...

PERFORM display_flights CHANGING it_flights.

AT LINE-SELECTION.

* affichage de la liste des comptoirs de tous les transporteurs


autorisés :
****************************************************
SUBMIT sapbc402_tabs_counterlist2
WITH so_carr IN allowed_carriers AND RETURN.

*------------------------------------------------------------*
* FORM display_flights
*------------------------------------------------------------*
* --> p_it_flights
*------------------------------------------------------------*
FORM display_flights CHANGING p_it_flights TYPE t_flighttab.

...

ENDFORM.

(C) SAP AG BC402 9-30