D
urch eigene Oberflächenelemente
können wir den bisher fest vorgegeben Ablauf des
InputScripts variabel gestalten.
A
ls erstes Beispiel
bieten wir zwei Drucktasten an, die das Verzeichnis für
zwei verschiedene Werke aufrufen. Da wir mit dem gleichen
InputScript arbeiten wollen, benutzen wir einen Parameter
WERK. Er wird im Anschluss an die Pushbutton-Zeile einmal
mit "1000" (Werk Hamburg) und einmal mit "3000"
(Werk Frankfurt) bewertet. Im InputScript kann der Inhalt
des Parameters mit "&U[WERK]" angesprochen
werden.
GuiXT
// GuiXT Script
Box (0,1) (6,26) "Materialien"
Image (1.6,1) (5.3,15) "materials.jpg"
Pushbutton (2,16) "Hamburg" "/NSA38" process="matverzeichnis1.txt" size=(2,10)
using WERK = "1000"
Pushbutton (4,16) "Frankfurt" "/NSA38" process="matverzeichnis1.txt" size=(2,10)
using WERK = "3000"
// InputScript "materialverzeichnis1.txt"
Parameter WERK
// ABAP Editor: Einstieg
Screen SAPMS38M.0101
Set F[Programm] "RMMVRZ00"
Enter "/8" // Direkt
// Materialverzeichnis
Screen RMMVRZ00.1000
Set F[Material] "M-*"
Set F[Werk] "1000"
Enter "/8" // Ausführen
D
as InputScript ist
gegenüber der Version in Tutorial 1 etwas vereinfacht:
Die erste Funktion (Aufruf der Transaktion SA38) wird
bereits bei Definition der Drucktaste mitgegeben. Man
spart sich dadurch den ersten Bildwechsel.
S
tatt mehrerer
Drucktasten können wir dem Benutzer auch einige
Radiobuttons und eine einzige Drucktaste anbieten. Das
folgende Beispiel startet jeweils die Auftragserfassung (VA01)
mit verschiedenen Auftragsarten.
GuiXT
//GuiXT script
del (0,0) (100,100)
pos X[IMAGE_CONTAINER] X[IMAGE_CONTAINER]+(0,50)
Box (0,0) (8,34) "Kundenauftrag"
Image (0.7,0.3) (7.2,14.6) "controlling.jpg" "-plain"
// Variable VA01_Auftragsart noch leer? Dann Vorschlagswert "BV" setzen
if not V[VA01_Auftragsart]
Set V[VA01_Auftragsart] "BV"
endif
// Auswahl Auftragsart
RadioButton (1,16) "Barverkauf" Name="VA01_Auftragsart" value="BV"
RadioButton (2,16) "Sofortauftrag" Name="VA01_Auftragsart" value="SO"
RadioButton (3,16) "Terminauftrag" Name="VA01_Auftragsart" value="TA"
RadioButton (4,16) "Retoure" Name="VA01_Auftragsart" value="RE"
Pushbutton (6,16) "Auftrag erfassen" "/NVA01" _
process="startva01.txt" "size=2"
// InputScript "startva01.txt"
Screen SAPMV45A.0101
// Feld "Auftragsart" mit Inhalt der Variablen "VA01_Auftragsart" besetzen
Set F[Auftragsart] "&V[VA01_Auftragsart]"
Set F[Verkaufsorganisation] "1000"
Set F[Vertriebsweg] "10"
Set F[Sparte] "00"
Enter
A
uf die Übergabe
eines Parameters wurde hier verzichtet; es wird
stattdessen mit der globalen Variablen V[VA01_Auftragsart]
gearbeitet. Falls Sie die Transaktion VA01 im
Alternativmodus aufrufen wollen durch "/OVA01"
statt "/NVA01", ist das nicht möglich, da jede
SAP-Session einen eigenen Raum von GuiXT-Variablen
besitzt. In diesem Fall können Sie den Wert aber als
Parameter mitgeben:
GuiXT
/GuiXT script
pos X[IMAGE_CONTAINER] X[IMAGE_CONTAINER]+(0,50)
Box (0,0) (8,34) "Kundenauftrag"
Image (0.7,0.3) (7.2,14.6) "controlling.jpg" "-plain"
// Variable VA01_Auftragsart noch leer? Dann Vorschlagswert "BV" setzen
if not V[VA01_Auftragsart]
Set V[VA01_Auftragsart] "BV"
endif
// Auswahl Auftragsart
RadioButton (1,16) "Barverkauf" Name="VA01_Auftragsart" value="BV"
RadioButton (2,16) "Sofortauftrag" Name="VA01_Auftragsart" value="SO"
RadioButton (3,16) "Terminauftrag" Name="VA01_Auftragsart" value="TA"
RadioButton (4,16) "Retoure" Name="VA01_Auftragsart" value="RE"
Pushbutton (6,16) "Auftrag erfassen" "/OVA01" process="startva01.txt" "size=2"
using AUFTRAGSART = [VA01_Auftragsart]
// InputScript "startva01.txt"
Parameter AUFTRAGSART
Screen SAPMV45A.0101
//Feld "Auftragsart" mit Inhalt des Parameters "AUFTRAGSART" besetzen
Set F[Auftragsart] "&U[AUFTRAGSART]"
Set F[Verkaufsorganisation] "1000"
Set F[Vertriebsweg] "10"
Set F[Sparte] "00"
Enter
E
benso wie die
Radiobuttons sind auch normale Eingabefelder möglich.
Jedes Eingabefeld (Anweisung "Inputfield") ist
dabei genau einer GuiXT-Variablen zugeordnet, d.h. der
Inhalt der Variablen wird im Eingabefeld angezeigt, und
Eingaben werden in die Variable übernommen.
Im
folgenden Beispiel kann der Benutzer zu einer
Materialnummer die Verfügbarkeit in drei verschiedenen
Werken auf einen Blick überprüfen. Wir nutzen dazu den
Aufruf von SAP_BAPIs.
Eingabe
der Materialnummer. Auch Suche über SAP-Matchcode ist möglich.
Die
Verfügbarkeit in den drei Werken wird angezeigt.
Bei
Eingabe einer falschen Materialnummer erfolgt eine
Fehlermeldung.
GuiXT
// GuiXT Script
pos X[IMAGE_CONTAINER] X[IMAGE_CONTAINER]+(0,50)
Box (0,0) (8,36) "Verfügbarkeit"
// Eingabefeld zur Variablen V[AV_Material] anzeigen
// Bezug zum SAP Matchcode über techName="..."
InputField (1,1) "Material" (1,16) name="AV_Material" size=18 techName="MARA-MATNR"
Text (2,1) "&V[AV_Materialtext](1-34)" -proportional -intensified
Text (3,4) "Hamburg"
Text (3,12) "&V[AV_Materialmenge1]" -border size="8"
Text (3,22) "&V[AV_Materialunit]"
Text (4,4) "Berlin"
Text (4,12) "&V[AV_Materialmenge2]" -border size="8"
Text (4,22) "&V[AV_Materialunit]"
Text (5,4) "Wien"
Text (5,12) "&V[AV_Materialmenge3]" -border size="8"
Text (5,22) "&V[AV_Materialunit]"
Pushbutton (7,2) "Verfügbarkeit anzeigen" process="availability.txt" size=(1,32)
// InputScript "availability.txt"
// Variablen zurücksetzen
Set V[AV_Materialtext]
Set V[AV_Materialunit]
Set V[AV_Materialmenge*]
// Kurztext und Mengeneinheit lesen
Call "BAPI_MATERIAL_GET_DETAIL" in.MATERIAL="&V[AV_Material]" _
out.MATERIAL_GENERAL_DATA="AV_materialdata"
// Felder über Offset ansprechen, siehe Tips&Tricks Nr. 17
Set V[AV_Materialtext] "&V[AV_materialdata](1-41)"
Set V[AV_Materialunit] "&V[AV_materialdata](156-158)"
// Material vorhanden?
if not V[AV_Materialtext]
return "E: Material &V[AV_Material] nicht vorhanden" -statusline
endif
// Verfügbarkeit lesen für 3 Werke
Call "BAPI_MATERIAL_AVAILABILITY" in.MATERIAL="&V[AV_Material]" _
in.PLANT="1000" in.UNIT="&V[AV_Materialunit]"out.AV_QTY_PLT="AV_Materialmenge1"
Call "BAPI_MATERIAL_AVAILABILITY" in.MATERIAL="&V[AV_Material]" _
in.PLANT="2000" in.UNIT="&V[AV_Materialunit]"out.AV_QTY_PLT="AV_Materialmenge2"
Call "BAPI_MATERIAL_AVAILABILITY" in.MATERIAL="&V[AV_Material]" _
in.PLANT="3000" in.UNIT="&V[AV_Materialunit]" _
out.AV_QTY_PLT="AV_Materialmenge3"
// 3 Dezimalstellen bei Menge berücksichtigen
Set V[AV_Materialmenge1] &V[AV_Materialmenge1] / 1000
Set V[AV_Materialmenge2] &V[AV_Materialmenge2] / 1000
Set V[AV_Materialmenge3] &V[AV_Materialmenge3] / 1000
// Nachricht + Bildschirm neu anzeigen
Return "S: Verfügbarkeit ermittelt" -statusline