Documente Academic
Documente Profesional
Documente Cultură
NET
Mention lgale : Les marques SAP, ABAP, WEBDYNPRO sont la proprit de la socit SAP.
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.
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...
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
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.
Notez que l'affectation se fait via un '=' et que la dclaration se fait via Data.
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#.
Dans ce cas nous utilisons le mot Data avec un double point Data: et chaque variable est spare par une virgule.
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.
De l vous pouvez allez sur les onglets Attributes Further characteristics ou Field Label...
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.
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.
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.
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).
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.
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 ".
on a ainsi ce rsultat..
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.
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
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....
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 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.
Enfin dans l'onglet Source code on tape le code (va tre vachement rapide)...
(ou control+F3) comme pour les programmes crits avec SE38. On peut enfin tester
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 / ...
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...
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.
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
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
Puis on doit slectionner une "delivery class" qui caractrise la table... Dans notre cas nous tapons A
Puis on clique sur l'onglet Fields ... La fentre d'dition des champs s'ouvre...
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)
Nous devons maintenant dfinir la Data Class et le Size Category... Regardons la Data Class ... Nous slectionnons APPL0
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.
Puis on clique sur la disquette ... Rptez l'opration pour entrer 3 ou 4 entres ...
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...
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.
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
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).
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.
et on obtient
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 :
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
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
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.
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.
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.
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
STRATGIE N3 : ON NE SLECTIONNE QUE LE S CHAMPS QU'ON DSIRE DANS UNE STRUCTURE ENTIRE
Le code :
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.
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
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
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.
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 :
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.
* 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
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
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.
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.
Entrez un numro dcran par exemple 0100. Une nouvelle fentre souvre. Renseignez l
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 ajouter BTADD_F dans la case Function Code. Et on active son code (CTRL+F3). Puis on passe sur longle Flow Logic.
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.
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
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.
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
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
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
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
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.
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
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)...
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
Les logarythmes : log( valeur ). // logarythme naturel log10( valeur ). // logarythme de base 10
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");
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
AFFICHER UN XML
ABAP IF IN RANGE
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