Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

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” 


 Sap Guixt matchcode21 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

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?
if not V[found]

endif

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] “&V[k10]“ -stringlength
Set V[p1]
“&V[p2]“ - 9
Set V[k10]
“&V[k10](&V[p1]-&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”

if not V[found]
  Set V[setcursor]
“Kunde”
  Return
“E: Kunde ‘&V[kunnr]‘ nicht vorhanden” -statusline
endif
 

// in GuiXT Script

InputField (10,1) “Kunde” (10,20) size=10 name=”kunnr” techname=”KNA1-KUNNR”

if V[setcursor]
  SetCursor F[&V[setcursor]]
  Set V[setcursor] “”
endif
 

Sap Guixt matchcode22 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

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”

if not V[found]
  Set V[setcursor]
“Kunde”
  Set V[kunnr.name]
“”
  Return
“E: Kunde ‘&V[kunnr]‘ nicht vorhanden” -statusline
endif

Set V[kunnr.name] “&text[data]“

// in GuiXT Script

InputField (10,1) “Kunde” (10,20) size=10 name=”kunnr” techname=”KNA1-KUNNR”
Text (10,33) “&V[kunnr.name]“

Sap Guixt matchcode23 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

 

Falls wir mehrere Felder zur Ausgabe benötigen, zum Beispiel Name und Ort, geht das analog:

// in InputScript “check.txt”

Call “Z_GUIXT_SELECT_SINGLE” in.TABLENAME=“KNA1″ in.CONDITION=“KUNNR = ‘&V[k10]‘”  in.FIELDS=“NAME1,ORT01″ out.FOUND=”found” table.DATA=“data”

CopyText fromText=“data” toString=“s1″ line=1
CopyText fromText=
“data” toString=“s2″ line=2
Set V[kunnr.name]
“&V[s1], &V[s2]“

Sap Guixt matchcode24 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

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] “&V[k10]“ -stringlength
Set V[p1]
“&V[p2]“ - 9
Set V[k10]
“&V[k10](&V[p1]-&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”

CopyText fromText=
“data” toString=“s1″ line=1
CopyText fromText=
“data” toString=“s2″ line=2
Set V[kunnr.name]
“&V[s1], &V[s2]“

Return

Eventuell ist es hier sinnvoll, mit einem “Include” zu arbeiten, um nicht das gleiche Coding in zwei Scripten pflegen zu müssen.

Sap Guixt matchcode25 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

 

Sap Guixt matchcode26 Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern

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.


Fremschlüsselprüfung und Texte zu eigenen Eingabefeldern