BC402 4.6a fr

246
BC402 ABAP Techniques de programmation ABAP BC402 R/3 System Release 46A 02/16/2001 0

Transcript of BC402 4.6a fr

Page 1: BC402 4.6a fr

BC402 ABAP Techniques deprogrammation ABAP

BC402

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

0

Page 2: BC402 4.6a fr

SAP AG 1999

BC402 ABAP Techniques de programmation ABAP

BC402BC402

Techniques de programmationABAPTechniques de programmationABAP

� Système R/3

� Version 4.6A

� Septembre 1999

� Numéro d'article : 5003 4163

Page 3: BC402 4.6a fr

SAP AG 1999

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

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

Tous droits réservés.

Copyright

� 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 NetscapeCommunications, 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

Page 4: BC402 4.6a fr

� 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, SAPArchiveLink, SAP Business Workflow, et ALE/WEB sont des marques ou marques déposées deSAP 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 deleurs propriétaires respectifs.

Page 5: BC402 4.6a fr

SAP AG 1999

ABAP Workbench

Introduction àABAP Workbench

BC400 5 jours

Gestion des projets dedéveloppement ABAP

MBC40 2 jours

ABAP Workbench -Interface de données

BC420 5 jours

Reporting dans ABAPWorkbench

BC405 3 jours

Dictionnaire de donnéesABAP

BC430 2 jours

Edition et impression deformulaires dansSAPscripts

BC460 3 jours

CATT - Test Workbench etComputer Aided Test Tool

CA610 2 jours

Analyses desperformancesABAP

BC490 3 joursTechniques deprogrammation ABAP

BC402 3 jours

Programmation dedialogues à l'aide descontrôles EnjoySAP

BC412 2 jours

Développement desapplications sur Internet

BC440 5 jours

Programmation interactive

BC410 5 jours

ABAP Workbench -Interfaces decommunication

BC415 2 jours

Programmation desmises à jour de la basede données

BC414 2 jours

Extensions etmodifications

BC425 3 jours

Cours supplémentairesrecommandés : BusinessProcess TechnologiesCA925, CA926, CA927BC095 (Technologied'intégration) BC619 (ALE),BC620, BC621

Niveau 3Niveau 2

ABAP Objects -Programmation orientéeobjets dans R/3

BC404 3 jours

Page 6: BC402 4.6a fr

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

Page 7: BC402 4.6a fr

SAP AG 1999

À qui s'adresse ce cours ?

� Participants :� Programmeurs

� Consultants

� Durée : 3 jours

� Notes aux participants

Les supports de formation ne constituent pas un programme d'auto-formation. Il sont conçusuniquement dans le but de compléter les explications fournies par l'animateur. Un espace estlaissé à votre disposition sur ces supports pour vous permettre de prendre des notes.

Page 8: BC402 4.6a fr

(C) SAP AG BC402 1-1

SAP AG 1999

� Objectif général du cours

� Objectifs du cours

� Table des matières

� Synoptique

� Scénario de gestion

Contenu

Vue d'ensemble du cours

Page 9: BC402 4.6a fr

(C) SAP AG BC402 1-2

SAP AG 1999

Ce cours vous permettra :

� De comprendre les principes de base du langage deprogrammation ABAP

� De choisir la technique de programmation ABAPappropriée à la résolution d'un problème spécifique

� D'écrire et de gérer vos propres programmes ABAP

Objectif général du cours

Page 10: BC402 4.6a fr

(C) SAP AG BC402 1-3

SAP AG 1999

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

� De décrire le mode de fonctionnement du runtimesystem ABAP

� D'utiliser les instructions ABAP et leurs variantes desyntaxe

� De créer, tester, comparer et classer les programmesABAP

� De concevoir, écrire et modifier vos propresprogrammes ABAP

� D'évaluer les solutions alternatives de programmationen fonction de leur garantie de cohérence dedonnées, des erreurs éventuelles à l'exécution et del'efficacité des techniques de modularisation utilisées

Objectifs du cours

Page 11: BC402 4.6a fr

(C) SAP AG BC402 1-4

SAP AG 1999

Chapitre 6 Sous-programmes

Chapitre 7 Groupes de fonctions et modules fonction

Chapitre 8 Introduction à ABAP Objects

Chapitre 9 Appel de programmes et passation de paramètres

Chapitre 1 Vue d'ensemble du cours

Chapitre 2 Environnement d'exécution ABAP

Chapitre 3 Types et objets dedonnées

Chapitre 4 Instructions

Chapitre 5 Opérations sur lestables internes

Préface

Annexes

Table des matières

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

Page 12: BC402 4.6a fr

(C) SAP AG BC402 1-5

SAP AG 1999

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

Page 13: BC402 4.6a fr

(C) SAP AG BC402 1-6

SAP AG 1999

Scénario de gestion

� Vous allez utiliser ABAP Workbench pourdévelopper des applications de gestion simples.Elles sont basées sur les tables, les données etles objets du Dictionnaire ABAP du modèle dedonnées de vol. Ce cours vous permet de lireuniquement les données de vol. Vous allez traiterles données dans vos programmes. Les donnéesréelles de la base de données ne seront pasmodifiées.

� Vous allez utiliser, analyser, copier et modifierégalement les objets du référentiel.

Page 14: BC402 4.6a fr

(C) SAP AG BC402 2-1

SAP AG 1999

� Composantes d'un programme ABAP

� Processeurs au sein d'un processus de travail

� Programmes ABAP : types et méthodes d'exécution

Contenu

Environnement d'exécution ABAP

Page 15: BC402 4.6a fr

(C) SAP AG BC402 2-2

SAP AG 1999

� De nommer les composantes d'un programmeABAP

� De décrire la structure d'un programme ABAP

� De prendre en compte les aspects techniques del'exécution du programme lors de l'écriture d'unprogramme ABAP

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

Environnement d'exécution ABAP : objectifs duchapitre

Page 16: BC402 4.6a fr

(C) SAP AG BC402 2-3

SAP AG 1999

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

Page 17: BC402 4.6a fr

(C) SAP AG BC402 2-4

SAP AG 1999

Composantes d'un programme ABAP

INCLUDE mz_test_top.INCLUDE mz_test_i01.INCLUDE mz_test_o01.INCLUDE mz_test_f01....

PROGRAM sapmz_test_.

TYPES: ...DATA: .......

MODULE s_100 OUTPUT....ENDMODULE.

MODULE ok_100 INPUT....ENDMODULE.

FORM calc using ....Changing .

...ENDFORM.

xy 007xz 008

Hello world!

Hallo Welt!

¡Hola mundo!

Objet Traiter Saut Autres fonctions Options Système Aide

Erstes BildLetztes BildErstes FeldLetztes Feld

SuitePremière ligneLetzte ZeileZurück

TabellentypZurück

Mehr Ziele <

Utilisation

Intégration

Aide à l'application

...

...

Objet Traiter Saut Autres fonctions Environnement Système AideSuitePremière ligneDernière ligneRetour

Type de tableRetour

Autres < Premier dynproDernier dynproPremière zoneDernière zone

Interface

Code source

Dynpros Valeurs dansles variantes

Documentation

Éléments de texte

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éezgénéralement la structure d'un écran à l'aide du Screen Painter. Cependant, il existe des écrans detype spécial, appelés écrans de sélection et listes, dont la structure et la logique d'exécution sontconç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 lesallocations des touches de fonction. Elle comprend les titres et les statuts. Un statut est un groupe demenus 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 codeprogramme.

� Des variantes... vous permettant de prédéfinir les valeurs des zones de saisie dans l'écran de sélection d'unprogramme.

Page 18: BC402 4.6a fr

(C) SAP AG BC402 2-5

SAP AG 1999

Structure d'un programme

PROGRAM sapbc402_rund_test.TYPES: ...DATA: ....CONSTANTS: ...MODULE s_100 OUTPUT....ENDMODULE.......INITIALIZATION.......START-OF-SELECTION................FORM calc USING ...

CHANGING ......ENDFORM.

DDéclarationséclarations

Bloc Bloc évévénementénement

ProcProcédureédure

Module deModule dedialoguedialogue

ABAP est un langage de programmation orienté événement et adapté au traitement des dialoguesutilisateur. 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 écransde sélection, ainsi que les classes (dans ABAP Objects) et les interfaces locales au sein duprogramme.

� Blocs de traitement (unités de programme indivisibles)Chaque bloc de traitement doit être programmé comme une entité individuelle. Il existe deux typesde blocs de traitement :Les blocs événementIls sont introduits par un mot-clé événement. Ils ne sont pas conclus de manière explicite, mais seterminent lorsque le bloc de traitement suivant commence.Les procédures et modules de dialogueLes 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.

Page 19: BC402 4.6a fr

(C) SAP AG BC402 2-6

SAP AG 1999

Organisation du programme

Create Program

!

Programme SAPMZ402_RUND_TEST

Avec TOP include

Workbench Traiter Saut Autres fonctions Environnement Système Aide

Object Navigator

Désignation d'objetSAPMZ402_RUND_TEST

Structures des dictionnairesZonesModules PBOModules PAI Sous-programmesDynprosStatuts GUITitres GUITransactionsIncludes

MZ402_RUND_TESTTOPMZ402_RUND_TESTO01MZ402_RUND_TESTI01MZ402_RUND_TESTF01MZ402_RUND_TESTE01

><<<<<<<<<

Déclarations globales

Modules PBO

Modules PAI

Sous-programmes

Événements

>

Dans le cas le plus simple, votre programme est composé d'une seule unité de code source contenanttous les blocs de traitement appropriés. Pour faciliter la compréhension de vos programmes etaugmenter 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 unTOP include pour le programme. Cette option est particulièrement utile lors de la création de poolsde modules.

� Lorsque vous créez un bloc de traitement, le système vous demande toujours dans quel programmeINCLUDE 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 instructionINCLUDE dans le programme principal.

� Si vous nommez votre programme d'après la convention d'appellation SAPMZ<suite> ouSAPMY<suite> et que vous créez un nouveau bloc de traitement, le système propose le nom dunouveau 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 leprogramme INCLUDE approprié.

Ainsi, le système vous aide à créer des programmes dont les structures sont faciles à comprendre. Laconvention d'appellation normalisée vous permet d'opérer une distinction entre vos programmes etles autres.

Page 20: BC402 4.6a fr

(C) SAP AG BC402 2-7

SAP AG 1999

Architecture client/serveur à trois niveaux dusystème R/3

Couchedu serveur deprésentation

Couchedu serveurd'application

Base dedonnées

Dispatcher

Processusde travail

Processusde travail

Dispatcher

Processus de travail

Processus de travail

SAPgui SAPgui SAPgui SAPgui SAPgui SAPgui

Processusde travail

de BDProcessusde travail

de BD

Processusde travail

de BD

Processusde travail

de BD

Processusde travail

de BD

Le système R/3 est basé sur une architecture client/serveur à trois niveaux comportant un serveur debase de données, un serveur d'application et un serveur de présentation. Il permet à un grand nombred'utilisateurs équipés d'ordinateurs peu coûteux et relativement lents de bénéficier d'un petit nombre deserveurs d'application rapides et coûteux via l'utilisation des processus de travail. Chaque processusde 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 à unprocessus de travail pour une durée spécifique au niveau du serveur de présentation. Le processus detravail 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 travailpour qu'un autre utilisateur puisse utiliser le processus de travail pour une autre étape de dialogue alorsque le premier utilisateur renseigne le dynpro suivant. Ainsi, les ressources disponibles sur le serveurd'application sont optimisées.

L'architecture à trois niveaux rend le système évolutif. Pour ajouter d'autres utilisateurs, il suffitd'installer davantage de serveurs de présentation bon marché. Vous pouvez également augmenterl'efficacité de la totalité du système en ajoutant des serveurs d'application, ainsi que leurs processus detravail correspondants.

Page 21: BC402 4.6a fr

(C) SAP AG BC402 2-8

SAP AG 1999

Structure d'un processus de travail

Processeur ABAP

Processeur dedynpro

Interface de basede données

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. Ellessont mises en œuvre en tant qu'"ordinateurs virtuels". Ainsi, les programmes ABAP peuvent êtreexé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érentestâches dans une étape de dialogue :

� Processeur de dynprosLe processeur de dynpros est responsable de la communication entre SAPgui et le processus detravail (via le dispatcher). Il traite la logique de séquence des dynpros, puis transfère le contenu dezone vers la logique de traitement dans le programme.

� Processeur ABAPLe processeur ABAP exécute la logique de traitement dans le programme ABAP et communiqueavec l'interface de base de données. Le processeur de dynpros communique au processeur ABAP lapartie du programme (module) à traiter (en fonction de la logique de séquence des dynpros).

� Interface de base de donnéesL'interface de base de données est responsable de la communication avec la base de données. Ellepermet d'accéder aux tables et aux objets du Repository (y compris les objets du DictionnaireABAP), de contrôler l'exécution de la transaction (COMMIT et ROLLBACK), puis d'administrer lebuffer de table sur le serveur d'application.

Page 22: BC402 4.6a fr

(C) SAP AG BC402 2-9

SAP AG 1999

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

Programme ABAP

RuntimesystemABAP

actif

Bloc detraitementpassif

Déclarationspassif

Bloc detraitementpassif

Bloc detraitementpassif

Les blocs de traitement individuels sont appelés dans une séquence prédéterminée au moment del'exécution, indépendamment de leur ordre d'apparition dans le programme. Une fois le bloc detraitement appelé, ses instructions sont traitées de manière séquentielle.

� Bloc événementSi le programme système ou un utilisateur déclenche un événement pour lequel un bloc événementcorrespondant a été écrit dans la logique de traitement, ce bloc événement est traité. Le déroulementdu programme est contrôlé par le système ou l'utilisateur.

� Unité de modularisationLorsque le système rencontre un appel d'unité de modularisation dans un bloc de traitement, ilappelle le bloc de traitement correspondant. Dans ce cas, c'est le programmeur qui contrôle ledéroulement du programme.

Affectation de codes de transactionPour rendre possible l'exécution d'un pool de modules, vous devez lui affecter un code detransaction. Vous pouvez (sans obligation) affecter un code de transaction à un programme (type 1)exécutable.

Page 23: BC402 4.6a fr

(C) SAP AG BC402 2-10

SAP AG 1999

Exécution de la transaction dialogue

LOP

PBO

PAI

MODULE ... OUTPUT.ENDMODULE.

MODULE ... INPUT.ENDMODULE.

PBO

PAI

MODULE ... OUTPUT.ENDMODULE.

MODULE ... INPUT.ENDMODULE.

LOAD-OF-PROGRAM....

Affectez une transaction dialogue à un pool de modules. Lors de l'exécution d'une transactiondialogue, les étapes suivantes sont exécutées :

� En premier lieu, l'événement LOAD-OF-PROGRAM est déclenché. Une fois ce bloc événementexécuté, le processeur ABAP passe le contrôle au processeur de dynpros. Pour obtenir un exemplesur le mode d'utilisation de ce nouvel événement, référez-vous à l'exemple contenu dans le chapitreGroupes de fonctions et modules fonction.

� Le processeur de dynpros traite le dynpro initial spécifié dans la définition de la transaction. Cedynpro peut être un écran de sélection (indépendamment du type de programme). L'événementPROCESS BEFORE OUTPUT est déclenché et le contrôle passe au processeur ABAP, lequelexécute le premier module PBO.

� Le processeur ABAP exécute le bloc de traitement, puis renvoie le contrôle au processeur dedynpros. Une fois tous les modules PBO traités, le contenu de toutes les zones portant le même nomdans le programme ABAP et sur le dynpro est copié du programme vers le dynpro. Le dynpro estalors affiché (contenu, titre actif, statut actif).

� Quand l'utilisateur a sélectionné une fonction de dialogue (telle que la touche ENTRÉE), le contenudes zones de dynpro est à nouveau transporté vers les zones correspondantes portant le même nomdans le programme ABAP, puis les blocs de traitement appartenant à l'événement PROCESSAFTER 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 instructionsappartenant à 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.

Page 24: BC402 4.6a fr

(C) SAP AG BC402 2-11

SAP AG 1999

Exécution de la transaction de programme

LOAD-OF-PROGRAM.LOP

AT SELECTION-SCREENOUTPUT.

START-OF-SELECTION.SOS

INIT INITIALIZATION.

ASSO

ATSS AT SELECTION-SCREEN.

END-OF-SELECTION.EOS

GET ...GET

Vous pouvez affecter une transaction de programme uniquement à un programme exécutable (type1). Dans une transaction de programme, le système appelle des événements spécifiques dans unesé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énementscorrespondants 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 pardéfaut. Si vous omettez ce mot-clé événementiel, toutes les instructions non affectées à un autre blocde 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) vial'instruction CALL SCREEN.

Vous pouvez non seulement lancer des programmes (type 1) exécutables sans utiliser de code detransaction, mais également les exécuter également en arrière-plan.

Page 25: BC402 4.6a fr

(C) SAP AG BC402 2-12

SAP AG 1999

WRITE ...SKIP ...ULINE.

Événements de traitement de liste

TOP-OF-PAGE.TOP

END-OF-PAGE.EOP

AT LINE-SELECTION.WRITE ...SKIP ...ULINE.

ALS

TextTextText

TextTextText

Buffer de la liste de base

AT USER-COMMAND.AUC

Buffer de listepour liste détaillée

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 audébut de chaque page et END-OF-PAGE à la fin.

Une fois le bloc événement END-OF-SELECTION traité, le traitement de liste interactivecommence. Le système affiche la liste de base formatée. L'utilisateur peut désormais déclencherdes é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 defonction 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 etULINE), 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 dansle graphique). Le traitement de liste interactive est à nouveau lancé. Le système affiche la listedé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énementAT USER-COMMAND.

Page 26: BC402 4.6a fr

(C) SAP AG BC402 2-13

SAP AG 1999

FUNCTION-POOL ...

TYPES: ...DATA: ....

FUNCTION ...ENDFUNCTION.

CLASS-POOL ...

TYPES: ...DATA: ....

CLASS ...ENDCLASS.

INTERFACE ...ENDINTERFACE.

Programmes non exécutables

Générateur de classesGénérateur de

modules fonction

Groupe de fonctions,type F

Interface globale, type JClasse globale, type K

SUBROUTINE-POOL ...

TYPES: ...DATA: ....

FORM ...ENDFORM.

TYPES: ...DATA: .......WRITE ...

Sous-programmes externes,type S

Programme INCLUDE,type I

Éditeur ABAP

Les types de programmes suivants ne peuvent pas être exécutés directement. Ils servent deconteneurs pour les unités de modularisation appelées à partir d'autres programmes. Lorsque vousappelez l'une de ces unités de modularisation, le système charge toujours l'intégralité de sonprogramme 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 pourle 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éeslocales. Attention ! Les programmes de type S sont obsolètes et ont été remplacés par des groupes defonctions.

Page 27: BC402 4.6a fr

(C) SAP AG BC402 2-14

SAP AG 1999

� De nommer les composantes d'un programmeABAP

� De décrire la structure d'un programme ABAP

� De prendre en compte les aspects techniques del'exécution du programme lors de l'écriture d'unprogramme ABAP

Vous êtes maintenant capable :

Environnement d'exécution ABAP : résumé duchapitre

Page 28: BC402 4.6a fr

(C) SAP AG BC402 2-15

Environnement d'exécution ABAP : exercices

Chapitre : environnement d'exécution ABAPSujet : 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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies aériennes.

1. Connectez-vous au système d'exploitation, puis au système de formation R/3 (votreanimateur 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 duRepository. 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 :BC402SAPBC402_TYPS_COUNTERLIST1SAPBC402_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_COUNTERLIST1sans TOP include.

2-3 Créez un programme exécutable Z##_BC402_FLIGHTLIST1sans TOP include.

À partir de là, vous devez toujours utiliser Object Navigator. Vousobtenez ainsi une vue d'ensemble de tous les objets du Repositorydans votre classe de développement. Vous pouvez sélectionner lesobjets que vous souhaitez utiliser.

Page 29: BC402 4.6a fr

(C) SAP AG BC402 2-16

Page 30: BC402 4.6a fr

(C) SAP AG BC402 2-17

Environnement d'exécution ABAP : solutions

Chapitre : environnement d'exécution ABAPSujet : 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 dedonné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 dedonnées **& **&-----------------------------------------------------------*

REPORT sapbc402_typs_flightlist1.

Page 31: BC402 4.6a fr

(C) SAP AG BC402 3-1

SAP AG 1999

� 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

Contenu

Types et objets de données

Page 32: BC402 4.6a fr

(C) SAP AG BC402 3-2

SAP AG 1999

� De distinguer les différents types et objets dedonnées

� De définir les types de données et de déclarer lesobjets de données

� D'utiliser les field symbols et références

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

Types et objets de données : objectifs du chapitre

Page 33: BC402 4.6a fr

(C) SAP AG BC402 3-3

SAP AG 1999

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

Page 34: BC402 4.6a fr

(C) SAP AG BC402 3-4

SAP AG 1999

Types et objets de données

ProgrammeABAP

CodesourceABAP Interface

Sous-programme

Les types décrivent les attributs des...

Objets de donnéesParamètres d'interfacedes sous-programmes

Tables debase de données

Paramètres d'interfacedes fonctions et méthodes

Zones de saisie/édition

Interface

Module fonction

Pour utiliser les données au moment de l'exécution, vous devez les mémoriser dans le programme et lesadresser à 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.). Unobjet de données est une zone de mémoire nommée, structurée en fonction d'un type de donnéesspécifique. Le type spécifie généralement tous les attributs de l'objet de données. À l'aide du nom, vouspouvez 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 planspeuvent ê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 particuliersi 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 dedéclarer la variable, et dans certains cas, pas avant l'exécution. Il vous permet aussi d'utiliser les objetsde données déjà déclarés ou les objets du Dictionnaire ABAP servant de base aux nouveaux types ouobjets de données.

Page 35: BC402 4.6a fr

(C) SAP AG BC402 3-5

SAP AG 1999

Types de données ABAP : vue d'ensemble

...

TYPES local_type ...

...

Programme ABAP(type localdans le programme)

Dictionnaire ABAP(type global)

Type élémentaire

Prédéfini

Type élémentaire

Type structuré

Type de table

Type complexe

Type de référence

Défini par l'utilisateur

Type de données

Type groupTYPE-POOL my_tp.

TYPES my_tp_type1 ...TYPES my_tp_type2 ......

ABAP Workbench comporte de nombreux endroits où vous pouvez définir et mémoriser les types dedonnées :

� Dictionnaire ABAPIl contient 23 types de données prédéfinis servant de base pour tous les autres objets du DictionnaireABAP (tels que les domaines, les éléments de données, les types de données, etc.). Ces types dedonné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 leDictionnaire ABAP.Auparavant, la seule méthode de définition des types de données globales consistait à utiliser un typegroup. Les type groups sont toujours pris en charge, mais le concept est en fait obsolète puisqu'il estaujourd'hui possible de définir les types de données globales dans le Dictionnaire ABAP.

� Programmes ABAPLes types de données définis dans un programme ABAP sont locaux, c'est-à-dire qu'ils sont correctsuniquement dans ce programme. Utilisez les dix types de données ABAP prédéfinis comme basepour 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ésci-dessus doivent vous permettre de comprendre les diapositives suivantes, ainsi que ladocumentation en ligne.

