|
Für eigene Eingabefelder kann es sinnvoll sein, eine Fremdschlüsselprüfung sowie die Anzeige eines Textes zu dem eingegebenen Schlüssel zu implementieren. Das ist mit GuiXT-Mitteln möglich, es ist aber erforderlich, dazu über “Call” einen Funktionsbaustein aufzurufen, um die entsprechenden SAP-Tabellen zu lesen. Sie können zum Lesen aller Tabellen den gleichen Funktionsbaustein verwenden (siehe unten),
Nehmen wir an, Sie haben ein eigenes Eingabefeld angelegt zur Eingabe einer Kundennummer: InputField (10,1) “Kunde” (10,20) size=10 name=”kunnr” techname=”KNA1-KUNNR”
Da der Benutzer die Kundennummer auch, statt sie über die F4 Hilfe auszuwählen, direkt eingeben kann, wollen wir prüfen, ob die Eingabe gültig ist. Dazu benutzen wir den Funktionsbaustein “Z_GUIXT_SELECT_SINGLE” (siehe unten). Es genügt im Prinzip, dem Baustein die Prüftabelle und die Where-Bedingung mitzugeben: Call “Z_GUIXT_SELECT_SINGLE” in.TABLENAME=“KNA1″ in.CONDITION=“KUNNR = ‘&V[kunnr]‘” out.FOUND=”found” Danach können wir dann die Variable V[found] abfragen mit z.B. // Ungültige Kundennummer eingegeben? Das funktioniert so aber noch nicht ganz, falls der Benutzer die Kundennummer nicht 10-stellig mit führenden Nullen eingibt. Wir ergänzen deshalb vor dem Aufruf die führenden Nullen bis zur Länge 10: Set V[k10] “0000000000&V[kunnr]“
Set V[p2] Call “Z_GUIXT_SELECT_SINGLE” in.TABLENAME=“KNA1″ in.CONDITION=“KUNNR = ‘&V[k10]‘” out.FOUND=”found” Die Prüfung rufen wir z.B. bei “Enter” oder bei “Sichern ” (eventuell ein Include verwenden): On Enter process=”check.txt” Es ist sinnvoll, im Fehlerfall auch den Eingabecursor in das fehlerhafte Feld zu positionieren. Dazu müssen wir im GuiXT Script die “SetCursor” Anweisung verwenden; im InputScript “check.txt” setzen wir nur eine V-Variable, die dann bei der Anzeige des Screens im GuiXT-Script abgefragt wird. Ein “SetCursor” direkt im InputScript ist nicht möglich, da zu diesem Zeitpunkt noch der “alte” Screen aktiv ist. // in InputScript “check.txt” // in GuiXT Script if V[setcursor]
Zusätzlich zur Prüfung der Eingabe wollen wir noch rechts neben dem Eingabefeld den Kundennamen ausgeben. Wir können ihn mit dem Prüfzugriff gleich mitlesen: Call “Z_GUIXT_SELECT_SINGLE” in.TABLENAME=“KNA1″ in.CONDITION=“KUNNR = ‘&V[k10]‘” in.FIELDS=“NAME1″ out.FOUND=”found” table.DATA=“data” Dabei können wir unter “FIELDS” alle Ausgabefelder nennen, durch Komma getrennt, die gelesen werden sollen. Ihre Werte erscheinen in der angegebenen Reihenfolge dann als separate Zeilen der Tabelle DATA. Wir stellen den gelesenen Wert in eine Variable, zum Beispiel V[kunnr.name], die wir im GuiXT Script ausgeben: // in InputScript “check.txt” Set V[kunnr.name] “&text[data]“
Falls wir mehrere Felder zur Ausgabe benötigen, zum Beispiel Name und Ort, geht das analog: // in InputScript “check.txt” CopyText fromText=“data” toString=“s1″ line=1
Jetzt fehlt nur noch eine Kleinigkeit: Wenn der Benutzer die Kundennummer über die F4 Wertehilfe selektiert, soll ebenfalls sofort der passende Text rechts erscheinen. Das geht über den Zusatz “searchhelpprocess=…” der InputField-Anweisung: InputField (10,1) “Kunde” (10,20) size=10 name=”kunnr” techname=”KNA1-KUNNR” searchhelpprocess=”return_kunnr.txt” In dem InputScript “return_kunnr.txt” lesen wir ebenfalls die Textfelder zu der selektierten Kundennummer: // InputScript “return_kunnr.txt”
Set V[k10] “0000000000&V[kunnr]“
Set V[p2] Call “Z_GUIXT_SELECT_SINGLE” in.TABLENAME=“KNA1″ in.CONDITION=“KUNNR = ‘&V[k10]‘” in.FIELDS=“NAME1,ORT01″ out.FOUND=”found” table.DATA=“data” Return Eventuell ist es hier sinnvoll, mit einem “Include” zu arbeiten, um nicht das gleiche Coding in zwei Scripten pflegen zu müssen.
Den Funktionsbaustein “Z_GUIXT_SELECT_SINGLE” kann man in einer beliebigen Funktionsgruppe anlegen. Zu beachten ist nur, dass der RFC-Benutzer die View-Berechtigung für die jeweilige Tabelle erhalten muss, da der Funktionsbaustein eine Berechtigungsprüfung durchführt.
TYPE ANY, TYPE ANY. ASSIGN WORK TO CASTING TYPE (TABLENAME). * reset output table REFRESH DATA. * reset found-flag FOUND = ”. SELECT SINGLE (FIELDTAB) FROM (TABLENAME) INTO CORRESPONDING FIELDS OF WHERE (CONDITION). IF SY-SUBRC EQ 0. FOUND = ‘X’. LOOP AT FIELDTAB. ASSIGN COMPONENT FIELDTAB-NAME OF STRUCTURE to . IF SY-SUBRC = 0. WRITE TO DATA LEFT-JUSTIFIED. ELSE. DATA = ”. ENDIF. APPEND DATA. ENDLOOP. ENDIF. ENDFUNCTION.
|