Vous êtes sur la page 1sur 99

B-INTEGRATION.

NET

B-BOOK: LA REFERENCE DE B-INTEGRATION.NET SAP ET .NET POUR LES DEVELOPPEURS


AUTO-FORMATION A ABAP.

Mention lgale : Les marques SAP, ABAP, WEBDYNPRO sont la proprit de la socit SAP.

VERSION : 0.0.2 : AJOUT SELECTION-SCREEN AVANC ET MATH


Auteur(s) : Jrme Fortias (tout sauf) ( Celdron ) ->Selection-screen avanc.en cours dintgration. Correcteurs : Adil ZERROUKI. (correction en cours dintgration)

CONTENU
PARTIE N1 : SAP ..................................................................................................................................................... 9 Introduction ............................................................................................................................................................ 9 HELLO WORLD EN ABAP .......................................................................................................................................... 9 Les variables .......................................................................................................................................................... 14 Premier programme : VARIABLE INTEGER ........................................................................................................ 15 Une modification amusante : AUTOBOXING..................................................................................................... 15 Dclaration de plusieurs variables en une seule ligne ...................................................................................... 16 Liste des diffrents types techniques en ABAP ................................................................................................. 16 Types textes .................................................................................................................................................. 16 Types numriques. ........................................................................................................................................ 17 Les structures. ............................................................................................................................................... 17 Types mtiers SAP : ........................................................................................................................................... 19 Types mtiers : .............................................................................................................................................. 19 Types drivs des tableaux ........................................................................................................................... 20 Bonne Pratique ............................................................................................................................................. 21 Les bases du langage ABAP ................................................................................................................................... 22 ABAP IF / ELSE / ELSEIF / ENDIF ......................................................................................................................... 22 IF et les oprateurs ........................................................................................................................................... 23 Les boucles en ABAP : DO. ................................................................................................................................ 24 Les boucles en ABAP : WHILE. ........................................................................................................................... 24 Le switch en ABAP : CASE / WHEN / ENDCASE.................................................................................................. 25 Le Foreach en ABAP : Le LOOP ... AT ................................................................................................................. 25 COMMENTAIRES EN ABAP. ............................................................................................................................... 25 ABAP Fonctions et sous-routines .......................................................................................................................... 26 ABAP - FORM / PERFORM : ............................................................................................................................... 26 ABAP - Les fonctions :........................................................................................................................................ 28 Cration d'un groupe de fonction ABAP ....................................................................................................... 28

Etape n2 : Cration d'une fonction en ABAP ............................................................................................... 30 Appeler sa fonction depuis un programme ABAP (ou une autre fonction). ................................................. 35 A propos des BAPI SAP : .................................................................................................................................... 36 Conclusion ......................................................................................................................................................... 37 ABAP : Tables et SQL ............................................................................................................................................. 38 Cration de Ztable avec SE11 ............................................................................................................................ 38 Le scnario (notre table Z) : .............................................................................................................................. 38 Dmarrage de la transaction SE11 : .................................................................................................................. 38 Cration de la table ........................................................................................................................................... 39 Cration des champs de la table Z SAP ............................................................................................................. 40 Paramtrages techniques de la table sur SAP ................................................................................................... 42 Utilisation de la table avec SE16 ....................................................................................................................... 44 Utilisation de la table avec SE16N ..................................................................................................................... 45 INITIATION A ABAP SQL ......................................................................................................................................... 47 SQL - Exercice N1 : Lecture de donnes........................................................................................................... 47 SQL Exercice N2 : Lecture avec chargement dans un "dataset". ..................................................................... 47 SQL Exercice N3 : Utilisation de la condition WHERE. ..................................................................................... 48 Combinaison de conditions ............................................................................................................................... 49 SQL Exercice N4 : Tri de la slection avec ORDER ............................................................................................ 49 SQL Exercice N5 : SY-DBCNT ............................................................................................................................ 50 SQL Exercice N6 : SY-SUBRC ............................................................................................................................. 50 SQL Exercice n7 : Insertion de donnes. .......................................................................................................... 51 SQL Exercice N8 : Ajout de plusieurs lignes ..................................................................................................... 52 SQL Exercice N9 : Mise jour de donnes (UPDATE). ..................................................................................... 53 Exercice N10 : Suppression de donnes .......................................................................................................... 54 Optimisation avec SE30 ..................................................................................................................................... 55 ABAP SQL AVANCE ................................................................................................................................................ 56 AJOUT LIGNE PAR LIGNE ................................................................................................................................... 56 Ajout de plusieurs lignes via une table intermdiaire ....................................................................................... 56

Utilisation de MODIFY ........................................................................................................................................... 58 UTILISATION DE CURSOR ...................................................................................................................................... 58 OPTIMISATION (SUITE) .......................................................................................................................................... 60 NATIVE SQL vs OPEN SQL : .................................................................................................................................... 60 SQL et ANALYSE DES DIFFERENTES STRATEGIES ................................................................................................... 61 Stratgie n1 : Couples table interne + work area imbriqus. .......................................................................... 61 Stratgie n2 : On slectionne toutes les colones avec l'utilisation de SELECT-ENDSELECT. ........................... 61 Stratgie n3 : On ne slectionne que les champs qu'on dsire dans une structure entire ........................... 62 Stratgie n4 : Utilisation d'une table interne et d'un FOR ALL ENTRIES IN...................................................... 63 Stratgie n 5 : Utilisation d'une fonction SUM ................................................................................................ 63 Stratgie n6 : Utilisation d'un INNER-JOIN et d'une fonction SUM. ................................................................ 64 Stratgie n7 : ALternative propose par sebastien ........................................................................................... 64 Conclusion : Tout dpend des serveurs. ........................................................................................................... 64 Selection-Screen.................................................................................................................................................... 66 Exercice 1 : Un premier selection-screen. ......................................................................................................... 66 Exercice 2 : Des valeurs par dfaut ................................................................................................................... 68 Renommez le nom des champs ........................................................................................................................ 69 Ajoutez des boutons RADIO .............................................................................................................................. 70 Selection-screen avanc........................................................................................................................................ 71 Rendre des zones non-saisissables. .................................................................................................................. 72 Rendre des zones invisibles ............................................................................................................................... 73 Rendre des zones obligatoires ou non-obligatoires .......................................................................................... 74 A SUIVRE. ........................................................................................................................................................ 79 Cration dcran .................................................................................................................................................... 79 Amlioration de linterface des crans ............................................................................................................. 88 Introduction aux mathmatiques sur SAP en ABAP : ............................................................................................ 92 Un type de donne idal ................................................................................................................................... 93 Des fonctions pour manipuler des nombres en ABAP (dcimal) ...................................................................... 93 Fonctions pour les nombres flottants en ABAP sur SAP ................................................................................... 93

ABAP contre C# ................................................................................................................................................. 94 Quelle stratgie choisir ?................................................................................................................................... 95 Annexe : Sites web ................................................................................................................................................ 95 ANNEXE : Trucs et actuces .................................................................................................................................... 96 Les champs SY- .................................................................................................................................................. 96 Une popup pour une saisie dheure .................................................................................................................. 96 Afficher un XML ................................................................................................................................................. 97 ABAP IF IN RANGE ............................................................................................................................... 97 ABAP Grer un dlais ..................................................................................................................................... 97 ABAP POPUP ABAP ............................................................................................................................................ 98 ABAP ALVGRID Simple .................................................................................................................................... 99 Partie 2 : C# et bonne pratique ................................................................................. Error! Bookmark not defined. Introduction .............................................................................................................. Error! Bookmark not defined. Manipulation de caractres et de chaines de caractres : ................................... Error! Bookmark not defined. Obtenir un caractre par son numro UNICODE .............................................. Error! Bookmark not defined. Caractres spciaux .......................................................................................... Error! Bookmark not defined. Insertion de variable dans une chaine de caractres ........................................ Error! Bookmark not defined. Manipulation de NOMBRES .................................................................................. Error! Bookmark not defined. Types de donnes ............................................................................................. Error! Bookmark not defined. Suffixe pour les nombres .................................................................................. Error! Bookmark not defined. Constante .......................................................................................................... Error! Bookmark not defined. Contler une valeur .......................................................................................... Error! Bookmark not defined. Oprateurs mathmatique ............................................................................... Error! Bookmark not defined. Conversion de types de donnes ...................................................................... Error! Bookmark not defined. Instructions de contrle ........................................................................................ Error! Bookmark not defined. IF (SI).................................................................................................................. Error! Bookmark not defined. Switch (slection) .............................................................................................. Error! Bookmark not defined. Itration avec un While ..................................................................................... Error! Bookmark not defined. Itration avec un do + while .............................................................................. Error! Bookmark not defined.

InStruction FOR ................................................................................................. Error! Bookmark not defined. Utilisation dtiquettes et de goto .................................................................... Error! Bookmark not defined. Les patterns essentiels .............................................................................................. Error! Bookmark not defined. Le singleton ........................................................................................................... Error! Bookmark not defined. Introduction au singleton en c# : ...................................................................... Error! Bookmark not defined. Le concept de base du singleton ....................................................................... Error! Bookmark not defined. Quand utilisez un singleton ? ............................................................................ Error! Bookmark not defined. Le snippet de base d'un singleton multitreadable ............................................ Error! Bookmark not defined. Code exemple d'un singleton c# multitreadable .............................................. Error! Bookmark not defined. Conclusion ......................................................................................................... Error! Bookmark not defined. Le pattern MVP ......................................................................................................... Error! Bookmark not defined. Introduction au pattern MVP en C# .................................................................. Error! Bookmark not defined. Etape n1 : crons notre page web en webform .............................................. Error! Bookmark not defined. Etape n2 : Crons notre modle ...................................................................... Error! Bookmark not defined. Etape n3 : Crons notre prsentateur et son interface. .................................. Error! Bookmark not defined. Etape n4 : Intgration de notre prsentateur dans notre interface utilisateur............. Error! Bookmark not defined. Conclusion ......................................................................................................... Error! Bookmark not defined. NHIBERNATE laccs aux bases de donnes .............................................................. Error! Bookmark not defined. Introduction NHibernate : .................................................................................. Error! Bookmark not defined. Prrequis : ............................................................................................................. Error! Bookmark not defined. Premier exercice .................................................................................................. Error! Bookmark not defined. Etape n1 : Crons un projet nhibernate FirstApplication (application console) et ajoutons nos dlls......... Error! Bookmark not defined. Etape n2 : Crons notre modle de donne ........................................................ Error! Bookmark not defined. Etape n3 : Crons un mapping. ............................................................................ Error! Bookmark not defined. Etape n4 : Crons notre base de donnes. .......................................................... Error! Bookmark not defined. Etape n5 : Crons notre configuration la base de donnes. ............................. Error! Bookmark not defined. Etape n6 : Crons et lisons un record .................................................................. Error! Bookmark not defined. Second exercice ........................................................................................................ Error! Bookmark not defined.

