Quelquepart

Blog d'un développeur ABAP

Vous êtes ici : Accueil>Mots clés>abap

abap

Classe CL_GUI_FRONTEND_SERVICES

Rédigé par Sébastien Hermann dans Fonction -

Derrière ce nom se cache une véritable trousse à outils de méthodes toutes plus utiles les unes que les autres. En effet SAP a décidé de regrouper au sein d'une même classe toutes les "fonctions" de dialogue avec le pc de l'utilisateur (aussi appelé "poste client").
Terminé les WS_UPLOAD ou autre GUI_UPLOAD (que SAP indique depuis longtemps comme obsolète), place à la méthode upload.

L'usage est simplifié au maximum, afin que même les développeurs fermés à l'abap objet puissent les utiliser. Inutile de créer un objet ou déclarer quoi que ce soit, vous pouvez appeler directement la méthode qui vous intéresse dans la classe CL_GUI_FRONTEND_SERVICES, de la même manière que vous appelleriez une fonction classique.

Ci dessous un tableau récapitulant les principales méthodes, avec un exemple d'utilisation.

Méthode Description Code exemple
CLIPBOARD_EXPORT Exporter des données dans le presse-papier Windows
DATA : s_line(100),
       t_line LIKE TABLE OF s_line,
       i_rc TYPE i.

APPEND 'Test envoi presse-papier' TO t_line.

CALL METHOD cl_gui_frontend_services=>clipboard_export
  IMPORTING
    data         = t_line
  CHANGING
    rc           = i_rc
  EXCEPTIONS
    OTHERS       = 0.
WRITE i_rc.
CLIPBOARD_IMPORT Importer des données du presse-papier Windows
DATA : s_line(100),
       t_line LIKE TABLE OF s_line,
       i_length TYPE i.

CALL METHOD cl_gui_frontend_services=>clipboard_import
  IMPORTING
    data         = t_line
    length       = i_length
  EXCEPTIONS
    OTHERS       = 0.

LOOP AT t_line INTO s_line.
  WRITE / s_line.
ENDLOOP.
DIRECTORY_BROWSE Affiche un popup windows de sélection de répertoire sur le poste local Ne fonctionne pas avec le noyau 4.6c
DATA : w_folder TYPE string,
       w_title TYPE string,
       w_init TYPE string.

w_title = 'Rechercher le dossier'.
w_init = 'C:'.

CALL METHOD cl_gui_frontend_services=>directory_browse
  EXPORTING
    window_title    = w_title
    initial_folder  = w_init
  CHANGING
    selected_folder = w_folder
  EXCEPTIONS
    OTHERS          = 0.

WRITE w_folder.
DIRECTORY_CREATE Créer un répertoire sur le poste client
DATA : w_dir TYPE string,
       i_rc TYPE i.

w_dir = 'C:Nouveau Rep inexistant'.

CALL METHOD cl_gui_frontend_services=>directory_create
  EXPORTING
    directory = w_dir
  CHANGING
    rc        = i_rc
  EXCEPTIONS
    OTHERS    = 0.

WRITE i_rc.
DIRECTORY_DELETE Supprimer un répertoire sur le poste client
DATA : w_dir TYPE string,
       i_rc TYPE i.

w_dir = 'C:Nouveau Rep inexistant'.

CALL METHOD cl_gui_frontend_services=>directory_delete
  EXPORTING
    directory = w_dir
  CHANGING
    rc        = i_rc
  EXCEPTIONS
    OTHERS    = 0.

WRITE i_rc.
DIRECTORY_EXIST Tester si un répertoire existe sur le poste client
DATA : w_dir TYPE string,
       w_rc.

w_dir = 'C:guixt'.

CALL METHOD cl_gui_frontend_services=>directory_exist
  EXPORTING
    directory = w_dir
  RECEIVING
    result    = w_rc
  EXCEPTIONS
    OTHERS    = 0.