Page 36: BC402 4.6a fr

(C) SAP AG BC402 3-6

SAP AG 1999

Construction des types de données

Type élémentaire

Type structuré

Type de table

Type de structure ou type de table ?

Extension detable dynamique

� 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 untype de clé.

� Dans des cas exceptionnels, les types décrivent seulement une partie des attributs d'un objet dedonnées. Par exemple, un type de table ne spécifie pas le nombre de lignes de la table. Cet attributn'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 cettemanière, le type structuré peut être doté de composantes elles-mêmes structurées ou de types detables. Vous pouvez ainsi construire des types de données très complexes. Cependant, la plus petiteunité indivisible correspond toujours à un type élémentaire.

Page 37: BC402 4.6a fr

(C) SAP AG BC402 3-7

SAP AG 1999

Types prédéfinis du Dictionnaire ABAP

ACCP ...............CHAR ...............CLNT ...............CUKY ...............CURR ...............DATS ...............DEC .................FLTP ................INT1 .................INT2 .................INT4 .................LANG ...............LCHR ...............LRAW ..............NUMC ..............PREC ...............QUAN ..............RAW ................TIMS ................VARC ...............STRING ...........RAWSTRING ...UNIT .................

Pas de typeélémentaire

Période comptable AAAAMMChaîne de caractèresMandantClé de devise référencée par une zone CURRZone devise stockée comme DECZone date (AAAAMMJJ) stockée comme CHAR(8)Zone de calcul ou zone montant comportant un signe plus ou moinsNombre en virgule flottante avec huit octetsNombre entier à 1 octet. Nombre entier <= 255Nombre entier à 2 octets. Uniquement pour la zone de longueur avant LCHR ou LRAWNombre entier à 4 octets. Nombre entier avec un signe plus ou moinsCode langueChaîne de caractères longue. Doit être précédée d'une zone INT2.Chaîne d'octets longue. Doit être précédée d'une zone INT2.Chaîne de caractères contenant uniquement des chiffresPrécision d'une zone QUAN.Zone de quantité. Pointe vers une zone d'unités avec le type UNIT.Séquence d'octets non interprétéeZone heure (HHMMSS) stockée comme CHAR(6)Chaîne de caractères longue (non prise en charge après la version 3.0)Chaîne de caractères d'une longueur variableSéquence d'octets d'une longueur variableClé d'unité pour une zone QUAN

Le Dictionnaire ABAP contient une série de types de données prédéfinies pour représenter les types dedonné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 larelier à 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 quidoit ê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 estgé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 danslesquelles seuls les chiffres doivent être autorisés, mais avec lesquelles vous ne souhaitez paseffectuer de calcul. (Cependant, il est possible d'utiliser des conversions et d'effectuer des calculsavec 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 (parexemple, formats de date nationaux). Chaque utilisateur définit ces formats dans ses constantesutilisateur.

Tous ces types de données, excepté les STRING et RAWSTRING, sont des types élémentaires. Pourdes raisons techniques, ils sont classés comme types structurés. Ceci a des conséquences surcertaines utilisations, telles que la clause INTO d'une instruction SELECT.

Page 38: BC402 4.6a fr

(C) SAP AG BC402 3-8

SAP AG 1999

Générateurde classes

Objet de dév. Traiter Saut Autres fonctions Environnement Système Aide

Objets du Dictionnaire de Object Navigator

Table de BD VueType de tableStructureÉlément de donnéesDomaineAide à la rechercheObjet de blocageType group

MY_DATA_ELEMENT

Objet de dév. Traiter Saut Autres fonctions Environnement Système Aide

Objets du Dictionnaire de Object Navigator

Table de BD VueType de tableStructureÉlément de donnéesDomaineAide à la rechercheObjet de blocageType group

MY_STRUCTURE

Domaine

Élément dedonnées

Structure

Type de table

Typeprédéfini

Peut êtreimbriqué

Éléments et structures de données dans leDictionnaire ABAP

� Élément de donnéesLes é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 dedonnées uniquement en définissant un domaine. À chaque domaine était affecté un type prédéfini duDictionnaire. Cette opération est toujours possible, cependant, il est désormais possible de saisirdirectement un type prédéfini du Dictionnaire. Pour vous assurer que les attributs techniques d'ungroupe d'éléments de données puissent être modifiés de manière centrale, continuez à utiliser lesdomaines.En ce qui concerne ABAP Objects, vous pouvez à présent désigner un élément de données et untype de référence, puis déclarer des types globaux pour les références aux classes ou interfacesglobales. Notez que, dans ce cas, le type de l'élément de données n'est plus élémentaire, maisimbriqué. Il en est de même lorsque vous utilisez les types prédéfinis string et rawstring.

� StructureChaque composante d'une structure doit comporter un nom en vue d'être traitée directement. Pour letype d'une composante, vous pouvez spécifier un type prédéfini du Dictionnaire, un élément dedonnées, un type structuré ou un type de table. Vous pouvez ainsi construire des types de donnéesimbriquées. Prenez en compte les conséquences déjà mentionnées relatives aux différents typesd'accès. Par exemple, si une structure contient une composante avec référence à un type duDictionnaire ou string, vous ne pouvez pas utiliser INTO CORRESPONDING FIELDS OF dansune instruction SELECT. Répertoriez plutôt les composantes dans la clause INTO.

Page 39: BC402 4.6a fr

(C) SAP AG BC402 3-9

SAP AG 1999

Attributs de la table interne (types)

Type de clé

AA 0017 2 572 LH 0400 6 162

QF 0005 10 000 Accès index

LH 0400 7 273

55

Accès clé

UA 0007

Type de ligne

Définition de la clé

Type d'accès

CARRID CONNID DISTANCECARRID CONNID DISTANCE

SQ 0866 1 625 UA 0007 2 572

?

Les types de données d'une table interne sont entièrement spécifiés par :

� Son type de ligneLe type de ligne définit les attributs des zones individuelles. Vous pouvez spécifier tout type dedonné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 lesystème.

� Son type de cléVous pouvez définir la clé comme unique ou non unique. Le caractère unique de la clé doit êtrecompatible avec le type d'accès choisi pour la table. Si la clé est unique, aucune entrée double nepeut exister dans la table.

� Son type d'accèsContrairement aux tables de base de données, le système affecte des numéros de ligne à certainstypes de tables internes. Par conséquent, vous pouvez utiliser l'index, ainsi que la clé, pour accéderaux lignes. Le terme "type de table" est parfois utilisé ici pour s'y référer.

Page 40: BC402 4.6a fr

(C) SAP AG BC402 3-10

SAP AG 1999

Types d'accès : vue d'ensemble

Accès clé

Accèsutilisant

Principalement un index Principalement la clé La clé uniquement

Caractère unique NON UNIQUE UNIQUE | NON UNIQUE UNIQUE

nn

Analyse deAnalyse dela tablela table

RechercheRecherchebinairebinaire

FonctionFonctionde hachagede hachage

STANDARD TABLE SORTED TABLE

INDEX TABLE HASHED TABLE

ANY TABLE

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 oude la clé de table. La clé d'une table standard devant toujours être non unique pour des raisons decompatibilité, le système parcourt la table entière à chaque fois que vous y accédez par la clé. Parconsé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èrede nouvelles entrées triées sur la clé de table. Le système utilise une recherche binaire lorsque vousaccédez à la table à l'aide de la clé. Vous pouvez spécifier la clé d'une table triée comme unique. Laclé est généralement utilisée pour accéder à une table triée, mais il est également possible d'utiliserl'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 viala 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 êtreunique.

Il n'est pas nécessaire de spécifier entièrement le type d'accès. Vous pouvez également l'omettre ou lespécifier partiellement (table à index). Le type de table est par conséquent générique et, en omettantcertains 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'instructionDESCRIBE TABLE <tabi> KIND <zonecar>.

Page 41: BC402 4.6a fr

(C) SAP AG BC402 3-11

SAP AG 1999

Types de tables dans le Dictionnaire ABAP

Domaine

Élément dedonnées

Structure

Type de table

Typeprédéfini

Objet de dév. Traiter Saut Autres fonctions Environ. Système Aide

Objets du Dictionnaire de Object Navigator

Table de BD VueType de tableStructureÉlément de donnéesDomaineAide à la rechercheObjet de blocageType group

MY_TABLETYPE

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é ouun type élémentaire. Si vous utilisez uniquement un type élémentaire, la table interne comporte uneseule 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 toutentiè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 chapitreOpérations sur les tables internes.

Page 42: BC402 4.6a fr

(C) SAP AG BC402 3-12

SAP AG 1999

Types d'ABAP prédéfinis

Longueur Longueur

Nombre condensé 0 15 31

Nombre entier 0 [-2147483648 ; 2147483647]Nombre en virguleflottante 0.0...E+000 [2.2...E-308 ; 1.7...E+308]

P

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

Chaîne de caractères _ _ ... _ 1 65535

Date JJMMAAAA 00000000 8 8

Temps HHMMSS 000000 6 6

Code hexadécimal X'00' 1 65535

I

F

N

C

D

T

X

Num

ériq

ue

Chaîne de caractères vide 0 indifférent

Alp

hanu

mér

ique

par défaut maximale

Code hexadécimal vide 0 indifférent

STRING

XSTRING

Type de données Signification Valeur initiale Valeurs possibles

(carac.) (carac.)

� Le type F sert aux calculs impliquant des nombres très importants ou très faibles. Ce type estgé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 danslesquelles seuls les chiffres doivent être autorisés, mais via lesquels vous ne souhaitez pas effectuerde calcul). (Cependant, il est possible d'utiliser des conversions et d'effectuer des calculs avec desdonné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écimalen'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èredynamique. 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 dedynpro.

Page 43: BC402 4.6a fr

(C) SAP AG BC402 3-13

SAP AG 1999

TYPES:t_char,t_name(8) TYPE c.

DATA:d_value(5) TYPE p DECIMALS 2.

TYPES:t_namenew TYPE t_name,t_valnew LIKE d_value,t_mydate TYPE dats,t_myfield TYPE zmy_data_element,t_mycarr TYPE spfli-carrid.

TYPESTYPES

TYPESTYPES

TYPETYPE

TYPETYPE

TYPETYPE

TYPETYPE

LIKELIKE

TYPETYPE

Domaine

Élémentde données

Structure

Type de table

Typeprédéfini

Définition des types élémentaires dans unprogramme

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

Table debase de

données

Conversion

Type de zone

Vous pouvez définir un nouveau type de données uniquement en fonction d'un type existant. Utilisezl'option TYPE pour vous référer aux types de données : aux types ABAP prédéfinis, aux typeslocaux définis par l'utilisateur, aux types du Dictionnaire ABAP, aux types prédéfinis par l'utilisateurdu Dictionnaire ABAP, aux zones ou aux lignes entières des tables de base de données. Si vousvous référez à un type du Dictionnaire ABAP, les modifications apportées au type global sontautomatiquement transférées vers votre type. De cette façon, votre type est toujours compatible avecl'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 dedonnées ABAP correspondant. Pour plus d'informations, référez-vous à la documentation de syntaxeABAP 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 demême pour les diapositives suivantes.

Types élémentairesL'indication de longueur située après le nom du type pour les types de données C, N et X ABAPspécifie le nombre de caractères du type. Pour les zones du type P, vous pouvez également définir lenombre 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).

Page 44: BC402 4.6a fr

(C) SAP AG BC402 3-14

SAP AG 1999

TYPES:BEGIN OF t_linetype,name TYPE t_name,val LIKE d_value,mydate TYPE dats,myfield TYPE zmy_data_element,mytab TYPE zmy_tabletype,

END OF t_linetype.

TYPES:t_linenew TYPE t_linetype,t_mystruc TYPE zmy_structure,t_mysflight TYPE sflight.

TYPESTYPES

TYPETYPE

TYPETYPE

TYPETYPE

LIKELIKE

TYPETYPE

TYPESTYPES

BEGIN OFBEGIN OF

END OFEND OF

TYPETYPE

TYPETYPETYPETYPE

Domaine

Élémentde données

Structure

Typede table

Typeprédéfini

Table debase de

données

Définition des types structurés dans unprogramme

TYPES:BEGIN OF <typestruct>,

* ...composantes...END OF <typestruct>. Conversion

Type de ligne

Types structurésUtilisez 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îtreentre 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 lesoptions TYPE LINE OF <typetabi> ou LIKE LINE OF <tabi>.

Page 45: BC402 4.6a fr

(C) SAP AG BC402 3-15

SAP AG 1999

Domaine

Élémentde données

StructureTypede table

Typeprédéfini

Tablede base

de données

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

TYPES t_simptabTYPE STANDARD TABLE OF t_linetypeWITH DEFAULT KEY.

TYPES t_sophtabTYPE SORTED TABLE OF t_linenewWITH UNIQUE KEY myfield name. "order!

TYPES t_mytabnew TYPE t_sophtab.

TYPES t_othertab TYPE zmy_tabletype.

TYPESTYPES

TYPESTYPES

TYPESTYPES

TYPESTYPES

TYPE STANDARD TABLE OFTYPE STANDARD TABLE OF

TYPE SORTED TABLE OFTYPE SORTED TABLE OFWITH UNIQUE KEYWITH UNIQUE KEY

TYPETYPE

TYPETYPE

WITH DEFAULT KEYWITH DEFAULT KEY

Conversion

Types de tablesÀ l'instar de la création des types de tables dans le Dictionnaire ABAP, vous devez spécifier lesdivers attributs suivants :

� Le type de ligne après ... TABLE OF (si vous vous référez à un type de données, utilisez TYPEet 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 utilisele 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'optionDEFAULT KEY). Vous pouvez également spécifier les zones à partir du type de ligne (plat) et laséquence de manière explicite. Si la table n'est pas structurée, vous pouvez utiliser l'option TABLELINE).

� 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 pageDé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 lesréférences.

Page 46: BC402 4.6a fr

(C) SAP AG BC402 3-16

SAP AG 1999

...DATA: d_char, d_name(8) TYPE c VALUE 'SAP AG'.DATA:d_valnew LIKE d_value,d_line1 TYPE t_linetype,

BEGIN OF d_line2,flag TYPE t_char,name TYPE t_name,mycarr TYPE spfli-carrid,

END OF d_line2.

DATADATA

TYPETYPE

TYPETYPETYPETYPE

TYPETYPELIKELIKE

DATADATA

BEGIN OFBEGIN OF

END OFEND OF

VALUEVALUE

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

Valeur initiale

À l'instar de la définition des types de données, vous devez spécifier un type lorsque vous déclarez desobjets 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éesdu programme déjà déclaré (à l'aide de l'option LIKE). Vous pouvez utiliser exactement les mêmesvariantes 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 uneinstruction 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 momentde l'exécution. Par conséquent, elles sont également connues sous le nom de variables. Vouspouvez affecter une valeur initiale à un objet de données à l'aide de l'option VALUE. Dans le cascontraire, le système lui affecte une valeur initiale appropriée à son type (référez-vous à la tablecontenue dans Types ABAP prédéfinis).

Deux instructions supplémentaires peuvent être utilisées pour déclarer des objets de donnéesspécifiques :

� STATICS déclare les variables locales d'un sous-programme dont les valeurs sont conservées dansdes appels de sous-programmes ultérieurs au lieu d'être initialisées à nouveau. Pour plusd'informations, reportez-vous au chapitre Sous-programmes.

� L'instruction des ABAP Objects CLASS-DATA vous permet de déclarer les attributs de classestatiques.

Page 47: BC402 4.6a fr

(C) SAP AG BC402 3-17

SAP AG 1999

Déclaration des tables internes

Extensionde table

dynamique

DATA d_simptab TYPE TABLE OF t_linetype.

DATA d_sophtabTYPE SORTED TABLE OF t_linenewWITH UNIQUE KEY myfield name. "order!

DATA d_mytabnew LIKE d_sophtab.

DATA d_othertab TYPE zmy_tabletype.

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

TYPE TABLE OFTYPE TABLE OFDATADATA

DATADATA

DATADATA

DATADATA

TYPE SORTED TABLE OFTYPE SORTED TABLE OFWITH UNIQUE KEYWITH UNIQUE KEY

LIKELIKE

TYPETYPE

À l'exception de l'option WITH HEADER LINE, la syntaxe permettant de déclarer les objets de latable interne est identique à celle utilisée pour définir les types de table ou d'autres types d'objets dedonnées. L'option vous permet de créer une table interne avec un en-tête. Cependant, cette techniquede programmation étant obsolète, il est recommandé de ne plus l'utiliser. Pour plus d'informations surles en-têtes et les tables internes, référez-vous au chapitre Opérations sur les tables internes.

Extension dynamique de tableContrairement aux tableaux contenus dans d'autres langages de programmation, le nombre de lignesd'une table interne augmente automatiquement en fonction de l'environnement d'exécution ABAPrequis. Il est par conséquent inutile de se préoccuper de la gestion de la taille de la table, maisseulement de l'insertion, de la lecture et de la suppression de lignes. Ainsi, ABAP contient des listesenchaînées redondantes.

Option INITIAL SIZELorsque vous créez une table interne, le système lui alloue 256 octets. Le système alloue ensuite unbloc de 8 Ko à la table lorsque vous ajoutez des données pour la première fois, puis d'autres blocs de 8Ko comme requis. Si vous souhaitez insérer uniquement quelques lignes dans votre table ou si vousutilisez des tables internes imbriquées, il peut s'avérer judicieux de limiter la première extensionautomatique à l'aide de l'option INITIAL SIZE <n>. Cette opération peut être exécutée dans ladéfinition de l'objet de données ou dans la définition du type. <n> correspond au nombre maximal delignes à insérer dans la table. Lors de la première allocation de mémoire, le système alloue le produitde <n> et de la longueur de la ligne. En second lieu, il alloue deux fois ce montant, puis un montantcompris entre 12 et 16 Ko lors des étapes ultérieures.

Page 48: BC402 4.6a fr

(C) SAP AG BC402 3-18

SAP AG 1999

Zones de saisie dans les écrans de sélection et lestables 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 pa_carr TYPE spfli-carrid DEFAULT 'LH'.

DATA d_conn TYPE spfli-connid.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_carrAND connid IN set_connection.

PARAMETERSPARAMETERS

SELECT-OPTIONSSELECT-OPTIONS FORFOR

TYPETYPE DEFAULTDEFAULT

ININ

LIKE RANGE OFLIKE RANGE OF

Les écrans de sélection correspondent à un type d'écran spécifique dont la structure dans la logique detraitement 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 instructionsmarquant généralement le début et la fin d'une définition de l'écran de sélection, ainsi que les appelsexplicites ne sont pas requis pour la définition de l'écran de sélection standard. Les instructionssuivantes vous permettent de créer facilement des dynpros dans lesquels l'utilisateur peut saisir desdonnées.

� PARAMETERS crée une zone de saisie dans l'écran de sélection à l'aide du type spécifié et d'unevariable du programme possédant le même nom. Il est impossible d'utiliser f, string, xstringou 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 saisirdes ensembles de sélections complexes pour une variable spécifiée. Les valeurs saisies parl'utilisateur sont stockées dans une table interne créée automatiquement par le système. La tableinterne 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 ABAPWorkbench) et BC410 (Programmation interactive).

Page 49: BC402 4.6a fr

(C) SAP AG BC402 3-19

SAP AG 1999

DATA factor TYPE f.

CONSTANTS: c_number1 TYPE i VALUE 123456789,c_number2 TYPE i VALUE '1234567890',c_eurofak(4) TYPE p DECIMALS 5 VALUE '1.95583',c_pi LIKE factor VALUE '3.1415E01',c_factor TYPE f VALUE IS INITIAL ,c_clause(20) TYPE c VALUE 'John''s bike is red.',c_our_carr TYPE scarr-carrid VALUE 'LH'.

* 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_carr AND connid = pa_conn.

Constantes et littérales

CONSTANTS <constante> TYPE <typedonnées>|LIKE <objetdonnées>VALUE <littéral>|IS INITIAL}.

TYPETYPETYPETYPETYPETYPELIKELIKE

TYPETYPETYPETYPE

VALUEVALUEVALUEVALUEVALUEVALUEVALUEVALUE

VALUEVALUEVALUEVALUE

DECIMALSDECIMALS

CONSTANTSCONSTANTS

'LH''LH'

c_c_ourour__carrcarr

TYPETYPE VALUE IS INITIALVALUE IS INITIAL

Les constantes et les littérales sont des objets de données fixes (il est impossible de modifier leursvaleurs au moment de l'exécution).

� Définissez les constantes à l'aide du mot-clé ABAP CONSTANTS. Pour affecter une valeur à votreconstante, vous devez utiliser l'option VALUE.Recommandation : Utilisez, si possible, des constantes plutôt que des littérales. La gestion de vos programmes en seraainsi facilitée.

� Les valeurs littérales vous permettent de spécifier une valeur directement dans une instructionABAP. Il existe deux types de valeurs littérales : les valeurs littérales numériques etalphanumériques. Les valeurs littérales alphanumériques doivent toujours être contenues entreapostrophes. Les nombres entiers (y compris le signe moins le cas échéant) peuvent être représentéscomme des valeurs littérales numériques. Ils sont mis en correspondance avec les types de données iet 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 entant 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 afinque la première soit interprétée comme partie intégrante de la valeur littérale et non commel'apostrophe de fin.

Page 50: BC402 4.6a fr

(C) SAP AG BC402 3-20

SAP AG 1999

Symboles de texte

Symboles de texte

EN Hello world!DE Hallo Welt!ES ¡Hola mundo! :EN How are you? :

ts1

ts2

* programmation incorrecte :***************************WRITE 'Hello World!'.

* programmation correcte :************************WRITE 'Hello World!'(ts1).* ouWRITE text-ts2.

<instruction_édition> '<texte_défaut>'(<tsk>).

<instruction_édition> text-<tsk>.

'Hello World'Hello World!'(ts1)!'(ts1)

texttext-ts2-ts2

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éspour l'édition de plusieurs manières. Les symboles de texte, contrairement aux valeurs littéralesalphanumé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 lacompréhension de votre programme.

Les symboles de texte sont souvent utilisés pour créer des listes non spécifiques à la langue. Vouspouvez é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'instructionWRITE :

� 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 cascontraire, le texte par défaut apparaît.

Page 51: BC402 4.6a fr

(C) SAP AG BC402 3-21

SAP AG 1999

Transfert des données vers et à partir des dynpros

<zone_s_é>

<objet_dic>-<zone>

TABLES <objet_dic>.DATA <zone_s_é> ...

* envoi de données à l'écran:<objet_dic>-<zone> = ...<zone_s_é> = ...

* obtention des données del'écran:... = <objet_dic>-<zone>.... = <zone_s_é>.

<objet_dic>-<zone>

<i_o_zone>

Lorsque vous utilisez les dynpros, le système transfère automatiquement le contenu de zone de lalogique de traitement vers le dynpro et inversement, mais seulement si les zones de dynpro et leszones 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 fromDictionary dans Screen Painter), vous devez utiliser l'instruction TABLES pour déclarer un objet dedonnées ayant le même nom que l'objet du Dictionnaire ABAP en vue d'assurer le fonctionnementdu transfert des zones. Les structures déclarées de cette façon sont souvent appelées espaces detravail.

L'utilisation d'une référence à un Dictionnaire ABAP présente de nombreux avantages : les objets duDictionnaire comprennent généralement des contrôles de clés externes, une aide de zone, des entréespossibles et les dialogues d'erreur nécessaires. Par conséquent, vous pouvez identifier les donnéesincohé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é versle programme. Si vous omettez de redéfinir la zone en cas d'échec du contrôle, une valeur nonsouhaitée demeure dans l'espace de travail. Vous risquez de rencontrer le même problème si vousne 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 dynproet le programme, puis utilisez-les uniquement dans ce contexte. Ils fournissent des données audynpro à la fin de l'événement PBO et les reçoivent à nouveau lorsque les valeurs sont transférés àpartir du dynpro.

Page 52: BC402 4.6a fr

(C) SAP AG BC402 3-22

SAP AG 1999

REPORT ...

NODES:spfli, sflight.

START-OF-SELECTION.

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

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

GET sflight.WRITE: /10 sflight-fldate.

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

NODESNODES

GETGET

GETGET

GETGET

LATELATE

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

Les bases de données logiques sont des programmes ABAP spécifiques que vous pouvez relier à unprogramme exécutable (type 1). Elles lisent les données à partir de la base de données, puis lestransfèrent au programme exécutable. La lecture des données étant affectée à la base de donnéeslogique, 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 travailde 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 foisque 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 pouvezcoder 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éeslogique à l'aide de l'option TYPE. Cependant, cette opération se limite aux types pris en charge parla base de données logique. Pour plus d'informations sur cette instruction, référez-vous à ladocumentation en ligne ou au cours BC405 (Reporting dans ABAP Workbench).

Page 53: BC402 4.6a fr

(C) SAP AG BC402 3-23

SAP AG 1999

Objets de données prédéfinis

...

SET PF-STATUS space.

...

WRITE:/ sy-tcode, "code de transaction courantsy-mandt, "mandant courantsy-uname, "utilisateur courantsy-datum, "date courantesy-langu, "langue courantesy-subrc. "code retour des instructions ABAP

spacespace

sy-tcodesy-tcodesy-mandtsy-mandt

sy-unamesy-unamesy-datumsy-datumsy-langusy-langusy-subrcsy-subrc

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 unestructure appelée sy pour chaque programme. Les composantes individuelles de la structure sontappelé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èreexplicite (par exemple, navigation entre les niveaux de liste en utilisant sy-lsind). Dans tous lesautres cas, lisez uniquement le contenu des zones système, car en les modifiant, des informationsimportantes 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.

Page 54: BC402 4.6a fr

(C) SAP AG BC402 3-24

SAP AG 1999

Field symbolsFIELD-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.FIELD-SYMBOLS <sz_int> TYPE i.

ASSIGN int TO <sz_int>.WRITE: / int, <sz_int>.

<sz_int> = 17.WRITE: / int, <sz_int>.

UNASSIGN <sz_int>.IF <sz_int> IS ASSIGNED.WRITE: / int, <sz_int>.

ELSE.WRITE: / 'le field symbol n'est pas affecté'(fna).

ENDIF.

FIELD-SYMBOLSFIELD-SYMBOLS << >> TYPETYPE

ASSIGNASSIGN TOTO << >><< >>

<< >><< >>

<< >>

<< >><< >>

UNASSIGNUNASSIGN

IS ASSIGNEDIS ASSIGNED

int

15 fs_int int

15 <adr_int> fs_int int

17 <adr_int> fs_int int

17 fs_int int

15

� 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 lesmodifications apportées au field symbol s'appliquent à l'objet de données qui lui est affecté. Siaucun type n'est affecté au field symbol (TYPE ANY), ce dernier adopte le type de l'objet dedonnées. Si vous spécifiez un type pour le field symbol, seuls les objets compatibles lui sontaffecté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. Pourlever 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 lamê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>> ISASSIGNED.

� L'instruction UNASSIGN <<sz>> définit le field symbol <<sz>> pour qu'il ne pointe vers aucunendroit. 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 decompatibilité) comme une constante de type C et de longueur 1.