Etape n1 : Modifions le config.cs ......................................................................... Error! Bookmark not defined. Etape n2 : Lisons le contenu de la table avec NHibernate ................................... Error! Bookmark not defined. Etape n3 : Ecrivons la mthode Create. ............................................................... Error! Bookmark not defined. Etape n4 : Ecrivons la mthode Update............................................................... Error! Bookmark not defined. Etape n5 : Ecrivons la mthode Read. ................................................................. Error! Bookmark not defined. Etape n6 : Ecrivons la mthode Delete. ............................................................... Error! Bookmark not defined. Etape n7 : Ecrivons la mthode DiplayAllPersons. ............................................... Error! Bookmark not defined. Etape n8 : Jouons maintenant. ............................................................................ Error! Bookmark not defined. conclusion ............................................................................................................ Error! Bookmark not defined. Castle windsor ........................................................................................................... Error! Bookmark not defined. Introduction Castle Windsor en C# .................................................................... Error! Bookmark not defined. Objectif du tutorial ................................................................................................ Error! Bookmark not defined. Etape n1 : Crons un webform avec .net 3.5 standard ....................................... Error! Bookmark not defined. Etape n2 : Crons nos interfaces et implmentations. ........................................ Error! Bookmark not defined. Etape n3 : Crons notre classe main ................................................................... Error! Bookmark not defined. Etape n4 : Appelons la classe main depuis le bouton de notre webform ........... Error! Bookmark not defined. Etape n5 : Crons un jeu de test .......................................................................... Error! Bookmark not defined. Conclusion ............................................................................................................. Error! Bookmark not defined. Tlchargement du tuto ....................................................................................... Error! Bookmark not defined. Liens relatifs Windsor Castle C# : .......................................................................... Error! Bookmark not defined. ERP Connect les bases du connecteur SAP.net ......................................................... Error! Bookmark not defined. Le dveloppeur et sa socit ...................................................................... Error! Bookmark not defined. Le produit .......................................................................................................... Error! Bookmark not defined. Prambule ......................................................................................................... Error! Bookmark not defined. Exemple n1 : BAPI_EMPLOYEE_GETDATA ........................................................... Error! Bookmark not defined. Exemple n2 : L'envoi d'iDoc. ................................................................................ Error! Bookmark not defined. Exemple n3 : RFC Server ...................................................................................... Error! Bookmark not defined. Impact sur les licenses utilisateurs SAP ................................................................. Error! Bookmark not defined. Conclusion ............................................................................................................. Error! Bookmark not defined.

C# et programmation rseau .................................................................................... Error! Bookmark not defined. Introduction la programmation rseau en C# .................................................... Error! Bookmark not defined. Lire un fichier XML .................................................................................................... Error! Bookmark not defined. Initiation c# XmlDocument ........................................................................ Error! Bookmark not defined. Chercher un noeud spcifique .............................................................................. Error! Bookmark not defined.

PARTIE N1 : SAP INTRODUCTION


Cela fait plusieurs annes que je travaille dans le monde ABAP et que jessaie daider mes contemporains avec plus ou moins de succs dcouvrir le monde SAP via le site web http://www.sap-integration.net devenue http://www.b-integration.net. Peut-tre par orgueil, ou par dfi, je dbute avec ce projet un nouveau projet. Celui dcrire avec plusieurs dveloppeurs un livre complet couvrant le plus de sujets possibles dans le domaine du dveloppement SAP. Une sorte de rfrence qui serait continuellement en construction et en volution avec laide de la communaut que jai cr. Bien sur il sagit dabord de commencer par le dbut. LABAP OLD SCHOOL.

HELLO WORLD EN ABAP


Je vous propose ici en prambule de ma srie de tuto consacrs ABAP, un premier tuto qui a pour objectif de dcouvrir l'interface de dveloppement SAP et de lever le voile sur un environnement spcifique avec sa logique propre. On se connecte SAP

L'cran SAP EASY ACCESS apparait... Dans la case en haut droite sous Menu tapez SE38 pour lancer l'environnement de programmation ABAP

L'cran SE38 apparait. Il permet d'accder aux sources des programmes. Tapez dans la case Program ZTUTO01 puis appuyez sur le bouton CREATE.

Un premire popup s'affiche... Slectionnez Excutable program ne remplissez pas les autres champs... Puis cliquez sur le bouton SAVE.

Une seconde popup apparait permettant d'informer le package ...et d'autres lments lis aux mcanismes de dploiement sur SAP. Dans notre cas notre application ne sera pas transport mais uniquement en local....Cliquez donc sur le bouton Local Object...

La fentre d'dition apparait

Le programme est vide... Remarquez le point (.) sur la mme ligne que REPORT ZTUTO01... Votre code devra tre insr la ligne suivante. Faites attention ne pas effacer ce point. Par contre vous pouvez supprimer l'espace entre ZTUTO01 et le point. Nous allons maintenant taper le code suivant

La fonction WRITE permet d'crire un texte ou un ensemble de textes et de variables la faon un printf en C, ou d'un println en Java...

Sur SAP, comme sur d'autres environnements on peut compiler et sauvegarder un programme. Dans le monde SAP on ne parle pas de compilation, mais d'activation. Une activation est une procdure un peu plus complte qu'une compilation, car elle intgre aussi bien la compilation que le dploiement et la gestion des autorisations. On peut ainsi dvelopper des programmes transportables (dployable sur d'autres systmes SAP comme un systme de test ou un systme de prod) ou dvelopper des programmes uniquement en local. Pour activer le programme sur la barre d'outil cliquez sur le bouton

Vous devez obtenir l'cran suivant.

Notez qu'en bas le texte Object activated est visible !!! Puis on teste son programme. Sur la barre d'outils cliquez sur L'cran suivant apparait...Votre Hello world fonctionne (OK c'est le programme le plus basic de la terre mais bon, c'est une tradition pour moi)...

LES VARIABLES
Comme tous les langages ABAP supportent diffrents types de variables. Mais le plus du langage ABAP comme SAP est d'tre orient surtout mtier. C'est dire que par exemple, un integer utiliser par exemple pour indiquer le nb d'article aura son propre type, et c'est le cas de l'ensemble des variables de SAP. Le but de cette premire leon est de faire le tour des diffrents types techniques, mais aussi de dcouvrir l'approche mtier de la dclaration de variables en ABAP.

PREMIER PROGRAMME : VARIABLE INTEGER


Dans ce premier programme, nous ralisons une addition. Simple et facile.

Notez que l'affectation se fait via un '=' et que la dclaration se fait via Data.

UNE MODIFICATION AMUSANTE : AUTOBOXING


Nous allons maintenant dcouvrir une capacit amusante dABAP, avec ce second exemple.

Comme vous le voyez la variable unsecondentierquiestunstring (long comme nom hein ?) n'est pas un entier mais une chaine de caractre. ABAP autorise l'addition entre un entier et une chaine de caractre de manire implicite condition que cette chaine de caractre soit convertissable en entier. Vous noterez que l'affectation d'une chaine de caractre se fait avec un signe = et avec une valeur mise entre quote ' et non pas entre guillemet comme en Java ou C#.

DCLARATION DE PLUSIEURS VARIABLES EN UNE SEULE LIGNE


En ABAP il est possible de dclarer plusieurs variables en une seule ligne. Si on reprend l'exemple prcdent voil ce que cela donne.

Dans ce cas nous utilisons le mot Data avec un double point Data: et chaque variable est spare par une virgule.

LISTE DES DIFFRENTS TYPES TECHNIQUES EN ABAP TYPES TEXTES


Chaine de caractre dfinie en taille (type C). Dclaration : Data chaineTexte(x). Note : x tant le nombre de caractre. 65535 caractres max. Chaine de caractre non dfini en taille (type string). Dclaration : Data chaineTexte type string. Note : Le pointeur est un integer 32 bits. Date (type D). Dclaration : Data madate type D. Note : Le format de la date est de type AAAAMMJJ. pour initialiser une variable la date du jour il suffit d'appeler la valeur DATUM dans le tableau SY. madate = sy-datum. Texte numrique (type N). Dclaration : Data monnombre type N.