WRITE w_rc. "X si existe, space si n'existe pas
DIRECTORY_LIST_FILES Liste les fichiers d'un répertoire
DATA : s_line(100),
       t_line LIKE TABLE OF s_line,
       w_dir TYPE string,
       i_count TYPE i.

w_dir = 'C:'.

CALL METHOD cl_gui_frontend_services=>directory_list_files
  EXPORTING
    directory                   = w_dir
    filter                      = '*.TXT'
*    FILES_ONLY                  =
*    DIRECTORIES_ONLY            =
  CHANGING
    file_table                  = t_line
    count                       = i_count
  EXCEPTIONS
    OTHERS                      = 0.

WRITE i_count.
LOOP AT t_line INTO s_line.
  WRITE / s_line.
ENDLOOP.
ENVIRONMENT_GET_VARIABLE Lecture d'une variable d'environnement Windows Ne semble pas fonctionner sur noyau SAP_BASIS 6.20
DATA : w_var TYPE string,
       w_val TYPE string.

w_var = 'OS'.

CALL METHOD cl_gui_frontend_services=>environment_get_variable
  EXPORTING
    variable = w_var
  CHANGING
    value    = w_val
  EXCEPTIONS
    OTHERS   = 0.

WRITE w_val.
ENVIRONMENT_SET_VARIABLE Modification d'une variable d'environnement Windows Ne semble pas fonctionner sur noyau SAP_BASIS 6.20
DATA : w_var TYPE string,
       w_val TYPE string,
       i_rc TYPE i.

w_var = 'NEWVAR'.
w_val = 'TEST'.
CALL METHOD cl_gui_frontend_services=>environment_set_variable
  EXPORTING
    variable = w_var
    value    = w_val
  CHANGING
    rc       = i_rc
  EXCEPTIONS
    OTHERS   = 0.

WRITE i_rc.
EXECUTE Exécute une application sur le poste client
DATA : w_appl TYPE string,
       w_param TYPE string.

w_appl = 'C:WINDOWSNOTEPAD.EXE'.
w_param = 'C:boot.ini'.

CALL METHOD cl_gui_frontend_services=>execute
  EXPORTING
    application            = w_appl
    parameter              = w_param
  EXCEPTIONS
    OTHERS                 = 0.
FILE_DELETE Supprimer un fichier sur le poste client
DATA : w_file TYPE string,
       i_rc TYPE i.

w_file = 'C:test.txt'.

CALL METHOD cl_gui_frontend_services=>file_delete
  EXPORTING
    filename = w_file
  CHANGING
    rc       = i_rc
  EXCEPTIONS
    OTHERS   = 0.

WRITE i_rc.
FILE_EXIST Tester si un fichier existe sur le poste client
DATA : w_file TYPE string,
       w_rc.

w_file = 'C:test.txt'.

CALL METHOD cl_gui_frontend_services=>file_exist
  EXPORTING
    file   = w_file
  RECEIVING
    result = w_rc
  EXCEPTIONS
    OTHERS = 0.

WRITE w_rc.
FILE_OPEN_DIALOG Affiche un popup windows de sélection de fichier sur le poste local
DATA : w_titre TYPE string,
       w_file TYPE string,
       w_dir TYPE string,
       t_file TYPE filetable,
       s_file LIKE LINE OF t_file,
       i_rc TYPE i.

w_titre = 'Selection de fichier'.
w_file = 'test.txt'.
w_dir = 'C:guixt'.

CALL METHOD cl_gui_frontend_services=>file_open_dialog
  EXPORTING
    window_title      = w_titre
    default_filename  = w_file
    initial_directory = w_dir
  CHANGING
    file_table        = t_file
    rc                = i_rc
  EXCEPTIONS
    OTHERS            = 0.

WRITE i_rc.
LOOP AT t_file INTO s_file.
  WRITE / s_file.
