Smart Forms Generierter Funktionsbaustein
Siehe Smart Forms.
Bei der Aktivierung eines Smart Forms wird vom Formulargenerator ein Funktionsbaustein erzeugt, der im Druckrahmenprogramm aufgerufen wird zur Formularausgabe.
Aufruf Generierter Funktionsbaustein im Druckprogramm
Data: fm_name type rs38l_fnam. call function fm_name exporting customer = customer bookings = bookings connections = connections exceptions formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 others = 5.
Ermittlung Funktionsbaustein zum Formular (Funktionsbaustein SSF_FUNCTION_MODULE_NAME)
- Der generierte Funktionsbaustein ist in jedem System (Entwicklungs-, Qualitäts-, Produktivsystem) identisch vom Coding, aber hat unterschiedliche Namen und daher wird der Name des Funktionsbausteins in der Variablen FM_NAME dynamisch bestimmt vom Funktionsbaustein SSF_FUNCTION_MODULE_NAME.
- Die Generierung des Funktionsbausteins geschieht beim ersten Aufruf des Formulars im Zielsystem. Daher braucht der erste Aufruf eines Formulars im Qualitäts-/Produktivsystem auch deutlich länger als jede weitere Formularausgabe.
call function 'SSF_FUNCTION_MODULE_NAME' exporting formname = p_form "ZSF_EXAMPLE_01_BEOSIT importing fm_name = fm_name exceptions no_form = 1 no_function_module = 2 others = 3.
Identifikation Smart Forms-Formular bei der Druckausgabe
- Manchmal wird ein Smart Forms auf den Bildschirm ausgegeben, aber es ist nicht der Name des Smart Forms bekannt
- Hier kann man im Funktionsbaustein SSF_FUNCTION_MODULE_NAME einen Breakpoint setzen und bei Ausführen der Anwendung wird der Funktionsbaustein angesprungen, sofern es ein Smart Forms-Formular ist
- Im Importparameter FORMNAME ist der generierte Funktionsbausteinname zu sehen. Hier ZSF_EXAMPLE_01_BEOSIT
- Wird bei der Ausgabe der Breakpoint nicht im Debugger angesprungen, so kann man recht sicher sein, dass das ausgegebene Formular kein Smart Forms ist, da der Funktionsbaustein SSF_FUNCTION_MODULE_NAME bei jedem Smart Forms-Aufruf durchlaufen wird.
- Siehe Identifikation Formulartechnologien (auch für SAPscript und Adobe Forms).
Identifikation generierter Funktionsbaustein zu einem Smart Forms
- Es ist sehr oft nützlich sein den generierten Funktionsbaustein zu identifizieren und Formularfunktionalität in ihm debuggen zu können.
- Es gibt eine Reihe von Möglichkeiten den Namen des Funktionsbausteins zu finden
Transaktion SMARTFORMS aus dem Einstiegsbildschirm
Das SAP-System springt in den Function Builder SE37 und zeigt den Funktionsbausteinnamen an
Menü "Umfeld - Name des Funktionsbausteins" in Transaktion SMARTFORMS
- Über das Menü "Umfeld - Name des Funktionsbausteins"
Im Dialogfenster ist der Name des Funktionsbausteins abzulesen
Im Druckprogramm mit Funktionsbaustein SSF_FUNCTION_MODULE_NAME
- Druckprogramm aufrufen in der Transaktion SE80 oder SE38
- Breakpoint setzen im Aufruf des Funktionsbausteins SSF_FUNCTION_MODULE_NAME, bzw Im Funktionsbaustein SSF_FUNCTION_MODULE_NAME
- Programm/Anwendung ausführen
- In der Variablen P_FORM steht der Name des Smart Forms-Formulars ZREB_SF_EXAMPLE_01
- In der Variablen FM_NAME steht der Name des generierten Funktionsbausteins /1BCDWB/SF00000054
Repräsentation Objekte aus Form Builder im Funktionsbaustein
- Das Feld "Kurzbeschreibung" (hier "beim Faxen!") bei Knotenelementen ist nur im Form Builder sichtbar und wird nicht in den generierten Funktionsbaustein geschrieben.
- Der technische Name der Knotens im Form Builder ist allerdings in aller Regel im generierten Funktionsbaustein zu finden
- Daher empfiehlt es sich zur guten Orientierung im Form Builder UND im generierten Funktionsbaustein den technischen Namen eines Knotens sprechend zu vergeben. Oft kann dann die Kurzbeschreibung eines Knotens im Form Builder leer bleiben.
Suchen lässt sich nach den technischen Knotennamen der Knotenarten
- Adresse
- Fenster
- Ordner
- Grafik
- Loop
- Programmzeilen
- Schablone
- Tabelle
- Textknoten
Fenster
Nebenfenster
In diesem Beispiel heißt das Fenster "FAX".
In der Layoutansicht vom Form Builder werden die Fenster grafisch in der Übersicht dargestellt.
Sucht man nach "fax"
So werden mehrere Fundstellen aufgelistet, aber nur eine Fundstelle mit "NODE FAX".
Ein Fenster erkennt man im generierten Funktionsbaustein an dem Kommentar "NODE <fenstername", hier "NODE FAX".
Die Suche nach "node fax" ergibt somit auch nur eine Fundstelle.
Hauptfenster (MAIN)
Das Hauptfenster vom Formular unterscheidet sich prinzipiell nicht von den Nebenfenstern bezüglich der Suche im generierten Funktionsbaustein.
Die Suche nach "node main" ergibt nur eine Fundstelle.
Adresse
In diesem Beispiel gibt es 2 Adressknoten. Einmal mit Namen "VARI_ADDRESS" und mit "VARI_ADRESSE".
Die Suche nach "vari_address" findet beide Adressknoten.
Beim Coding mit dem Adressknoten im Funktionsbaustein sieht man auch die Parameter vom Adressknoten, z. B. die Adressnummer &IS_PICK_LIST_HEAD-ZSD_ADRESSE-ADRNR&.
Alternative
Die Suche nach dem Namen des Alternativknotens ergibt leider keine Fundstelle, wie hier die Suche nach "ADRNR_LEER_ODER_GEFUELLT".
Man kann sich behelfen, indem man nach den Variablen im Reiter "Allgemeine Eigenschaften" sucht, die die Unterscheidung zwischen TRUE und FALSE bewirken.
Genauso kann man nach dem ersten Objekt unter dem TRUE-Knoten suchen, hier nach "ALTE_ADRESSDARSTELLUNG".
Im generierten Funktionsbaustein erkennt man Alternativen an dem "if - else - endif"-Coding.
Grafik
Im Beispiel heißt die Grafik LOGO_SF_LMC.
Bei der Suche nach "logo_sf_lmc"
gibt es eine Fundstelle.
Man sieht auch die Parameter vom Grafikknoten und die Bedingung (IS_ORDER_HEAD-VBDKA-VKORG EQ '8200'), unter der in diesem Fall das Logo ausgegeben wird.
Kommando
Ein Kommandoknoten löst einen expliziten Übergang auf eine neue Formularseite aus.
Hier wird die "PAGE3" angesprungen.
Die Suche nach UEBERGANG_PAGE3 gibt keine Fundstelle im generierten Funktionsbaustein aus. Aber man kann sich behelfen mit der Suche nach der Seite "PAGE3", die angesprungen werden soll.
Man könnte auch nach dem String "SSFCOMP_SET_NEXT_PAGE" suchen, um Kommandoknoten in einem Formular zu identifizieren.
Loop
Eine Schleife kann auch über den technischen Namen gefunden werden.
Die Schleife loopt über GT_LINES into GS_LINES.
Die Suche nach "%LOOP19" findet die Zeile 15631. Ab Zeile 15639 beginnt der Loop und schließt in Zeile 15646.
Programmzeilen
Beim Knotentyp "Programmzeilen" kann nach dem Namen des Knotens gesucht werden oder auch nach dem Coding in den Programmzeilen.
Die Suche nach "%code3" führt das Programmzeilencoding auf.
Schablone
Die Schablone hat hier den (wenig sprechenden) Namen "%SECTION1".
Die Suche nach "%SECTION1" gibt eine Fundstelle im Funktionsbaustein.
Tabelle
Textknoten
Der Textknoten heißt hier FIRMA_ABSENDERS_1101 und wird unter einer Bedingung ausgeben.
Die Suche nach "FIRMA_ABSENDERS_1101" gibt eine Fundstelle.
In Zeile 1097 über dem Textknoten ist auch die Bedingung für die Ausgabe des Textknotens im Coding zu sehen.
Repräsentation Codingzeile im Funktionsbaustein mit Objekte aus Form Builder
Man kann sich auf der ersten Seite recht gut orientieren anhand der Codingzeile im generierten Funktionsbaustein. Der Baum im Form Builder wird von oben nach unten abgearbeitet und entsprechend erhöht sich auch die Zeilenzahl.
Hier ist die Zeilenzahl von einigen Fenstern und sonstigen Knoten auf der Seite "PAGE1" protokolliert.
Auf der nächsten Seite "NEXTPAGE" kann man sich so nicht mehr orientieren, da die meisten Fenster auch auf der Seite PAGE1 auftauchen und im Coding nur einmal erstellt werden. So hat z. B. das Fenster KOMMIAUFTRAG_LIEFERUNG auf NEXTPAGE die Zeilenzahl 861. Das ist identisch mit der Zeilenzahl des Fensters KOMMIAUFTRAG_LIEFERUNG auf PAGE1.
Wenn man nun den Fall hat, das man im Debugger im generierten Funktionsbaustein eine problemrelevante Codingstelle gefunden hat, kann man sich über die Zeilenzahl und Vergleich zur Zeilenzahl von anderen Knoten (die man im Form Builder sieht) der problemrelevanten Stelle im Form Builder schnell annähern.
Web-Links
Literatur
- SAP Smart Forms - Das umfassende Handbuch, von Werner Hertleif, Christoph Wachter, Rinaldo Heck, Tobias Trapp, Thomas Karas; 3. Auflage