Page 55: BC402 4.6a fr

(C) SAP AG BC402 3-25

SAP AG 1999

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.FIELD-SYMBOLS <sz_int> LIKE int.DATA d_ref1 TYPE REF TO data.DATA d_ref2 LIKE d_ref1.

GET REFERENCE OF int INTO d_ref1.d_ref2 = d_ref1.

ASSIGN d_ref2->* TO <sz_int>.

WRITE: / int, <sz_int>.

TYPE REF TOTYPE REF TO datadata

GET REFERENCE OFGET REFERENCE OF INTOINTO

ASSIGNASSIGN ->* TO->* TO

15 int

fs_int

d_ref1d_ref2

15 int

fs_int

<adr_int> d_ref1d_ref2<adr_int>

<adr_int>

� L'instruction TYPES <typeréf> TYPE REF TO data. *) définit un type de référence à unobjet de données. DATA... définit elle-même la référence correspondante. Une telle référencecorrespond à une zone dans laquelle une adresse peut être stockée.

� L'instruction GET REFERENCE OF <objetdonnées> INTO <référence> écrit l'adressede l'objet de données (déjà déclaré) dans la variable de référence. En d'autres termes, la référencepointe 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), ainsique la sémantique de valeur, telles qu'elles sont utilisées dans les field symbols (dans lesquels lesmodifications s'appliquent aux objets de données). Cependant, dans ABAP, la sémantique deréférence se limite aux affectations.

� L'opérateur de déréférencement ->* dans l'instruction ASSIGN vous permet d'affecter l'objet dedonnées vers lequel la référence pointe vers un field symbol. Vous pouvez alors accéder à la valeurde 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 del'instruction CREATE DATA <référence>. Cet objet de données ne possède pas de nom mais laré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 chapitreIntroduction à ABAP Objects.

� __________________________

� *) Remarque : les données dans ce contexte ne correspondent pas à un mot-clé mais plutôt à un nomprédéfini comme espace ou p.

Page 56: BC402 4.6a fr

(C) SAP AG BC402 3-26

SAP AG 1999

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.

Vous pouvez utiliser la conversion de type de manière dynamique lorsque vous affectez un objet dedonné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 aumoment de l'exécution. Puisqu'il n'est pas possible de spécifier une clause INTO dynamique dansl'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 zonecomme 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'optionTYPE.)Si vous connaissez les noms des composantes, vous pouvez afficher les zones directement à l'aide deWRITE <sz_wa>-... .

Cependant, les noms des composantes ne sont généralement pas connues. Dans ce cas, utilisez lavariante ASSIGN COMPONENT dans laquelle les composantes de la structure <fs_wa> sontaffectées une par une au field symbol <sz_comp>, puis affichées. Lorsque la boucle ne rencontreplus de composantes, le programme lit l'enregistrement de données suivant.

ProblèmeL'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 entierdummy directement avant de déclarer line. (Les nombres entiers sont toujours stockés au niveaudes adresses divisibles par 4.)

Page 57: BC402 4.6a fr

(C) SAP AG BC402 3-27

SAP AG 1999

Déclaration des objets de données de manièredynamique : exemplePARAMETERS: 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.

Contrairement aux objets de données classiques, vous pouvez spécifier le type d'un objet de donnéescréé au moment de l'exécution de manière dynamique. L'exemple ci-dessus est une versionlé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 aumoment de l'exécution. Dans ce cas, le type est déjà connu (vous avez saisi le nom de table) et iln'existe plus de problème d'alignement. L'instruction ASSIGN d_ref->* to <sz_wa> affectel'objet de données au field symbol. Le type de données de la table provient du field symbol, laconversion 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 dedonnées dans l'objet de données avec le même type vers lequel la référence d_ref pointe, enutilisant le field symbol <sz_wa>.

Page 58: BC402 4.6a fr

(C) SAP AG BC402 3-28

SAP AG 1999

Attributs des objets de données

DESCRIBE FIELD <zone>LENGTH <lon> "longueurTYPE <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...

ProgrammeABAP

CodesourceABAP

Objetsde données

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 DESCRIBEFIELD 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 nerenvoie pas la longueur de la chaîne. Il renvoie à la place la longueur de la référence de chaîne quiest 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 tableinterne.

Depuis l'introduction de ABAP Objects, il existe désormais un système appelé concept RTTI (RunTime Type Information) permettant de rechercher les attributs de type au moment de l'exécution. Ilest basé sur des classes du système. Le concept comprend tous les types ABAP et couvre toutes lesfonctions des instructions DESCRIBE FIELD et DESCRIBE TABLE.

Page 59: BC402 4.6a fr

(C) SAP AG BC402 3-29

SAP AG 1999

� De distinguer les différents types et objets dedonnées

� De définir les types de données et de déclarer lesobjets de données

� D'utiliser les field symbols et références

Vous êtes maintenant capable :

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

Page 60: BC402 4.6a fr

(C) SAP AG BC402 3-30

Types et objets de données : exercices

Chapitre : types et objets de donnéesSujet : 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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies 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, ainsique leurs codes. Créez une deuxième table interne pour les compagnies aériennes, lesaé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 Typeid sairport-id

name sairport-name

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

Composante Typeairport scounter-airportairp_name sairport-namecarrid scounter-carridcountnum scounter-countnum

1-3 Déclarez la table interne it_carr_counter comme table standard avec le typede ligne t_counter et une clé par défaut non unique.

Page 61: BC402 4.6a fr

(C) SAP AG BC402 3-31

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'adressescalculées avec le type de ligne t_airport. La clé unique doit contenir lacomposante 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 lazone wa_counter-carrid.

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

Page 62: BC402 4.6a fr

(C) SAP AG BC402 3-32

2. Complétez le programme Z##_BC402-FLIGHTLIST1 :Déclarez une table interne contenant le calendrier des vols de différentes compagniesaériennes.L'affectation d'un ou de plusieurs types d'appareils disponibles pour chaque compagnieaé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 avecsuccès le contrôle des autorisations.## correspond à votre numéro de groupe à deux chiffres.Solutions de modèle :BC402_TYPS_PLANEBC402_TYPS_PLANETABSAPBC402_TYPS_FLIGHTLIST1

2-1 Dans le Dictionnaire ABAP, créez la structure globale Z##_BC402_PLANE. Lastructure doit être la suivante (gardez à l'esprit que vous devez relier une zonedevise à une zone montant) :

Composante Type utilisant l'élément de donnéesPLANETYPE 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éfinissezla table interne comme table standard avec une clé non unique comprenant lacomposante 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 tableglobal).

Composante Typecarrid 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

Page 63: BC402 4.6a fr

(C) SAP AG BC402 3-33

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

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 lazone wa_flight-carrid.

2-8 Déclarez une table de sélection allowed_carriers pour les zones contenant letype t_flight-carrid.

... TYPE RANGE OF ...

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

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

Page 64: BC402 4.6a fr

(C) SAP AG BC402 3-34

Types et objets de données : solutions

Chapitre : types et objets de donnéesSujet : 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 dedonné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_airportWITH UNIQUE KEY id,

wa_airport TYPE t_airport.

SELECT-OPTIONS so_carr FOR wa_counter-carrid.

Page 65: BC402 4.6a fr

(C) SAP AG BC402 3-35

2 Solution de modèle SAPBC402_TYPS_FLIGHTLIST1

*&-----------------------------------------------------------**& État SAPBC402_TYPS_FLIGHTLIST1 **& **&-----------------------------------------------------------**& solution de l'exercice 2 relatif aux types et objets dedonné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_flightWITH 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.

Page 66: BC402 4.6a fr

(C) SAP AG BC402 3-36

Page 67: BC402 4.6a fr

(C) SAP AG BC402 4-1

SAP AG 1999

� Affectation de valeurs

� Traitement de chaînes et de parties de zones

� Opérations numériques

� Contrôle du déroulement du programme

Contenu

Instructions

Page 68: BC402 4.6a fr

(C) SAP AG BC402 4-2

SAP AG 1999

� D'écrire des expressions arithmétiques etd'effectuer des calculs

� De traiter des chaînes et des parties de zones

� D'affecter des valeurs entre les zones compatibleset non compatibles

� D'écrire des expressions logiques et de contrôlerle déroulement du programme

� D'intercepter les erreurs à l'exécution

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

Instructions : objectifs du chapitre

Page 69: BC402 4.6a fr

(C) SAP AG BC402 4-3

SAP AG 1999

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

Page 70: BC402 4.6a fr

(C) SAP AG BC402 4-4

SAP AG 1999

Initialisation des objets de données

CLEAR <objetdedonnées>.

DATA:char,name(8) TYPE c,length(4) TYPE p DECIMALS 2,

BEGIN OF line,flag LIKE char,name LIKE name,mycarr TYPE spfli-carrid,

END OF line,

itab LIKE TABLE OF line.

CLEAR:char,name,length,line,itab.

témoin nom mycarr

nom

carac.

longueur

ligne

tabitémoin nom mycarr

_

_ _ _ _ _ _ _ _ _

_ _ _ _ _ _ _ _

_ _ _

0 0 0 0 0 0 0

CLEARCLEAR

Utilisez CLEAR pour réinitialiser tout objet de données variable sur la valeur initiale appropriée à sontype.

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

Page 71: BC402 4.6a fr

(C) SAP AG BC402 4-5

SAP AG 1999

Affectation de valeurs

MOVE <source> TO <cible>.MOVE-CORRESPONDING <s_struc> TO <t_struc>.WRITE <source> TO <cible>.

DATA:linenew LIKE line,itabnew LIKE itab,wa_scustom TYPE scustom,time TYPE tims VALUE '083045'.

MOVE 'X' TO line-flag.MOVE name TO line-name.line-mycarr = 'YZ'.

linenew = line.MOVE itab TO itabnew.

MOVE-CORRESPONDING wa_scustom TO line.

WRITE time TO charfield.

MOVEMOVEMOVEMOVE

MOVEMOVE

WRITEWRITE

TOTOTOTO

==

==TOTO

TOTO

TOTOMOVE-CORRESPONDINGMOVE-CORRESPONDING

témoinnom mycarrnouvelle ligne

X SAP_ AG _ _ YZ _

témoin nom mycarrligne

X SAP_ AG _ _ YZ _

témoin mycarrligne

wa_scustom

nomSAP_ AG _ _

temps 0 8 3 0 4 5

zonecarac 08 : 30 : 45

X S c h e e r YZ _

mandt nom form.... 4 0 0 S c h e e r . . .

id123

nom

Utilisez la valeur MOVE pour copier le contenu d'un objet de données dans un autre objet de donnéesvariable.Avec les objets complexes, vous pouvez traiter les composantes individuellement ou utiliser une "copielongue". Si les objets source et cible sont compatibles (voir page suivante), le système copie lescomposantes 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 conversionappropriée.

Si vous effectuez une copie entre deux structures et que vous souhaitez copier uniquement les valeurscomprises 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 auxinstructions MOVE et MOVE-CORRESPONDING, mais également aux calculs et comparaisons devaleurs.

Contrairement à l'instruction MOVE, lorsque vous utilisez WRITE... TO... pour affecter desvaleurs, la zone cible est toujours considérée comme une zone de caractère indépendamment de sontype réel. WRITE...TO se comporte de la même manière que lorsque vous écrivez une sortie sur uneliste. Vous pouvez ainsi utiliser les options d'édition lors de la copie d'objets de données (par exemple,édition de la date nationale).

Page 72: BC402 4.6a fr

(C) SAP AG BC402 4-6

SAP AG 1999

� 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êmenombre de décimales).

� Deux types structurés sont compatibles s'ils comportent exactement lamême structure et si leurs composantes sont compatibles.

� Deux types de table sont compatibles si leurs types de ligne sontcompatibles et si leurs séquences de clé, leurs attributs d'unicité etleurs 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.

Compatibilité et conversion

Si deux types de données sont incompatibles mais qu'il existe une règle de conversion lorsque vousaffectez des valeurs, effectuez des calculs ou comparez des valeurs, le système convertit l'objetsource en type d'objet cible.

Les pages suivantes contiennent les principes de base des règles de conversion, ainsi que des exemplesdes cas les plus fréquents. Pour obtenir une liste complète des règles de conversion, référez-vous à ladocumentation de syntaxe ABAP pour l'instruction MOVE.

Si aucune règle de conversion n'est définie pour une affectation spécifique, le comportement dusystè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 seproduit.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 seproduit, car le système n'est pas en mesure d'indiquer, lors du contrôle de syntaxe, s'ils sontconvertibles ou non.Exemple (voir ci-dessus) :...FIELD-SYMBOLS: <date_sz> TYPE ANY, <heure_sz> TYPE ANY....

Page 73: BC402 4.6a fr

(C) SAP AG BC402 4-7

SAP AG 1999

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

Type Longueur Valeur Type Longueur Valeur

Zone source Zone cible

C

C

C

P

C

C4 A B C D 2 A B

1 A 4 A _ _ _

3 1 2 3 4 5 - 7 _ 1 2 3 4 5 -

7 - 4 7 1 1 0 _ 3 4 7 1 1 0 -P

C

� Les zones de saisie sont renseignées dans la partiegauche si elles contiennent des caractères et dans la partiedroite si elles contiennent des chiffres

� Les zones numériques sont renseignées à partir de ladroite et avec des zéros en-tête si nécessaire

� Le système doit pouvoir interpréter le contenu de la zonesource en fonction du type de données de la zone cible

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 typesde 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 desyntaxe (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 uniquementdes chiffres, des espaces, un signe décimal ou un signe plus ou moins. La zone cible doit êtresuffisamment grande.

� Lorsque vous convertissez un nombre condensé en une zone de type C, les zéros en-tête sontconvertis en espaces.

Pour plus d'informations sur les règles de conversion pour les types élémentaires, référez-vous à ladocumentation de l'Éditeur ABAP pour l'instruction MOVE.

Page 74: BC402 4.6a fr

(C) SAP AG BC402 4-8

SAP AG 1999

Règles de conversion pour les types structurés

DATA: BEGIN OF 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,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.MOVE rec1 TO rec2.

C

MOVE rec1 TO rec2MOVE rec1 TO rec2

rec1rec1

rec1rec1rec2rec2

rec2rec2

text1rec1 text2 pack text3

text1rec2 pack text3 text1rec2 pack text3?AAABB C ? ? ?ZYYYYY 0000000000072.34

DD _ _ _ _ _ _ _ _AAA BBCC 0000000000002.26

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 lesstructures cibles octet par octet. Les règles de conversion appropriées aux zones élémentaires sontensuite appliquées.

Les tables internes peuvent être uniquement converties en d'autres tables internes. Le système convertitles 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 dezones cible contenant des valeurs ne pouvant pas être interprétées correctement. Pour éviter ceproblème, effectuez une copie des valeurs zone par zone. Le système applique ainsi la règle deconversion correcte pour les zones élémentaires.Pour traiter les chaînes, il est préférable d'utiliser les instructions prévues à cet effet.

Page 75: BC402 4.6a fr

(C) SAP AG BC402 4-9

SAP AG 1999

Vue d'ensemble : traitement de chaîne

REPLACE

TRANSLATE

SHIFT

CONDENSE

SEARCH

CONCATENATE

OVERLAY

SPLIT

sysy--subrcsubrc sysy--fdposfdpos u/lu/l

A B A PA B A PA B A P a b a pA B A P B A P

B B A P

A P A P A B A B A P A P+A B PA A A A

A B A P

?

A BA B A P A P

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 lachaî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().

Page 76: BC402 4.6a fr

(C) SAP AG BC402 4-10

SAP AG 1999

Recherche dans une chaîne

SEARCH <zone> FOR <chaînederecherche>.SEARCH <tabi> FOR <chaînederecherche>.

DATA:str(100) TYPE c

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:

A b a p o b e c tj

0 1 2 3 4 5 6 7 8 9 10 11

SEARCHSEARCHSEARCHSEARCHSEARCHSEARCHSEARCHSEARCHSEARCHSEARCH

FORFORFORFORFORFORFORFORFORFOR

Le système recherche la chaîne <chaînederecherche> dans la zone <zone>. La chaîne de recherchepeut 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 estintrouvable, 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 derecherche <chaînederecherche> dans la table interne <tabi>. Dans cette variante, lesystème définit également la zone système sy-tabix en fonction de l'index de la ligne contenant lachaîne de recherche.

Page 77: BC402 4.6a fr

(C) SAP AG BC402 4-11

SAP AG 1999

Modification des chaînes

B b B p +

B b A p +

A B A P +

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

TRANSLATE <zone> USING <ch>.

TRANSLATE <zone> TO {UPPER|LOWER} CASE.

A b A p +

A b A p +

A b A p +CONDENSE <zone> [NO-GAPS].

A b A p +

A b A p +

b A p +SHIFT <zone> [<var>] [RIGHT|CIRCULAR].

A b A p +

� 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 derecherche et de remplacement dans les paires. Par exemple : TRANSLATE ... USING 'AB'.

� TRANSLATE <zone> TO UPPER|LOWER CASERemplace 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èresUP TO <ch> Décale <zone> jusqu'au début de <ch>Les ajouts entraînent les conséquences suivantes :RIGHT Décale vers la droiteCIRCULAR 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 utilisantSHIFT <zone> LEFT DELETING LEADING SPACE ouSHIFT <zone> RIGHT DELETING TRAILING SPACE.

Page 78: BC402 4.6a fr

(C) SAP AG BC402 4-12

SAP AG 1999

Fractionnement et regroupement de chaînes

A P

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

A B +

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

X B A X

A B A P

A P

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

A B A P

A B A P

P

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

CONCATENATE 'AB' 'AP' INTO f.

A

OVERLAY f WITH 'XBAX'.

SPLITSPLIT ATAT INTOINTO

CONCATENATECONCATENATE INTOINTO

OVERLAYOVERLAY WITHWITH

� 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 dansles 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 leszones de composantes. Vous pouvez utiliser l'option SEPARATED BY <séparateur> pourinsé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>.

RemarqueRéférez-vous également au chapitre "Accès aux parties de zones".

Page 79: BC402 4.6a fr

(C) SAP AG BC402 4-13

SAP AG 1999

Accès aux parties de zones

Possible avec touttype de zone de saisie

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

REPORT ...

PARAMETERS:pa_str(40) LOWER CASE,pa_pos TYPE i,pa_len TYPE i.

WRITE pa_str+pa_pos(pa_len).

19991231ttA235959

000000

+pa_pos(pa_len)+pa_pos(pa_len)

Pour chaque instruction utilisant une zone de saisie, vous pouvez traiter une partie de la zone ou de lastructure en spécifiant un emplacement de départ et un nombre de caractères. Si les longueurs dezones 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 égalementpossible 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>.

AttentionSous Unicode *), seules les zones contenant le type C, X et STRING sont appropriées pour un accèspartiel. Dans d'autres cas, utilisez des field symbols avec la conversion.

_________________________________________

*) Jeu de caractères indépendant de la langue et de la culture.

Page 80: BC402 4.6a fr

(C) SAP AG BC402 4-14

SAP AG 1999

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

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, parconsé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éparepas). 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 entreparenthèses suivies de fonctions, de puissances, d'une multiplication, d'une division et enfin d'uneaddition et d'une soustraction.