ENDLOOP.
FILE_SAVE_DIALOG Affiche un popup windows de sélection de fichier sur le poste local (avec confirmation si le fichier existe déjà)
DATA : w_titre TYPE string,
       w_file TYPE string,
       w_dir TYPE string,
       w_name TYPE string,
       w_path TYPE string,
       w_fp TYPE string.

w_titre = 'Selection de fichier pour sauvegarde'.
w_file = 'test.txt'.
w_dir = 'C:guixt'.

CALL METHOD cl_gui_frontend_services=>file_save_dialog
  EXPORTING
    window_title      = w_titre
    default_file_name = w_file
    initial_directory = w_dir
  CHANGING
    filename          = w_name
    path              = w_path
    fullpath          = w_fp
  EXCEPTIONS
    OTHERS            = 0.

WRITE : / w_name, / w_path, / w_fp.
GUI_DOWNLOAD Télécharger un fichier sur le poste client
DATA : w_file type string,
       s_file type string,
       t_file like table of s_file.

w_file = 'C:test.txt'.
s_file = 'Test de contenu de fichier'.
append s_file to t_file.

CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename                = w_file
    FILETYPE                = 'ASC'
  changing
    data_tab                = t_file
  EXCEPTIONS
    others                  = 0.
GUI_UPLOAD Charger un fichier depuis le poste client
DATA : w_file TYPE string,
       s_file TYPE string,
       t_file LIKE TABLE OF s_file.

w_file = 'C:test.txt'.

CALL METHOD cl_gui_frontend_services=>gui_upload
  EXPORTING
    filename = w_file
  CHANGING
    data_tab = t_file
  EXCEPTIONS
    OTHERS   = 0.

LOOP AT t_file INTO s_file.
  WRITE / s_file.
ENDLOOP.
REGISTRY_DELETE_KEY Supprimer une clé de registre sur le poste client Ne semble pas fonctionner sur noyau SAP_BASIS 6.20
REGISTRY_DELETE_VALUE Supprimer une valeur de registre sur le poste client Ne semble pas fonctionner sur noyau SAP_BASIS 6.20
REGISTRY_GET_VALUE Lire une valeur de registre sur le poste client Ne semble pas fonctionner sur noyau SAP_BASIS 6.20
REGISTRY_SET_VALUE Modifier une valeur de registre sur le poste client Ne semble pas fonctionner sur noyau SAP_BASIS 6.20

ZTOAD : Requêteur Open SQL

Rédigé par Sébastien Hermann dans Application -

Vous avez surement déjà été confronté à un bug dans un programme en production qui ne semble pas être reproductible en environnement de test.

Dans ces cas là, il n'est pas toujours évident de débugger directement le programme en production (problème de droits, sensibilité des données, risque de mauvaise exécution, documents créés avec votre user...). Quand le bug semble venir d'une requête SQL un peu compliquée (jointure sur 5 tables, subquery...), vous voila embarqué dans de fastidieuses recherches via SE16 avec 3 ou 4 modes ouverts pour essayer de comprendre le problème avec la requête (et encore... le problème ne vient peut-être même pas de cette requête la !)

Dans d'autres mondes, les développeurs n'ont pas ce genre de problèmes et peuvent composer en temps réel leur requêtes personnalisées directement sur la base de données. Sur SAP ce n'est pas possible. Vraiment ? Pas en standard en tout cas. Il suffit donc de créer un programme spécifique.

Dérivé de Z_TETARD lui même dérivé de YES4SQL, voici ZTOAD, mon requêteur SQL. Il permet de faire vos propres requêtes multi-tables, ou de copier coller celle du programme à débugger.

