Beispiel 2: Produkte vorschlagen
bei "Kundenauftrag anlegen" (VA01) In
der Transaktion VA01 (Kundenauftrag anlegen) gibt der Anwender eine Nummer für den
Auftraggeber ein. Für diesen Auftraggeber schlagen wird dann einige Produkte
aus früheren Aufträgen vor. Wir zeigen diese Produkte als Pushbuttons an, und ein einfacher
Mausklick auf einen Pushbutton fügt dann automatisch die Materialnummer und Auftragsmenge
in den neuen Auftrag ein. Gleichzeitig zeigen wir in 5 Pushbuttons der letzten 5 Aufträge
mit dem Bestelldatum an. Ein Mausklick auf diesen Pushbutton springt zur
Anzeige des jeweiligen
Auftrags.
VA01: Neuer Pushbutton "Frühere Aufträge"
Nach Eingabe der Kundennummer für den
Auftraggeber kann der Anwender auf den neuen Pushbutton klicken, um folgende Informationen
zu erhalten:
- 5 frühere Aufträge
- 5 Produkte, die aus diesen Aufträgen
stammen, mit Auftragsmenge und Kurzbezeichnung (als Tipp bei jedem Pushbutton)
Wenn Sie mehr als 5 Produkte anzeigen
möchten, dann können Sie einen oder mehrere Pushbuttons hinzufügen. Wenn Sie eine
größere Produktanzahl zeigen möchten, dann ist es empfehlenswert, ein HTML Template mit
dem Add-on Viewer zu benutzen. Die Technik, die wir Ihnen hier vorstellen, bleibt im
Wesentlichen die gleiche, mit dem Unterschied, dass die Produkt-Buttons mit einer html
Tabelle gezeigt werden.
Die zusätzlichen Produktinformationen
Ein Mausklick auf den Produktbutton fügt die
Materialnummer und Auftragsmenge ein; ein Mausklick auf den Auftragsbutton zeigt den
Auftrag an (unter Verwendung der Transaktion VA03). Wenn das Fenster nicht mehr benötigt
wird, kann der Anwender es mit dem roten Pfeil schließen.
Automatische Eingabe von Materialnummer und Auftragsmenge
Die Scripte (für ein IDES 4.6D System)
sind nicht besonders lang, sie stellen allerdings höhere Ansprüche an die GuiXT
Programmierung. Es wird hierbei ein dynamischer Index verwendet. Wenn Sie
die Beispielskripte anpassen und verändern, dann beachten Sie bitte folgende
Einschränkungen, die bei Tabellen Transfers mit der Call Anweisung gelten:
- Verwenden Sie nur
zeichenartige Felder in Ihrer Tabellendefinition (keine
"integer" oder "gepackten" Zahlen)
- Die maximale Standard Tabellenbreite ist
256. Verwenden Sie den width:xxx Parameter wenn Sie eine größere
Tabellenbreite
benötigen, z.B.. table.ORDERS(width:500)=orders.
Hierbei ist die maximale definierbare
Breite 32000.
- Bezüglich der Zeilenanzahl gibt es keine
Einschränkungen.
GuiXT Script "SAPMV45A.E4001.TXT"
if Q[Transaction=VA01] and Q[Page=Verkauf]
if V[VA01_KUNNR=&F[Auftraggeber]] and V[VA01_KUNNR]
Offset (7,86)
Box (0,0) (6,44)
// close box
Pushbutton (0,43) "@02@" process="GetOrdersMaterials.txt"
using KUNNR = ""
Text (0,1) "Aufträge"
// Index
Set V[i] 1
Set V[row] 1
label next_order
if not V[VA01_VBELN&V[i]]
goto end_of_orders
endif
Pushbutton (&V[row],1) "@16\QOrder
&V[VA01_VBELN&V[i]]@&V[VA01_AUDAT&V[i]]" "/OVA03"
process="DisplayOrder.txt"
using VBELN = "&V[VA01_VBELN&V[i]]"
Set V[i] &V[i] + 1
Set V[row] &V[row] + 1
if V[i<6]
goto next_order
endif
label end_of_orders
// Index
Set V[i] 1
Set V[row] 1
Text (0,17) "Produkte"
label next_material
if not V[VA01_MATNR&V[i]]
goto end_of_materials
endif
Pushbutton (&V[row],17)
"@40\Q&V[VA01_ARKTX&V[i]]@&V[VA01_MATNR&V[i]]"
process="AddMaterial.txt" size=(1,16)
using MATERIAL = "&V[VA01_MATNR&V[i]]"
using AMOUNT = "&V[VA01_AMOUNT&V[i]]"
Text (&V[row],34) "&V[VA01_AMOUNT&V[i]]
&V[VA01_VRKME&V[i]]"
Set V[i] &V[i] + 1
Set V[row] &V[row] + 1
if V[i<6]
goto next_material
endif
label end_of_materials
else
Pushbutton (7,86) "Frühere Aufträge"
process="GetOrdersMaterials.txt"
using KUNNR = [Auftraggeber]
endif
endif
InputScript "DisplayOrder.txt"
Parameter VBELN
Screen sapmv45a.0102
Set F[Order] "&U[VBELN]"
Enter
InputScript "AddMaterial.txt"
Parameter MATERIAL
Parameter AMOUNT
Set V[i] 1
label next_line
Set V[Material] "&cell[.,Material,&V[i]]"
// empty?
If not V[Material]
Set cell[Alle Positionen,Material,&V[i]] "&U[MATERIAL]"
Set cell[Alle Positionen,Auftragsmenge,&V[i]] "&U[AMOUNT]"
Leave
endif
Set V[i] &V[i] + 1
if V[i<20]
goto next_line
endif
Function "ZZ_GUIXT_CUSTOMER_ORDERS"
FUNCTION ZZ_GUIXT_CUSTOMER_ORDERS.
*"*"Local interface:
*" IMPORTING*" VALUE(KUNNR) TYPE KUNNR
*" VALUE(N_ORDERS) TYPE I DEFAULT 5
*" TABLES
*" ORDERS STRUCTURE ZZORDER
*" MATERIALS STRUCTURE ZZMATERIAL
*"----------------------------------------------------------------------
Tables: vakpa, vbap.
* Activate for debugging in RFC mode:
* call function 'SYSTEM_ATTACH_GUI'.
* Break-point.
* add leading 000... for numerical customer numbers
if kunnr co ' 0123456789'.
unpack kunnr to kunnr.
endif.
refresh: orders, materials.
select AUDAT VBELN from vakpa
into corresponding fields of vakpa
up to n_orders rows
where kunde = kunnr and parvw = 'AG'
order by audat descending.
orders-audat = vakpa-audat.
orders-vbeln = vakpa-vbeln.
Append orders.
select MATNR KWMENG VRKME ARKTX from vbap
into corresponding fields of vbap
where vbeln = orders-vbeln.
read table materials with key vbap-matnr.
IF sy-subrc ne 0.
materials-matnr = vbap-matnr.
materials-arktx = vbap-arktx.
materials-vbeln = vakpa-vbeln.
* Use "Write to" instead of "Move" for
special fields
Write vbap-kwmeng to materials-menge unit vbap-vrkme.
Write vbap-vrkme to materials-vrkme.
Append materials.
endif.
endselect.
endselect.
endfunction.
InputScript "GetOrdersMaterials.txt"
Parameter KUNNR
// Save customer number
Set V[VA01_KUNNR] "&U[KUNNR]"
// no customer number? Then no action
if not V[VA01_KUNNR]
Leave
endif
// Reset order and material table
Set V[empty] ""
CopyText fromString=empty toText=orders
CopyText fromString=empty toText=materials
Call "ZZ_GUIXT_CUSTOMER_ORDERS" in.KUNNR="&U[KUNNR]"
table.ORDERS=orders table.MATERIALS=materials
// Index
Set V[i] 1
label next_order
CopyText fromText=orders toString=Pos line=&V[i]
if not Q[ok]
// Reset Order
Set V[VA01_ORDER&V[i]]
goto materials
endif
Set V[VA01_AUDAT&V[i]] "&V[Pos](1-4)/&V[Pos](5-6)/&V[Pos](7-8)"
Set V[VA01_VBELN&V[i]] "&V[Pos](9-18)"
Set V[i] &V[i] + 1
if V[i<6]
goto next_order
endif
label materials
Set V[i] 1
label next_material
CopyText fromText=materials toString=Pos line=&V[i]
if not Q[ok]
// Reset Material
Set V[VA01_MATNR&V[i]]
Leave
endif
Set V[VA01_MATNR&V[i]] "&V[Pos](1-18)"
Set V[VA01_AMOUNT&V[i]] "&V[Pos](19-33)"
Set V[VA01_VRKME&V[i]] "&V[Pos](34-36)"
Set V[VA01_MATVBELN&V[i]] "&V[Pos](37-46)"
Set V[VA01_ARKTX&V[i]] "&V[Pos](47-86)"
Set V[i] &V[i] + 1
if V[i<6]
goto next_material
endif
|