Note : Ce type est utilis pour stocker des nombres sous forme de chaine de caractres comme, par exemple, des numeros de clients, ou de commandes. Heure (type T). Dclaration : Data horaire type T. Note : Ce type est construit avec le partern HHMMSS (heures+minutes+secondes). TYPES NUMRIQUES. Entier (type I). Dclaration : Date compteur type i. Note : nombre entier sur 32 bits. Flottant (type F). Dclaration : Date valeurmathematique type F. Note : nombre flottant cod sur 8 octets. Packed Number (type P). Dclaration : Date monnombre type P. Note : Valeur sur 8 octets. Le type Packed est un numrique avec virgule mais la virgule est position fixe, c..d que le nombre de digits aprs la virgule est fixe et non variable. LES STRUCTURES. Comme d'autres langages ABAP permet de crer des structures. C'est simple est trs utile (on y reviendrat sur le cour consacr aux tableaux.

Quand vous lancez le programme ... vous avez ceci ...

Voir aussi http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb2fcc358411d1829f0000e829fbfe/content.htm ou http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb2fd9358411d1829f0000e829fbfe/content.htm

TYPES MTIERS SAP : TYPES MTIERS :


Comme j'aime le rpter SAP est avant orient business. C'est pour cela qu'il est important de comprendre la notion de dictionnaire (accessible via la transaction SE11) qui fait le lien entre un le domaine associ le concept au sens smantique et le type technique. Ainsi quand on manipule une variable correspondant au numro de matriel dans MM, on n'utilise pas un digital de 18 caractres, mais un MATNR. On dclarera notre variable comme cela : Data monnumerodematos type MATNR. Il est possible d'accder au type et de crer ses propres type via la transaction SE11. Exemple : ici nous consultons le type MATNR. Etape 1 : On lance la transaction SE11.

Etape 2 : On saisit MATNR dans la transaction

Puis on clique sur Display ... ou F7

De l vous pouvez allez sur les onglets Attributes Further characteristics ou Field Label...

TYPES DRIVS DES TABLEAUX


L'une des autres plaisantes possibilits d'ABAP est que lorsqu'on manipule un tableau on peut rcuprer un type d'un champs du tableau trs simplement. Par exemple, si on souhaite crer une variable du mme type que le champs TRDAT (dernier logon) de la table USR02 il suffit de faire la dclaration suivante : Data dernierlogon like USR02-TRDAT. Dictionnaire montrant la structure du tableau USR02.

Reste que cette pratique ncessitant de dclarer aussi le tableau est de plus en plus remplac par une dclaration utilisant un type inscrit directement dans le dictionnaire.

BONNE PRATIQUE
Quand on dveloppe des applications, il est fortement conseill de crer de nouveaux types de data lment dans le dictionnaire. Non seulement cela donne un sens smantique aux variables qu'on utilise, mais en plus le travail de prparation amliore et l'analyse et la comprhension du travail qu'on a faire. En rsum sauf exception comme les indicateurs de boucle ou les compteurs il est fortement dconseill d'utiliser des types techniques.

LES BASES DU LANGAGE ABAP


Tous les langages sont construits sur des instructions de boucles et de conditions. Ce sont ces instructions que nous allons dcouvrir. On retrouve en gnral dans tous les langages les mmes types de test (if, case, for, ...) Ce sont ces fonctions que nous allons explorer.

ABAP IF / ELSE / ELSEIF / ENDIF


If permet de conditionner l'excution du bloc de code en fonction d'un test

Dans ce cas on teste si le champ valeur est gal au caractre X. Le code entre le IF et ELSE est excut uniquement si le test valeur = 'X' est vrai. Le code entre ELSE et ENDIF est excut uniquement si le test valeur = 'X' est faux. Parfois on a besoin de faire plusieurs tests avant d'avoir une action par dfaut (ELSE), pour cela on utilise le ELSEIF. Voici un exemple avec un ELSEIF. Note :Les if sont utiliss pour conditionner l'excution d'un code. Mais il est souvent trs intressant d'imbriquer des if les uns dans les autres. L'utilisation du ELSEIF permet de tester d'autres conditions, mais si les conditions s'appliquent la mme variable ( if monchar = 'a'. else if monchar = 'b'. (etc)... endif.) il est prfrable d'utiliser un CASE...

IF ET LES OPRATEURS
Il est possible de combiner des tests avec AND (les deux conditions doivent tre vraies) ou OR (au moins une condition doit tre vraie). de plus les oprateurs de tests sont : = gale < infrieure > suprieure ne diffrent on peut bien sur combiner => et <= . pour gal et suprieure ou gale et infrieure ...

Note : Si vous dveloppez des combinaisons de tests dans le if avec l'utilisation de AND et OR je vous conseille fortement d'crire sur une page de note une table de vrit. ( voir sur http://fr.wikipedia.org/wiki/Table_de_v%C3%A9rit%C3%A9 ). C'est simple utiliser et cela vite d'oublier un cas ou de se tromper dans ces tests.

LES BOUCLES EN ABAP : DO.


il est possible de faire des boucles avec un DO. Voici un premier exemple qui effectue, un nombre dtermin de boucle

Il est possible d'interrompre la boucle avec une instruction EXIT associ un IF par exemple. Note : En ajoutant un test avec un if il est possible de sortir d'un DO (et des boucles) avec une instruction EXIT.

LES BOUCLES EN ABAP : WHILE.


Dans ce cas la boucle boucle tant que la condition est vraie.

Note : Un WHILE est en fait une boucle avec un IF une sorte de DO infini avec un Exit si la condition est vraie. C'est la boucle la plus souvent utilise (en tout cas dans ce que j'ai fait comme boucle en ABAP).

LE SWITCH EN ABAP : CASE / WHEN / ENDCASE.

Afin d'viter une srie longue de tests IF, quand le test est le mme et seule la valeur vraie change, il est prfrable d'aller vers un CASE. Voici un exemple simple.

LE FOREACH EN ABAP : LE LOOP ... AT


Cette boucle spcifique aux tables est quivalente au foreach. Je traiterais cette instruction sur la partie consacre aux tables SAP.

COMMENTAIRES EN ABAP.
En ABAP il est possible de laisser des commentaires. On distingue deux types de commentaires. Les commentaires de lignes introduit par le signe *. Les commentaires en fin de ligne introduit par le signe guillemet ".

ABAP FONCTIONS ET SOUS-ROUTINES


Dans l'ensemble des langages de programmation la notion de fonction ou procdure ou encore mthode en objet est prsente. Cela consiste en fait gnrer des blocs de code qui sont appels pour excuter des tches rptitives. Sur SAP on distingue deux types cls : Les fonctions, et les routines (form). Ces dernieres sont contenues dans les programmes ABAP ou mme dans des fonctions. Les premieres sont gres spcifiquement vi la transaction SE37. Les fonctions sont attaches un groupe de fonction crer et peuvent tre RFCable c..d appelable distance.

ABAP - FORM / PERFORM :


Nous allons commencer par un peu de pratique avec un bout de code. On notera dessus que les variables utilises dans la sous-routine sont de deux types using et changing. Les variables using sont statiques et ne changent pas, typiquement utilises pour passer des arguments / paramtres. Les variables changing elles sont utiliss pour passer des variables qui sont modifies par la sous-routine, un moyen de passer les valeurs retournes par la sous-routine.

on a ainsi ce rsultat..

On peut bien sur rpter l'appel de la sous-routine

Note : Les sous-routines sont pratiques, mais une meilleure pratique consiste les crire dans des fichiers include qui permet de les partager pour une utilisation depuis plusieurs programmes et fonctions. Toutefois la question cls reste ... Quand doit-on utiliser des fonctions et quand on doit utiliser des sous-procdures.

ABAP - LES FONCTIONS :


Si il y'a un concept cls sur SAP, c'est le bien celui-ci : Les RFC. Les RFC, Remote Function Call, sont des fonctions appelables distance via un protocole de type CPI/C (aussi connu sous le nom de RPC), les anctres des webservices. En ABAP il est possible d'utiliser des fonctions fournies par SAP, distance quand celle-ci sont des RFC (juste une case qui autorise l'appel de la fonction distance), mais aussi de crer ses propres fonctions (appeles ZFONCTION). Dans le cadre du dveloppement d'un programme Z (utilisateur) on va distinguer deux approches qui mnent l'criture de fonctions : Des fonctions Z utilises par un ou plusieurs de ses programmes ABAP. Dans ce cas on fera des fonctions d'abord parce qu'une fonction peut tre teste individuellement (test unitaire) indpendamment du contexte du programme et que cela permet de parallliser le travail entre la partie interface utilisateur et les fonctions qui s'excutent en arrire-plan. Des fonctions Z qui seront appels par des programmes extrieurs (ABAP, JAVA ou AUTRE), ou la fonction servira d'abord faire le mapping entre d'autres fonctions ABAP SAP et l'appelant et optimiser les flux d'intgration SAP avec ses partenaires extrieurs.

Mais le plus simple est de crer sa propre fonction....

CRATION D'UN GROUPE DE FONCTION ABAP


Avant mme de s'attaquer la cration mme d'une fonction on doit d'abord disposer d'un groupe de fonction, une sorte de classe qui regroupe les diffrentes fonctions qu'on dveloppe (le moteur de SAP a t crit en C++). On lance la transaction SE80

L'ABAP DEVELOPMENT WORKBENCH s'ouvre...

Dans la colonne de gauche

Dans la section Repository Browser slectionnez Function Group puis tapez le nom de votre groupe de fonctions (par exemple : ZMESFONCTIONS). Puis tapez sur ENTRER Une popup s'ouvre

Cliquez sur YEs pour crer l'objet... Une seconde POPUP s'ouvre

Cliquez sur SAVE ... Une Troisime POPUP s'ouvre

Dans ce cas on saisit $TMP comme package (package non transportable) puis on clique sur la disquette ou on tape sur la touche ENTRER

Notre groupe de fonctions est OK maintenant, nous allons pouvoir crer une fonction....

ETAPE N2 : CRATION D'UNE FONCTION EN ABAP


Pour rester un rien old-school, nous allons lancer la transaction SE37.

La transaction SE37, Function Builder, Initial screen, s'ouvre...

Puis on appuie sur le bouton Create. Une fentre popup s'ouvre...

On slectionne le groue de fonction qu'on a prcdemment cr... et on ajoute un petit blabla puis on clique sur le bouton SAVE. Une seconde popup peut apparaitre

On clique sur la flche verte...

L'cran d'dition de la fonction s'ouvre...

On distingue plusieurs onglets : Import contient les dclarations des variables (arguments paramtres) qu'on envoie la fonction. (quivalent de using des sous-routines) Export contient les dclarations des variables qu'on rcupre aprs l'appel de la fonction. (quivalent du changing des sous-routines). Code qui contient le code de la fonction et aussi l'onglet TABLES, CHANGING, ATTRIBUTES, EXCEPTIONS... qui seront abords dans la partie advanced de ce cours que je proposerais plus tard.

On saisit valeur1 et valeur2 dans l'onglet Import.

Puis Result dans l'onglet Export

Enfin dans l'onglet Source code on tape le code (va tre vachement rapide)...

On clique sur Activate

(ou control+F3) comme pour les programmes crits avec SE38. On peut enfin tester

sa fonction en cliquant sur F8 (execute)ou le bouton

Entrez deux valeurs (Valeur1, Valeur2) puis cliquez sur F8(execute) ou le bouton On obtient le rsultat suivant....

Notez le rsultat RESULT (57) et le temps du runtime 116 microseconds. Notre fonction marche... Avant de faire appel notre fonction depuis notre application je vous invite faire un petit passage sur l'onglet attribut de notre function builder...

Notez le radio-button Remote-Enabled Module pour faire que la fonction soit appelable distance...

Un autre truc est la possibilit de transformer sa fonction en webservice en allant sur le menu...Utilities / More Utilities / Create webservice / ...

APPELER SA FONCTION DEPUIS UN PROGRAMME ABAP (OU UNE AUTRE FONCTION).


Il nous reste plus qu' appeler notre fonction depuis notre programme.... On commence taper sa dclaration de code...

Puis depuis le bouton On appelle d'outil d'insertion de pattern...

Puis on clique sur la flche verte ou ENTRER ... Le code suivant est automatiquement insr...

Faites bien attention au point isol sous la partie mis en commentaire (et en gris dans notre cas). On doit le garder.... On adapte notre code...