Un calcul peut contenir tous les types de données pouvant être convertis entre eux et en type de zone deré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 unearithmétique pour chacun des trois types de données. Le système effectue ensuite le calcul, puis leconvertit 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.

Page 81: BC402 4.6a fr

(C) SAP AG BC402 4-15

SAP AG 1999

Calculs : nombres entiers et condensés

Utilisez le type de données

dec ou P

ABAP : attributs de programme pour CALCULATOR

Titre Démo : calculs

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

Attributs

Sauvegarder

Dans l'arithmétique d'un nombre entier et condensé, le système arrondit toujours à la décimalecorrespondante. Par exemple :DATA int TYPE i. int = 4 / 10. " résultat : 0

int = 5 / 10. " résultat : 1ouDATA: 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 31décimales. L'arithmétique utilisée dépend du mode d'interprétation des valeurs littérales numériquespar 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'optionDECIMALS dans l'instruction DATA affecte uniquement la sortie et pas l'arithmétique. Dans cecas, tous les nombres sont interprétés en interne comme des nombres entiers, indépendamment dusigne décimal. Vous devez ensuite calculer manuellement le nombre de décimales, puis vousassurer 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.00En 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 cettevaleur, puis utilisez des nombres condensés pour les calculs de gestion.

Page 82: BC402 4.6a fr

(C) SAP AG BC402 4-16

SAP AG 1999

Λ

Λ

Λ

Λ

Λ

Λ

Λ

1499023437.0

1494140625.0

1484375.0

140625.0

125.0

20481

10241

1281

641

81

212121212115.0

21

21215.1

1110763

10

1

=

+=

+=

+=

+=

+++++=

+⋅+⋅+⋅+⋅+⋅=

+=

⋅+⋅=

−−−−−

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

| |

| | | | |0 0 0 0 . . .. . .

Uniquement 53 bitsUniquement 53 bitsdisponiblesdisponibles

≈≈≈≈Uniquement pour

les approximations

Les calculs effectués à l'aide du type de données F sont toujours, pour des raisons techniques, imprécis.ExempleVous 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 lemessage suivant :DATA: float TYPE f, pack TYPE p DECIMALS 2.float = 73050 * '0.0727'. " résultat : 5.3107349999999997E+03pack = float. WRITE pack. " résultat : 5310.73Vous devez, par conséquent, utiliser uniquement des nombres en virgule flottante pour desapproximations. Lorsque vous comparez des nombres, utilisez toujours des intervalles, puisarrondissez 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 lestockage 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'instructionCOMPUTE.

Page 83: BC402 4.6a fr

(C) SAP AG BC402 4-17

SAP AG 1999

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

--

--

� 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ètecomme 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 valeurnumé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 similairequi consiste à compter le nombre de secondes écoulées depuis 0:00:00.

Page 84: BC402 4.6a fr

(C) SAP AG BC402 4-18

SAP AG 1999

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

Les comparaisons entre les objets de données non numériques sont interprétées en fonction de leurtype 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 logiquess'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êmelorsque 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 lastructure de vos expressions.

Page 85: BC402 4.6a fr

(C) SAP AG BC402 4-19

SAP AG 1999

Comparaison des chaînes

CA

CS

CP

CO

u/lu/l espaceespace

* 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

sysy--fdposfdpos

À 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 longueurde <ch1>.

Dans les quatre premières expressions, le système prend en compte les lettres en minuscules et enmajuscules 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. Lesymbole d'échappement est représenté par "#".

Page 86: BC402 4.6a fr

(C) SAP AG BC402 4-20

SAP AG 1999

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

� 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 casd'é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 estremplie, les instructions correspondantes sont exécutées. Si aucune condition n'est remplie, le blocELSE programmé est exécuté.

Dans les deux cas, le système exécute uniquement un bloc d'instructions, à savoir celui appartenant aupremier cas correct.

Si chaque condition teste l'égalité de ce même objet de données avec un autre objet, utilisez unestructure CASE-ENDCASE. Cette procédure est plus simple et requiert une exécution moinsimportante.

En dehors d'une boucle, vous pouvez exécuter toutes les instructions restantes dans le bloc detraitement courant en utilisant CHECK. En cas d'échec du contrôle, le traitement reprend par lapremière instruction dans le bloc de traitement suivant.

Page 87: BC402 4.6a fr

(C) SAP AG BC402 4-21

SAP AG 1999

Boucles

DO [<n> TIMES] [...].* ... instructions ...ENDDO.

WHILE <expr_logique>.* ... instructions ...ENDWHILE.

LOOP AT ...* ... instructions ...ENDLOOP.

SELECT ...* ... instructions ...ENDSELECT.

DO.* ... instructions ...CHECK <condition_interr>.EXIT.

ENDDO.

Compteur de boucles :sy-index

Compteur de boucles :sy-index

Il existe quatre structures de boucle. Le nombre de passages de boucle courants est toujours disponibledans la zone système sy-index. Si vous utilisez des boucles imbriquées, la valeur de sy-indexse 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 auchapitre Blocs de traitement. Le graphique illustre le mode de contrôle du traitement supplémentaired'une boucle.

� Boucles inconditionnelles/indexéesLes instructions entre DO et ENDDO sont exécutées jusqu'à ce que vous terminiez la boucle avec uneinstruction d'interruption. Vous pouvez spécifier un nombre maximal de passages de boucle. Dans lacas contraire, vous êtes en présence d'une boucle infinie.

� Boucles conditionnellesLes instructions entre WHILE et ENDWHILE sont répétées tant que la condition <expressionlogique> est remplie.

� Accès de lignes multiples à une table internePour 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éesRéférez-vous aux cours BC400 (Introduction à ABAP Workbench)et BC405 (Reporting dans ABAP Workbench) et à la documentation de syntaxe pour l'instructionSELECT.

Page 88: BC402 4.6a fr

(C) SAP AG BC402 4-22

SAP AG 1999

Vue d'ensemble : blocs de traitement

Boucles :DO WHILESELECT LOOP

Événements ILOAD-OF-PROGRAM.START-OF-SELECTION.GET <nœud> [LATE].END-OF-SELECTION.

Événements IIAT SELECTION-SCREEN [OUTPUT].INITIALIZATION.TOP-OF-PAGE.END-OF-PAGE.AT LINE-SELECTION.AT USER-COMMAND.

Unités de modularisation

Afficherle message

puis

le programmese termineet tous les

modesinternes sont

supprimés

Fin du programme

Fin du blocde traitement courant

et démarragedu suivant

Passage debouclesuivant

Bouclede sortie

Afficher lebuffer deliste et

continueravec les

événementsII

MESSAGE a..EXITCHECK

LEAVEPROGRAM

LEAVE TOTRANSACTION

RappelUn 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 pourterminer le bloc de traitement si la condition logique n'est pas remplie. Le traitement continue avecla première instruction dans le bloc de traitement suivant. Dans une boucle, le traitement reprend audébut du passage de boucle suivant.

� L'instruction EXIT peut se comporter de trois manières différentes : dans une boucle, elle terminele traitement de boucle entièrement. En dehors d'une boucle mais dans l'un des événementsrépertoriés sous Événements I, elle entraîne l'affichage du contenu courant du buffer de liste par lesystème. Les événements provenant d'autres groupes et répertoriés ci-dessus peuvent encore êtredé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 leprogramme courant.

� Lorsque vous envoyez un message d'interruption (type A), le programme courant se termine et lapile dynamique de programme est supprimée. Pour plus d'informations, référez-vous au chapitreAppel de programmes et passation de paramètres.

Page 89: BC402 4.6a fr

(C) SAP AG BC402 4-23

SAP AG 1999

Interception des erreurs à l'exécution

Classes ERROR

Erreur à l'ex.simple

Toutes les erreursà l'ex. pouvant

être interceptées

arithmetic_errorsconversion_errors...

bcd_zerodivideconvt_no_number...

autres

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

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èmespécifié, le système conserve les instructions dans le bloc, puis continue le traitement aprèsl'instruction ENDCATCH. Cette construction intercepte uniquement les erreurs à l'exécution auniveau 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. Siplusieurs valeurs lui sont affectées, le système utilise la première. Ceci s'avère particulièrementimportant si vous spécifiez deux classes ERROR différentes contenant la même erreur à l'exécution.

Page 90: BC402 4.6a fr

(C) SAP AG BC402 4-24

SAP AG 1999

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

Les constructions CATCH SYSTEM-EXCEPTIONS ... ENDCATCH peuvent être imbriquées à toutniveau. En cas d'erreur à l'exécution, le système recherche une affectation dans le bloc de traitementcourant. En cas d'échec, il effectue une recherche dans le premier bloc le plus élevé, etc. Letraitement 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 ? Auniveau de quelle instruction le traitement reprend-t-il ?

Page 91: BC402 4.6a fr

(C) SAP AG BC402 4-25

SAP AG 1999

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

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.

Page 92: BC402 4.6a fr

(C) SAP AG BC402 4-26

SAP AG 1999

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

Le système reprend le traitement au niveau de la première instruction après l'instruction intermédiaireENDCATCH. 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 quis'ensuit convt_no_number avait été interceptée dans notre programme.

Page 93: BC402 4.6a fr

(C) SAP AG BC402 4-27

SAP AG 1999

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

L'erreur à l'exécution convt_overflow est déclenchée en affectant un nombre à la zone condenséequi est trop volumineuse pour lui. Un code retour est affecté à cette erreur dans le bloc extérieur.

sy-subrc est défini sur 2.

Page 94: BC402 4.6a fr

(C) SAP AG BC402 4-28

SAP AG 1999

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

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

Page 95: BC402 4.6a fr

(C) SAP AG BC402 4-29

SAP AG 1999

� D'écrire des expressions arithmétiques etd'effectuer des calculs

� De traiter des chaînes et des parties de zones

� D'affecter des valeurs entre les zones compatibleset non compatibles

� D'écrire des expressions logiques et de contrôlerle déroulement du programme

� D'intercepter les erreurs à l'exécution

Vous êtes maintenant capable :

Instructions : résumé du chapitre

Page 96: BC402 4.6a fr

(C) SAP AG BC402 5-1

SAP AG 1999

� Informations générales

� Accès index

� Accès clé

� Accès field symbols

� Exemple

Contenu

Opérations sur les tables internes

Page 97: BC402 4.6a fr

(C) SAP AG BC402 5-2

SAP AG 1999

� D'insérer des enregistrements de données

� De les lire

� De les modifier

� De les supprimer

� D'identifier la syntaxe des tables internes avecdes en-têtes

� D'évaluer les avantages et inconvénients del'utilisation des différents types de tables internesdans vos applications

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

Tables internes : objectifs du chapitre

Page 98: BC402 4.6a fr

(C) SAP AG BC402 5-3

SAP AG 1999

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

Page 99: BC402 4.6a fr

(C) SAP AG BC402 5-4

SAP AG 1999

Accès aux enregistrements de données

mandtwa_scarr carrid carrname currcode

it_scarr mandtUSD4 0 0

carrid carrnameAmerican Airlines

currcodeAA

CAD4 0 0 Air CanadaAC

FF4 0 0 Air FranceAF

ITL4 0 0 AlitaliaAZ

GBP4 0 0 British AirwaysBA

USD4 0 0 Pacific AirlinesBL

USD4 0 0 Continental AirlinesCO

USD4 0 0 Delta AirlinesDL

DEM4 0 0 Berliner Spez. FlugFC

DEM4 0 0 LufthansaLH

INTO FROM

mandt carrid currname currcode

ASSIGNING<fs_scarr>

LOOP AT ......ENDLOOP.

4 0 0 British AirwaysBA GBP

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 travaildoit ê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 tableinterne, utilisez un espace de travail supplémentaire dont le type de ligne est compatible avec celuide la table imbriquée.Lorsque vous modifiez la table interne, le contenu de l'espace de travail est écrit à nouveau dans latable ou ajouté en tant que nouvel enregistrement.

� Vous pouvez affecter les enregistrements de données individuels à un field symbol approprié. Unefois l'entrée lue par le système, vous pouvez traiter ses composantes directement à l'aide de sonadresse. Aucune copie n'est effectuée vers et à partir de l'espace de travail. Cette méthode estparticulièrement appropriée pour l'accès aux tables volumineuses ou complexes.

Pour lire plusieurs enregistrements, utilisez une structure LOOP... ENDLOOP. Vous pouvez ensuitemodifier ou supprimer la ligne déjà lue et le système applique la modification dans la table. Vouspouvez également modifier ou supprimer des lignes à l'aide d'une condition logique.

Page 100: BC402 4.6a fr

(C) SAP AG BC402 5-5

SAP AG 1999

Ajout, insertion et lecture avec les tables d'index

APPEND LINES OF <tabi1> [FROM <n1>][TO <n2>]TO <tabi2>.

Tables standard Tables triéesAjout

Ligne indiv.

Ligne d'origine

Lignes d'unetable

(des index)

APPEND <wa> TO <tabi>.

APPEND INITIAL LINE TO <tabi>.

InsertionLigne indiv.

Plusieurs lignes

Lignes d'unetable

(des index)

Ligne d'origine

INSERT LINES OF <tabi1>[FROM <n1>] [TO <n2>]INTO <tabi2>.

INSERT <wa> INTO <tabi> INDEX <n>.

INSERT <wa> INTO <tabi>.

INSERT INITIAL LINE INTO <tabi> INDEX <n>.

Lecture

Ligne indiv. READ TABLE <tabi> INDEX <n> INTO <wa>[COMPARING ...][TRANSPORTING ...].

Uniquementpossible sila séquence

de trin'a subi aucune

violation Uniquement

possibledans une boucle

sy- tabixcontient l'index

de la lecturede ligne

Lorsque vous utilisez les instructions ci-dessus avec des tables triées, assurez-vous que la séquence detri est gérée.

Dans une boucle, l'instruction INSERT ajoute dans la table l'enregistrement de données avantl'enregistrement courant. Pour insérer une série de lignes d'une table interne dans une autre tabled'index, utilisez plutôt la variante INSERT LINES OF <tabi>.

Lorsque vous utilisez des enregistrements de données individuels, vous pouvez utiliser deux optionssupplémentaires :

� Dans l'option COMPARING, le système compare l'égalité entre le contenu de zone d'unenregistrement de données et le contenu de l'espace de travail.

� Dans l'option TRANSPORTING, vous pouvez limiter le transport des données aux zonessé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 pasd'option, le système effectue un tri par ordre croissant. Si vous utilisez l'option AS TEXT, les zonesde caractères sont triées par séquence spécifique à la culture. L'ordre relatif des enregistrements dedonnées avec des clés de tri identiques demeure constant uniquement si vous utilisez l'optionSTABLE.

� APPEND <wa> INTO <classement> SORTED BY <f>.Cette instruction ajoute l'espace de travail au classement <classement> par ordre décroissant. Lalongueur du classement ne peut pas dépasser l'instruction INITIAL SIZE spécifiée et l'espacede travail doit respecter la séquence de tri de la table.

Page 101: BC402 4.6a fr

(C) SAP AG BC402 5-6

SAP AG 1999

Modification, suppression et exécution de bouclesdans les tables d'index

Tables standard Tables triéesModification

Ligne indiv.

Plusieurs lignes

MODIFY <tabi> FROM <wa> INDEX <n>[TRANSPORTING ...].

MODIFY <tabi> FROM <wa>.

Suppression

Individuelle

Plusieurs

DELETE <tabi> INDEX <n>.

Boucles

LOOP AT <tabi> INTO <wa>[FROM <n1>][TO <n2>].

...ENDLOOP.

DELETE <tabi> [FROM <n1>][TO <n2>][WHERE <expr_logique>].

Uniquementpossible

dans une boucle

Uniquementpossible dans

une bouclesauf si vous

utilisez une option

sy- tabixcontient

l'index deligne courant

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 del'option TRANSPORTING. Dans une boucle, l'option MODIFY modifie l'enregistrement de donnéescourant.

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 touteexpression logique après WHERE. La première zone dans chaque comparaison doit être une composantede la structure de lignes (référez-vous au chapitre "Ouverture des instructions SQL"). Vous pouveztransmettre 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 à leurtour à chaque enregistrement de données. L'option INTO copie les entrées une par une dans l'espacede travail.Le système insère l'index du passage de boucle courant dans la zone système sy-tabix. Une fois laboucle terminée, sy-tabix comporte une valeur identique à celle précédant le démarrage de laboucle.L'insertion et la suppression de lignes dans une boucle affectent les passages de boucle suivants.

Page 102: BC402 4.6a fr

(C) SAP AG BC402 5-7

SAP AG 1999

Tables d'adresses calculées

SORT <tabi> [ASCENDING|DESCENDING][BY <f1> [ASCENDING|DESCENDING]

..<fn> [ASCENDING|DESCENDING]]

[AS TEXT][STABLE].

it_scarr mandt

USD4 0 0

carrid carrname

American Airlines

currcode

AA

CAD4 0 0 Air CanadaAC

FF4 0 0 Air FranceAF

ITL4 0 0 AlitaliaAZ

GBP4 0 0 British AirwaysBA

USD4 0 0 Pacific AirlinesBL

USD4 0 0 Continental AirlinesCO

USD4 0 0 Delta AirlinesDL

DEM4 0 0 Berliner Spez. FlugFC

DEM4 0 0 LufthansaLH

Table d'adressescalculées <adr_400_CO>

wa_scarr mandt carrid

4 0 0 BA

Fonction de hachage<adr_400_LH>

<adr_400_AF>

<adr_400_BL>

<adr_400_BA>

<adr_400_DL>

<adr_400_AA>

<adr_400_FC>

<adr_400_AZ>

<adr_400_AC>

Tri

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écifiqueappelée table de hachage. Il s'agit d'une fonction de hachage qui détermine l'adresse du pointeur versun enregistrement de données avec une clé spécifique. En fait, plusieurs enregistrements de donnéespeuvent être stockés dans une seule adresse. Cette opération est mise en œuvre en interne comme uneliste enchaînée. Par conséquent, bien que le système doive encore effectuer une recherche séquentielledans ces domaines, il doit lire uniquement quelques enregistrements de données (généralement, pas plusde trois). Le graphique illustre le cas le plus simple représenté par un seul enregistrement de donnéesstocké à chaque adresse.

L'utilisation d'une technique de hachage signifie que le temps d'accès ne dépend plus du nombre totald'entrées dans la table. Au contraire, ce temps d'accès est toujours très rapide. Par conséquent, lestables d'adresses calculées sont particulièrement utiles pour des tables volumineuses pour lesquellesvous 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 lestables 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 à unetable.

Page 103: BC402 4.6a fr

(C) SAP AG BC402 5-8

SAP AG 1999

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

Insertion

Ligne indiv.

Lignesd'une table(des index)

Ligne d'origine

INSERT LINES OF <tabi1>[FROM <n1>] [TO <n2>]INTO TABLE <tabi2>.

INSERT <wa> INTO TABLE <tabi>.

INSERT INITIAL LINE INTO TABLE <tabi>.

Lecture

Zones[clés]

READ TABLE <tabi> WITH [TABLE] KEY<k1> = <val1> .. <kn> = <valn>INTO <wa>[COMPARING ...][TRANSPORTING ...].

READ TABLE <tabi> WITH [TABLE] KEYtable_line = <val>INTO <wa>.

Clé READ TABLE <tabi> FROM <wa1> INTO <wa2>.

Non structuré

Pour les tablesd'adresses calculées

et standardcomme pour l'ajout

Identiqueaux tablesdes index

sy- tabixcontient l'index

de la lecturede ligne

Vous pouvez utiliser les instructions répertoriées dans cet exemple avec les tables contenant les troistypes. 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 dutype 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é uniqueest possible uniquement avec des tables d'adresses calculées et triées. Si vous utilisez la syntaxeaffichée ici, le codage de votre programme est indépendant du type de table (spécification de typegé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ésencede 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 êtreidentiques. 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 dela séquence des zones spécifiées à l'aide d'une recherche binaire si possible. Vous pouvez forcer lesystè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èreentrée répondant au critère de sélection.

Page 104: BC402 4.6a fr

(C) SAP AG BC402 5-9

SAP AG 1999

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

Modification

Ligneindividuelle

Plusieurslignes

MODIFY TABLE <tabi> FROM <wa>[TRANSPORTING ...].

MODIFY <tabi> FROM <wa>TRANSPORTING <f1> .. <fn>WHERE <expr_logique>.

Suppression

Individuelle

Plusieurs

DELETE TABLE <tabi> FROM <wa>.

Boucle

LOOP AT <tabi> INTO <wa> [WHERE <expr_logique>[TRANSPORTING NO FIELDS]].

...ENDLOOP.

sy- tabixcontient

l'index de lignecourant

DELETE <tabi> WHERE <expr_logique>.

Zones-clés DELETE TABLE <tabi> WITH TABLE KEY<k1> = <val1> .. <kn> = <valn>.

Comme pour la lecture des entrées, lorsque vous modifiez et supprimez des entrées à l'aide de la clé etd'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 latransmission des zones vers l'espace de travail lors du traitement de boucle. (Cette procédure peutservir à 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>|ALL FIEL <fn>}|ALL FIELDS}].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 lazone-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 ADJACENTDUPLICATES.

� Recherche la chaîne dans toutes les lignes de la table <tabi>. Si la recherche est fructueuse, lesystè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 lamémoire occupée par celle-ci.

Page 105: BC402 4.6a fr

(C) SAP AG BC402 5-10

SAP AG 1999

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_custWITH NON-UNIQUE KEY id.

DATA:wa_cust TYPE t_cust,wait_list TYPE t_cust_list,

position TYPE sy-tabix.

STANDARDSTANDARD

Pour accéder à vos données à l'aide d'un index et pour que votre table ne soit pas forcément gérée parséquence de tri ou pour obtenir une clé unique, c'est-à-dire, que vous privilégiez la séquence desentrées par rapport au tri par clé ou à l'obtention d'entrées uniques, utilisez les tables standard. (Sivous décidez de la nécessité de trier la table ou d'y accéder à l'aide de la clé ou d'une recherchebinaire, 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 estensuite 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.

Page 106: BC402 4.6a fr

(C) SAP AG BC402 5-11

SAP AG 1999

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.

Cet exemple omet les dialogues utilisateur et le transport des données en supposant que les principesimpliqués aient été assimilés. SAP souhaite uniquement mettre l'accent sur l'accès aux tables :

