Dateien lesen und schreiben während automatisierter Transaktionsverarbeitung

Es gibt eine Reihe von sehr nützlichen Dingen, die Sie mit Dateien in InputScripts tun können.
  • Sie können Daten aus einer Datei lesen und sie in SAP ERP eingeben.
  • Sie können Daten aus SAP ERP über die Transaktionen extrahieren und die so generierten Dateien in Excel oder ähnlichen Programmen verwenden.
  • Sie können eine html Datei generieren und diese in SAP GUI anzeigen, indem Sie den GuiXT Viewer verwenden.

Wenn Sie solche Anwendungen planen, dann beachten Sie bitte, dass diese Methode sehr gut für  100 Datensätze in einer Datei funktioniert, dass aber andere Methoden (Batch input, ABAP Programme) aus Performance-Gründen möglicherweise eine bessere Wahl bei größeren Datenmengen sind. Technisch gibt es keine Einschränkungen bei den Dateigrössen oder Laufzeiten. Die "Scriptingmethode", die hier beschrieben ist, ist vor allem geeignet, um 50 Materialsätze über eine Exceltabelle zu verändern oder um Daten aus 120 Kostenstellen zu extrahieren. Besonders für adhoc Aufgaben stellt der InputAssistant eine leicht zu handhabende Möglichkeit dar, um eine Menge Zeit zu sparen, die Sie andernfalls für die Ausführung per Hand oder für die Programmierung verwenden müßten.

Übersicht

Wir verwenden die folgenden Anweisungen des InputAssistant:

  • Öffnen und schließen einer Datei: OpenFile, CloseFile;
  • Werte aus einer Datei in Variablen einlesen: ReadFile;
  • einen neuen Satz in eine Datei schreiben: AppendFile;
  • mit Variablen arbeiten: Set, if;
  • Ablaufkontrolle innerhalb eines InputScripts: Screen, Enter, goto, label, return.

Beispiel 1

  • Wir nehmen an, dass wir eine Textdatei mit Materialnummern haben. Wir möchten eine zweite Datei erstellen, die die Materialnummer zusammen mit der Sparte, Warengruppe und Berechtigungsgruppe für jedes Material enthält.

    // GuiXT script:
    Pushbutton (toolbar) "Materialdatei erstellen" "/NMM03" process="Materialdatei_erstellen.txt"

    Das InputScript Materialdatei_erstellen.txt sieht folgendermaßen aus::

    // Materialdatei erstellen

    Parameter mat_file1 "C:\GuiXT\Input.txt"
    Parameter mat_file2 "C:\GuiXT\Output.txt"


    // Start
    Screen SAPLMGMM.0060
      OpenFile "&U[mat_file1]"
      OpenFile "&U[mat_file2]" "-Output"

      label Read_File
      ReadFile "&U[mat_file1]" mat_matnr

      if not Q[ok]
        CloseFile "&U[mat_file1]"
        CloseFile "&U[mat_file2]"
        Return "Materialdatei wurde generiert" "&U[mat_file2]"
      endif

      Set F[Material] "&V[mat_matnr]"
      Enter

    // Bild auswählen
    Screen SAPLMGMM.0070
      Set C[Grunddaten 1] "X"
      Enter

    // Grunddaten 1
    Screen SAPLMGMM.4000
      Set V[mat_division] "&F[Sparte]"
      Set V[mat_matgroup] "&F[Warengruppe]"
      Set V[mat_autgroup] "&F[Berechtigungsgruppe]"

      AppendFile "&V[mat_file2]" mat_matnr mat_division mat_matgroup mat_autgroup

      Enter "/NMM03"

    // MM03 Neustart, zum Beginn des Scripts gehen
    Screen SAPLMGMM.0060
      goto Read_File

  • Beispiel 2

    Angenommen wir haben eine Textdatei mit Daten, die GL Dokumente darstellen.  Wir möchten dieses Dokumente mit Transaktion FB01 nach SAP ERP übernehmen. Wenn es Fehlermeldungen der SAP ERP Transaktion gibt, dann werden diese in ein Logfile gespeichert, zusammen mit weiteren Daten.

    // GuiXT script 
    Pushbutton (toolbar) "GL upload" "/NFB01" process="FB01_GL.txt"

    Das InputScript FB01_GL.txt lautet folgendermaßen:

    // Dateinamen
    Parameter FB01FILE "C:\GL Test\FB01_data.txt"
    Parameter FB01ERR  "C:\GL Test\FB01_err.txt"

    // Start der Dateiausführung
    OpenFile "&U[FB01FILE]" delimiter=";"
    OpenFile "&U[FB01ERR]" -Output

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



    Screen SAPMF05A.0100

    label start

      // Gibt es eine Fehlermeldung im vorherigen Datensatz?
      if V[_lasterror]

     
      // Fehlermeldungszähler hochsetzen
        Set V[FB01_errors] &[F
    B01_errors] + 1

     
      // Fehler Logfile schreiben
        AppendFile "&U[FB01ERR]" s_date s_text s_pstky1 s_account1 s_amount1 s_pstky2 s_account2 s_amount2 _lasterror

     
      // Fehlerzähler zurücksetzen (!). Automatisches Rücksetzen nur bei Start des InputScripts 
        Set V[_lasterror] ""
      endif 

      ReadFile  "&U[FB01FILE]" -stripQuotationMarks s_date s_text s_pstky1 s_account1 s_amount1 s_pstky2 s_account2 s_amount2 

      // Ist ein weiterer Datensatz auszuführen?
      if Q[ok]

     
      // Zähler hochsetzen
        Set V[FB01_records] &V[FB01_records] + 1

        Set F[Document date] "&V[s_date]"
        Set F[Doc.header text] "&V[s_text]"
        Set F[Company Code] "0001"
        Set F[Type] "SA"
        Set F[Currency/rate] "USD"

        Set F[Pstky] "&V[s_bschl1]"
        Set F[Account] "&V[s_account]"

        Enter onError="/NFB01"

      else

       
    // Ausführung beendet, Dateien schließen
        CloseFile "&U[FB01FILE]" 
        CloseFile "&U[FB01ERR]" 

        if V[FB01_errors=0]
          Return "Processing done, no errors, &[FB01_records] documents in total"
        else

         
    // Fehlermeldungen in Error log anzeigen
          View "&U[FB01ERR]" 

          Return "Processing done: &V[FB01_errors] errors, &V[FB01_records] documents in total"
        endif
      endif 

    Screen SAPMF05A.0300
      Set F[Amount] "&V[s_amount1]"
      Set F[PstKy]  "&V[s_pstky2]"
      Set F[GL/ account]  "&V[s_account2]"

      Enter onError="/NFB01"


    Screen SAPMF05A.0300
      Set F[Amount] "&V[s_amount2]"
      Enter "/11" onError="/NFB01"

    Screen SAPMF05A.0100
      goto start 



    Die Datei FB01_data.txt könnte folgendermaßen aussehen:

    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