Quelquepart

Blog d'un développeur ABAP

Vous êtes ici : Accueil

Classe CL_GUI_FRONTEND_SERVICES

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

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

Envoyer des emails depuis SAP BW (2/2) : Process chain

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

Nous avons vu comment configurer le serveur SAP dans un précédent billet, il reste à planifier l'envoi d'alertes dans nos process chain.

Dans la transaction RSPC, vous pouvez ajouter un message pour chaque type de processus, par exemple sur le processus de lancement.

Faites un clic droit sur le processus et sélectionner "Créer message"

Un popup de sélection de variante apparait. Entrer un nouveau nom puis cliquer sur le bouton "Créer".

Un nouveau popup vous demande de saisir un libellé pour ce message. Saisissez le avec précaution. En effet ce libellé sera le SUJET de l'email envoyé par le message.

Vous arrivez alors sur le panneau de gestion du nouveau message. Le bouton "Editer document" permet de saisir le corps du message, le bouton "Gérer liste réception." permet de définir les destinataires.

Valider et sauvegarder. Une fois de retour sur la process chain, le message est affiché directement dans le rectangle du processus, et un clic droit sur ce processus vous affiche de nouvelles options "Gérer message" et "Supprimer message".

Envoyer des emails depuis SAP BW (1/2) : paramétrage du serveur

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

Sur BW, il est intéressant de pouvoir envoyer des alertes par email en cas d'erreur dans les chargements nocturnes (process chain). Si sur SAP R/3 il peut être intéressant d'utiliser le système d'alerte de SAP, ce n'est pas pertinent pour BW, les utilisateurs ne se connectant pas directement en transactionnel, mais soit via Excel, soit via le portail web donc il ne serait pas aisé pour eux de souscrire aux alertes.

Chez un client sans administrateur SAP dédié, j'ai du paramétrer le serveur pour qu'il gère l'envoi d'e-mails vers une boite générique, des règles de redirection étant paramétrées sur cette boite pour "arroser" l'équipe technique, ainsi que quelques key-users.

Première étape du paramétrage : transaction SCOT

Si vous n'arrivez pas sur l'écran d'état du système, aller dans le menu Vue > Etat du système (ou appuyer sur F5).
Une fois sur l'écran d'état du système, double cliquer sur la ligne SMTP (après avoir déplié le noeud INT).

Renseigner les champs "Hôte mail" et "Port mail" avec les données du serveur de messagerie de l'entreprise. Cocher la case "Noeuds opérationnels"
Cliquer sur le bouton "paramétrer" de la ligne "Internet"

Renseigner la plage d'adresses email autorisées, ou * pour autoriser toute adresse puis valider les écrans.

Vous pouvez maintenant faire un test de routage :
Menu Utilitaires > Test de routage (ou CTRL F10)

Renseigner le type d'adresse INT et indiquer un email. Appuyer sur ENTREE pour valider et lancer le test de routage. Si tout se passe bien, vous verrez apparaitre sous vos informations le noeud SMTP ainsi que l'adresse mail que vous avez indiqué.

Deuxième étape, il vous faut activer le service SMTP de SAPConnect via la transaction SICF Si le service n'est pas activé, il apparaitra grisé dans la liste des services. Clic droit sur SAPconnect puis choisir l'option "Activave SMTP Host"

Un message de succès apparait et la ligne devient noire. Si le service est déjà actif, cette même opération fera apparaitre le message d'erreur "Service has already been actively saved"

Troisième étape, il faut définir une adresse email pour son User SAP via la transaction SU01

A partir de maintenant, il doit être possible d'envoyer un email.
Pour le vérifier il existe de multiples manières. La plus simple est de passer par la Business workplace SAPOffice : transaction SO01.

Créer un nouveau message en indiquant un titre, un contenu, et un destinataire de type "Adresse internet", puis cliquer sur "Envoyer"

Le message doit être maintenant en attente dans la file d'envoi. Pour le faire sortir de SAP, il faut aller dans la transaction SOST. Le message apparait bien en jaune : il est prêt, en attente d'envoi.

Pour l'envoyer, Aller dans le menu Utilitaires > Lancer processus d'envoi (ou CTRL F7)

Une liste des messages envoyés apparait. Vous pouvez double cliquer sur une ligne pour voir le détail du routage.

Si tout s'est bien passé, le message est passé en vert ou en gris. En cas de problème il sera passé en rouge. Vous pouvez cliquer sur le nombre de la dernière colonne (Msg) pour avoir le texte d'erreur (ou refaire un test et analyser le détail du routage lors de l'envoi).
En cas d'erreur il est probable qu'il faille se tourner du coté de l'administration du serveur de messagerie pour qu'il accepte d'envoyer les messages en provenance du serveur SAP (possible blocage total ou internet, auquel cas il sera possible de faire un test sur sa messagerie d'entreprise mais pas sur un webmail).

Une fois le test passé avec succès, il ne reste plus qu'a paramétrer les process chain, cela fera l'objet d'un prochain billet.

Quelques grammes de GuiXT dans un monde de brutes...

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

La plupart des gens que je connais utilisent des couleurs distinctes pour différencier les environnements SAP (développement/recette/production).

Personnellement je ne suis pas adepte de cette solution. Quel faire quand on a 7 serveurs de production, 2 pre-prod, 2 recettes, 2 dev ? (fréquent en phase de montée de version)

Heureusement GuiXT vient au secours de tous les daltoniens pour les sauver d'erreurs aux conséquences incalculables ( oups, je viens de lancer l'impression de 30000 factures... en production... bon, je vide mon bureau de suite ? ). Grâce à une simple commande GuiXT, vous pouvez préfixer toutes vos fenêtres SAP par le trigramme du serveur. Voici comment faire :

  1. Activer GuiXT
    Cocher l'option "Activer GuiXT" dans les options du sapgui
  2. La fenêtre de GuiXT s'ouvre, cliquer sur le bouton "Profile"
  3. La fenêtre d'options apparaît, renseigner un répertoire ou vous souhaitez placer les scripts (C:guixt par exemple). Attention, vous devrez créer manuellement le répertoire s'il n'existe pas.
    Dans le cadre "Start Window", choisir "Minimized"
    Dans le cadre "Further Options", cocher "No language key in script file name"
    Valider avec le bouton OK
  4. Créer un fichier nommé "session.txt". L'éditer avec Notepad (Blocnote) et copier coller le code suivant :
    titleprefix &V[_database]
  5. Quitter SAP et le relancer.

Le trigramme du serveur vient désormais préfixer l'ensemble de vos fenêtres SAP.

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
  • Une gestion d'opnglet vous permet de lancer plusieurs requêtes

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.