� Ajout de nouvelles entréesL'enregistrement de données pour un client en attente est ajouté à la table uniquement s'il n'existe pasencore. 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èresLa zone-clé est le critère. Cependant, d'autres critères sont possibles (par exemple, la suppressiond'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 listeUne fois que le client a atteint le haut de la liste, vous pouvez supprimer son entrée. Si la listed'attente est vide, une telle action n'a aucune incidence. Par conséquent, il n'est pas nécessaire decontrô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 lesvaleurs sy-subrc et sy-tabix doivent être prises en compte. Si l'entrée ne se trouve pas dans latable, 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>.

Page 107: BC402 4.6a fr

(C) SAP AG BC402 5-12

SAP AG 1999

Exemple : table triée

DATA:wa_flight TYPE sflight,

flight_list TYPE SORTED TABLE OF sflightWITH UNIQUE KEY carrid connid fldate.

SELECT * FROM sflightINTO 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-carridAND connid = wa_flight-connid.

*** modification de la table de base de données à partir de latable interne ...

SORTEDSORTED

Généralement, vous choisissez d'utiliser une table triée, afin de définir une clé unique. Le fait que latable soit gérée dans une séquence de tri n'est pas importante, car vous pouvez trier toute sorte de tableinterne. Cependant, avec des tables triées (contrairement aux tables d'adresses calculées), les nouveauxenregistrements de données sont insérés dans le bon ordre. Si une table comporte peu d'entrées mais denombreux accès modifiant le contenu, une table triée peut s'avérer plus efficace qu'une table d'adressescalculé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 copielocale de la table dans le programme, apportez les modifications à la copie, puis écrivez à nouveautoutes ses données dans la table de base de données. Lorsque vous traitez des volumes importants dedonnées, cette méthode permet de réduire la durée d'exécution et la charge sur le serveur de base dedonnées.

Puisque, dans ce cas, la table interne représente une table de base de données, assurez-vous, à l'aide dela 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 currencysont 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.

Page 108: BC402 4.6a fr

(C) SAP AG BC402 5-13

SAP AG 1999

Exemple : déclaration des tables d'adressescalculé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 TABLE OF t_cityWITH UNIQUE KEY city country.

DATA:wa_city TYPE t_city,city_list TYPE t_city_list.

PARAMETERS:pa_city TYPE sgeocity-city,pa_ctry TYPE sgeocity-country.

HASHEDHASHED

citycity countrycountry

L'algorithme de hachage calcule l'adresse d'une entrée en fonction de la clé. Ainsi, à l'aide de tablesvolumineuses, le temps d'accès est réduit considérablement par rapport à une recherche binaire. Dansune boucle, cependant, la table d'adresses calculées doit effectuer une recherche dans toute la table (fulltable scan). Les entrées de la table étant stockées sans tri préalable, il est préférable d'utiliser une tabletrié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 informationsdé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 tabled'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 fonctionde 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.

Page 109: BC402 4.6a fr

(C) SAP AG BC402 5-14

SAP AG 1999

SELECT city country latitude longitudeFROM sgeocityINTO CORRESPONDING FIELDS OF TABLE city_list.

READ TABLE city_list WITH TABLE KEY city = pa_citycountry = pa_ctry

INTO wa_city.CHECK sy-subrc = 0.WRITE: / wa_city-city,

wa_city-country,wa_city-latitude,wa_city-longitude.

Exemple : opérations sur les tables d'adressescalculées

TABLETABLE citycity

countrycountry

Le "buffer de table" city_list est tout d'abord renseigné avec des valeurs issues de la table de basede 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 uniquementsi 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ètelorsque vous y accédez à partir de votre programme.

Page 110: BC402 4.6a fr

(C) SAP AG BC402 5-15

SAP AG 1999

Table interne avec en-tête

Table interne

Espace de travail

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

READ TABLE <tabi> INDEX <n>INTO <wa>.

LOOP AT <tabi> INTO <wa>.WRITE <wa>-<f>.

ENDLOOP.

APPEND <tabi>.INSERT <tabi> INDEX <n>.MODIFY <tabi> INDEX <n>.DELETE TABLE <tabi>.

READ TABLE <tabi> INDEX <n>.

LOOP AT <tabi>.WRITE <tabi>-<f>.

ENDLOOP.

Syntaxe impliciteSyntaxe explicite

it_scarr mandt carrid carrname currcode

FF4 0 0 Air FranceAF

USD4 0 0 Continental AirlinesCO

DEM4 0 0 LufthansaLH

wa_scarr mandt carrid carrname currcode

USD4 0 0 Continental AirlinesCO

Table interne

En-tête

it_scarr mandt carrid carrname currcode

FF4 0 0 Air FranceAF

USD4 0 0 Continental AirlinesCO

DEM4 0 0 LufthansaLH

it_scarr mandt carrid carrname currcode

USD4 0 0 Continental AirlinesCO

<wa><wa> TOTOINTOINTO<wa><wa>

INTOINTO

FROMFROMFROMFROM

INTOINTO

<wa><wa>

<wa><wa>

<wa><wa><wa><wa>

Vous pouvez définir des tables internes avec (option WITH HEADER LINE) ou sans en-têtes. Unetable interne avec un en-tête comporte un espace de travail (en-tête) et la table réelle. Traitez les deuxobjets avec le même nom. Le mode d'interprétation du nom par le système dépend du contexte. Parexemple, 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 lorsquevous utilisez des tables imbriquées. Cependant, les tables internes comportant un en-tête ont unesyntaxe 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 lasyntaxe suivante : <tabi>[]. Cette syntaxe est toujours valide, que la table interne comporte un en-tête ou non.ExempleDATA 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ésitab1[] = itab2[]. " Copie le corps de la table

Page 111: BC402 4.6a fr

(C) SAP AG BC402 5-16

SAP AG 1999

Table interne avec valeurs cumulées

COLLECT [<wa> INTO] <itab>. TYPES:BEGIN OF t_carr_info,carrid TYPE sflight-carrid,price TYPE sflight-price,

END OF t_carr_info.

DATA:it_carr_list TYPE HASHEDTABLE OF t_carr_infoWITH UNIQUE KEY carrid,

wa TYPE t_carr_info.

SELECT carrid priceFROM sflightINTO wa.

COLLECT wa INTO it_carr_list.ENDSELECT.

carridwa prix

it_carr_list carrid prix

DL 933338

LH 1766669

SQ 492837

+

LH 100000

AA 2090938

it_carr_listit_carr_listt_carr_infot_carr_info

t_carr_infot_carr_info

it_carr_listit_carr_listINTOINTOCOLLECTCOLLECT wawa

Type p

Vous pouvez utiliser uniquement l'instruction COLLECT avec les tables internes dont les zones nonclé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êmetype ou, s'il n'en existe pas, ajoute une nouvelle entrée à la table. Elle recherche l'entrée en fonction dutype de table et de la clé définie. Si une entrée est trouvée, elle ajoute toutes les zones numériques nefaisant 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.

Page 112: BC402 4.6a fr

(C) SAP AG BC402 5-17

SAP AG 1999

Accès field symbols

Loops

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

Lecture

LOOP AT <tabi> ASSIGNING <<ligne_sz>> [WHERE ...]....ENDLOOP.

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

Boucles

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éderdirectement. Par conséquent, le système ne doit pas copier l'entrée de la table interne vers l'espace detravail et inversement.

Le field symbol <<field_symbol>> doit comporter le même type que le type de ligne de la tableinterne.

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 tablesimbriquées dans une boucle. La durée de copie des valeurs à partir de et vers l'espace de travail dansce type d'opération est particulièrement longue.

Page 113: BC402 4.6a fr

(C) SAP AG BC402 5-18

SAP AG 1999

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.

PARAMETERSpa_start TYPE spfli-cityfrom DEFAULT 'FRANKFURT'.

Dans cet exemple, l'utilisateur doit être en mesure de saisir une ville de départ pour laquelle tous lesvols possibles sont ensuite répertoriés.

Pour ce faire, une table interne (cofl_list) et une table externe ( travel_list) sont déclaréesavec des espaces de travail correspondants.

Une table interne supplémentaire (conn_list) bufferise, puis trie toutes les correspondances.

RemarquePour permettre l'accès à la boucle à l'aide des field symbols, les types du buffer de table et de la tableinterne doivent être identiques. Par ailleurs, une autre étape consiste à trier la table ultérieurement selondifférents critères. Par conséquent, les tables standard sont utilisées, et non pas celles qui sont triées.

Page 114: BC402 4.6a fr

(C) SAP AG BC402 5-19

SAP AG 1999

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

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

SELECT carrid connid cityfrom citytoFROM spfliINTO 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.

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 aufield symbol <conn_sz>.

Seule la ville d'arrivée de chaque correspondance nous intéresse. Il s'agit de la première entrée dansune ligne de la table externe travel_list.

Pour obtenir une table triée correctement, la table interne wa_travel-cofl_list doit êtrerenseignée avec les villes accessibles depuis cette table. Pour ce faire, le programme recherche lescorrespondances 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 groupedans l'affichage. La table est ensuite triée en fonction des zones cityto et carrid.

Page 115: BC402 4.6a fr

(C) SAP AG BC402 5-20

SAP AG 1999

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

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

Le traitement du niveau de groupe étant utilisé dans cet exemple, seules les villes d'arrivée sontrépertoriées dans la liste.

RemarqueCe problème peut être résolu à l'aide des instructions imbriquées SELECT. Cependant, cette solution nesemble pas réaliste en raison de la charge excessive placée sur le serveur de base de données.

Page 116: BC402 4.6a fr

(C) SAP AG BC402 5-21

SAP AG 1999

Opérations sur les tables internes : résumé

Table standard Table triée Table d'adressescalculées

INSERT

READ TABLE

MODIFY

DELETE

COLLECT

nn

Accès clé

Accès index

APPEND

LOOP AT

INSERT

READ TABLE

MODIFY

DELETE

SORT

LOOP AT

La séquencede tri

peut subirune violation

Pas d'accès indexaux tablesd'adressescalculées

Identique à APPEND Identique à APPEND

L'accès index (APPEND, INSERT ... INDEX, LOOP ... FROM TO, etc.) est possible pour lestables standard et triées. De cette façon, une erreur à l'exécution peut avoir lieu en tronquant lasé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'aaucune conséquence positive sur une table triée et peut entraîner une syntaxe d'erreur ou de duréed'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 enfonction du type de table. La durée d'exécution dépend de l'appartenance ou non des valeurs à la clé (laséquence dans laquelle elles sont transmises est, par conséquent, également importante). L'instructionINSERT pour une table standard ou une table d'adresses calculées à l'aide de la clé a les mêmesconséquences que l'instruction APPEND.

Le système prend en charge le traitement du niveau de groupe pour tous les types de tables. Lestables standard et d'adresses calculées doivent être triées au préalable.

AperçuPour 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 coursBC405 (Reporting dans ABAP Workbench).

Page 117: BC402 4.6a fr

(C) SAP AG BC402 5-22

SAP AG 1999

� D'insérer des enregistrements de données

� De les lire

� De les modifier

� De les supprimer

� D'identifier la syntaxe des tables internes avecdes en-têtes

� D'évaluer les avantages et inconvénients del'utilisation des différents types de tables internesdans vos applications

Vous êtes maintenant capable :

Tables internes : résumé du chapitre

Page 118: BC402 4.6a fr

(C) SAP AG BC402 5-23

Opérations sur les tables internes : exercices

Chapitre : opérations sur les tables internesSujet : 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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies 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 descompagnies aériennes aux aéroports et aux numéros de comptoirs. Affichez ensuite ladeuxiè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éroportset leurs noms provenant de la table transparente SAIRPORT.

1-3 Utilisez une boucle pour sélectionner des données dans la table transparenteSCOUNTER pour toutes les compagnies aériennes dans la sélection de l'utilisateur.Vous pouvez renseigner directement les zones carrid, countnum et airportdans l'espace de travail wa_counter. Pour renseigner la zone airp_name,utilisez un accès en enregistrement individuel à la table interneit_airport_buffer. Une fois l'espace de travail renseigné, ajoutez-le à latable interne it_carr_counter.

1-4 Affichez la table interne it_carr_counter triée par les zones airport etcarrid par ordre croissant.

Page 119: BC402 4.6a fr

(C) SAP AG BC402 5-24

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 desélection.Insérez ensuite, dans une table interne appropriée, les compagnies aériennes sélectionnéespar 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 lowde l'espace de travail wa_allowed_carr.Effectuez à présent un contrôle des autorisations par rapport à l'objet d'autorisationS_CARRID pour cette compagnie aérienne et à l'activité "Afficher" (utilisez lafonction Modèle dans l'Éditeur ABAP).Si le contrôle est réussi, renseignez les zones sign et option de l'espace detravail, 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 latable interne it_flights. Cependant, à ce stade, maintenez la table interneit_planes d'origine.Il n'est pas possible d'utiliser la variante "array fetch" de l'instruction SELECT avecdes tables internes imbriquées. Vous devez, par conséquent, programmer uneboucle avec les zones cibles répertoriées dans la clause INTO, puis insérer l'espacede 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 del'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.

Page 120: BC402 4.6a fr

(C) SAP AG BC402 5-25

Page 121: BC402 4.6a fr

(C) SAP AG BC402 5-26

Opérations sur les tables internes : solutions

Chapitre : opérations sur les tables internesSujet : 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 tablesinternes **& **&-----------------------------------------------------------*

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_airportWITH UNIQUE KEY id,

wa_airport TYPE t_airport.

SELECT-OPTIONS so_carr FOR wa_counter-carrid.

Page 122: BC402 4.6a fr

(C) SAP AG BC402 5-27

START-OF-SELECTION.

* bufferisation des noms d'aéroports :*************************************************

SELECT id nameFROM sairportINTO CORRESPONDING FIELDS OF TABLE it_airport_buffer.

* renseignement d'une table interne avec tous les comptoirs destransporteurs sélectionnés :********************************

SELECT carrid countnum airportFROM scounterINTO CORRESPONDING FIELDS OF wa_counterWHERE carrid IN so_carr.

READ TABLE it_airport_bufferINTO wa_airportWITH 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.

Page 123: BC402 4.6a fr

(C) SAP AG BC402 5-28

2 Solution de modèle SAPBC402_TABS_FLIGHTLIST2

*&-----------------------------------------------------------**& État SAPBC402_TABS_FLIGHTLIST2 **& **&-----------------------------------------------------------**& solution de l'exercice 2 : opérations sur les tablesinternes **& **&-----------------------------------------------------------*

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

Page 124: BC402 4.6a fr

(C) SAP AG BC402 5-29

START-OF-SELECTION.

* renseignement d'une table range avec les transporteursautorisés:**************************************************************

SELECT carridFROM scarrINTO wa_allowed_carr-lowWHERE carrid IN so_carr.

AUTHORITY-CHECK OBJECT 'S_CARRID'ID 'CARRID' FIELD wa_allowed_carr-lowID '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 decorrespondance et de vol pour les transporteurs autorisés :***********************************************************

SELECT carrid connid fldate cityfrom citytoseatsocc paymentsum currencyFROM bc402_flightsINTO (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.

Page 125: BC402 4.6a fr

(C) SAP AG BC402 5-30

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

Page 126: BC402 4.6a fr

(C) SAP AG BC402 6-1

SAP AG 1999

� Définition de l'interface

� Appel de sous-programmes

� Durée de vie et visibilité

� Utilisation

Contenu

Sous-programmes

Page 127: BC402 4.6a fr

(C) SAP AG BC402 6-2

SAP AG 1999

� De définir des sous-programmes

� De les appeler

� D'utiliser les différentes techniques existantes detransfert et de saisie des paramètres d'interface

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

Sous-programmes : objectifs du chapitre

Page 128: BC402 4.6a fr

(C) SAP AG BC402 6-3

SAP AG 1999

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

Page 129: BC402 4.6a fr

(C) SAP AG BC402 6-4

SAP AG 1999

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.

Un sous-programme est une unité de modularisation interne dans un programme vers laquelle il estpossible de transférer des données à l'aide d'une interface. Les sous-programmes servent à encapsulerles parties de votre programme pour faciliter la compréhension du programme ou car une sectionspécifique du codage est utilisée à plusieurs points du programme. Votre programme est alorsdavantage 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. Parexemple, vous pouvez les exécuter de manière "invisible" dans le débogueur, puis visualiseruniquement le résultat. Par conséquent, si vous savez pertinemment qu'aucune erreur n'est présentedans 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 lesparamètres formels, puis affectez-leur des types le cas échéant. Les paramètres doivent apparaîtredans 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 faisantpartie du sous-programme.

Page 130: BC402 4.6a fr

(C) SAP AG BC402 6-5

SAP AG 1999

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 parvaleur etrésultat

appel parréférence

appelpar

valeur

appel parréférence

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 cetteopé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 setermine prématurément, utilisez cette méthode.

� Lorsque vous utilisez des tables internes comme paramètres, utilisez la méthode appel parréférence pour vous assurer que le système ne copie pas une table interne volumineuse.

Page 131: BC402 4.6a fr

(C) SAP AG BC402 6-6

SAP AG 1999

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

Contrôle de programme(s) étenduProgramme principal

Autre objet

Actif <-> Inactif

SauvegarderGénérer

Contrôler <

ActiverTesterImprimerTerminer

Afficher <-> Modifier

Syntaxe

Les objets de données transférés vers un sous-programme peuvent comporter tout type de données. Enmatiè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 unparamè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 effectifau runtime. Si les instructions contenues dans le sous-programme ne sont pas compatibles avec cetype 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èrementle 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 avantl'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.

Page 132: BC402 4.6a fr

(C) SAP AG BC402 6-7

SAP AG 1999

Appel d'un sous-programme

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

...PERFORM <sprog> USING do1 do2 CHANGING do3 do4....

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

ENDFORM.

Insertion d'un modèle

. . .

. . .

. . .PERFORM. . .. . .

<s_prog>

Lorsque vous appelez un sous-programme, les paramètres sont transférés dans la séquence danslaquelle 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 etCHANGING de la même manière. L'appel et la définition de l'interface doivent contenir un nombreidentique de paramètres.

La meilleure solution consiste à définir le sous-programme, puis à utiliser la fonction Modèle dansl'É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. Pourtransfé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.

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

Page 133: BC402 4.6a fr

(C) SAP AG BC402 6-8

SAP AG 1999

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

* ... instructions ...

ENDFORM.

��������

����

����

Masquagelocal

Les paramètres formels et les objets de données locaux définis dans un sous-programme sont visiblesuniquement lorsque le sous-programme est actif. Ceci signifie que l'espace mémoire approprié estalloué 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, cetteopération est déconseillée, car l'interface s'en trouve ignorée et des erreurs de codage peuventsurvenir.

� Vous pouvez traiter uniquement les paramètres formels et les objets de données locaux à partir dusous-programme.

� Si un paramètre formel ou un objet de données local comporte le même nom qu'un objet de donnéesglobal, l'objet global est dit masqué localement par l'objet local. Ainsi, si vous traitez un objet avecle nom partagé dans le sous-programme, le système utilise l'objet local, si vous utilisez le mêmenom 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 lesous-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.

Page 134: BC402 4.6a fr

(C) SAP AG BC402 6-9

SAP AG 1999

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

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.

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

do1 do2 do3 do4old1 old2 old3 old4

Cet exemple appelle le sous-programme demosub. Il contient un objet de données local avec unevaleur initiale et modifie les quatre paramètres formels.

Page 135: BC402 4.6a fr

(C) SAP AG BC402 6-10

SAP AG 1999

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

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.

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

do1 do2 do3 do4old1 old2 old3 old4

p2 p4l_do v_new old2 old4

Le système alloue deux zones de mémoire p2 et p4 pour les deux appels à l'aide des paramètres devaleur d2 et d4, puis les renseigne à l'aide des valeurs correspondantes. Il alloue également de lamé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écutionaffectent les paramètres effectifs directement, puis le traitement de do1 peut être effectué directementà l'aide de p1.

Page 136: BC402 4.6a fr

(C) SAP AG BC402 6-11

SAP AG 1999

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

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.

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

v_new old2 old3 old4

old2 old4v_new

do1 do2 do3 do4

p2 p4l_do

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, aucunemodification ne peut affecter le paramètre effectif do2.

Page 137: BC402 4.6a fr

(C) SAP AG BC402 6-12

SAP AG 1999

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

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.

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

v_new old2 old3 old4

v_new old4v_new

do1 do2 do3 do4

p2 p4l_do

Il en est de même pour p3 et p1. Si l'option VALUE n'est pas utilisée, USING et CHANGING ont lesmêmes incidences.

Page 138: BC402 4.6a fr

(C) SAP AG BC402 6-13

SAP AG 1999

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

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.

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

v_new old2 v_new old4

v_new old4v_new

do1 do2 do3 do4

p2 p4l_do

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 auparamètre formel n'ont aucune incidence sur le paramètre effectif lors de l'exécution du sous-programme.

Page 139: BC402 4.6a fr

(C) SAP AG BC402 6-14

SAP AG 1999

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

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.

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

v_new old2 v_new old4

v_new v_newv_new

do1 do2 do3 do4

p2 p4l_do

Les modifications sont prises en compte dans les paramètres effectifs uniquement lorsque l'instructionENDFORM est terminée.

Page 140: BC402 4.6a fr

(C) SAP AG BC402 6-15

SAP AG 1999

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

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.

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

v_new old2 v_new v_newdo1 do2 do3 do4

Si, pour une raison quelconque, demosub est interrompu, do4 reprend la valeur qu'il possédait avantl'appel.

Une fois l'exécution de demosub terminée, la mémoire occupée par ses objets de données locaux estlibé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.

Page 141: BC402 4.6a fr

(C) SAP AG BC402 6-16

SAP AG 1999

Exemple : modularisation locale dans lesprogrammesDATAres_seats TYPE saplane-seatsmax.

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

PERFORM get_free_seats USING pa_typepa_occ

CHANGING res_seats.

WRITE res_seats.**********************************************************************FORM get_free_seats USING p_planetype TYPE saplane-planetype

p_seatsocc TYPE saplane-seatsmaxCHANGING value(p_seatsfree) TYPE saplane-seatsmax.

SELECT SINGLE seatsmax FROM saplaneINTO p_seatsfreeWHERE planetype = p_planetype.

p_seatsfree = p_seatsfree - p_seatsocc.ENDFORM.

Dans l'exemple ci-dessus, le sous-programme doit calculer le nombre de places disponibles dans unavion 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-programmeget_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 lequell'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 programmesprincipaux. Cependant, cette technique de programmation étant obsolète, utilisez plutôt des modulesfonction. Ces derniers offrent des avantages considérables et constituent des composantes importantesdans ABAP Workbench. Pour plus d'informations, référez-vous au chapitre Groupes de fonctions etmodules fonction.

Page 142: BC402 4.6a fr

(C) SAP AG BC402 6-17

SAP AG 1999

Exemple : appel récursif I

FORM 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_poscityto = 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.

find_find_connconn

Vous pouvez également utiliser les sous-programmes par appels récursifs. Bien que d'autres unités demodularisation puissent, en principe, être appelées de manière récursive, la durée d'exécution requiseest 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 rechercherune 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) pourcompiler une liste de toutes les villes disponibles (l_poss_list) et qui ne figurent pas encoredans la liste des itinéraires (p_step_list). La liste des itinéraires est définie comme une tablestandard en vue de conserver l'ordre des villes dans l'itinéraire.

Page 143: BC402 4.6a fr

(C) SAP AG BC402 6-18

SAP AG 1999

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.PERFORM find_conn USING l_wa_poss-cityto

p_destCHANGING p_step_list.

find_find_connconn

� Pour plus de simplicité, le système supprime les doublons présents dans la liste des villes. Ainsi, lesous-programme se termine par une seule correspondance possible.Cependant, il est également possible de supprimer cette correspondance et d'examiner toutes cellesqui 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 laville 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 uneboucle. Chaque ville est inclue dans la liste des itinéraires, afin que le programme puisse continuer sarecherche. Cependant, avant cette étape, le programme doit rechercher si la ville a déjà été définiecomme une impasse lors d'une recherche précédente.

Page 144: BC402 4.6a fr

(C) SAP AG BC402 6-19

SAP AG 1999

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

� Une fois la destination trouvée, le traitement est terminé. À ce stade, toute autre recherche s'avéreraitinfructueuse. La ville apparaît dans la liste des itinéraires et la recherche continue d'être effectuée surla prochaine ville disponible.

� La logique de traitement pour ce sous-programme est contenue dans le groupe de fonctionsLBC402_SURD_RECURSION, programme INCLUDE LBC402_SURD_RECURSIONF01. Lesous-programme est appelé à partir du module fonction BC402_SURD_TRAVEL_LIST, lui-mêmeappelé à partir du programme exécutable SAPBC402_SURD_RECURSION. Ce programmerépertorie tous les vols possibles dans le mode des données de vol et particulièrement ceux contenantdes escales.

Page 145: BC402 4.6a fr

(C) SAP AG BC402 6-20

SAP AG 1999

� De définir des sous-programmes

� De les appeler

� D'utiliser les différentes techniques existantes detransfert et de saisie des paramètres d'interface

Vous êtes maintenant capable :

Sous-programmes : résumé du chapitre

Page 146: BC402 4.6a fr

(C) SAP AG BC402 6-21

Sous-programmes : exercices

Chapitre : sous-programmesSujet : 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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies 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-programmedisplay_flights. Déclarez un paramètre pour la table interne afin de latransfé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-lecomme un objet de données local dans le sous-programme.

1-4 Supprimez les instructions utilisées pour créer la liste à partir du programmeprincipal, puis insérez-les (modifiées de manière appropriée) dans lesous-programme.

1-5 Dans le programme principal, appelez le sous-programme display_flights(utilisez la fonction Modèle).

Page 147: BC402 4.6a fr

(C) SAP AG BC402 6-22

Page 148: BC402 4.6a fr

(C) SAP AG BC402 6-23

Sous-programmes : solutions

Chapitre : sous-programmesSujet : 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_flightWITH 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.

Page 149: BC402 4.6a fr

(C) SAP AG BC402 6-24

START-OF-SELECTION.

* renseignement d'une table range avec les transporteursautorisés:**************************************************************

SELECT carridFROM scarrINTO wa_allowed_carr-lowWHERE carrid IN so_carr.

AUTHORITY-CHECK OBJECT 'S_CARRID'ID 'CARRID' FIELD wa_allowed_carr-lowID '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 decorrespondance et de vol pour les transporteurs autorisés :***********************************************************

SELECT carrid connid fldate cityfrom citytoseatsocc paymentsum currencyFROM bc402_flightsINTO (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.

Page 150: BC402 4.6a fr

(C) SAP AG BC402 6-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.

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.

Page 151: BC402 4.6a fr

(C) SAP AG BC402 7-1

SAP AG 1999

� 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

Contenu :

Groupes de fonctions et modules fonction

Page 152: BC402 4.6a fr

(C) SAP AG BC402 7-2

SAP AG 1999

� 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 lesmodules fonction

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

Groupes de fonctions et modules fonction :objectifs du chapitre

Page 153: BC402 4.6a fr

(C) SAP AG BC402 7-3

SAP AG 1999

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

Page 154: BC402 4.6a fr

(C) SAP AG BC402 7-4

SAP AG 1999

Modules fonction par rapport aux sous-programmes

Actif/inactifParamètres transmis par nom

Paramètres facultatifsValeurs par défaut

Exceptions

Menu Painter Screen Painter

Exécutionasynchrone

Concept d'extension

Appel de fonctionà distance

Mises à jour

Générateur de classes

Dictionnaire ABAP

Éditeur ABAP

Les modules fonction sont plus conviviaux que les sous-programmes et leurs possibilités d'utilisationssont plus importantes. La liste suivante, qui ne prétend pas être exhaustive, détaille le rôle essentieljoué 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 duGénérateur de modules fonction.

� Peuvent comporter des paramètres d'import et de modification auxquels vous pouvez affecter desvaleurs 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 processusparallè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 diapositivessuivantes illustrent les étapes individuelles nécessaires à la création d'un module fonction.

Page 155: BC402 4.6a fr

(C) SAP AG BC402 7-5

SAP AG 1999

Attributs

Module fonction Traiter Saut Utilitaires Environnement Système Aide

Gén. de module fon. : Display BC402_FMDD_GET_FREE_SEATS

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Code sourceExceptionsTablesModif.ExportImportAttributs

Type de trait.

Normal Activé à distanceMise à jour

Groupe de fonctions BC402_FMDD_FLIGHT Module fonction de démonstration

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

Classe dedéveloppement

BC402

Données générales

Classification

Documentation du module fonction

Dans les attributs d'un module fonction, spécifiez ses données de gestion générales et le type detraitement :

� Les modules fonction activés à distance peuvent être appelés de manière asynchrone dans le mêmesystème et également à partir d'autres systèmes (et pas seulement les systèmes R/3). Pour appeler unmodule fonction dans un autre système, une connexion système correcte doit être établie. Pour plusd'informations, référez-vous au chapitre BC415 (ABAP Workbench - Interfaces decommunication).

� Les modules fonction de mise à jour contiennent des fonctions supplémentaires permettant deregrouper les modifications de bases de données. Pour plus d'informations, référez-vous au chapitreBC414 (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 fonctionde mise à jour et activés à distance.

Page 156: BC402 4.6a fr

(C) SAP AG BC402 7-6

SAP AG 1999

Interface

Funktionsbausteindokumentation

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

Funktionsbaustein BC402_FMDD_GET_FREE_SEATS aktiv

Code srceExceptionsTablesModif.ImportAttributs Export

Nom du paramètre Typing Type de réf. Trans. par valeur Désig. synt.EP_SEATSFREE TYPE S_SEATSMAX Places disponibles!

Module fonction Traiter Saut Utilitaires Environnement Système Aide

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

Module fonction BC402_FMDD_GET_FREE_SEATS actif

Code srceExceptionsTablesModif.Export

Documentation du module fonction

ImportAttributs

Nom du paramètre Typing Type de réf. Valeur par déf. Facultatif Trans. par valeur Désig. synt.IP_PLANETYPE TYPE S_PLANETYE Type d'avionIP_SEATSOCC TYPE S_SEATSMAX 0 Occ. devise! !

Lors de l'échange de données avec les modules fonction, trois types de paramètres sont clairementdé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, vouspouvez 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 del'interface.

Vous pouvez également déclarer les paramètres d'import et de modification comme facultatifs. Il n'estpas 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 encours d'utilisation. Vous pouvez affecter une valeur par défaut à un paramètre facultatif. Si vous netransmettez pas une de vos valeurs lors de l'appel du module fonction, le système utilise alors lavaleur 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ètrede table ou de structure. Vous pouvez utiliser les types de Dictionnaire ABAP, les objets duDictionnaire 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îtdans le contrôle de programme(s) étendu.

Les paramètres de table sont obsolètes pour les modules fonction classiques. Ils sont toutefois conservéspour s'assurer de la compatibilité des modules fonction avec d'autres modes d'exécution.

Page 157: BC402 4.6a fr

(C) SAP AG BC402 7-7

SAP AG 1999

Logique de traitement

Module fonction Traiter Saut Utilitaires Environnement Système Aide

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

Module fonction BC402_FMDD_GET_FREE_SEATS actif

ExceptionsTablesModif.ExportImport

Documentation du module fonction

Attributs Code srce

FUNCTION bc402_fmdd_get_free_seats.*"---------------------------------*"*"Interface locale :*" IMPORTING*" EXPORTING*" EXCEPTIONS*"---------------------------------...

ENDFUNCTION.

Lors de la sauvegarde de l'interface, le système génère la structure de l'instruction, ainsi que le bloc decommentaires répertoriant les paramètres d'interface :

FUNCTION <nom>.*"--------------*" ...*"--------------

...

ENDFUNCTION.

Le bloc de commentaires est mis à jour automatiquement si vous apportez des modifications ultérieuresau module fonction. Ainsi, lors du codage du module fonction, la définition de l'interface est toujoursvisible.

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 appelerles sous-programmes ou d'autres modules fonction.

Page 158: BC402 4.6a fr

(C) SAP AG BC402 7-8

SAP AG 1999

Exceptions

Module fonction Traiter Saut Utilitaires Environnement Système Aide

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

Module fonction BC402_FMDD_GET_FREE_SEATS actif

TablesModif.Export

Documentation du module fonction

ImportAttributs

Exceptions Désig. synt.Avion-cargo

Code srceExceptions

NO_SEATSSurréservéOVERLOAD

RAISE <exception>.

*** avec un message par défaut :MESSAGE <type><num>(<id>)

RAISING <exception>.

DB_FAILURE Aucune donnée

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 unnom différent à chacune d'elles.

Dans le code source de votre module fonction, programmez les instructions déclenchant une exceptiondans les conditions requises. Au runtime, le module fonction est interrompu lorsqu'une exceptionest déclenchée. Les modifications apportées aux paramètres d'export et de modification sontidentiques à celles des sous-programmes. Deux instructions peuvent être utilisées pour déclencherune exception. Dans les formules spécifiées ci-dessous, <exception> correspond au nom d'uneexception 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ôledirectement. 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 queRAISE <exception>. Dans le cas contraire, le système envoie le message <nom> à partir de la classede messages <id> avec le type <type> et aucune erreur ne survient à l'exécution.

Page 159: BC402 4.6a fr

(C) SAP AG BC402 7-9

SAP AG 1999

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

Les modules fonction diffèrent des sous-programmes dans le sens où ils seront utilisés par d'autresprogrammeurs. 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 textesdescriptifs, le cas échéant), ainsi que l'intégralité de votre module fonction. Pour ce faire, utilisezl'éditeur de texte, contenant des sections prédéfinies, telles que Fonctionnalités, Appel d'exemple,Conseils et Informations supplémentaires.

� Liste de travailLorsque vous modifiez un module fonction actif, il prend le statut actif (révisé). Lorsque vous lesauvegardez, une autre version est créée avec le statut inactif. Lorsque vous utilisez un modulefonction, vous pouvez basculer entre la version inactive et la dernière version activée. Lorsque vousactivez la version inactive, la dernière version active est remplacée.

� Test de fonctionUne fois le module fonction activé, vous pouvez le tester à l'aide de l'environnement de test prédéfinidans le Générateur de modules fonction. Si une exception est déclenchée, l'environnement de testl'affiche, ainsi que tout autre message ayant pu être spécifié. Vous pouvez également basculer entrele débogueur et l'outil d'analyse de la durée d'exécution. Vous pouvez sauvegarder les données detest, puis comparer l'ensemble des résultats.

Page 160: BC402 4.6a fr

(C) SAP AG BC402 7-10

SAP AG 1999

Appel d'un module fonction

DATA: result TYPE s_seatsmax.PARAMETERS: pa_type TYPE s_planetye, pa_occ TYPE s_seatsmax.

CALL FUNCTION 'BC402_FMDD_GET_FREE_SEATS'EXPORTING

ip_planetype = pa_typeip_seatsocc = pa_occ " valeur par défaut : 0

IMPORTINGep_seatsfree = result

EXCEPTIONSno_seats = 1overload = 2OTHERS = 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.

Insertion d'un modèleCALL FUNCTION. . .. . .. . .. . .. . .

BC402_FMDD_GET_FREE_SEATS

CALL FUNCTION 'CALL FUNCTION ' ''

EXPORTINGEXPORTING

IMPORTINGIMPORTING

EXCEPTIONSEXCEPTIONS

====

==

= 1= 1= 2= 2

OTHERS = 3.OTHERS = 3.CASE sy-subrc.CASE sy-subrc.WHEN 0.WHEN 0.

WHEN 1.WHEN 1.

WHEN 2.WHEN 2.

WHEN 3.WHEN 3.

ENDCASE.ENDCASE.

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). Lesystème insère ensuite le traitement des appels et des exceptions (instruction MESSAGE) dans votreprogramme.

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, satransmission 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 deré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 ladéfinition du module fonction. Vous pouvez affecter une valeur à toutes les autres exceptions qui nesont 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 valeurcorrespondante 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 selonl'instruction utilisée dans le module fonction pour déclencher l'exception.

Page 161: BC402 4.6a fr

(C) SAP AG BC402 7-11

SAP AG 1999

Groupes de fonctions

Mod

ule

fonc

tion

FM3

Inte

rface

Inte

rface

Interface

Interface

Module fonctionFM2

Interface

Interface

Module fonction

FM1

Module fonction

FM5

InterfaceInterface

Module fonctionFM4

InterfaceInterface

Sous-programmeInterface

Lorsque vous créez un module fonction, affectez-le à un groupe de fonctions. Ce dernier correspondau 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 defonctions 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. Parconséquent, il s'agit d'un moyen approprié pour conserver les objets de données pendant toute la duréed'un programme. Tous les modules fonction contenus dans un groupe peuvent accéder aux donnéesglobales 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 nomsque les zones de dynpro du groupe de fonctions. Le dynpro et le transport des données peuventdé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 (Programmationinteractive).

Page 162: BC402 4.6a fr

(C) SAP AG BC402 7-12

SAP AG 1999

Exemple

Ajouter le clientà la liste Supprim

er le

client de la liste

Déplacer lesclients dans la liste

Affic

her l

alis

te d

'atte

nte

Renvoyer le

poste dans la

liste d'attente

Mod

ifier l

e po

ste

dans

la lis

ted'a

ttent

e

Liste d'attente

Structure de transport

Affichage de liste

ip_custip_cust

ip_i

dip_i

d

ep_custep_cust

ip_id

ip_id

ep_pos

ep_pos

ip_id

ip_id

ip_new_pos

ip_new_pos

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 listerepré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'aientpas à effectuer à nouveau la même tâche. Si, par exemple, ces programmeurs savent qu'un modulefonction wait_get_first renvoie le nom du client en haut de la liste d'attente, leur unique tâcheconsiste à 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 dedonnées globales du groupe de fonctions. Cette liste ne peut donc être modifiée qu'à l'aide d'autresmodules fonction de ce groupe. Ces modules sont accessibles à partir de tout programme.

Page 163: BC402 4.6a fr

(C) SAP AG BC402 7-13

SAP AG 1999

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.

DELETE wait_list WHERE id = ip_id.IF sy-subrc <> 0.MESSAGE e203(bc402) RAISING not_in_list.

ENDIF.

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

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.

Ajouter un clienten attente

Supprimer le clienten attente

Déplacer les clientsdans la liste

Renvoyer le postedans la liste

La mise en œuvre des modules fonction individuels est similaire aux exemples contenus dans lechapitre 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 typesappropriés du Dictionnaire ABAP.

Page 164: BC402 4.6a fr

(C) SAP AG BC402 7-14

SAP AG 1999

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.

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.

ENDMODULE.

Afficher la listed'attente

Liste dans la boitede dialogue modale

Le dynpro 100 appartient au groupe de fonctions. Il s'agit d'un écran de conteneur pour le traitementinvisible de la liste. L'utilisateur peut ainsi afficher le contenu actuel de la liste d'attente dans une boitede dialogue modale.

Pour plus de simplicité, un table control n'a pas été utilisé dans l'exemple. Dans le cas contraire, lanavigation tout entière aurait pu être encapsulée dans le groupe de fonctions. Pour plus d'informationssur l'utilisation d'objets de dynpro, tels que les table controls, référez-vous au cours BC410(Programmation interactive).

Page 165: BC402 4.6a fr

(C) SAP AG BC402 7-15

SAP AG 1999

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.MESSAGE e203(bc402) RAISING not_in_list.

ENDIF.

Modifier le postedans la liste

d'attente

Pour déplacer une entrée dans la liste d'attente, il est tout d'abord nécessaire de supprimer l'entréeexistante. 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 aunombre total de lignes dans la liste (last_pos). La valeur de last_pos est définie à l'aide del'instruction DESCRIBE TABLE … LINES. Si vous spécifiez un index trop volumineux, l'entrée estajoutée à la table interne.

Page 166: BC402 4.6a fr

(C) SAP AG BC402 7-16

SAP AG 1999

Structure d'un groupe de fonctions

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

Liste d'objets

Afficher

BC402_FMDD_WAITLISTGroupe de fonctionsClasseObjets locaux

Classe de dév.Programme

Workbench Traiter Saut Autres fonctions Envir. Système Aide

Object Navigator

Nom d'objetBC402_FMDD_WAITLIST

Modules fonctionZonesModules PBODynprosTitres GUIIncludes

Ajouter un client en attenteSupprimer le client en attenteAfficher la liste d'attenteDéplacer la liste d'attenteRenvoyer le poste dans la listeModifier le poste

FunktionsbausteineFunktionsbausteineFunktionsbausteineFunktionsbausteineModules fonction

Modules PBO

Déclarations globales

Modules INCLUDEdans le programme

><<<<<

>

LBC402_FMDD_WAITLISTTOPLBC402_FMDD_WAITLISTO01

LBC402_FMDD_WAITLISTU01LBC402_FMDD_WAITLISTU02LBC402_FMDD_WAITLISTU03LBC402_FMDD_WAITLISTU04LBC402_FMDD_WAITLISTU05LBC402_FMDD_WAITLISTU06LBC402_FMDD_WAITLISTUXX

Object Navigator

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 programmesINCLUDE sont nommés automatiquement et les instructions d'appel appropriées sont inséréesautomatiquement 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 desinstructions INCLUDE générées automatiquement. Les programmes INCLUDE sont égalementnommé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 duprogramme.

Le programme INCLUDE LY|Z<sup_nom>UXX est également inséré. Il contient une instructionINCLUDE pour chaque module fonction sous la forme LY|Z<sup_nom>U<numéro>.

Page 167: BC402 4.6a fr

(C) SAP AG BC402 7-17

SAP AG 1999

� 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 lesmodules fonction

Vous êtes maintenant capable :

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

Page 168: BC402 4.6a fr

(C) SAP AG BC402 7-18

Groupes de fonctions et modules fonction : exercices

s

Chapitre : groupes de fonctions et modules fonctionSujet : création et appel des groupes de fonctions et desmodules fonction

À 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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies aériennes.

1. Créez une table interne dans un groupe de fonctions bufferisant tous les types d'appareilsdisponibles pour chaque compagnie aérienne. Pour plus de simplicité, la structure de latable 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.

Page 169: BC402 4.6a fr

(C) SAP AG BC402 7-19

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

2-1 Créez le module fonction Z_##_BC402_CREATE_PLANELIST dans votregroupe de fonctions Z##_BC402_FLIGHT.

2-2 Déclarez le type de ligne t_carr_plane comme un type de données global dansvotre groupe de fonctions. Il doit comporter la structure suivante :

Composante Typecarrid 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 globaldans votre groupe de fonctions. Elle doit comporter le type de lignet_carr_plane. Il doit s'agir d'une table triée avec la clé unique carrid etplanetype.

2-4 Renseignez la table interne it_carr_planes à l'aide de la méthode "arrayfetch"avec la vue BC402_CARPLAN.

Sélectionnez un événement approprié. Gardez à l'esprit que lesgroupes de fonctions ne peuvent pas être exécutés directement.Mettez en œuvre le bloc événement dans un programme INCLUDEapproprié. Observez la convention d'appellation pour lesprogrammes 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 globalZ##_BC402_PLANETAB.

Page 170: BC402 4.6a fr

(C) SAP AG BC402 7-20

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

2-9 Dans la table interne globale, lisez les types d'appareils disponibles transférés aumodule fonction et comportant suffisamment de places pour accueillir le nombre depassagers réservés sur le vol.Dans cette boucle, calculez la recette moyenne par place pour chaque typed'appareil. Déclarez un autre espace de travail (l_wa_plane) comme un objet dedonnées local dans le module fonction. Spécifiez son type en vous référant à votrestructure globale Z##_BC402_PLANE.Une fois la structure complètement renseignée, transférez-la à la table interne quevous ê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.

Page 171: BC402 4.6a fr

(C) SAP AG BC402 7-21

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 modulefonction 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 modulefonction Z_##_BC402_CREATE_PLANELIST (utilisez la fonction Modèle).La ligne courante doit être uniquement mise à jour si aucune exception n'estdé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 recettesmoyennes (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 untexte approprié.

Page 172: BC402 4.6a fr

(C) SAP AG BC402 7-22

Groupes de fonctions et modules fonction : solutions

Chapitre : groupes de fonctions et modules fonctionSujet : 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 globalesINCLUDE 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.

Page 173: BC402 4.6a fr

(C) SAP AG BC402 7-23

2-4 Solution de modèle LBC402_FMDS_FLIGHTE01

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

LOAD-OF-PROGRAM.

SELECT carrid planetype seatsmaxFROM bc402_carplanINTO 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_planeWHERE carrid EQ ip_carridAND 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.

Page 174: BC402 4.6a fr

(C) SAP AG BC402 7-24

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

Page 175: BC402 4.6a fr

(C) SAP AG BC402 7-25

AT SELECTION-SCREEN....

* renseignement d'une table range avec les transporteursautorisés:**********......

START-OF-SELECTION.

* renseignement d'une table interne avec les données decorrespondance et de vol pour les transporteurs autorisés :***********************************************************......

* renseignement de toutes les tables internes avec d'autrestypes d'avions :****************

LOOP AT it_flights INTO wa_flight WHERE seatsocc > 0.

CALL FUNCTION 'BC402_FMDS_CREATE_PLANELIST'EXPORTING

ip_seatsocc = wa_flight-seatsoccip_carrid = wa_flight-carridip_paymentsum = wa_flight-paymentsumip_currency = wa_flight-currency

IMPORTINGep_planelist = wa_flight-it_planes

EXCEPTIONSno_planes = 1OTHERS = 2.

IF sy-subrc = 0.MODIFY TABLE it_flights FROM wa_flight

TRANSPORTING it_planes.ENDIF.

ENDLOOP.

PERFORM display_flights CHANGING it_flights.

Page 176: BC402 4.6a fr

(C) SAP AG BC402 7-26

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

Page 177: BC402 4.6a fr

(C) SAP AG BC402 8-1

SAP AG 1999

� 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

Contenu :

Introduction à ABAP Objects

Page 178: BC402 4.6a fr

(C) SAP AG BC402 8-2

SAP AG 1999

� De déclarer et mettre en œuvre des classeslocales

� 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

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

Introduction à ABAP Objects : objectifs du chapitre

Page 179: BC402 4.6a fr

(C) SAP AG BC402 8-3

SAP AG 1999

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

Page 180: BC402 4.6a fr

(C) SAP AG BC402 8-4

SAP AG 1999

Programmations fonctionnelle et orientée object

Fonctions et donnéesModèle de données commeabstraction du monde réel

Objets réelsObjets logicielsModèle d'objet comme

abstraction du monde réel

Fonction

Fonction Fonction

Fonction Fonction Fonction

Fonction

Fonction

DonnDonnéesées

MéthodeMéthode

MéthodeAbstractionDonnéesAttributs

MéthodeMéthode

MéthodeDonnées Abstraction

Méthodes

DonnDonnéesées Donn Donnéesées

Donn DonnéeséesDonnDonnéesées

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 etconcrets du monde réel. Décrivez-les par leurs caractéristiques et leur comportement pour obtenir leurstructure 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 uneprogrammation orientée objet, la modélisation est autrement plus importante que dans laprogrammation fonctionnelle. Cependant, une fois la modélisation terminée, vous pouvez écrire lecode programme très rapidement. Par ailleurs, le codage est généralement si évident que l'utilisationd'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 tableinterne est stockée globalement, c'est-à-dire, séparément des modules fonction. Les modules fonctiontraitent 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'ellecontient non seulement les données relatives aux clients en attente, mais également les méthodes detraitement des données qui lui permettent de s'autogérer. En externe, l'objet est intégré (l'utilisateurn'appelle pas un module fonction affichant les données, mais il demande à la liste d'attente des'afficher).

Page 181: BC402 4.6a fr

(C) SAP AG BC402 8-5

SAP AG 1999

Position de ABAP Objects

� ABAP Objects représente une extension à compatibilitéascendante du langage ABAP existant

� Vous pouvez utiliser les instructions ABAP existantes dansABAP Objects

� Vous pouvez utiliser ABAP Objects dans les programmesABAP existants

� ABAP Objects est entièrement intégré au débogueur ABAP

� L'orientation objet dans ABAP représente une extension à compatibilité ascendante du langageABAP 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 ABAPObjects et, inversement, ABAP Objects peut également être utilisé dans les programmes ABAPexistants.

� Certaines restrictions syntaxiques s'appliquent à ABAP Objects. Par exemple, vous pouvezdé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 desoulignement. Ils ne peuvent pas commencer par un chiffre.Pour garantir la compatibilité avec les versions précédentes, les anciennes formulations ne sont pasinterdites en dehors de ABAP Objects. Ce cours a été conçu pour être entièrement compatible avecABAP Objects, aussi toutes les formulations de l'ensemble des instructions doivent également êtrecorrectes dans le contexte de ABAP Objects.

Page 182: BC402 4.6a fr

(C) SAP AG BC402 8-6

SAP AG 1999

Des groupes de fonctions aux classes I

Mode externe

DonnDonnéesées...

ModuleModulefonctionfonction

Groupe de fonctions 1 1

DonnDonnéesées...

ModuleModulefonctionfonction

Groupe de fonctions 2 2

Mode interne d'un programme ABAP

Programme ABAP avec lesdonnées

CALL FUNCTION ...

Avant la version 4.0, les composantes ABAP ressemblant le plus aux objets étaient les modulesfonction 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 zonede mémoire du mode interne. Si un programme ABAP individuel appelle les modules fonction à partirde 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 seulprogramme peut utiliser simultanément les instances de plusieurs groupes de fonctions, mais pasplusieurs 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'uneinstance individuelle ou d'une seule liste d'attente. Il peut s'avérer très difficile d'administrer plusieurslistes d'attente au moment de l'exécution. Il est possible de créer de nouvelles tables internes demanière dynamique mais qui appartiennent toutes à la même instance, à savoir au groupe de fonctions.

Page 183: BC402 4.6a fr

(C) SAP AG BC402 8-7

SAP AG 1999

Des groupes de fonctions aux classes II

Mode externe

Mode interne d'un programme ABAP

DatenDaten... DatenDaten

...

FunktionsFunktions--bausteinbaustein

nième instance, classe m

DonnDonnéesées...

InterfaceInterface

1ère instance, classe m

DonnDonnéeéess

... DataData...

Schnitt-stelleSchnitt-stelle

nième instance, classe 1

DonnDonnéesées...

InterfaceInterface

1ère instance, classe 1

Programme ABAP avec lesdonnées

CREATE OBJECT ...

Ces problèmes ont été résolus par l'introduction des classes. Il est désormais possible de définir lesdonnées et les fonctions dans une classe plutôt que dans un groupe de fonctions et un programmeABAP 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 implicitelors de l'appel d'un module fonction, un programme ABAP génère des instances d'exécution des classesde manière explicite. Chaque instance d'exécution est un objet pouvant être identifié de manièreexceptionnelle, 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 suppressiond'un nombre illimité d'instances de la classe de la liste d'attente. Toutes ces instances sont distinctesmais comportent la même structure. Elles encapsulent leurs données. Il est possible de spécifier demanière explicite la liste d'attente dans laquelle seront intégrées les données en utilisant la méthodeappropriée à cette liste.

Page 184: BC402 4.6a fr

(C) SAP AG BC402 8-8

SAP AG 1999

Définition des classes

Tous lesutilisateurs

Classe <c1>Composantesprivéesa3, m3,

e3

Mises en œuvrede la méthode

Sous-classes de c1

Composantes protégées a2, m2, e2, …

Composantespubliques

a1,m1,

e1 …

ENDCLASS.

CLASS <c1> DEFINITION.PUBLIC SECTION.

DATA: a1 …METHODS: m1 …EVENTS: e1 …

PROTECTED SECTION.DATA: a2 …METHODS: m2 …EVENTS: e2 …

PRIVATE SECTION.DATA: a3 …METHODS: m3 …EVENTS: e3 …

CLASS <c1> IMPLEMENTATION.

METHOD m1. … ENDMETHOD.

METHOD m2. … ENDMETHOD.

METHOD m3. … ENDMETHOD.

ENDCLASS.

Les classes constituent des modèles de structure pour les objets. Vous pouvez les créer localement danstout 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. Chaquecomposante doit être déclarée dans l'une des trois sections de visibilité. Ces sections définissent lepoint 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 lesutilisateurs. 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 lessous-classes de la classe.

� PRIVATE - Les composantes privées peuvent être traitées uniquement dans les méthodes de laclasse.

� 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 leurssections de visibilité ainsi que les mises en œuvre de la méthode.

Page 185: BC402 4.6a fr

(C) SAP AG BC402 8-9

SAP AG 1999

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

Les constructeurs (instance ou statique) sont des méthodes spécifiques appelées de manière implicitelorsque vous créez un objet ou accédez à une classe pour la première fois. Ils sont exécutésautomatiquement 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'utilisationde 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.

Page 186: BC402 4.6a fr

(C) SAP AG BC402 8-10

SAP AG 1999

Exemple : déclaration

CLASS lcl_waitlist DEFINITION.PUBLIC SECTION.METHODS constructor IMPORTING im_carrid TYPE sflight-carrid

im_connid TYPE sflight-connidim_fldate TYPE sflight-fldate.

METHODS add IMPORTING im_cust TYPE bc402_typd_custEXCEPTIONS 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 renvoie à l'exemple de la classe locale lcl_waitlist du programmeSAPBC402_AOOD_WAITLISTS. Cette classe contient :

� Un constructeur d'instances vers lequel doivent être transmises les données clés d'unecorrespondance.

� 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é sontdéfinis en tant qu'objets de données privés.

Page 187: BC402 4.6a fr

(C) SAP AG BC402 8-11

SAP AG 1999

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.

� Lors de la création d'un objet de liste d'attente, le constructeur écrit les données clés dans les zonesprivées.

� Lors de l'appel de la méthode add pour un objet de liste d'attente, l'enregistrement de données estnormalement ajouté à la liste, s'il n'existe pas encore dans la table.

Page 188: BC402 4.6a fr

(C) SAP AG BC402 8-12

SAP AG 1999

Déclaration des variables de référence

DATAo_list1 TYPE REF TO lcl_waitlist.

o_list1

Pour créer un objet à partir d'une classe, une variable de référence est requise. Dans cet exemple, ils'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 objetde 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 variablede référence à une autre, seule l'adresse de l'objet (référence à l'objet) est transmise. Une foisl'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.

Page 189: BC402 4.6a fr

(C) SAP AG BC402 8-13

SAP AG 1999

Création d'objets

DATAo_list1 TYPE REF TO lcl_waitlist.

...

CREATE OBJECT o_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

o_ list1

5<LCL_WAITLIST>

LH

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'unprogramme 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 pasnécessaire de spécifier une variable de référence. À la place, l'auto-référence me est définie demaniè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érences'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 deré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 desclasses.

Page 190: BC402 4.6a fr

(C) SAP AG BC402 8-14

SAP AG 1999

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_ list1

o_ list2

o_list3

Les différentes variables de référence illustrées ci-dessus sont toutes déclarées avec une référence à lamême classe.

Page 191: BC402 4.6a fr

(C) SAP AG BC402 8-15

SAP AG 1999

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_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

CREATE OBJECT o_list2EXPORTING im_carrid = 'AA'

im_connid = '17'im_fldate = '19991231'.

o_ list1

o_ list2

o_ list3

6<LCL_WAITLIST>

3<LCL_WAITLIST>

LH

AA

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 queses propres attributs. Chaque instruction CREATE OBJECT crée une nouvelle instance.

Page 192: BC402 4.6a fr

(C) SAP AG BC402 8-16

SAP AG 1999

Sémantique de référence III

o_ list1

o_ list2

o_ list3

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_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

CREATE OBJECT o_list2EXPORTING im_carrid = 'AA'

im_connid = '17'im_fldate = '19991231'.

o_list3 = o_list2.

6<LCL_WAITLIST>

3<LCL_WAITLIST>

LH

AA

Vous pouvez affecter des références à d'autres références à l'aide de l'instruction MOVE. Ainsi, laréférence à plusieurs objets différents peut pointer vers le même objet. Lors de l'affectation entreplusieurs variables de référence, les types respectifs doivent être compatibles ou convertibles.

Page 193: BC402 4.6a fr

(C) SAP AG BC402 8-17

SAP AG 1999

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_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

CREATE OBJECT o_list2EXPORTING im_carrid = 'AA'

im_connid = '17'im_fldate = '19991231'.

o_list3 = o_list2.

CLEAR o_list2.

o_ list1

o_ list2

o_ list3

6<LCL_WAITLIST>

3<LCL_WAITLIST>

LH

AA

À l'instar d'autres variables, vous pouvez initialiser une variable de référence à l'aide de l'instructionCLEAR. La valeur initiale d'une variable de référence est toujours une référence qui ne pointe pas versun objet (adresse "vide").

Page 194: BC402 4.6a fr

(C) SAP AG BC402 8-18

SAP AG 1999

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_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

CREATE OBJECT o_list2EXPORTING im_carrid = 'AA'

im_connid = '17'im_fldate = '19991231'.

o_list3 = o_list2.

CLEAR o_list2.

o_list3 = o_list1.

o_ list1

o_ list2

o_ list3

6<LCL_WAITLIST>

3<LCL_WAITLIST>

LH

AA

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'espacemémoire. Ce mécanisme analyse entièrement le mode interne pour les objets vers lesquels plus aucuneréférence ne pointe, puis les supprime.

Page 195: BC402 4.6a fr

(C) SAP AG BC402 8-19

SAP AG 1999

Nettoyage de mémoire II

o_ list1

o_ list2

o_ list3

3<LCL_WAITLIST>

LH

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_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

CREATE OBJECT o_list2EXPORTING im_carrid = 'AA'

im_connid = '17'im_fldate = '19991231'.

o_list3 = o_list2.

CLEAR o_list2.

o_list3 = o_list1.

Page 196: BC402 4.6a fr

(C) SAP AG BC402 8-20

SAP AG 1999

Réinstantiation

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

CREATE OBJECT o_list3EXPORTING im_carrid = 'SQ'

im_connid = '866'im_fldate = '20000101'.

o_ list1

o_ list2

o_list3

1<LCL_WAITLIST>

3<LCL_WAITLIST>

LH

SQ

Utilisez à présent l'instruction CREATE OBJECT pour créer un nouvel objet et pour que la référenceo_list3 pointe vers lui. L'instruction CREATE OBJECT a remplacé le contenu précédent de lavariable de référence utilisée dans l'instruction par la nouvelle référence.

Page 197: BC402 4.6a fr

(C) SAP AG BC402 8-21

SAP AG 1999

Appel de méthodes

o_list1

DATAo_list1 TYPE REF TO lcl_waitlist.

CREATE OBJECT o_list1EXPORTING ... .

CALL METHOD o_list1->addEXPORTINGim_cust = wa_cust

EXCEPTIONSin_list = 1OTHERS = 2.

CASE sy-subrc.WHEN 0.

WRITE 'ok, inséré'(ins).WHEN 1.

WRITE 'déjà dans la liste'(itl).WHEN 2.

WRITE 'administrateur'(adm).ENDCASE.

9<LCL_WAITLIST>

o_list1->wait_list contientdésormais le contenu de of wa_cust.

Une fois l'instance d'une classe créée, vous pouvez appeler ses méthodes à l'aide de l'instruction CALLMETHOD. Spécifiez le nom de la méthode, ainsi que l'objet auquel vous souhaitez l'appliquer. Lasyntaxe 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.

Page 198: BC402 4.6a fr

(C) SAP AG BC402 8-22

SAP AG 1999

Indépendance des instances

wait_list contient des valeursdifférentes dans chaque instance

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 ... ,o_list2 EXPORTING ... ,o_list3 EXPORTING ... .

wa_cust-name = 'SAP AG'.CALL METHOD o_list1->addEXPORTING im_cust = wa_cust ...

wa_cust-name = 'Dr. Einstein'.CALL METHOD o_list2->addEXPORTING im_cust = wa_cust ...

wa_cust-name = 'IDS Scheer'.CALL METHOD o_list3->addEXPORTING im_cust = wa_cust ...

8<LCL_WAITLIST>

2<LCL_WAITLIST>

9<LCL_WAITLIST>

o_list1

o_list2

o_list3

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.

Page 199: BC402 4.6a fr

(C) SAP AG BC402 8-23

SAP AG 1999

Interfaces

� Définition d'un point de contact dans une classe sansaucune 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>

n<classe1>

Interface

<réfi>

Une interface est un objet public contenant des attributs, des méthodes et des événements. Ellecontient uniquement une déclaration et est définie indépendamment des classes. Les composantesd'une interface sont mises en œuvre dans les classes utilisant l'interface. Les classes ont alors un pointde contact externe uniforme. Les classes utilisant une interface doivent fournir leurs fonctions par lamise 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 deréférence à une interface. Une référence à une interface peut pointer vers des instances de toute classeayant mis en œuvre les composantes de l'interface appropriée. Vous pouvez accédez à ces composantesde 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éesde 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 estgénéralement appelée polymorphisme.

Page 200: BC402 4.6a fr

(C) SAP AG BC402 8-24

SAP AG 1999

Définition des interfaces

Tous lesutilisateurs

Classe c1

Composantesprivéesa2,m2,

e2 Mises en œuvrede la méthode

Composantes protégées a3, m3, e3, …

Composantespubliques

CLASS c1 DEFINITION.PUBLIC SECTION.

INTERFACES i1 ...DATA a1 ...

PROTECTED SECTION.

PRIVATE SECTION.

ENDCLASS.

CLASS c1 IMPLEMENTATION.METHOD i1~m1.ENDMETHOD.

ENDCLASS.

INTERFACE i1.DATA: a1 ...METHODS: m1 ...EVENTS: e1 ...

ENDINTERFACE.

i1~a1,i1~m1,...

Sous-classes de c1

a1,...

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

� Le côté gauche du graphique illustre la définition d'une interface locale i1, ainsi que les partiesdéclaration et mise en œuvre d'une classe locale c1, qui met en œuvre l'interface i1 dans sa sectionpublique.La méthode d'interface m1 doit être mise en œuvre dans la partie correspondante de la classe c1comme i1~m1.

� Le côté droit du graphique illustre la structure de la classe avec les composantes dans leurs sectionsde visibilité ainsi que les méthodes de mise en œuvre. Les composantes de l'interface étendent lasection publique de la classe. De cette manière, tous les utilisateurs peuvent accéder auxcomposantes publiques appartenant à cette seule classe et aux composantes déjà ajoutées à l'aide dela mise en œuvre de l'interface.

Une classe peut mettre en œuvre plusieurs interfaces en parallèle à condition qu'elle implémente toutesles méthodes de l'ensemble des interfaces.

Les interfaces peuvent être imbriquées. (INTERFACE ... INTERFACES ...ENDINTERFACE.)

Page 201: BC402 4.6a fr

(C) SAP AG BC402 8-25

SAP AG 1999

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 renvoie à l'exemple de l'interface locale lif_status du programmeSAPBC402_AOOD_WAITLISTS. Elle contient un affichage de déclaration de la méthode. Cettemé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 trouverezdes informations détaillées dans les sections suivantes. Le comptoir cnt_look_for correspond austatut spécifique d'un employé.

Cette méthode d'interface doit à présent être mise en œuvre dans les deux classes. Cependant, l'interfacedoit préalablement être déclarée dans la section publique des classes.

Page 202: BC402 4.6a fr

(C) SAP AG BC402 8-26

SAP AG 1999

Exemple : mises en œuvre

CLASS lcl_waitlist IMPLEMENTATION....METHOD lif_status~display.CALL FUNCTION 'BC402_AOOD_WAIT_DISPLAY'

EXPORTINGip_waitlist = wait_list

EXCEPTIONSlist_empty = 1OTHERS = 2.

...ENDMETHOD.

ENDCLASS.

CLASS lcl_clerk IMPLEMENTATION....METHOD lif_status~display.MESSAGE i194 WITH cnt_look_for ... .

ENDMETHOD.

ENDCLASS.

CLASS lcl_waitlist IMPLEMENTATION....METHOD lif_status~display.CALL FUNCTION 'BC402_AOOD_WAIT_DISPLAY'

EXPORTINGip_waitlist = wait_list

EXCEPTIONSlist_empty = 1OTHERS = 2.

...ENDMETHOD.

ENDCLASS.

CLASS lcl_clerk IMPLEMENTATION....METHOD lif_status~display.MESSAGE i194 WITH cnt_look_for ... .

ENDMETHOD.

ENDCLASS.

� Dans la liste d'attente, le statut apparaît en appelant un module fonction qui affiche la liste dans uneboite de dialogue modale.

� Dans la classe des employés, la méthode d'interface est mise en œuvre différemment et une méthodecontenant des informations sur le statut de l'employé apparaît.

Page 203: BC402 4.6a fr

(C) SAP AG BC402 8-27

SAP AG 1999

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

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

i_status1 TYPE REF TO lif_status.

CREATE OBJECT o_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

i_status1 = o_list1.

CREATE OBJECT o_clerk1.

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

i_status1 TYPE REF TO lif_status.

CREATE OBJECT o_list1EXPORTING im_carrid = 'LH'

im_connid = '400'im_fldate = '19991119'.

i_status1 = o_list1.

CREATE OBJECT o_clerk1.

o_list1

i_status1

5<LCL_WAITLIST>

3<LCL_CLERK>

o_clerk1

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ôtqu'à une classe. Le type de variable de référence peut contenir des références à des objets de touteclasse 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 objetde la classe lcl_clerk, les composantes de l'interface auraient un comportement différent lors deleur accès.

Page 204: BC402 4.6a fr

(C) SAP AG BC402 8-28

SAP AG 1999

Appel de méthodes d'interface

* affichage du statut de la liste d'attente :*********************************************CALL METHOD o_list1->lif_status~display.* ou :CALL METHOD i_status1->display.

* affichage du statut de la liste d'attente :*********************************************CALL METHOD o_list1->lif_status~display.* ou :CALL METHOD i_status1->display.

i_status1->display appellele module fonction

* affichage du statut de l'employé :************************************CALL METHOD o_clerk1->lif_status~display.* ou :i_status1 = o_clerk1.CALL METHOD i_status1->display.

* affichage du statut de l'employé :************************************CALL METHOD o_clerk1->lif_status~display.* ou :i_status1 = o_clerk1.CALL METHOD i_status1->display.

i_status1->display affichele message

o_list1

i_status1

5<LCL_WAITLIST>

3<LCL_CLERK>

o_clerk1

� Si une référence de classe <réfc> pointe vers une instance de classe, vous pouvez appeler laméthode <méth> d'une interface <intf> mise en œuvre par la classe à l'aide de la formulationCALL 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 uneinstance de classe, vous pouvez appelez la méthode <méth> de l'interface <intf> à l'aide de laformulation 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.

Page 205: BC402 4.6a fr

(C) SAP AG BC402 8-29

SAP AG 1999

Résumé

� Déclaration des variables de référence

� Création d'objets

� Accès aux attributs et appel de méthodes

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

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

CREATE OBJECT <réfc> ... .CREATE OBJECT <réfc> ... .

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

CALL METHOD: <réfc>-><méthode> ... ,<réfc>-><interface>~<méthode> ... ,<réfi>-><méthode> ... .

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

CALL METHOD: <réfc>-><méthode> ... ,<réfc>-><interface>~<méthode> ... ,<réfi>-><méthode> ... .

Page 206: BC402 4.6a fr

(C) SAP AG BC402 8-30

SAP AG 1999

ABAP Objects : sujets avancés

� Méthodes fonctionnelles

� Attributs et méthodes statiques (y compris le constructeurstatique)

� Classes globales

� Interfaces globales

� Héritage

Les sujets répertoriés ci-dessus constituent une suite logique de l'étape actuelle. Cependant, il n'est paspossible 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).

Page 207: BC402 4.6a fr

(C) SAP AG BC402 8-31

SAP AG 1999

Événements

2<HANDLER>

1<HANDLER>

1<RAISER>

� Les événements sont des composantes des classes

� Les méthodes peuvent déclencher les événements de leurclasse

� Les méthodes de traitement peuvent réagir aux événements

ABAP Objects est doté d'une fonction spécifique vous permettant de déclencher des événements et d'yréagir. Les événements de ABAP Objects ne doivent pas être confondus avec les événements del'environnement d'exécution et surviennent lors du traitement du dialogue utilisateur (référez-vous auchapitre Environnement d'exécution ABAP).

Un événement contenu dans une orientation objet peut être déclenché par un objet individuel pourindiquer, 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'estpas nécessaire d'appeler de manière explicite. En fait, ils sont appelés de manière implicite lors dudé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 etinversement. Les objets déclenchent des événements sans savoir si un destinataire les recevra etcomment il y réagira. Inversement, les destinataires sont enregistrés pour des événements sans savoir sil'é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'aidedu paramètre sender.

Page 208: BC402 4.6a fr

(C) SAP AG BC402 8-32

SAP AG 1999

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.

� Déclarez les événements en tant que composantes d'une classe dans la partie déclaration. Ils peuventcomporter des paramètres d'export à transmettre par valeur.

� Pour déclencher un événement dans une méthode, utilisez l'instruction RAISE EVENT. Transmetteztous ses paramètres (excepté ceux définis comme facultatifs) à l'aide de l'option EXPORTING.

Page 209: BC402 4.6a fr

(C) SAP AG BC402 8-33

SAP AG 1999

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.

Toutes les classes peuvent contenir des méthodes de traitement des événements pour des événementssélectionnés de classes sélectionnées. Ces méthodes réagissent aux événements lorsqu'ils sontdé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 enquestion. Les attributs du paramètre proviennent de l'événement (leurs types ne sont pas spécifiés demanière explicite). Il n'est pas nécessaire que la méthode de traitement reçoive tous les paramètrestransmis dans l'instruction RAISE EVENT.

� Les événements comportent un paramètre implicite appelé sender pouvant également être reçu en lerépertoriant dans l'option IMPORTING. La méthode de traitement peut ainsi accéder au déclencheuret 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 instancesde la classe à gérer l'événement.

Page 210: BC402 4.6a fr

(C) SAP AG BC402 8-34

SAP AG 1999

Vue d'ensemble

CLASS c1 DEFINITION. PUBLIC SECTION.

EVENTS e1 EXPORTING VALUE(p1)TYPE i.

METHODS m1.

PRIVATE SECTION.DATA a1 TYPE i.

ENDCLASS.

CLASS c1 IMPLEMENTATION.METHOD m1.a1 = ...RAISE EVENT e1

EXPORTING p1 = a1.ENDMETHOD.

ENDCLASS.

CLASS c2 DEFINITION. PUBLIC SECTION.

METHODS m2 FOR EVENT e1 OF c1IMPORTING p1.

PRIVATE SECTION.DATA a2 TYPE i.

ENDCLASS.

CLASS c2 IMPLEMENTATION.METHOD m2.

...a2 = p1....

ENDMETHOD.ENDCLASS.

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

� Dans l'exemple ci-dessus, la classe c1 contient un événement e1, qui exporte un nombre entier lorsde 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 importerune valeur. Au moment de l'exécution, ce paramètre de la méthode m2 est affecté au type I.

Page 211: BC402 4.6a fr

(C) SAP AG BC402 8-35

SAP AG 1999

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.

Pour qu'une méthode de traitement des événements réagisse à un événement, spécifiez au moment del'exécution le (les) déclencheur(s) (objet ou objets) auquel (auxquels) elle doit réagir. Lorsque vousdé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 SETHANDLER. Pour les événements d'instance, utilisez l'option FOR pour spécifier l'instance dedéclenchement pour laquelle vous souhaitez enregistrer le traitement :

� Vous pouvez enregistrer une instance de déclenchement individuelle à l'aide d'une variable deréférence (dans cet exemple, o_raiser).

� Vous pouvez également enregistrer le traitement de toutes les instances à l'aide de l'option FORALL INSTANCES. Cet enregistrement comprend également des instances de déclenchementpotentielles 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 pouvezdé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

Page 212: BC402 4.6a fr

(C) SAP AG BC402 8-36

SAP AG 1999

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-connidvalue(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 = carridex_connid = connidex_fldate = fldate.

...ENDMETHOD.

ENDCLASS.

L'exemple ci-dessus illustre une extension de la liste d'attente. Si le nombre d'entrées dans la liste atteintune valeur maximale spécifique, la liste d'attente déclenche alors un événement. Une foisl'é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.

Page 213: BC402 4.6a fr

(C) SAP AG BC402 8-37

SAP AG 1999

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.

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 lesinstances de la classe lcl_waitlist déclenchent l'événement list_full. La méthodechange_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éthodechange_planetype, les paramètres reçus lors de l'exécution peuvent également être affichésavec le message.

Page 214: BC402 4.6a fr

(C) SAP AG BC402 8-38

SAP AG 1999

Exemple : enregistrement des traitementsd'é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.

Une fois l'instance o_clerk1 de la classe lcl_clerk créée, vous pouvez enregistrer les méthodesde l'objet afin qu'elle réagissent aux événements déclenchés par l'objet o_list1. Si les méthodes nesont 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 ledéclenchement d'événements, l'employé peut uniquement réagir aux événements de la liste d'attenteo_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'enregistrezpas 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 sesméthodes de traitement. Vous constatez ainsi que la technique d'enregistrement des événements est trèsflexible.

Page 215: BC402 4.6a fr

(C) SAP AG BC402 8-39

SAP AG 1999

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

CLASS-POOL ... .

TYPES:...

CLASS ... IMPLEMENTATION....

ENDCLASS.

CLASS ... DEFINITION....

ENDCLASS.

Type K

CLASS-POOL ... .

TYPES:...

INTERFACE ... DEFINITION....

ENDINTERFACE.

Générateur de classes

Type J

Le Générateur de classes est un outil de ABAP Workbench utilisé pour créer des interfaces et desclasses globales. Définissez les composantes à l'aide de l'interface graphique, le Générateur de classesgénère ensuite automatiquement le code source ABAP correspondant. Écrivez la partie mise en œuvrede 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ésgroupes de classes (programme de type K). Les interfaces globales sont stockées dans des groupesd'interfaces (programme de type J). Chaque groupe de classes ou d'interfaces contient la définitiond'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 instructionsdéclaratives et exécutables qui ne peuvent pas être lancées directement. Utilisez l'instruction CREATEOBJECT 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ôlesEnjoySAP), expliquent d'autres variantes de syntaxe utilisées dans ABAP Objects, ainsi que le moded'utilisation des classes globales.

Il existe également un cours, le BC404, dédié à ABAP Objects - Programmation orientée objet dansR/3.

Page 216: BC402 4.6a fr

(C) SAP AG BC402 8-40

SAP AG 1999

� De déclarer et de mettre en œuvre des classeslocales

� 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

Vous êtes maintenant capable :

Introduction à ABAP Objects : résumé du chapitre

Page 217: BC402 4.6a fr

(C) SAP AG BC402 9-1

SAP AG 1999

� Techniques d'appel de programmes

� Modèle de mémoire

� Techniques de passation de paramètres

� Utilisation

Contenu :

Appel de programmes et passation de paramètres

Page 218: BC402 4.6a fr

(C) SAP AG BC402 9-2

SAP AG 1999

� 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 lapassation des paramètres

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

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

Page 219: BC402 4.6a fr

(C) SAP AG BC402 9-3

SAP AG 1999

BC402 - Appel de programmes et passation deparamè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

Page 220: BC402 4.6a fr

(C) SAP AG BC402 9-4

SAP AG 1999

Appels de programmes synchrones

22

11

Mémoireprincipale

22

11

Mémoireprincipale

11

Démarrage du nouveau programme

Appel du nouveauprogramme

Fin du programmeappelé 11

22

Programme 1

Programme 2

Temps

Il existe deux méthodes de lancement d'un programme ABAP à partir d'un autre programme ABAP encours 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 uniquementde 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 surcette technique, référez-vous au cours BC415 (ABAP Workbench - Interfaces de communication)et à la documentation relative à l'instruction CALL FUNCTION … STARTING NEW TASK….

Page 221: BC402 4.6a fr

(C) SAP AG BC402 9-5

SAP AG 1999

Modèle de mémoire logique

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

Mode interne 1.2

Programme 1.2

La structure de la mémoire principale, du point de vue du programme, peut être représentée facilementdans 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 externesen 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 propremode 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 enfonction des différents appels.

Page 222: BC402 4.6a fr

(C) SAP AG BC402 9-6

SAP AG 1999

Insertion d'un programme I

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

Page 223: BC402 4.6a fr

(C) SAP AG BC402 9-7

SAP AG 1999

Insertion d'un programme II

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

Mode interne 1.2

Programme 1.2Programme 1.2

Lors de l'insertion d'un programme, le système crée un nouveau mode interne contenant le nouveaucontexte du programme.

Le nouveau mode est inséré sur la pile. Le contexte du programme appelant demeure également sur lapile.

Page 224: BC402 4.6a fr

(C) SAP AG BC402 9-8

SAP AG 1999

Fin de l'insertion du programme

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

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.

Page 225: BC402 4.6a fr

(C) SAP AG BC402 9-9

SAP AG 1999

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

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mémoire SAP

Session utilisateur

Mode interne 1.2

Programme 1.2

Mode interne 1.3

Programme 1.3

Mode interne 2.1

Programme 2.1

Lorsque vous terminez un programme et que vous en lancez un autre, opérez une distinction entrel'appel d'un programme exécutable et l'appel d'une transaction.

Page 226: BC402 4.6a fr

(C) SAP AG BC402 9-10

SAP AG 1999

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

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mémoire SAP

Session utilisateur

Mode interne 1.2

Programme 1.2

Mode interne 1.3

Programme 1.3Programme 1.3

Mode interne 2.1

Programme 2.1

Si vous lancez un programme exécutable à l'aide de son nom, le mode interne du programme quevous 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. Lemode interne supérieur sur la pile est remplacé.

Page 227: BC402 4.6a fr

(C) SAP AG BC402 9-11

SAP AG 1999

Lancement d'une transaction I

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mémoire SAP

Session utilisateur

Mode interne 1.2

Programme 1.2

Mode interne 1.3

Programme 1.3

Mode interne 2.1

Programme 2.1

Page 228: BC402 4.6a fr

(C) SAP AG BC402 9-12

SAP AG 1999

Lancement d'une transaction II

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mémoire SAP

Session utilisateur

Mode interne 2.1

Programme 2.1

Si vous lancez un programme à l'aide de son code de transaction (le cas échéant), tous les modesinternes 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.

Page 229: BC402 4.6a fr

(C) SAP AG BC402 9-13

SAP AG 1999

Appel de modules fonction I

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

Lorsque vous appelez un module fonction, le runtime system ABAP vérifie si un module fonction adéjà été appelé à partir du même groupe de fonctions dans le programme courant.

Page 230: BC402 4.6a fr

(C) SAP AG BC402 9-14

SAP AG 1999

Appel de modules fonction II

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

Mémoire SAP

Session utilisateur

Groupe deGroupe defonctionsfonctions

� Dans le cas contraire, le système charge le groupe de fonctions approprié dans le mode interne duprogramme appelant. Ses données globales sont initialisées et l'événement LOAD-OF-PROGRAMest déclenché.

� Si votre programme a déjà utilisé un module fonction du même groupe de fonctions avant l'appel, cegroupe de fonctions réside déjà dans le mode interne et le nouvel appel peut accéder aux mêmesdonnées globales. Ainsi, le groupe de fonctions demeure actif jusqu'à ce que le programmel'ayant appelé se termine.

Les données sont uniquement visibles dans le programme correspondant (chaque programme peuttraiter uniquement ses propres données, même si des objets appelés de manière identique existentdans les deux programmes). Il en est de même lorsque la pile est étendue. Si un programme estajouté à la pile qui appelle un module fonction à partir d'un groupe de fonctions déjà appelé par unautre programme, le groupe de fonctions est à nouveau chargé dans le nouveau mode interne. Lesystè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 legroupe de fonctions a été chargé.

Le graphique illustre le premier appel vers un module fonction dans un groupe de fonctions spécifique.

Page 231: BC402 4.6a fr

(C) SAP AG BC402 9-15

SAP AG 1999

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

Programme 1

...SUBMIT <nom_prog_2>....

...SUBMIT <nom_prog_2>

AND RETURN....

...SUBMIT <nom_prog_2>

VIA SELECTION-SCREENAND RETURN.

...

<nom_prog_2>PROGRAM ......

Liste

Écran de sélection

Programme 2

F3

F3F3

<nom_prog_2>PROGRAM ......

Liste

F3

<nom_prog_2>PROGRAM ......

Liste

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

Page 232: BC402 4.6a fr

(C) SAP AG BC402 9-16

SAP AG 1999

Appel d'une transaction

SAPM<nom_t>

...LEAVE PROGRAMLEAVE PROGRAM.....

Programme 1

...LEAVE TO TRANSACTIONLEAVE TO TRANSACTION '<CODE_T>''<CODE_T>'[AND SKIP FIRST SCREEN].[AND SKIP FIRST SCREEN]....

1er dynpro

2nd dynpro

F15

Programme 2 : transaction <CODET><CODET>

SAPM<nom_t>

...LEAVE PROGRAMLEAVE PROGRAM.....

...CALL TRANSACTIONCALL TRANSACTION '<CODE_T>''<CODE_T>'[AND SKIP FIRST SCREEN].[AND SKIP FIRST SCREEN]....

1er dynpro

2nd dynpro

F15

Lorsque vous utilisez l'instruction LEAVE TO TRANSACTION '<CODE_T>', le système termine leprogramme 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 avecun code de transaction dans la chaîne d'appel.

Pour terminer un programme ABAP, utilisez l'instruction LEAVE PROGRAM. Si l'instruction survientdans 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 programmeappelant. 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 dedynpro 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 destechniques 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 plusd'informations, référez-vous au cours BC414 (Programmation des mises à jour de la base dedonnées) et à la documentation en ligne.

Page 233: BC402 4.6a fr

(C) SAP AG BC402 9-17

SAP AG 1999

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

Programme A 11

44

BDBD

Interface

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

Mémoire ABAP

22

33

Programme B

55

Il existe différentes manières de passer des paramètres aux programmes exécutés dans des modesinternes 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 dubuffer 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 deprésentation, référez-vous à la documentation relative aux modules fonction WS_UPLOAD etWS_DOWNLOAD.

Page 234: BC402 4.6a fr

(C) SAP AG BC402 9-18

SAP AG 1999

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

Programme A

Don

nD

onn é

esées

Programme B

Écran de sélection standard

Programme AD

onn

Don

n éesée

s EXPORTATIONIMPORTATION

EXCEPTIONS

ou

Interface

Interface

Module fonction

Les modules fonction comportent une interface utilisée par le programme appelant et le modulefonction permettant d'échanger des données. Les sous-programmes utilisent également une techniquesimilaire. 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 pouvezpasser des paramètres pour les zones de saisie dans l'appel. Cette opération s'effectue de deuxmaniè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

Page 235: BC402 4.6a fr

(C) SAP AG BC402 9-19

SAP AG 1999

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|... < va} <val>WITH <opt_sél> EQ|NE|... < va l> SIGN } <val> SIGN {'I'|'E'}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>... .

MODULE user_command_0200 INPUT....CASE save_ok.WHEN 'COORDFR'.

SUBMIT sapbc402_tabd_hashedWITH pa_city = sdyn_conn-cityfromWITH pa_ctry = sdyn_conn-countryfrAND RETURN.

...ENDCASE.

ENDMODULE. " USER_COMMAND_0200 INPUT

WITHWITHWITHWITH

SUBMITSUBMIT

AND RETURNAND RETURN

==

==

Insertion du modèle. . .

Autre modèle SUBMIT

. . .

. . .

L'option WITH contenue dans l'instruction SUBMIT vous permet d'affecter des valeurs aux zones dansun écran de sélection standard. Les abréviations "EQ, NE, … , I, E" ont la même signification quepour les options de sélection.Pour transférer plusieurs délimitations à une option de sélection, utilisez l'instruction RANGES plutôtque les options WITH individuelles. Cette instruction crée une table de sélection que vous pouvezrenseigner 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 del'appel du programme.

Dans l'instruction SUBMIT, utilisez la fonction Modèle dans l'Éditeur ABAP pour insérer un modèled'instruction approprié au programme à appeler. Il fournit automatiquement les noms des paramètres etdes 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'utilisateurdemande les coordonnées d'une ville, le programme exécutable SAPBC402_TABD_HASHED estappelé. Les paramètres sont renseignés avec la ville et l'indicatif pays de la transaction. L'écran desélection standard n'apparaît pas.

Pour plus d'informations sur l'utilisation des variantes et sur d'autres variantes de syntaxe de l'optionWITH, référez-vous à la documentation relative à l'instruction SUBMIT.

Page 236: BC402 4.6a fr

(C) SAP AG BC402 9-20

SAP AG 1999

Mémoire ABAP et mémoire SAP

Mode externe (fenêtre) 1

Mém

oire

AB

AP

1

Mode interne 1.1

Programme 1.1

Mode externe (fenêtre) 2

Mém

oire

AB

AP

2

Mode interne 2.1

Programme 2.1

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

Session utilisateur

Mode interne 1.2

Programme 1.2

Mode interne 2.2

Programme 2.2

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 stockerdes valeurs de zone. Il s'agit uniquement d'une valeur limitée pour la passation des paramètres entreles modes internes. Les valeurs contenues dans la mémoire SAP sont conservées pendant toute lasession utilisateur. La mémoire peut être utilisée entre les modes dans une même session. Vouspouvez utiliser le contenu de la mémoire SAP comme des valeurs par défaut pour les zones dedynpro. 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 pourchaque 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 ABAPcorrespondante est initialisée ou libérée automatiquement.

Page 237: BC402 4.6a fr

(C) SAP AG BC402 9-21

SAP AG 1999

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

PROGRAM p1 ... .DATA: p1_spfli TYPE spfli,

it_spfli TYPE STANDARD TABLEOF spfli.

...

PROGRAM p2 ... .DATA: p2_spfli TYPE spfli,

it_spfli TYPE STANDARD TABLEOF spfli.

...

wa_fli

it_spfli

MY_ID

Mémoire ABAP

MY_ID1 ...

EXPORTEXPORTwawa__flifli FROM p1_spfliFROM p1_spfliit_spfliit_spfliTO MEMORY ID 'MY_ID'.TO MEMORY ID 'MY_ID'.

IMPORTIMPORTwawa__flifli TO p2_spfliTO p2_spfliit_spfliit_spfliFROM MEMORY ID 'MY_ID'.FROM MEMORY ID 'MY_ID'.

Mode interne 1

Mode interne 2

Utilisez l'instruction EXPORT … TO MEMORY pour copier un nombre illimité de variables ABAP etleurs valeurs correctes (cluster de données) dans la mémoire ABAP. L'option ID… (32 caractèresmaximum) vous permet d'identifier différents clusters.Si vous utilisez une nouvelle instruction EXPORT TO MEMORY pour un cluster de données existant, lanouvelle instruction remplace l'ancienne.

L'instruction IMPORT… FROM MEMORY ID… vous permet de copier des données de la mémoireABAP vers les zones correspondantes de votre programme ABAP. Dans l'instruction IMPORT, vouspouvez é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 doiventcomporter 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 pouvezuniquement utiliser la mémoire ABAP pour la passation des paramètres vers la transaction.

Page 238: BC402 4.6a fr

(C) SAP AG BC402 9-22

SAP AG 1999

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

MMémoire SAPémoire SAPCARCAR LH

Cgnie aér.N° vol

LH ou

ou

Programme BProgramme B

Cgnie aér.N° vol

LH

SET!

GET!

CONCON 400

400

400

SET PARAMETER ID'CON' FIELD sdyn_conn-connid.

CALL TRANSACTION'BC402_TABD_SORT'.

GET PARAMETER ID'CON' FIELD sdyn_conn-connid.

Programme AProgramme A

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 duparamè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 pouvezensuite choisir si les entrées de la zone doivent être transférées vers le paramètre (SET) ou si la zonede 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 lazone (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'instructionGET PARAMETER ID '<PAR_ID>' FIELD <var>.

� Vous pouvez également définir des paramètres à l'aide de Object Navigator, puis les renseigner avecdes valeurs.

Cet exemple illustre un extrait de la transaction BC402_CALD_CONN. Lorsque l'utilisateur gère lestemps de vol, le programme appelle la transaction BC402_TABD_SORT. Le nom de la compagnieaé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).

Page 239: BC402 4.6a fr

(C) SAP AG BC402 9-23

SAP AG 1999

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

SAPM<nom_t>

...LEAVE PROGRAM.LEAVE PROGRAM....

1er dynpro2nd dynpro

F15

Programme 2 : transaction <CODE_T><CODE_T>Programme 1

...DATA:

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

* renseignement de <bi_tabi>...

* appel d'un autre programmeCALL TRANSACTION '<CODE_T>'CALL TRANSACTION '<CODE_T>'

USING <bi_tabi>.USING <bi_tabi>.IF sy-subc = 0....ELSE....

<bi_tabi>

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 pardéfaut) uniquement lorsqu'une erreur survient ('E') ou pas du tout ('N'). L'option MESSAGEINTO <tabi_mess> vous permet de spécifier une table interne dans laquelle un message systèmedoit ê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 égalementnormalement 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.

Page 240: BC402 4.6a fr

(C) SAP AG BC402 9-24

SAP AG 1999

Zones dans le type global BDCDATA

fnamfnamdynprodynproprogramprogram

Signification :

dynbegindynbegin

Nom duprogramme

Nom de zone :Nom de zone : fvalfval

132132444040 11Longueur :Longueur : 132132

RenseignéeUniquement pour

le 1erenregistrement

du nouveaudynpro

Numéro dedynpro

1er enregis. Nom dezone

Valeur dezone

Uniquement pourle 1er

enregistrementdu nouveau

dynpro

'X' pour le 1erenregistrementsur le dynpro

sinon ' '

Majuscules/minuscules

Renseignement de la table interne au format batch input.

� Chaque dynpro que vous souhaitez traiter automatiquement dans la transaction doit être identifié parune 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 pourchaque zone à renseigner. Ces enregistrements utilisent les zones fnam et fval. Vous pouvezrenseigner 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 documentationen ligne.

Page 241: BC402 4.6a fr

(C) SAP AG BC402 9-25

SAP AG 1999

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

fnamfnamdynprodynproprogramprogram dynbegindynbegin

SAPBC402_CALD_CREATE_CUSTOMER

fvalfval

0100 X

SCUSTOM-NAME <nom_courant>

SCUSTOM-CITY <ville_courante>

BDC_OKCODE SAVE

Sauvegarde

Indique l'entrée dansla zone de commande

DATA:wa_bdcdata TYPE bdcdata,it_bdcdata LIKE TABLE OF wa_bdcdata.

*** renseignement de la table bdcdata ...

CALL TRANSACTION 'BC402_CALD_CRE_CUST'USING it_bdcdataMODE 'N'.

IF sy-subrc <> 0.MESSAGE ... WITH sy-subrc.

ENDIF.

bdcdatabdcdata

USINGUSINGMODEMODE

L'exemple ci-dessus se réfère à la transaction BC402_FMDD_FG. Lorsque l'utilisateur crée unenouvelle entrée client, le programme appelle la transaction BC402_CALD_CRE_CUST. Cettetransaction n'a pas mis en œuvre l'importation à partir de la mémoire ABAP et ses zones de saisie nesont pas définies en tant que paramètres GET. Les données client sont, par conséquent, passées à l'aided'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 lecode de fonction déclenché par l'utilisateur à l'aide d'une touche de fonction, d'un bouton de commandeou d'un point de menu en mode dialogué (ou en saisissant un code directement dans la zone decommande).

Page 242: BC402 4.6a fr

(C) SAP AG BC402 9-26

SAP AG 1999

� 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 lapassation des paramètres

Vous êtes maintenant capable :

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

Page 243: BC402 4.6a fr

(C) SAP AG BC402 9-27

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 votreactivité consiste à écrire des programmes d'analyse pour plusieurscompagnies 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 descompagnies aériennes saisies sur l'écran de sélection s'il est autorisé à visualiser lesdonné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 cliqueou double-clique sur une ligne, puis appuie sur <F2>. Ajoutez un bloc événementapproprié à votre programme.

1-3 Programmez un appel à votre programme exécutable Z##_BC402_COUNTLIST2ou la solution de modèle SAPBC402_TABS_COUNTLIST2 (utilisez la fonctionModè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 derenvoyer le programme d'origine.

Page 244: BC402 4.6a fr

(C) SAP AG BC402 9-28

Page 245: BC402 4.6a fr

(C) SAP AG BC402 9-29

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 transporteursautorisés:**********...

...

* renseignement d'une table interne avec les données decorrespondance et de vol pour les transporteurs autorisés :***********************************************************...

...

Page 246: BC402 4.6a fr

(C) SAP AG BC402 9-30

* renseignement de toutes les tables internes avec d'autrestypes d'avions :****************

...

...

PERFORM display_flights CHANGING it_flights.

AT LINE-SELECTION.

* affichage de la liste des comptoirs de tous les transporteursautorisé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.