Form-Routine aus SAPscript-Formular aufrufen

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Aus einem SAPscript-Formular kann eine Form-Routine aufgerufen werden, in dem Werte zum Formular hinzugelesen oder auch verändert werden. Das Programm mit der Form-Routine kann ganz in ABAP mit den Transaktion SE38 oder SE80 programmiert werden.

Siehe SAPscript.

Fehlerursachen

Die Übergabe der Variablen aus dem SAPscript-Formular an die Form-Routine und die Parameterbehandlung in der Form-Routine ist anders als man es sonst von Form-Routinen gewohnt ist und es gibt eine Reihe von möglichen Fehlern, die verhindern, dass das gewünschte Ergebnis im Formular erscheint.

Es ist hier ratsam sehr sorgfältig zu programmieren und die Form-Routine auch zu debuggen. Es ist selten, dass man die Form-Routine gleich fehlerfrei programmiert.

Mögliche Fehler

  • Im SAPscript verwechselt man die technische Absatzformate „/:“ (Kommandozeile) und „/** (Kommentarzeile).
  • Im SAPsript werden nicht alle Parameterzeilen mit einem führenden „USING“ bzw. „CHANGING“ programmiert.
  • Im SAPscript kommt ein abschließender Punkt nur ans Ende des Perform-Aufrufs
  • Im SAPscript wird ein Changing-Parameter übergeben, der gegen Überschreiben geschützt ist (Importparameter vom Funktionsbaustein).
  • Im SAPscript wird zwar ein lokaler Changing-Parameter gefüllt, aber bei der geplanten Verwendung des Changing-Parameters steht noch die globale Variable.
  • In der Form-Routine hat man einen Rechtschreibfehler bei der Abfrage der Using-Parameter oder der Changing-Parameter.
  • In der Form-Routine wird jeder Parameter als CHAR-Feld (255 Zeichen Länge) übergeben und dies wird bei (vorher) Nichtcharfeldern nicht berücksichtigt.
  • In der Form-Routine funktioniert zwar das Auslesen der Using-Parameter, aber es wird nicht der neu zu verändernde Wert als Changing-Parameter zurück an SAPscript zurückgegeben.
  • Wenn der Test im gleichen System, aber unterschiedlichen Mandanten ist, hat man das SAPscript per SCC1 vom Quellmandanten zum Zielmandanten kopiert.
  • Wenn das Formular in mehreren Sprachen ausgegegeben wird, hat man die Änderung auch korrekt in der passenden Sprachversion vom Formular vorgenommen.

Zentrales Programm mit Form-Routinen für SAPscript-Formulare

  • Man sollte lediglich ein Programm erstellen, wo für das gesamte SAP-System alle Form-Routinen gesammelt werden, die aus SAPscript-Formularen oder Standardtexten aufgerufen werden. Das werden oft kaum ein Dutzend oder weniger sein. So kann man sich bei neuen Routinen an den bereits vorhandenen Form-Routinen orientieren.
  • Man sollte in die Form-Routinen auch einen Kommentar schreiben, von welchem SAPscript-Formular oder Standardtext eine Form-Routine verwendet wird. Einen (automatisch generierten) Verwendungsnachweis für die Form-Routinen gibt es nicht.
  • Eine schlanke Form-Routine sollte man sehr gut formatieren und kommentieren, damit sie die Kopiervorlage für neue Form-Routinen ist.

Aufruf Form im SAPscript-Formular

  • Die einzelnen Zeilen werden in der Formatspalte als Kommandozeilen eingefügt, mit dem speziellen Absatzformat "/:".
  • Lediglich die letzte Zeile mit dem "Endperform" endet mit einem Punkt.
  • Alle Variablen vom Formular, die aus dem Formular benötigt werden, werden per "Using" übergeben.
  • Die Variablen, die aus der Form-Routine ans SAPscript-Formular übergeben werden, werden per "Changing" übergeben. Im Unterschied zum Perform in ABAP-Programmen wird der Befehl „Using“, bzw. „Changing“ vor jeden Übergabeparameter geschrieben.

ScriptPerform1.jpg

  • Die Changing-Parameter müssen nicht zwingen als globale Variablen vorhanden sein. Sie können auch im Formular lokal angelegt werden mit dem Befehl Define. Sie müssen aber auch nicht zwingend deklariert werden, da sie auch implizit vom Changing-Parameter angelegt werden während der Laufzeit der Formularausgabe, sofern sie nicht bereits vorhanden sind.

Generierter Aufruf

Bei einem Formular der Saldenbestätigung wird für die Form-Routine im SAPscript-Formular folgender Code generiert für den Aufruf der Form-Routine

 perform (co_perform-form) in program (co_perform-program)
   tables co_sym_using
          co_set_symbols
          if found.

Form-Routine

Schnittstelle

Die übergebenen Variablen stehen in einer Tabelle IN_TAB.

Die Output-/Changing-Variablen in einer Tabelle OUT_TAB.

Die Tabellen typisieren auf die Struktur ITSYS. Der übergebene Feldname steht im Feld „NAME“ und der Feldwert im CHAR-Feld „VALUE“ (255 Zeichen).

FORM mat_gewicht
  TABLES in_tab  STRUCTURE itcsy
         out_tab STRUCTURE itcsy.
 ...
ENDFORM.

ScriptPerform3.jpg

Auslesen Using-Parameter

Hier wird man oft auch nicht nur den „sy-subrc“ abfragen, sondern auch nach dem gefüllten Wert in „IN_TAB-VALUE“.

ScriptPerform4.jpg

Füllen Changing-Parameter

Im Gegensatz z. B. zu einem klassischen Form-Parameter bei CHANGING steht hier beim Einstieg in die Form-Routine in CHANGING noch nicht der Übergabewert aus dem SAPscript-Formular. Daher muss die Importparameter immer in USING übergeben werden.

Die Changing-Parameter der Output-Tabelle werden aktualisiert per "modify".

ScriptPerform5.jpg

oder (im anderen Kontext) zuerst leeren der Ausgabetabelle und dann füllen mit "append". Dies bietet sich an, wenn die Changing-Parameter in der Form-Routine initial gefüllt werden, die im SAPscript-Formular mit DEFINE deklariert wird.

ScriptPerform7.jpg


Oftmals können Felder, die aus dem Druckprogramm dem Formular übergeben werden, nicht geändert werden. Sie müssen dann in eine lokale Variable geschrieben werden, z. B.

/: DEFINE &LV_CHARG& = &MDPMX-CHARG&
/: PERFORM CHANGE_CHARGE IN PROGRAM YFORMS_DATA_MM
/: USING &LV_CHARG&
/: CHANGING &LV_CHARG&
/: ENDPERFORM.

Sammlung Form-Routinen

Beispielprogramm = ZWM_FORMS_SUBROUTINES

ScriptPerform8.jpg

Beispielcoding

FORM z_f130confirm_info
  TABLES in_tab  STRUCTURE itcsy
         out_tab STRUCTURE itcsy.

  DATA: lv_sgtxt TYPE bseg-sgtxt,
        lv_belnr TYPE bseg-belnr,
        lv_bukrs TYPE bseg-bukrs,
        lv_gjahr TYPE bseg-gjahr,
        lv_buzei TYPE bseg-buzei.

  READ TABLE out_tab ASSIGNING FIELD-SYMBOL(<fs_out_tab>) WITH KEY name = 'HBSIDH-SGTXT'.
  IF sy-subrc = 0.
    lv_sgtxt = <fs_out_tab>-value.
  else.
    Break eberstein.  „Changing-Parameter wurde von SAPscript falsch/nicht übergeben
  ENDIF.
* Wenn bereits ein Wert gefüllt ist, braucht nichts weiter gemacht zu werden
  if lv_sgtxt is not initial.
    return.
  endif. 
* Nachlesen des Verbuchungstextes
  READ TABLE in_tab into data(ls_in_tab) WITH KEY name = 'HBSIDH-BELNR'.
  IF sy-subrc = 0.
    lv_belnr = ls_in_tab-value.
  ENDIF.

  READ TABLE in_tab into ls_in_tab WITH KEY name = 'HBSIDH-BUKRS'.
  IF sy-subrc = 0.
    lv_bukrs = ls_in_tab-value.
  ENDIF.

  READ TABLE in_tab into ls_in_tab WITH KEY name = 'HBSIDH-GJAHR'.
  IF sy-subrc = 0.
    lv_gjahr = ls_in_tab-value.
  ENDIF.

  READ TABLE in_tab into ls_in_tab WITH KEY name = 'HBSIDH-BUZEI'.
  IF sy-subrc = 0.
    lv_buzei = ls_in_tab-value.
  ENDIF.
* Lese aus der Buchungszeile den Vorgangstext
* und schreibe ihn zurück
  Select single *
    from bseg
    into @data(ls_bseg)
    where bukrs = @lv_bukrs
      and belnr = @lv_belnr
      and gjahr = @lv_gjahr
      and buzei = @lv_buzei.

  <fs_out_tab>-value = ls_bseg-sgtxt.

ENDFORM.

Web-Links