Gestion de fichiers dans un InputScript

Il y a de nombreuses raisons pour utiliser des fichiers dans un InputScript:
  • vous pouvez lire des données dans un fichier et les intégrer dans le R/3
  • vous pouvez extraire des données du R/3 au travers de transactions et utiliser les fichiers générés dans Excel ou d’autres outils similaires
  • vous pouvez générer un fichier html et l’afficher ensuite dans un écran R/3 à l’aide du GuiXT Viewer

Lorsque vous envisagez de telles applications, pensez au fait que cette méthode fonctionne bien pour 100 à 1000 enregistrements dans le fichier, mais que d’autres approches (batch input, programmes ABAP) sont sûrement plus adaptées pour un plus grand nombre d’enregistrements. L’approche de “scripting” décrite ici convient pour modifier 50 articles à l’aide d’un fichier Excel ou pour extraire des données pour 120 centres de coûts. En particulier pour des tâches ad hoc l’InputAssistant est une solution permettant de gagner beaucoup de temps qui serait autrement nécessaire pour le traitement manuel ou la programmation.

Aperçu
Nous utilisons les fonctionnalités suivantes de l’InputAssistant (reportez-vous à la documentation des mots-clés pour plus de détails):
  • Ouvrir et fermer un fichier: OpenFile, CloseFile
  • Lire des valeurs d’un fichier dans des variables: ReadFile
  • Ajouter un nouvel enregistrement à un fichier: AppendFile
  • Le traitement des variables: Set, if
  • Contrôle du déroulement dans l’InputScript: Screen, Enter, goto, label, Return
Exemple 1

Assumons que nous avons un fichier texte avec des numéros d’articles. Nous voulons générer un second fichier contenant à la fois les numéros d’articles et la division, le groupe marchandises et le groupe d’autorisations correspondant à chaque article.

Pour commencer nous avons besoin d’un endroit d’où nous lancerons le scripte, par exemple le menu de base du R/3:

MENUS00.F0040.txt:
Pushbutton (toolbar) “Génération de fichier” “/NMM03″ Process=”CreerFichierArticle.txt”

L’InputScript CreerFichierArticle.txt sera comme suit:

// Créer fichier article (Exemple for R/3 Rel. 4.5)
Parameter mat_file1 “C:\GuiXT\Input.txt”
Parameter mat_file2 “C:\GuiXT\Output.txt”

// Début
Screen SAPLMGMM.0060
   OpenFile “&[mat_file1]“
   OpenFile “&[mat_file2]” “-Output”

label Lire_Fichier
ReadFile “&[mat_file1]” mat_matnr

   if not V[mat_matnr]
      CloseFile “&[mat_file1]“
      CloseFile “&[mat_file2]“
      Return “Fichier article généré” “&[mat_file2]“
   endif

   Set F[Article] “&[mat_matnr]“
   Enter

// Sélectionner les vues
Screen SAPLMGMM.0070
   Set C[Données de base 1] “X”
   Enter

// Données de base 1
Screen SAPLMGMM.4000
   Set V[mat_division] “&F[Secteur d'activité]“
   Set V[mat_matgroup] “&F[Grpe marchand.]“
   Set V[mat_autgroup] “&F[Groupe autorisations]“

   AppendFile “&[mat_file2]” mat_matnr mat_division mat_matgroup mat_autgroup

   Enter “/NMM03″

// MM03 recommencer, aller au début du scripte
Screen SAPLMGMM.0060
   goto Lire_Fichier

Le temps d’exécution pour 100 numéros d’articles était dans notre cas de 67 secondes dans notre système de test (système central sur un ordinateur avec Pentium 266MHz et 256 MB RAM) .

 

Exemple 2

Supposons que nous avons un fichier texte contenant les données de pièces comptables. Nous voulons traiter ces pièces dans R/3 à l’aide de la transaction FB01. Si une erreur survient lors du traitement de ces transaction R/3, nous enregistrons le message d’erreur dans un fichier ensemble accompagné d’autres données.

MENUS00.F0040.txt:
Pushbutton (toolbar) “Saisie de pièce” “/NFB01″ Process=”FB01_GL.txt”

L’InputScript FB01_GL.txt sera comme suit:

// Noms de fichiers
Parameter FB01FILE “C:\GL Test\FB01_data.txt”
Parameter FB01ERR  “C:\GL Test\FB01_err.txt”

// Début d’exécution de fichier
OpenFile “&[FB01FILE]” “Delimiter=;”
OpenFile “&[FB01ERR]” “-Output”

Set V[FB01_errors] 0
Set V[FB01_records] 0

Screen SAPMF05A.0100

   label start

   // Y
a-t-il une erreur dans l’enregistrement précédent??

   if V[_lasterror]

     // Augmenter le compteur d’erreur
     Set V[FB01_errors] &[F
B01_errors] + 1

     // Ecrire le fichier erreur
     AppendFile “&[FB01ERR]” s_date s_text s_pstky1 s_account1 s_amount1 s_pstky2 s_account2 s_amount2 _lasterror

        // Initialiser l’indicateur d’erreur (!). une initialisation automatique n’est faite qu’en début de l’exécution du scripte 
     Set V[_lasterror]
   endif 

   ReadFile “-StripQuotationMarks” “&[FB01FILE]” s_date s_text s_pstky1 s_account1 s_amount1 s_pstky2 s_account2 s_amount2 

   // Y a-t-il un autre enregistrement à traiter?
   if V[s_date]

     // Augmenter le compeur d’enregistrements
     Set V[FB01_records] &[FB01_records] + 1

     Set F[Date pièce] &[s_date]
     Set F[Texte d'en-tête] &[s_text]
     Set F[Société] “0001″
     Set F[Type] “SA”
     Set F[Devise/taux] “USD”

     Set F[CC] &[s_bschl1]
     Set F[Compte] &[s_account]

     Enter OnError=”/NFB01″

   else

     // Traitement terminé, fermeture des fichiers
     CloseFile “&[FB01FILE]“ 
     CloseFile “&[FB01ERR]“ 

     if V[FB01_errors=0]
       Return “Traitement terminé, pas d’erreurs, &[FB01_records] pièces au total”
     else

       // Afficher le fichier d’erreurs
       View “&[FB01ERR]“ 

       Return “Traitement terminé: &[FB01_errors] erreurs, &[FB01_records] pièces au total”
     endif
   endif 

Screen SAPMF05A.0300
   Set F[Montant] &[s_amount1]
   Set F[CC]  &[s_pstky2]
   Set F[Compte général]  &[s_account2]

   Enter “OnError=/NFB01″

Screen SAPMF05A.0300
   Set [Montant] &[s_amount2]
   Enter “/11″ OnError=”/NFB01″

Screen SAPMF05A.0100
   goto start 

Le fichier de saisie FB01_data.txt pourrait être comme suit:

01122000;”GL text1″;40;113100;100;50;113101;100
02122000;”GL text2″;40;113100;200;50;113777;200
15122000;”GL text3″;40;113100;300;50;113101;300
32122000;”GL text4″;40;113100;400;50;113101;400
14122000;”GL text5″;40;113100;500;50;113101;500
01122000;”GL text6″;40;113100;100;50;13101M;100
02122000;”GL text7″;40;113100;200;50;113777;200
15122000;”GL text8″;40;113100;300;50;113101;300
32122000;”GL text9″;40;113100;400;50;113101;400


Gestion de fichiers dans un InputScript