Les commentaires ABAP sont supprimés avant exécution, les alias de table sont compris, les requêtes sont mémorisées pour réutilisation (jusqu'à 99 requêtes).

ZTOAD nouveau se présente sous la forme d'une transaction à écran unique :

  • A gauche vos requêtes sauvegardées et votre historique de requête exécutées.
  • Au milieu votre éditeur de requête, qui accepte toute forme de select, mais également insert, delete, update...
  • A droite un explorateur de DDIC qui vous affiche les champs des tables présentes dans votre requête.
  • Et en bas une grille ALV affichant les résultats de la requête exécutée

L'aide ABAP est disponible lors de la saisie de requête, ainsi que l'aide intégrée du programme. Vous pouvez saisir plusieurs requêtes et choisir celle a exécuter sans avoir a effacer les autres. Vous pouvez partager vos requêtes avec les autres utilisateurs.

A noter : vous pouvez définir finement les autorisations par utilisateur pour chaque type de requête (SELECT, INSERT, UPDATE, DELETE). A la manière initiée dans ZAL11, cette gestion est simple et accessible au début du programme : Vous pouvez désactiver certaines commandes en quelques secondes sans avoir à comprendre les méandres du code.

Cette nouvelle version utilise une table pour stocker les requêtes, il faudra donc utiliser l'extension SAPLINK de gestion de tables pour pouvoir l'installer.

Télécharger ZTOAD - version pour SAP 4.6 n'est plus mis à jour

A noter : n’oubliez pas que vous aurez besoin de SAPLINK et son extension de gestion de table pour installer le programme.

Fonction RV_CALL_DISPLAY_TRANSACTION

Rédigé par Sébastien Hermann dans Fonction -

Petit focus sur une fonction "magique" de SAP.

RV_CALL_DISPLAY_TRANSACTION permet d'ouvrir en mode transactionnel tout type (ou presque) de documents SD/MM dans SAP.

function rv_call_display_transaction.
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*"       IMPORTING
*"             VALUE(BUKRS) DEFAULT '    '
*"             VALUE(FCODE) DEFAULT '    '
*"             VALUE(GJAHR) DEFAULT '0000'
*"             VALUE(LGNUM) LIKE  VBFA-LGNUM DEFAULT '   '
*"             VALUE(POSNR) LIKE  VBAP-POSNR DEFAULT '000000'
*"             VALUE(VBELN) LIKE  VBUK-VBELN
*"             VALUE(AUFNR) LIKE  VBAK-AUFNR OPTIONAL
*"             VALUE(VBTYP) LIKE  VBUK-VBTYP DEFAULT ' '
*"             VALUE(FI_APPLI) LIKE  VBFAL-APPLI DEFAULT '  '
*"----------------------------------------------------------------------

Il suffit de renseigner le numéro de document (VBELN) pour ouvrir commande, contrat, livraison sortante ou facture. Mieux, ajouter le numéro de poste (POSNR) et le document ouvert arrive directement sur ce poste.

Mais ce n'est pas tout. Si vous spécifiez le type de document (VBTYP), vous pouvez ouvrir une multitude d'autres documents. Voici un petit tableau des transactions gérées par cette fonction :

VBTYPTransactionDocumentChamps pris en compte
1VC03, VC02ContactVBELN
3 ou 4VF23, VF22Liste de facturesVBELN
5, 6, M, N, O, P, S, UVF03, VF02FactureVBELN POSNR
7VL33N, VL32NLivraison entranteVBELN
8VT03N, VT02NTransportVBELN
AVA13, VA12Demande d'offreVBELN POSNR
BVA23, VA22OffreVBELN POSNR
C, H, I, K, LVA03, VA02CommandeVBELN POSNR
DVA53, VA52PropositionVBELN POSNR
E, FVA33, VA32Programme de livraisonVBELN POSNR
F, G, 0VA43, VA42ContratVBELN POSNR
QLT21Ordre de transfertVBELN LGNUM
R, h, iMB03, MB02Doc articleVBELN
J, TVL03N, VL02NLivraison sortanteVBELN POSNR
VME23N, ME33, ME43, ME53N, ML81N, ME22, ME32K, ME32L, ME42, ME52Document achat (demande, commande, VBELN
vME53NDemande d'achatVBELN
WMD83, MD82Plan de besoinVBELN POSNR
Xfct HU_DISPLAY (?)Unité de manutentionVBELN
&LX44Document magasinVBELN LGNUM
aVI03Frais de transportVBELN
YVB03Liste d'exclusionVBELN
.IW33OrdreAUFNR
:IQS3AvisAUFNR
1 et FI_APPLI=MMMB03Doc articleVBELN (comme doc article)+GJAHR+BUKRS
2, 3 et FI_APPLI=MMFB03Piece comptableVBELN (comme doc article)+GJAHR+BUKRS
A et FI_APPLI=MMMIR4Doc de facturationVBELN (comme doc article)+GJAHR
vide et BUKRS renseignéFB02Piece comptableVBELN (comme doc article)+GJAHR+BUKRS

Légende : Document accessible sans indiquer de VBTYP
Uniquement pour la fonction DISPLAY
Uniquement pour la fonction CHANGE

Vous pouvez utiliser RV_CALL_CHANGE_TRANSACTION pour ouvrir en modification les mêmes documents.
Ces fonctions sont très utilisées par le standard pour afficher des documents.
A noter, les USEREXIT de LV06AFZZ sont utilisés.

Reprise de données SAP Standard

Rédigé par Sébastien Hermann dans Liste mémo -

Voici une petite liste de programmes standards de reprise de données.

Solution Business Object Prog/Transaction Code
Financial Acounting Accounting Documents RFBIBL00
Financial Acounting Assets RAALTD01 (Batch Input)
Financial Acounting RAALTD11 (Direct Input)
Financial Acounting G/L Account Master RFBISA00
Financial Acounting Customer Master RFBIDE00
Financial Acounting Vendor Master RFBIKR00
FI-Bank Data Transfer of Bank Data
FI-Bank Data (Austria) RFBVAT_0
FI-Bank Data (German) RFBVD__2
FI-Bank Data (Great Britain) RFBVGB_0
FI-Bank Data (Italian) RFBVIT_0
FI-Bank Data (Spanish) RFBVES_0
FI-Bank Data (Swiss) RFBVCH_0
Human Resources Master Data (Org. Units) RPUSTD00
Human Resources Payroll Account RPULKT00
Human Resources Personal Planning Data RHALTD00
Materials Management Create Characteristics RCCTBI01
Materials Management Create Classes RCCLBI01
Materials Management Create Classification RCCLBI02
Materials Management Change Classification RCCLRI03
Materials Management Material Master RMDATIND
Materials Management Purchase Info. Records RM06IBI0
Materials Management Purchase Requisitions RM06BBI0
Materials Management Reservations RM07RRES
Materials Management Stocks (Inventory Mgmt) RM07MMBL
Materials Management Vendor Master RFBIKR00
MM (Physical Inventory Doc) Create PID For Cycle Counting RM07ICN1
MM (Physical Inventory Doc) Create PID For Sales Order RM07IE31
MM (Physical Inventory Doc) Create PID For Standard Stock RM07II31
MM (Physical Inventory Doc) Block Material for Phys. Inv. RM07II32
MM (Physical Inventory Doc) Block Material for Phys. Inv. RM07II37
MM (Physical Inventory Doc) Create PID vendor consignmnt RM07IK31
MM (Physical Inventory Doc) Cre. PID ret. transp. packaging RM07IM31
MM (Physical Inventory Doc) Cre. PID Mat. Prov. to Vendor RM07IO31
MM (Physical Inventory Doc) Create PID for project RM07IQ31
MM (Physical Inventory Doc) Cre. PID ret. packaging at cust RM07IV31
MM (Physical Inventory Doc) Cre. PID consignment at cust. RM07IW31
MM (Physical Inventory Doc) Inventory Sampling RM07SVOR
Materials Management (EH & S) Phrases CG31
Materials Management (EH & S) Sources CG32
Materials Management (EH & S) Substances CG33
Plant Maintenance Measuring Point RIIBIP00/IBIP
Plant Maintenance Measurement Document RIIBIP00/IBIP
Plant Maintenance Notifications-General RIIBIP00/IBIP
Plant Maintenance Functional Location RIIBIP00/IBIP
Plant Maintenance Object Link RIIBIP00/IBIP
Plant Maintenance Equipment RIIBIP00/IBIP
Plant Maintenance Maintenance Plan RIIBIP00/IBIP
Plant Maintenance Scheduling Maintenance Plan RIIBIP00/IBIP
Plant Maintenance Order Confirmation RIIBIP00/IBIP
Plant Maintenance Equipment Task List RIIBIP00/IBIP
Plant Maintenance General Maintenance Task List RIIBIP00/IBIP
Plant Maintenance Functional Location Task List RIIBIP00/IBIP
Production Master Data Create BOM RCSBI010 (Batch Input)
Production Master Data Change BOM RCSBI020 (Batch Input)
Production Master Data Create Variant BOM RCSBI030 (Batch Input)
Production Master Data Create BOM With Long Text RCSBI040 (Batch Input)
Production Master Data Routing / Task Lists RCPTRA01 (Batch Input)
Production Planning Demand Management RMMM60BI (Bacth Input)
Production Planning RM60IN00 (Direct Input)
SAP-EIS Several Records for SAP-EIS RKCFILE0
Sales and Distribution Condition Records (Pricing) RV14BTC1
Sales and Distribution Customer Master RFBIDE00
Sales and Distribution Open Sales Orders RVINVB00
Sales and Distribution Invoice External Transactions RVAFSS00
Warehouse Management Storage Bins RLPLAT00
Warehouse Management Stocks on Storage Bins RLBEST00

Conserver ses programmes ABAP

Rédigé par Sébastien Hermann dans Général -

Etant prestataire de service, je suis amené régulièrement à changer de client. Cela présente certains avantages mais aussi des inconvénients. Et parmi eux celui de "perdre" toutes ses réalisations.

Afin de capitaliser mon temps passé à rechercher des fonctions standards cachées, à réaliser des algorithmes tordus hyper optimisés ou à réinventer la roue, j'essaie de conserver mes codes sources.

Au fil des ans et des versions de SAP, j'ai utilisé différents programmes pour le faire car chacun devenait incompatible avec la version de SAP suivante (4.5/4.6, 4.7, ECCx...)

Récemment j'ai découvert SAPLink, un programme ABAP "open source" pour essayer de standardiser cette opération. Ce programme est très bien fait, est ouvert aux "plugins" pour en étendre les fonctionnalités, et possède l'énorme avantage de permettre d'uniformiser les échanges de programmes entre développeurs via un format de fichier commun.

L'installation se fait en 2 temps. Il y a un programme temporaire (zsaplink_installer) dont le seul usage est de charger le .nugg (format de fichier utilisé par saplink) afin d'installer complètement Saplink.

Sur leur site ils se définissent comme : "an open source project that aims to make it easier to share ABAP developments between programmers. It provides the ability to easily distribute and package custom objects."

J'ai décidé de l'utiliser et de proposer ici mes réalisations sous ce format, que je pense pérenne.
Malheureusement, SAPLink ne fonctionne qu'a partir de SAP 4.7
Aussi pour les codes compatibles 4.6, j'utiliserai le programme ZAPC0007. Bien que moins abouti, il permettra néanmoins de passer l'essentiel des éléments d'un programme. Seul le ddic restera à recréer manuellement.

SAPLINK évolue avec le temps et perd malheureusement sa compatibilité avec les vieilles versions de SAP. Les déménagements successifs du projet ont rendu compliqué l'accès aux différentes versions aussi je vais proposer sur mon site le téléchargement des principales versions exploitées.

Si la dernière version stable proposée ne fonctionne pas, voici de plus anciennes versions :

Sans oublier l'extension de gestion de tables indispensable pour certains de mes applications.