Notez sur les variables que nous avons cres valeur1 (avec la valeur 10) et valeur2 (avec la valeur 12) portent le mme nom que les paramtres EXPORTING de l'appel de notre fonction, mais le rsultat non. L'appel de fonction distingue le nom du paramtre de la valeur que vous luis passez. Vous pouvez bien sur remplacer VALEUR1 = valeur1 par VALEUR1 = 15 ... Vous n'avez plus qu' activer votre programme et l'excuter... Et vous avez le rsultat suivant...

Bingo a marche... Modifiez les valeurs et jouer avec....

A PROPOS DES BAPI SAP :


Les BAPI Business API sont en fait de simples fonctions crites et maintenues par SAP. La particularit des BAPI est d'tre stable et indpendante des versions de SAP et d'tre totalement orientes BUSINESS (mtier). Ainsi si vous utilisez une BAPI et que le systme SAP est updat, vous tes certains que la BAPI aura le mme fonctionnement mtier, mme si son code est modifi, et mme si SAP dcidait de passer un autre langage une BAPI est stable dans la dure... elle a et aura toujours le mme comportement et les mmes donnes reues et retournes. Le fait que les BAPI sont release-indpendantes est la trs grande force des BAPI.... Il existe une transaction spcifique pour dcouvrir les BAPI, la transaction BAPI. Je vous recommande chaudement de jouer avec...

CONCLUSION
L'criture de fonction est essentielle quand on dveloppe en intgration avec d'autres systmes SAP ou non, tant qu'elles sont RFCables... L'criture de fonction est un plus quand on crit des programmes ABAP ou encore quand on fait du dveloppement de workflow. Reste que dans de nombreux cas on peut faire en sous-routines ce qu'on fait avec des fonctions. Au final voila ce que je prfre. Ecrire une fonction quand : Je dveloppe des connecteurs SAP pour tre attaqus depuis d'autres systmes SAP ou non. Je dveloppe sur SAP Workflow. Je dveloppe avec une approche SOA, et mtier.

Ecrire une sous-routine (dans un include) : Pour des excuter des morceaux de code techniques non mtier. Pour initialiser des variables et des structures rapidement.

Mais l c'est d'abord un point de vue...

ABAP : TABLES ET SQL CRATION DE ZTABLE AVEC SE11


Mme si le modle de donnes de SAP est norme (c'est peu dire) il est parfois ncessaire de crer et d'utiliser ses propres tables de donnes, SAP tant aussi une plateforme de dveloppement indpendante des modules SAP. Sur ce petit tuto je vous montre comment crer une table simplement avec SE11 et injecter des donnes avec SE16N.

LE SCNARIO (NOTRE TABLE Z) :


Pour une application BSP nous avons besoin de stocker les inscriptions une newsletter. Pour cela nous allons collecter les donnes suivantes : L'email Le nom de la personne qui s'inscrit. Le nom de la socit

La structure technique de notre table sera donc NEWSLETTER_EMAIL - S_EMAIL (en fait un char(40). NEWSLETTER_NAME - char(80). NEWSLETTER_COMP - char(80)

Note : Pour l'email je prends un type mtier. Normalement on doit utiliser des types mtiers ... et non des formats techniques

DMARRAGE DE LA TRANSACTION SE11 :

La transaction SE11 s'ouvre...

On slectionne Database table et on tape le nom de notre table ZNEWSLETTER. Puis on clique sur le bouton Create. L'cran de cration de la table s'ouvre....

CRATION DE LA TABLE

Notez les different onglets (Attributes / Delivery and Maintenance / Fields / Entry help/check / Currency/Quantity Fields

La premire chose qu'on doit faire est de taper un texte de description...

Puis on doit slectionner une "delivery class" qui caractrise la table... Dans notre cas nous tapons A

Et on slectionne DisplayMaintenance Allowed

Puis on clique sur l'onglet Fields ... La fentre d'dition des champs s'ouvre...

CRATION DES CHAMPS DE LA TABLE Z SAP

Nous allons maintenant entrer les noms de chacun de nos champs. Mais avant tout, nous allons ajouter le champ MANDANT. Un mandant est le numro de systme SAP, un serveur SAP pouvant avoir plusieurs systmes logiques. Ce champ MAND se retrouve sur l'ensemble des tables SAP (c'est obligatoire) sauf pour les tables inter-mandants (beaucoup plus rares). Nous allons donc crer le champs MANDT et le champs NEWSLETTER_EMAIL qui sont tous les deux dfinissables par un Data Element.

Il suffit de remplir les cases blanches Field Key Initial value et MANDT ... Quand vous tapez sur OK le datatype lenght decim. et short description sont remplis automatiquement. Nous allons maintenant crer des champs mais qui ne ne sont pas associables des datas lments. Pour cela il suffit de cliquer sur le bouton Predefinied Type.

Voila nos champs sont crs. Nous cliquons maintenant sur CTRL+S ou la disquette pour sauver notre table.

Dans ce cas nous slectionnons $TMP ou clique sur le bouton Local Object. Aprs quelques secondes (parfois plus) en bas dans la barre de status on voit le texte NOMDELATABLE saved (ou sauv en franais)

PARAMTRAGES TECHNIQUES DE LA TABLE SUR SAP


Nous allons maintenant dfinir les paramtres techniques de la table en cliquant sur Technical Settings.

L'cran de settings ...

Nous devons maintenant dfinir la Data Class et le Size Category... Regardons la Data Class ... Nous slectionnons APPL0

Puis nous slectionnons le Size category.

Dans notre nous allons utiliser cette table uniquement pour des exercices donc on slectionne 0.

On sauve nos settings (CTRL+S ou clique sur la disquette orange). Il ne reste plus qu' cliquer sur le bouton Revided <->Active.

Validez (entrer ou la flche verte) Il ne reste plus qu' activer la table en cliquant sur le bouton Voila notre table est OK. ou CTRL+F3.

UTILISATION DE LA TABLE AVEC SE16


On lance la transaction SE16..

On clique sur le bouton

ou F5 pour crer une entre...

Puis on clique sur la disquette ... Rptez l'opration pour entrer 3 ou 4 entres ...

UTILISATION DE LA TABLE AVEC SE16N


On lance la transaction SE16N L'cran SE16N s'ouvre ...

On clique sur le bouton

Dans le DataGrid on peut diter ses donnes (n'oubliez pas de sauver avec CTRL+S)... Il suffit de cliquer sur pour ajouter une ligne...

INITIATION A ABAP SQL


Normalement quand on dveloppe sur SAP, on ne doit pas attaquer des donnes en direct mais toujours passer par des BAPI. Toutefois il est parfois ncessaire de passer outre surtout quand on utilise SAP comme plateforme de dveloppement d'applications. D'une manire plus gnrale, il est prfrable lors de dveloppement d'applications sur SAP de transfrer l'ensemble des manipulations de donnes via des requtes SQL dans des fonctions RFC qui feront ainsi office de mapping SQL<->mtier.

SQL - EXERCICE N1 : LECTURE DE DONNES


Tapez ce premier code.

Notez la dclaration de la table ZNEWSLETTER avec l'instruction tables. Dans cet exemple on boucle directement dans la table. Notez comment on accde aux champs de la table. <NOMTABLE><NOMDUCHAMPS>. Le tiret est le sparateur qui fait le lien entre la table et le champ. Quand on excute ce code voila ce qu'on obtient.

SQL EXERCICE N2 : LECTURE AVEC CHARGEMENT DANS UN "DATASET".


En C# avec ADO.net il est possible de travailler avec une copie des donnes dconnecte. Cela existe depuis trs longtemps sur SAP. Pour cela on cre une sorte de copie de la table qu'on charge via un select. Les donnes sont donc charges une fois et utilisable sans nouvelle connexion la base de donnes, donc plus rapide utiliser. Cet avantage est mettre en perspective avec les risques d'avoir une perte de synchro entre sa copie de donnes et la donne relle si celle ci est modifie dans la DB alors mme qu'on travaille avec la copie. le source

Notez la dclaration de la table locale copie de ma table ZNEWSLETTER. WITH HEADER LINE est ncessaire pour accder aux champs avec <NOMTABLE>-<NOMCHAMPS>. Occurs 100 dfinit une taille par dfaut de la table locale.

On obtient

SQL EXERCICE N3 : UTILISATION DE LA CONDITION WHERE.


Note : Mme si le SQL de SAP est un peu particulier, je vous recommande d'aller sur ce tutorial en anglais spcifique SQL. http://www.w3schools.com/sql/default.asp (cela peut aider un peu quand mme) La condition WHERE permet de dfinir les conditions de slection des donnes qu'on va utiliser. C'est essentiel si on recherche dans notre exemple le nom d'une personne avec seulement son email. Tapez ce code (pour trouver l'enregistrement ou l'email est 'jfo@bsb.com'.

On nobtient qu'un seul enregistrement...

Les conditions WHERE sont constitues de CHAMPS oprateur Valeur. Les oprateurs sont : gal : EQ ou = diffrent de : NE ou <> plus petit que : LT ou <

plus petit ou gal : LE ou <= plus grand que : GT ou > plus grand ou gal : GE ou >= entre valeur1 et valeur 2 : BETWEEN <VALEUR1> AND <VALEUR2> correspond un pattern : LIKE gal une de ces valeurs : IN ( <VALEUR1>, <VALEUR2>) correspond au condition de la table SELECT-OPTION : IN SELOPT

Suite de l'exercice Si besoin ajoutez des donnes et essayez diffrentes combinaison WHERE NEWSLETTER_EMAIL IN ( 'jfo@bsb.com', 'jerome@onplonge.com') ... WHERE NEWSLETTER_EMAIL NE 'jfo@bsb.com' ... etc...

COMBINAISON DE CONDITIONS
Sur un Where il est possible de combiner plusieurs tests de conditions en associant chaque test des oprateurs AND (ET) et OR (OU). AND ncessite que les deux conditions associes par un AND soient VRAIES. OR ncessite qu'au moins une des conditions associes par un AND soit VRAIE.

Il est possible d'associer plusieurs conditions dans des parenthses afin de les hirarchiser. Par exemple WHERE (champ1=valeur1) OR (champ1 NE valeur1 AND champs 2 = valeur2).

SQL EXERCICE N4 : TRI DE LA SLECTION AVEC ORDER


Il est possible de trier ses rponses. Voici un exemple

on a

...
Il est possible aussi d'inverser l'ordre de tri avec l'utilisation de l'instruction DESCENDING.

et on obtient

Note : il est bien sur d'associer plusieurs tris avec ORDER BY CHAMP1, CHAMP2, en associant DESCENDING ou non chaque champ.

SQL EXERCICE N5 : SY-DBCNT


Lorsqu'on fait une requte SQL il est possible d'avoir le nb de champs impacts par la requte. Pour cela il suffit d'appeler SY-SUBRC

et on obtient

SQL EXERCICE N6 : SY-SUBRC


SY-SUBRC renvoie la valeur zero 0 si il y'a des donnes. Voila un code type

On a en rsultat :

Ajoutez la dessus une condition WHERE (toujours avant le ORDER BY) comme WHERE newsletter_name = 'toto'...

et dans ce cas on a :

SQL EXERCICE N7 : INSERTION DE DONNES.


Bon on a jou avec les WHERE et les ORDER, mais manipuler des donnes dans une base de donnes c'est souvent pour les modifier (sauf si comme moi vous passez votre temps dvelopper des ETL). Il est donc ncessaire d'ajouter des donnes avec un INSERT.

Lalternative cette mthode est la suivante

SQL EXERCICE N8 : AJOUT DE PLUSIEURS LIGNES


Il est possible de grouper plusieurs ajouts depuis une copie locale de la table.

Le rsultat est ....

SQL EXERCICE N9 : MISE JOUR DE DONNES (UPDATE).

On a vu comment ajouter des donnes. Nous allons maintenant voir comment modifier des donnes. Il suffit de faire : UPDATE <NOM DE LA TABLE> SET <CHAMP1> = <VALUE1> <CHAMP2>=<VALUE2> WHERE <CONDITIONS> Voici un exemple de code

EXERCICE N10 : SUPPRESSION DE DONNES


Bon il est temps qu'on supprime nos RAOUL qui ont remplis notre table avec nos exercice. Pour cela on utilise DELETE FROM <NOM DE LA TABLE> WHERE <CONDITIONS> Un exemple simple

OPTIMISATION AVEC SE 30
Un dernier truc, si vous dveloppez des applications qui effectuent beaucoup de requtes SQL, je vous conseille de tester vos applications avec la transaction de SE30. Il me parait important de comprendre ce qui est consomm pour mieux quilibrer son application en fonction des ressources disponibles.

On clique sur Execute puis on quitte l'application puis on clique sur Evaluate pour avoir cette mesure

ABAP SQL AVANCE


Aprs la leon 4 ou mon approche tait avant tout de vous expliquer les bases de SQL sur SAP, je vous propose une petite extension la leon 4 ou nous allons traiter des mthodes plus massives pour excuter des requtes SQL, et aussi revenir sur une approche SOA du dveloppement sur SAP Je vous propose ici de continuer notre exploration d'OPEN XML de SAP en ABAP pour manipuler des donnes sur SAP en ABAP.

AJOUT LIGNE PAR LIGNE


Cette technique est idale dans une boucle pour insrer des donnes.

REPORT ZSQLWA. TABLES ZNEWSLETTER. DATA WA TYPE ZNEWSLETTER. WA-NEWSLETTER_NAME = 'JEROMEDIM'. WA-NEWSLETTER_EMAIL = '123@EMAIL'. WA-NEWSLETTER_COMP = 'SAPCONSULTING'. INSERT INTO ZNEWSLETTER VALUES WA. WRITE 'AJOUT FAIT'.
Il est possible de modifier des donnes de la mme manire, sachant que le critre where est par dfaut implicite, dans notre exemple la cls c..d newsletter_email.

MOVE 'ALAIN@123.COM' TO WA-NEWSLETTER_EMAIL. MOVE 'FRANOIS' TO WA-NEWSLETTER_NAME. MOVE 'PASNOUS' TO WA-NEWSLETTER_COMP. UPDATE ZNEWSLETTER FROM WA.
Il faut noter que l'insert peut aussi se faire via un INSERT ZNEWSLETTER FROM WA.

AJOUT DE PLUSIEURS LIGNES VIA UNE TABLE INTERMDIAIRE

Voici un autre exemple ou on fait l'insert en deux tapes. On cre une table locale non connect la base de donnes ou on insert les donnes puis on insert cette table locale dans la base de donnes. Cette solution permet d'avoir qu'une seule connection relle la DB. La contrepartie est que les donnes sont dconnects, donc on peut avoir une perte de synchro.

REPORT ZSQLWA2. DATA: ITAB TYPE HASHED TABLE OF ZNEWSLETTER WITH UNIQUE KEY NEWSLETTER_EMAIL, WA LIKE LINE OF ITAB. WA-NEWSLETTER_NAME = 'JEROME4'. WA-NEWSLETTER_EMAIL = '789@EMAIL'. WA-NEWSLETTER_COMP = 'SAPCONSULTING'. INSERT WA INTO TABLE ITAB. WA-NEWSLETTER_NAME = 'JEROME5'. WA-NEWSLETTER_EMAIL = '456@EMAIL'. WA-NEWSLETTER_COMP = 'SAPCONSULTING'. INSERT WA INTO TABLE ITAB. INSERT ZNEWSLETTER FROM TABLE ITAB ACCEPTING DUPLICATE KEY S. WRITE: / 'AJOUT 2 FAIT '.
Comme dans notre exemple prcdent il est possible de faire la mme chose avec un update ou un delete. Pour cela la(les) cls seront pris comme critre de where implicite. Par exemple :

DATA: itab type HASHED TABLE OF znewsletter WITH UNIQUE KEY newsletter_e mail, wa LIKE LINE OF itab. DATA: itab2 type HASHED TABLE OF znewsletter WITH UNIQUE KEY newsletter_e mail. wa-newsletter_name = 'ROBERT'. wa-newsletter_email = 'BOB@email.com'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab. wa-newsletter_name = 'Jerome5'. wa-newsletter_email = '456@email.be'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab. insert znewsletter from TABLE itab ACCEPTING DUPLICATE KEYS. * dans ce cas nous allons modifier la donnes avec la cls '456@email' wa-newsletter_name = 'BOB2'.

wa-newsletter_email = 'BOB@email.com'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab2. update znewsletter from TABLE itab2 .
On obtient donc avec SE16N

UTILISATION DE MODIFY
Une force de SAP c'est qu'il est possible d'ajouter ou de mettre jour sans se poser la question de savoir si la donne existe dja avec la cls indique. Pour cela on utilise l'instruction MODIFY. Voici un exemple simple.

DATA: itab type HASHED TABLE OF znewsletter WITH UNIQUE KEY newsletter_e mail, wa LIKE LINE OF itab. wa-newsletter_name = 'ROBERT2'. wa-newsletter_email = 'BOB@email.com'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab. wa-newsletter_name = 'Jerome52'. wa-newsletter_email = '456@email.be'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab.

MODIFY znewsletter FROM TABLE itab.


C'est trs pratique et vite de devoir combiner un select puis un update ou insert.

UTILISATION DE CURSOR

Les curseurs permettent de regrouper diffrents select dans une opration commune. Cette technique classique puisqu'on retrouve ce concept sur d'autres plateformes comme sur ADO (mais non plus sur ADO.net) est particulirement pratique et performant. Voici un exemple simple :

REPORT ZSQLWA2. * PARTIE 1 DATA: itab type HASHED TABLE OF znewsletter WITH UNIQUE KEY newsletter_e mail , wa LIKE LINE OF itab. wa-newsletter_name = 'ROBERT2'. wa-newsletter_email = 'BOB@email.com'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab. wa-newsletter_name = 'Jerome52'. wa-newsletter_email = '456@email.be'. wa-newsletter_comp = 'SAPCONSULTING'. insert wa INTO TABLE itab. MODIFY znewsletter FROM TABLE itab. write: / 'ajout 2 fait '. * PARTIE 2 DATA: c1 type cursor, c2 type cursor. DATA: wa1 type znewsletter, wa2 type znewsletter. DATA : flag1(1) type C, flag2(1) type C. OPEN CURSOR : c1 FOR SELECT newsletter_name FROM znewsletter where newsletter_email = 'BOB@email.com', c2 FOR SELECT newsletter_name newsletter_comp from znewsletter where newsletter_comp = 'SAPCONSULTING'. DO. IF flag1 NE 'X'. FETCH NEXT CURSOR c1 INTO CORRESPONDING FIELDS OF wa1. IF sy-subrc <> 0. CLOSE CURSOR c1. flag1 = 'X'. ELSE. write: / wa1-newsletter_name. ENDIF. ENDIF. IF flag2 NE 'X'. FETCH NEXT CURSOR c2 INTO CORRESPONDING FIELDS OF wa2. IF sy-subrc <> 0. CLOSE CURSOR c2. flag2 = 'X'. ELSE. write: / wa2-newsletter_name, wa2-newsletter_comp.

ENDIF. ENDIF. IF flag1 = 'X' AND flag2 = 'X'. EXIT. ENDIF. ENDDO.
On a ainsi ce rsultat

OPTIMISATION (SUITE)
Il faut comprendre que chaque requte sollicite plusieurs couches de SAP et de la machine. Afin d'optimiser son application il existe plusieurs pistes : Il est prfrable de regrouper les opration via une table interne (nos exemples avec iTab) afin de rduire le nombres de requtes relles envoyes au serveur SQL. Eviter d'avoir des accs rpts dans votre programme c..d plusieurs select dans une boucle par exemple. Optimis la logique de votre programme pour rduire le nombre de requtes Utiliser des cursors SQL. Utiliser le mot cls CLIENT SPECIFIED juste aprs le nome de la table.

Une autre piste, plutot issue de ma culture Microsoft.net est de n'avoir aucun SQL dans ses programmes mais de les regrouper toujours dans des fonctions RFC crites avec SE37 et avoir une approche de type SOA avec si besoin une optimisation faite en dfinissant de nouvelles structures depuis la transaction SE11 surtout quand on manipule de grosse quantit de donnes, afin d'viter de transfrer des donnes qui ne seront pas utilises/impactes par votre programme.

NATIVE SQL VS OPEN SQL :


Lors de mon prcdent article consacr SQL j'ai essay de vous initier aux bases de Open SQL, l'ABAP pour excuter des requtes SQL. Mais vous devez savoir qu'il est possible d'excuter du SQL en mode natif. Cela apporte dj plus de performance, mais permet surtout d'excuter des procdures stocks sur le serveur SQL ce qui est bien plus performant, surtout pour des updates ou inserts massifs. Pour cela on utilise les mots cls : EXEC SQL . <code>. ENDEXEC.

La force de cette approche est bien la performance, mais elle ncessite d'avoir une approche mixte ABAP du cot client, et dveloppeur SQL sur la base de donnes. Grace cette approche il est possible d'utiliser des interfaces SQL, des procdures stockes (EXECUTE PROCEDURE <nom procdure> (IN : x, OUT : y)., et piloter le curseur de base de donnes ... L'inconvnient est bien sur le fait qu'il n'y plus d'abstraction avec la DB et donc son code devient spcifique la base de donnes, et ncessite une maintenance mixte SAP et Bases de donnes. C'est un plus qui sera le sujet d'un article prochainement. En attendant je vous invite aller sur le lien suivant : http://help.sap.com/saphelp_47x200/helpdata/en/c9/5472f9787f11d194c90000e8353423/frameset.htm

SQL ET ANALYSE DES DIFFERENTES STRATEGIES


Le scnario de base s'appuie sur l'application SFLIGHT (si vous n'avez pas de donne dedans lancer le rapport SAPBC_DATA_GENERATOR. Il s'agit en fait de raliser deux SELECT imbriqus d'abord dans la table SFLIGHT puis dans SBOOK et faire une somme.

STRATGIE N1 : COUPLES TABLE INTERNE + WORK AREA IMBRIQUS.


Le code

STRATGIE N2 : ON SLECTIONNE TOUTES LES COLONES AVEC L 'UTILISATION DE SELECT-ENDSELECT.


Le code

STRATGIE N3 : ON NE SLECTIONNE QUE LE S CHAMPS QU'ON DSIRE DANS UNE STRUCTURE ENTIRE
Le code :

STRATGIE N4 : UTILISATION D'UNE TABLE INTERNE ET D'UN FOR ALL ENTRIES IN


Le code

STRATGIE N 5 : UTILISATION D'UNE FONCT ION SUM


Le code :

STRATGIE N6 : UTILISATION D'UN INNER-JOIN ET D'UNE FONCTION SUM.


Le code :

STRATGIE N7 : ALTERNATIVE PROPOSE PAR SEBASTIEN


Le code :

CONCLUSION : TOUT DPEND DES SERVEURS.


Sur une machine unique portant autant le serveur SAP que la base de donne voila les performances que nous avons. La solution 3 est la meilleure.

On se rend compte que la stratgie n3 gagne largement. Cela s'explique par plusieurs raisons : On rduit le nombre d'information change entre SAP et la base de donne en allant chercher que ce qu'il y'a de ncessaire. On s'appuie surtout sur le stack ABAP et non SQL.

En fait tout dpend de la performance et du serveur d'application SAP et du serveur de base de donnes. Si la DB est trs performante l'INNER-JOIN sera la solution, mais dans un cas plus quilibr ce sera souvent la solution 3 qui sera la plus performante. Mais le plus simple est de tester. C'est pour cela que je vous propose les sources dans la section download.

SELECTION-SCREEN
En ABAP il est possible de crer trs rapidement un cran de slection pour excuter un programme, lancer un job ou charger encore un ALVGRID par exemple. Cette solution, mme si elle fait une rupture sur l'interface graphique est trs productive. Je vous propose donc un tutorial consacr cela.

EXERCICE 1 : UN PREMIER SELECTION-SCREEN.


Histoire de comprendre le principe de base je vous propose un exemple minimaliste pour dbuter. Pour cela crer un programme ZSELECT01 avec la transaction SE38. Dans ce cas nous allons saisir deux valeurs (Hello et World tradition oblige) et les afficher concatn. Code
*&---------------------------------------------------------------------* *& Report ZSELECT01 * *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZSELECT01. SELECTION-SCREEN BEGIN OF BLOCK BLOCK1. PARAMETERS : CHAMP1(10), CHAMP2(10). SELECTION-SCREEN END OF BLOCK BLOCK1. DATA: MACHAINE(20). CONCATENATE CHAMP1 CHAMP2 INTO MACHAINE. WRITE MACHAINE.

On a ainsi

on rentre les valeurs par exemple Hello World puis F8 pour excuter le programme et on a

Vous comprenez maintenant le principe de base. Le slection screen permet juste de crer rapidement une fenetre de slection qui bascule sur votre code sans devoir designer un cran. Pratique ! Nous allons maintenant donner un titre notre cran de slection. Pour cela nous modifions la ligne begin

Puis cliquez sur CTRL+F3 ou

pour activer votre modification

puis double cliquez sur TEXT-001 Une popup apparait

Cliquez sur YES (ou OUI) L'cran suivant apparait... Saisissez le texte comme suit.

Puis cliquez sur CTRL+F3 ou puis revenez l'cran prcdent Puis cliquez sur CTRL+F3 ou

pour activer votre modification

pour activer votre programme et excutez le...

On a donc notre bloc isol et maintenant avec un titre...

EXERCICE 2 : DES VALEURS PAR DFAUT


Nous allons maintenant donner des valeurs par dfaut nos deux champs SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001. PARAMETERS : CHAMP1(10) DEFAULT 'Hello', CHAMP2(10) DEFAULT 'World'. SELECTION-SCREEN END OF BLOCK BLOCK1. DATA: MACHAINE(20). CONCATENATE CHAMP1 CHAMP2 INTO MACHAINE. WRITE MACHAINE.

En excutant le programme on a maintenant

RENOMMEZ LE NOM DES CHAMPS


Nous allons maintenant voir comment renommer les champs. Dans le cas prcdent nous avions CHAMP1 et CHAMP2. Nous allons maintenant leur donner une valeur diffrente plus lisible. Dans ce cas on va sparter chaque ligne avec SELECTION-SCREEN BEGIN OF LINE. et on la finit SELECTIONSCREEN END OF LINE. Il suffit alors d'ajouter un comment en ajoutant un SELECTION-SCREEN COMMENT qu'on affecte chaque champs. Tapez le code suivant. REPORT ZSELECT . SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(31) TEXT-S01 FOR FIELD CHAMP1. PARAMETERS : CHAMP1(10) DEFAULT 'Hello'. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(31) TEXT-S02 FOR FIELD CHAMP1. PARAMETERS: CHAMP2(10) DEFAULT 'World'. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK BLOCK1. DATA: MACHAINE(20). CONCATENATE CHAMP1 CHAMP2 INTO MACHAINE. WRITE MACHAINE. Faites un CTRL+S pour sauver le programme. Puis double-cliquez sur TEXT-S01 et TEXT-S02 et entrez les valeurs de vos tiquettes. Puis activez les textes et la page pui excutez le programme. et vous devez avoir cet cran.

AJOUTEZ DES BOUTONS RADIO


Il est assez simple d'ajouter des boutons RADIO, pour essayer copier ce code... REPORT ZSELECT . SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(31) TEXT-S01 FOR FIELD CHAMP1. PARAMETERS : CHAMP1(10) DEFAULT 'Hello'. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(31) TEXT-S02 FOR FIELD CHAMP1. PARAMETERS: CHAMP2(10) DEFAULT 'World'. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK BLOCK1. SELECTION-SCREEN BEGIN OF BLOCK BLOCK2 WITH FRAME. PARAMETERS : CHOIX1 RADIOBUTTON GROUP g, CHOIX2 RADIOBUTTON GROUP g. SELECTION-SCREEN END OF BLOCK BLOCK2. DATA: MACHAINE(20). CONCATENATE CHAMP1 CHAMP2 INTO MACHAINE. WRITE MACHAINE. IF CHOIX1 = 'X'. WRITE 'Choix 1 est valid'. ELSE. WRITE 'Choix 2 est valid'. ENDIF. Activez le code et excutez le et vous devez avoir ce rsultat...

Voilou pour le B.A BA des crans de slection...

SELECTION-SCREEN AVANC
Avant toute chose, on va commencer par se faire un cran de slection donc on cr un programme, qui sera ZMODIF_SCREEN pour moi, et on va y placer des composants. *&---------------------------------------------------------------------* *& Report ZMODIF_SCREEN *& *&---------------------------------------------------------------------* *& Auteur : Celdrn *& *&---------------------------------------------------------------------* REPORT zmodif_screen. * Donnes pour cran de slection. DATA : vbeln TYPE vbak-vbeln, auart TYPE vbak-auart, pstyv TYPE vbap-pstyv, * BLOCK 1 SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1. SELECT-OPTIONS : so_vbeln FOR vbeln. SELECT-OPTIONS : so_auart FOR auart. SELECTION-SCREEN END OF BLOCK bl1. * BLOCK 2 SELECTION-SCREEN BEGIN OF BLOCK bl2 WITH FRAME TITLE text-bl2. PARAMETERS : cb1 TYPE c AS CHECKBOX USER-COMMAND cb1. SELECT-OPTIONS : so_pstyv FOR pstyv MODIF ID bl2. PARAMETERS : p_file TYPE fileextern MODIF ID bl2. SELECTION-SCREEN END OF BLOCK bl2. Ce qui nous donne l'affichage.

Voil, et maintenant je suis grill car certains vont se rendre compte au premier coup d'il qu'en ce moment je bosse sur SD. ^_^ Alors si tu te demandes comment j'ai eu les descriptions de champs sans les mettre dans le code, il suffit d'aller dans Saut=>"lments de texte"=>"Texte de slection" et de cocher la case de slection qui signifie que la description de zone fait rfrence celle du DDIC (Dictionnaire de donne). Et pour la case cocher (Checkbox) sur l'cran, et bien elle va tout simplement nous servir conditionner les zones du Bloque 2 (BL2). A noter la prsence du USER-COMMAND fcode qui est ncessaire pour indiquer qu'une action faite sur ce composant dclenche un traitement, sans a les actions faites sur le composants ne seront pas dtects. Sinon pour les deux lments o j'ai rajout MODIF ID, c'est juste pour montrer, titre d'exemple, que l'on peut regrouper des zones. C'est utile pour ne mettre qu'une condition plutt que de conditionner selon chaque zone. L'ID se trouvera dans la zone SCREEN-GROUP1. Exemple : IF screen-group1 = 'BL2' * Traitement ENDIF.

Plutt que : IF screen-name = 'SO_PSTYV' OR screen-name = 'P_FILE'. * Traitement ENDIF. A noter pour finir que j'ai un principe de base qui est d'utiliser juste la mmoire dont j'ai besoin c'est pour cela que je n'utilise pas l'instruction TABLES qui dclare une structure qui ne sera surement pas utilis mais que je dclare des DATA typ qui me servent pour les SELECT-OPTIONS.

RENDRE DES ZONES NON-SAISISSABLES.


Disons que les zones seront saisissables si la case cocher est coche et non saisissables si elle ne l'est pas. Il faut donc conditionner les zones avant l'affichage de l'cran et cela se passe dans l'vnement : AT SELECTION-SCREEN OUTPUT. * PBO de l'cran de slection AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF cb1 IS INITIAL.

IF screen-group1 = 'BL2'. screen-input = 0. ENDIF. "screen-name = 'P_FILE'. ELSE. IF screen-group1 = 'BL2'. screen-input = 1. ENDIF. "screen-group1 = 'BL2'. ENDIF. "cb1 IS INITIAL. MODIFY SCREEN. ENDLOOP. "AT SCREEN.

Et normalement :

et on doit revenir l'cran initial quand on dcoche la case cocher. 2

RENDRE DES ZONES INVISIBLES


Pour a, ce sera pareil que la partie prcdente, c'est dire que tout se passe dans le PBO de l'cran de slection. * PBO de l'cran de slection AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF cb1 IS INITIAL. IF screen-group1 = 'BL2'. screen-input = 0. screen-invisible = 1. ENDIF. "screen-name = 'P_FILE'. ELSE. IF screen-group1 = 'BL2'. screen-input = 1. screen-invisible = 0. ENDIF. "screen-group1 = 'BL2'.

ENDIF. "cb1 IS INITIAL. MODIFY SCREEN. ENDLOOP. "AT SCREEN. Dans ce cas cliquer le sur checkbox et la zone apparait.

Attention !!! il faut quand mme grer l'affichage des zones (INPUT) sous peine d'avoir des surprises l'affichage. Sinon, il est possible d'utiliser la zone SCREEN-ACTIVE.

RENDRE DES ZONES OBLIGATOIRES OU NON-OBLIGATOIRES


Voil une partie qui pourrait tre intressante pour toi si tu es dans le cas o tu as t confront au cas et que tu as abandonn car a ne marchait pas comme tu le voulais cause du standard qui te bloquait. Nota : je me souviens que j'avais confront ce cas, mes dbut en ABAP (2 ans et quelques ce jour), un consultant expriment mais il n'avait pu me donner une rponse l'poque et je suis assez content de moi car j'ai trouv une solution de contournement... Sans rancune Yann. Alors illustrons tout d'abord la situation dans laquelle on tombe en rendant les zones obligatoires.

* PBO de l'cran de slection AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF cb1 IS INITIAL. IF screen-group1 = 'BL2'. screen-input = 0. ENDIF. "screen-name = 'P_FILE'. IF screen-name = 'P_FILE'.

screen-required = 0. ENDIF. "screen-name = 'P_FILE'. ELSE. IF screen-group1 = 'BL2'. screen-input = 1. ENDIF. "screen-group1 = 'BL2'. IF screen-name = 'P_FILE'. screen-required = 1. ENDIF. "screen-name = 'P_FILE'. ENDIF. "cb1 IS INITIAL. MODIFY SCREEN. ENDLOOP. "AT SCREEN Et voil ce qu'on obtient

Et aprs que la case cocher soit coche

Bien, a ressemble ce que l'on voudrait obtenir mais seulement peu prs car si on essaie de dcocher la case cocher voil ce qu'on obtient

Avec en bas du sap gui le message suivant

Et voil o a pourrait s'arrter car je pense que si tu as lus jusqu'ici, tu as pu tre confront cette situation et que tu as abandonn pensant que c'tait impossible alors que tu aurais surement aim pouvoir faire ceci.

Et bien saches que la succession d'cran que tu vois au dessus a t faite pendant le mme traitement ... Et maintenant que je ris juste l'ide de t'imaginer en train de saliver, je te donne la solution que j'ai trouv et a me fait d'autant plus plaisir que de la partager avec toi... par contre penses dire que c'est moi qui te l'ai appris.

* PBO de l'cran de slection AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN.

IF cb1 IS INITIAL. IF screen-group1 = 'BL2'. Screen-input = 0. ENDIF. "screen-name = 'P_FILE'. IF screen-name = 'P_FILE'. screen-required = 0. ENDIF. "screen-name = 'P_FILE'. ELSE. IF screen-group1 = 'BL2'. screen-input = 1. ENDIF. "screen-group1 = 'BL2'. IF screen-name = 'P_FILE'. screen-required = 2. ENDIF. "screen-name = 'P_FILE'. ENDIF. "cb1 IS INITIAL. MODIFY SCREEN. ENDLOOP. "AT SCREEN

Tu dois te demander ce qui change par rapport ce qu'il y avait prcdemment. Alors je t'invites bien regarder cette ligne de code : screen-required = 2. Avant on mettait REQUIRED 1 ce qui avait pour consquence de rendre la zone obligatoire, alors que si on met REQUIRED 2, a a pour consquence de la rendre recommande... c'est--dire qu'elle va apparatre comme obligatoire l'cran mais le standard ne bloquera pas les traitements si elle n'est pas remplie. Donc en procdant ainsi, on obtient bien le rsultat attendu. Aprs que tu ais test, je m'attends ta remarque : C'est nul ton truc, la zone est bien obligatoire mais je peux quand mme lancer le traitement alors que la zone n'est pas remplie !!

Et je vais te rpondre tout simplement "Oui", mais je t'ai dis que la standard ne bloquait plus si la zone n'tait pas remplie, cette partie du traitement est aussi mettre en place. Et pour cela, il va nous falloir un nouvel vnement pour les traitements du PAI et a se passe dans le : AT SELECTION-SCREEN Mais avant toute chose, il faut rflchir la manire de procder. On ne va pas balancer un blocage chaque action, le mieux serait de lancer le blocage que dans un, ou plusieurs, cas particuliers. Pour l'instant, je n'ai besoin que d'un traitement de base, c'est dire de bloquer que dans le cas ou je lance le traitement c'est dire sur l'action du bouton ou sur l'appui de la touche F8. La grande question reste de dtecter que le traitement est lanc... bonne question et je vais te mettre sur la piste de la rponse

Tu bloques encore ?? Ce que tu vois en face de Fonction c'est le code fonction du bouton "Excuter". Nota : Pour afficher l'aide sur un bouton, il suffit de cliquer sur le bouton en maintenant appuy, de sortir du composant et de relcher. Aprs faire F1 pour afficher l'aide et ensuite F9 pour afficher les Infos techniques. Donc, on sait maintenant que le code fonction du bouton "Excuter" est 'ONLI' (pour Online surement). Maintenant que l'on a le code fonction du bouton, il ne nous reste plus qu' capturer cet vnement et il n'y a rien de plus simple. Rajouter la suite du programme : * PAI de l'cran de slection. AT SELECTION-SCREEN. * On test si l'action a t de lancer le traitement IF sy-ucomm = 'ONLI'. * On test si bien sur la case cocher est coch car c'est l'une des conditions IF NOT cb1 IS INITIAL. * Et bien sur la dernire condition est que la zone soit vide IF p_file IS INITIAL. MESSAGE ID '38' TYPE 'E' NUMBER '000' WITH 'Veuillez renseigner un nom de fichier'(e01). ENDIF. "p_file IS INITIAL. ENDIF. "NOT cb1 IS INITIAL. ENDIF. "sy-ucomm = 'ONLI'.

Et voil, maintenant quand la case cocher CB1 sera coch, que la zone P_FILE sera vide et que l'action sera de lancer la traitement, un message de type 'E' (Erreur) sera lanc. A noter le cot avantageux de pouvoir lancer le message souhait ou de lancer le massage standard, donc on peut ainsi customiser sa guise selon diffrents cas prcis.

Mais ce n'est pas tout, en effet tu t'es peut-tre rendu compte que si on lance l'excution du traitement avec la zone obligatoire manquante, le traitement mis en place nous bloque... a c'est OK seulement si tu as essay de renseigner la zone et de l'effacer et faire Entre juste aprs... le traitement se lance. Pour preuve :

Et si on va voir en dbug :

A SUIVRE.

CRATION DCRAN

Nous allons crer une simple calculatrice qui a pour fonction de faire une addition. Nous allons avoir ainsi une case pour rentrer la valeur 1, une autre pour entrer la valeur 2 et enfin une case rsultat et un bouton qui excute le calcul. Pour cela nous allons crer le projet ZMYADD via SE80 ou SE38. Dans tous les cas nous crons un programme sans include.

On a notre diteur et nous allons activer le programme dj vide (ctrl+F3)

Puis nous faisons un clique-droit sur le programme afin de crer un cran

Une popup souvre create screen

Entrez un numro dcran par exemple 0100. Une nouvelle fentre souvre. Renseignez l

Puis activer la fentre (CTRL+F3).

Cliquez sur le bouton LAYOUT.

Le screen painter se lance et souvre

On drague and drop un textbox sur lcran.

Pour la valeur du champs name entrez TXTVALEUR1. Refaites la mme chose pour TXTVALEUR2 et TXTRESULT. Vous devriez avoir un cran comme cela.

Nous allons maintenant ajouter un bouton Vous appelez le bouton BTADD et sur lequel vous ajoutez le texte ADDITIONNER et dfinissez sa largeur dans lg. Vous devez avoir lcran suivant.

Vous activer votre cran avec CTRL+F3 Notre cran est OK nous allons devoir maintenant limplmenter. Nous avons besoin maintenant de crer des variables qui rcuprent les messages envoys par lcran. Pour cela nous double-cliquons sur lcran 100 dans le dossier screens puis on slectionne longlet Element List et General Attributes.

On ajoute lattribut OK_CODE

Puis on clique sur le sous-onglet Mod. Groups / Functions.

On ajouter BTADD_F dans la case Function Code. Et on active son code (CTRL+F3). Puis on passe sur longle Flow Logic.

On d-commente (on enlve ltoile) la ligne aprs PROCESS AFTER INPUT.

Puis on double-clique sur USER_COMMAND_0100, une popup souvre.

Cliquez sur Yes pour crer lobjet. Une seconde popup souvre. Create PAI Module.

Slectionnez la ligne new Include . Une nouvelle popup souvre pour confirmer la cration de linclude.

Validez et on a (encore) une nouvelle popup Exit Screen Painter souvre pour vous indiquer que votre programme a t modifi.

Cliquez sur Yes.

Le fichier Include ZMYADD_USER_COMMAND_0100 est cr. Notez que dans la colonne de gauche un dossier INCLUDES a t cr.

Nous allons maintenant diter le code USER_COMMAND_0100 qui gre la raction de notre application aux vnements envoys par linterface graphique de notre programme ABAP. Tapez le code suivant

Puis cliquez sur la disquette orange ou CTRL+S pour sauver vos modifications Il ne reste plus qu faire une chose : dclarer les variables utilises dans le code de votre application correspondant aux noms que vous avez donns vos objets dinterface lors de la cration de votre interface graphique. Pour cela dans le repository Browser double cliquez sur le dossier Screens pour louvrir puis doublecliquez sur lcran 0100. Puis cliquez sur longlet Element list

Notez lensemble des variables utilises dans le code c..d TXTVALEUR1, TXTVALEUR2,TXTRESULT,OK_CODE Puis double-cliquez sur le source de votre programme ZMYADDEt ditez

Et ditez votre code comme ce qui suit

Note : Lcran 0100 que nous avons cr est appel via la command CALL SCREEN 0100.

Vous navez plus qu cliquez sur Activer c..d CTRL+F3 puis cliquez sur F8 pour excuter le programme.Et lcran suivant apparait.

Cela marche (et na).

AMLIORATION DE LINTERFACE DES CRANS

Vous aurez remarqu (si si jen suis sur) que les boutons propre linterface usuelle de SAP ne sont pas prsents, comme le bouton BACK par exemplePour cela nous allons devoir crer un status et implmenter le code PBO (Process Before Output) Ouvrez votre cran 0100 et passez en mode dition CTRL+F1

D-commentez la ligne MODULE STATUS_0100 pour avoir

Sauvegarder votre code en cliquant sur la disquette orange ou en tapant sur CTRL+S et double-cliquez sur STATUS_0100. Une fentre popup Create object apparait

Cliquez sur YES, une seconde fentre apparait

Slectionnez la ligne New Include puis tapez sur ENTER Une fentre de confirmation warning apparait, re cliquez sur la flche verte ou tapez sur ENTER

Une page de code source apparaitDcommenter !

Dcommenter la ligne SET TITLEBAR et la ligne SET PF-STATUS Et diter le source pour avoir ceci

Double cliquez sur STATUSBAR La fentre Create Object apparait Cliquez sur Yes

Puis la fentre Create Status souvre

Remplissez l comme ci-dessus puis cliquez sur la flche verte ou tapez sur ENTER Lditeur de barre de status souvre Ouvrez la section Function keys

Vous navez plus qu saisir des valeurs qui seront rcupres par OK_CODE par exemple BACK pour la flche retour

Sauvegardez vos modifications en cliquant sur la disquette orange ou en tapant CTRL+S Il ne reste plus qu implmenter le code sur lvnement OK_CODE quand il est gal BACK Ouvrez le dossier PAI Modules puis et double-cliquez sur USER_COMMAND_0100

Editer votre code en ajoutant une condition when 'BACK'. SET SCREEN 0.

Vous navez plus qu tout active et tester.

INTRODUCTION AUX MATHMATIQUES SUR SAP EN ABAP :


Soyons direct. ABAP sur SAP n'est pas fait pour faire du gros calcul... Si on compare de l'ABAP avec d'autres langages comme Java et C# l'cart de performance en la dfaveur de ABAP sur la mme plateforme est de presque x10.... Donc dans le domaine du forecasting, des estimations, du calcul massique, il est rellement prfrable d'aller vers d'autres langages et plateformes. MAIS (bah oui y'a un mais), avec intelligence et pour des besoins moyens il est tout fait possible de faire des mathmatiques en ABAP. Comme toujours, l'important c'est le mtier, donc dans notre cas avoir une comprhension intelligente des mathmatique.

UN TYPE DE DONNE IDAL


En ABAP nous avons un type flottant (I). Il suffit donc de dclarer ses variables comme suit : DATA: valeur1 type F, valeur2 type F. Toutefois le type Decimal est aussi utilisable est a ses avantages.

DES FONCTIONS POUR MANIPULER DES NOMBRES EN ABAP (DCIMAL)

Voila un exemple simple DATA n TYPE p DECIMALS 2. DATA m TYPE p DECIMALS 2 VALUE '-9.52'. n n n n n n = = = = = = abs( m ). sign( m ). ceil( m ). floor( m ). trunc( m ). frac( m ). WRITE: WRITE: WRITE: WRITE: WRITE: WRITE: / / / / / 'ABS: ', 'SIGN: ', 'CEIL: ', 'FLOOR:', 'TRUNC:', 'FRAC: ', n. n. n. n. n. n. '// '// '// '// '// '// Valeur absolue le signe -1 = ngatif la valeur entire suprieur la valeur entire infrieur la partie entire la partie dcimale

Le rsultat sera le suivant

ABS: SIGN: CEIL: FLOOR: TRUNC: FRAC:

9.52 1.009.0010.009.000.52-

Jouer avec ce code en changeant le nombre de dcimals (dcimals 3 par exemple) et la valeur (par exemple 9.536)...

FONCTIONS POUR LES NOMBRES FLOTTANTS EN ABAP SUR SAP

N'oubliez pas que SAP fait de l'autoboxing, c..d qu'il adapte les formats de donnes aux ncessits de la fonction. On distingue plusieurs catgories de fonction : Les fonctions trigonomtriques : sin ( valeur ). // sinus cos( valeur ). // cosinus tan( valeur). // tangeante asin( valeur ). // arc sinus

acos( valeur ). // arc cosinus atan( valeur ). // arc tangeante.

les fonctions hyperboliques : cosh( valeur ). sinh( valeur ). tanh( valeur ).

les exponentiels : exp( valeur ).

Les logarythmes : log( valeur ). // logarythme naturel log10( valeur ). // logarythme de base 10

La racine carr : sqrt( valeur ).

ABAP CONTRE C#
Je vous propose ici un code en ABAP a comparer avec du C#
ABAP : REPORT ZMATH01. DATA: t1 TYPE i, t2 TYPE i, delta(16) TYPE p. GET RUN TIME FIELD t1. DATA: moncompteur type i. moncompteur = 0.DATA: result type F. DO 10000000 times. result = SQRT( SY-INDEX ).

ENDDO. GET RUN TIME FIELD t2. delta = t2 - t1. WRITE: / 'Time:', delta COLOR COL_TOTAL. C# : int imax = 10000000; DateTime start = DateTime.Now; for (int i = 0; i < imax; i++) { double result = Math.Sqrt(i); } DateTime end = DateTime.Now; TimeSpan spent = end - start; Console.WriteLine("{0} racine calcul en {1}", imax, spent.ToString()); Console.WriteLine("end");

La comparaison sera toujours en faveur, sur la mme plateforme, de Java ou .net....

QUELLE STRATGIE CHOISIR ?


Pour du calcul tout dpend de la quantit de calcul... Pour des calculs relativement simples pour une application SAP GUI, WebAS, WebDynPro, l'criture de fonctions RFC suffit amplement. Dans ce cas il suffit juste de bencher sa fonction (avec SE30) et voir si elle n'impacte pas trop sa solution. Pour des calculs plus importants comme la simulation, le forecasting, des modlisations, il est prfrable de dvelopper un Proxy Server en .net ou JAVA. Ainsi on dveloppe en C# ou Java des fonctions mathmatiques qui seront mises disposition des dveloppeurs ABAP pour qu'elles soient intgres de manire transparente. Pour des calculs hyper massiques, la meilleure solution reste le Proxy Server mais qui exposera des fonctions qui elles-mmes invoqueront du code C/C++ compil avec toutes les options en terme de support de multiprocesseurs, paralllisme, Grid, etc... Dans tous les cas il faut surtout exposer des fonctions aux ABAPEURS pour qu'eux ne se posent pas la question du quoi.

ANNEXE : SITES WEB


http://www.sdn.sap.com // Site en anglais des dveloppeurs SAP (Site Officiel) http://www.sapfans.com // Communaut indpendante en anglais consacre SAP http://www.b-integration.net // Communaut francophone consacre SAP et .net (technique et fonctionnelle)

ANNEXE : TRUCS ET ACTUCES LES CHAMPS SYJe vous propose un mmo avec la liste des champs SY dit champs systme, en tout 174... Dans le cadre de ce mmo (que j'cris le temps que mon SAP soit redmarr lol).... je vous propose les principaux, ceux qu'on doit connaitre par coeur. informations serveur SAP : SY-DBSYS // renvoie le nom du serveur de base de donne, par exemple : ORACLE SY-HOST // renvoie le nom de la machine sur laquelle tourne SAP SY-OPSYS // renvoie le nom du systme d'opration sur lequel tourne SAP SY-SYSID // renvoie l'id systme du SAP

Informations concernant le client : SY-LANGU // renvoie la langue utilise par le client SY-MANDT // renvoie le mandant SY-UNAME // renvoie le nom de l'utilisateur SY-MODNO // le numro de l'instance client en cours quand un utilisateur se connecte plusieurs fois en meme temps.

Information de calendrier : SY-DATUM // renvoie la date au format AAAAMMJJ par exemple 20100110 pour le 10 janvier 2010. SY-FDAYW // le numro de jour avec lundi = 1 . SY-UZEIT // heure du serveur d'application. SY-TIMLO // le temps local

Information sur les programmes : SY-CPROG // renvoie le nom du programme qui appelle votre code par exemple quand vous crivez une RFC SY-DYNNR // renvoie le nom de l'cran qui appelle votre code SY-TCODE // renvoie le nom de la transaction utilisant votre code SY-ABCDE // renvoie le code d'encodage des pages SY-INDEX // renvoie le nombre de cycle dans une boucle DO ou WHILE. SY-DBCNT // renvoie le nombre de recorde renvoy par un selec SQL SY-SUBRC // renvoie le code de retour ou l'exception avec 0 (zro) = success SY-UCOMM // renvoie le code event qui est dclenche par un PAI (Process After Input), OK en gnral

UNE POPUP POUR UNE SAISIE DHEURE

AFFICHER UN XML

ABAP IF IN RANGE

ABAP GRER UN DLAIS

ABAP POPUP ABAP

data c_popupret(1). call function 'POPUP_TO_CONFIRM' exporting text_question = 'Are you Ready ?' " Are you certain...? importing answer = c_popupret exceptions text_not_found = 1 others = 2. write c_popupret. Le popup renvoie 1 pour OUI 2 pour non et A pour annuler. Facile

ABAP ALVGRID SIMPLE