Statt in VB.NET
eine eigene ActiveX Komponente zu implementieren, können Sie auch direkt
eine Windows Form in das SAP GUI Fenster einbetten, indem Sie die
Funktion
guixt.EmbedForm() verwenden.
In
Verbindung mit einer zentralen Ablage der VB.NET dll, zum Beispiel in
SAP Web Repository oder Mime Repository, ist dann auf den Benutzer-PCs
keinerlei Installation oder Registrierung nötig. DIe VB.NET dll wird ja
von GuiXT automatisch beim ersten Ansprechen in den GuiXT Cache geladen
und dort ausgeführt.
Wir zeigen das
in diesem Tutorial an dem Beispiel einer interaktiven Kundeninfo. Das
Beispiel ist relativ umfangreich, hat aber den Vorteil, eine Reihe von
Techniken zu enthalten, die für die Implementierung einer Anforderung
aus der Praxis hilfreich sind.
In Visual Studio sieht das Design der Form wie folgt aus:
Visual Studio, Forms
Designer
Die Form
besteht aus mehreren Tabellen, Buttons und einem Diagramm. Für den
Benutzer ist der Ablauf wie folgt:
Eingabe der Kundennummer
und "Start"
Anzeige der
Kundeninformation
Die Tabelle
rechts oben zeigt die bisher verkauften Artikel, absteigend sortiert
nach 5-Jahres-Umsatz. Durch Klick auf einen Artikel wird jeweils ein
Umsatzdiagramm für den ausgewählten Artikel angezeigt:
Diagramm pro
Verkaufsprodukt
Diese Benutzeraktion wird unmittelbar in VB.NET durchgeführt. Andere
Aktionen, z.B. Klick auf den Button "Fidelity 3 years", um das
Treuepaket 3 als Kundenauftrag zu verbuchen, lösen dagegen ein
InputScript aus, das in der VA01 die entsprechenden Artikel (oder eine
Stückliste) einstellt.
"Treuepaket 3 Jahre" als
Kundenauftrag anlegen
Insgesamt ist
die Implementierung zwischen VB.NET und GuiXT Scripten variabel
aufgeteilt. Datenzugriffe und SAP-Aktionen sind in InputScripts
realisiert, während die Benutzeroberfläche und das Erstellen der
Diagramme in VB.NET erfolgt.
Durch die
Standard-.NET-Controls hat der Benutzer eine Reihe von
Interaktionsmöglichkeiten -etwa nach Spalten zu sortieren -, die nicht
separat implementiert werden müssen:
Sortierung nach
Produktbezeichnung
Das Einblenden
der Kundeninfo kann im Prinzip in einer beliebigen Transaktion erfolgen.
Wir haben hier den Weg beschritten, eine eigene Transaktion ZCSO
anzulegen, der Einfachheit halber als Parametertransaktion zu einer
bestehenden; der Transaktion START_REPORT, die für unser Beispiel
genügt.
Alle Scripte zum
Herunterladen, einschließlich des VB.NET Projekts, finden Sie in
zcso.zip. Bitte beachten Sie für eventuelle eigene Tests, dass wir das
Erstellen der Diagramme über das (kostenlose) Microsoft-Zusatzpaket "MS Chart"
implementiert haben, das nicht automatisch installiert ist. Sie finden in der
zip-Datei zcso.zip auch die Installationsroutine zu MS Chart. Zum Öffnen des
VB.NET Projekts bitte Visual Studio ab Version 2012 verwenden. Nach download der
Datei zcso.zip ist meist ein "Unblock" nötig (rechte Maustaste ->
Dateiattribute), sonst können die Dateien später nicht ausgeführt werden; oder
"Unblock" nach Entpacken für die einzelnen Dateien.
GuiXT Script
GuiXT
// ZCSO
// demo transaction of embedded Windows Forms
// delete existing elements (necessary if implemented as parameter transaction)
del (0,0) (20,120)
// initial screen?
if not V[zcso_main_screen=X]
// title
Title "Customer Sales Order Dashboard"
InputField (1,1) "Customer" (1,20) size=10 name="zcso_kunnr_ext" _
techName="KNA1-KUNNR" -numerical
On "Enter" process="zcso_init_enter.txt"
Pushbutton (toolbar) "Start" "/0" "F8" process="zcso_init_enter.txt"
else
// title
Title "&V[zcso_kunnr_ext]: &V[zcso_name1], &V[zcso_city], &V[zcso_country]"
// area for VB.NET control.
// We start at (-1,-1) and use a very large area in order to avoid any padding
Control (-1,-1) (50,300) progID="Shell.Explorer" name="r1" initFlag="r1init"
// embed control
if V[r1init]
CallVB charts.zcso.embed "&V[r1]"
endif
Pushbutton (toolbar) "Other customer" process="zcso_main_back.txt"
Pushbutton (toolbar) "Display customer data (XD03)" _
process="zcso_display_customer.txt"
On "Enter" process="zcso_main_enter.txt"
On "/3" process="zcso_main_back.txt"
endif
InputScipt zcso_init_enter.txt
GuiXT
// customer number specified?
if not V[zcso_kunnr_ext]
return "E: Please specify a customer number" -statusline
endif
// customer number with 10 digits
Set V[zcso_kunnr](1-10) "0000000000&V[zcso_kunnr_ext]" -alignRight
// set organization key values (option:read from user parameters)
Set V[zcso_vkorg] "1000"
Set V[zcso_vtweg] "10"
Set V[zcso_spart] "00"
// prepare VB.NET form
StatusMessage title="Processing..."
CallVB charts.zcso.initialize
// read customer address
StatusMessage addString="1 Address"
include "zcso_read_address.txt"
// read contacts
StatusMessage addString="2 Contacts"
include "zcso_read_contacts.txt"
// read orders
StatusMessage addString="3 Open orders"
include "zcso_read_orders.txt"
// read diagram data from S001
StatusMessage addString="4 Sales figures"
include "zcso_read_diagramdata.txt"
// build tables, diagrams etc.
CallVB charts.zcso.display
// display main screen
Set V[zcso_main_screen] "X"
StatusMessage -remove
Return
InputScipt zcso_read_address.txt
GuiXT
// read customer address
Call "/guixt/select" cache="session" in.table="KNA1" _
in.fields="NAME1,ORT01,LAND1" _
in.condition="KUNNR = '&V[zcso_kunnr]'" _
out.found="found" out.v1="zcso_name1" _
out.v2="zcso_city" out.v3="zcso_countrycode"
// found?
if not V[found]
StatusMessage -remove
return "E: Customer &V[zcso_kunnr_ext] not found" -statusline
endif
// read country text
Call "/guixt/select" cache="session" in.table="T005T" _
in.fields="LANDX50" _
in.condition="SPRAS = '&V[_language]' AND LAND1 = '&V[zcso_countrycode]'" _
out.v1="zcso_country"
InputScipt zcso_read_contacts.txt
GuiXT
// Build key table for function
Set V[crwa] ""
Set V[crwa](BAPICUSTOMER_IDRANGE-SIGN) "I"
Set V[crwa](BAPICUSTOMER_IDRANGE-OPTION) "EQ"
Set V[crwa](BAPICUSTOMER_IDRANGE-LOW) "&V[zcso_kunnr]"
Set text[cr] "&V[crwa]"
// clear result table
Set text[contacts] ""
// call function
Call "BAPI_CUSTOMER_GETCONTACTLIST" _
table.CUSTOMERRANGE="cr" table.CONTACTADDRESSDATA="contacts"
// transfer data to VB
Set V[i] 1
label contacts_line
CopyText fromText="contacts" toString="wa" line=&V[i]
if Q[ok]
Set V[lastname] "&V[wa](BAPICONTACT_ADDRESSDATA-LASTNAME)"
Set V[firstname] "&V[wa](BAPICONTACT_ADDRESSDATA-FIRSTNAME)"
Set V[zcso_contactname] "&V[lastname], &V[firstname]"
Set V[zcso_contacttitle] "&V[wa](BAPICONTACT_ADDRESSDATA-FUNCTION)"
Set V[zcso_contactphone] "&V[wa](BAPICONTACT_ADDRESSDATA-TEL1_NUMBR)"
Set V[zcso_contactemail] "&V[wa](BAPICONTACT_ADDRESSDATA-E_MAIL)"
CallVB charts.zcso.newcontact
Set V[i] &V[i] + 1
goto contacts_line
endif
InputScipt zcso_read_orders.txt
GuiXT
// read open orders
// search condition
Set V[cond1] "KUNNR = '&V[zcso_kunnr]'"
Set V[cond2] "and VKORG = '&V[zcso_vkorg]'"
Set V[cond3] "and VTWEG = '&V[zcso_vtweg]'"
Set V[cond4] "and SPART = '&V[zcso_spart]'"
Set V[cond5] "and TRVOG = '0'"
Set V[cond6] "and AUDAT GE '&V[today-365_ymd]'"
Set V[condition] "&V[cond1] &V[cond2] &V[cond3] &V[cond4] &V[cond5] &V[cond6]"
// clear result tables
Set text[r1] ""
Set text[r2] ""
Set text[r3] ""
Set text[r4] ""
Set text[r5] ""
// read orders
Call /guixt/select in.table="VBAK" in.Condition="&V[condition]" _
in.Fields="VBELN,AUDAT,AUART,NETWR,BSTNK" _
table.V1table="r1" table.V2table="r2" table.V3table="r3" _
table.V4table="r4" table.V5table="r5"
// pass to VB
CallVB charts.zcso.neworders
// clear result tables
Set text[r1] ""
Set text[r2] ""
Set text[r3] ""
Set text[r4] ""
Set text[r5] ""
InputScipt zcso_read_diagramdata.txt
GuiXT
// Determine years
Set V[zcso_year0] &V[today_y]
Set V[zcso_year1] &V[zcso_year0] - 1
Set V[zcso_year2] &V[zcso_year0] - 2
Set V[zcso_year3] &V[zcso_year0] - 3
Set V[zcso_year4] &V[zcso_year0] - 4
// search condition
Set V[c1] "KUNNR = '&V[zcso_kunnr]'"
Set V[c2] "and VKORG = '&V[zcso_vkorg]'"
Set V[c3] "and VTWEG = '&V[zcso_vtweg]'"
Set V[c4] "and SPART = '&V[zcso_spart]'"
Set V[c5] "and SPMON GE '&V[zcso_year4]01'"
Set V[condition] "&V[c1] &V[c2] &V[c3] &V[c4] &V[c5]"
// Clear result tables
Set text[r1] ""
Set text[r2] ""
Set text[r3] ""
// read VIS statistics table S001
Call /guixt/select in.table="S001" in.Condition="&V[condition]" _
in.Fields="MATNR,SPMON,AENETWR" table.V1table="r1" _
table.V2table="r2" table.V3table="r3"
// pass data to VB
CallVB charts.zcso.materialsales
// Clear result tables
Set text[r1] ""
Set text[r2] ""
Set text[r3] ""
// obtain all product numbers from VB
CallVB charts.zcso.products_to_guixt
// read product names
if text[zcso_products]
Set text[ctab] ""
Set V[i] 1
label next
CopyText fromText="zcso_products" toString="matnr" line="&V[i]"
if Q[ok]
if V[i=1]
Set V[condline] "SPRAS = 'E' AND (MATNR = '&V[matnr]'
else
Set V[condline] "OR MATNR = '&V[matnr]'"
endif
CopyText fromString="condline" toText="ctab" -appendLine
Set V[i] &V[i] + 1
goto next
endif
if V[i>1]
Set V[condline] ")"
CopyText fromString="condline" toText="ctab" -appendLine
endif
Call /guixt/select in.table="MAKT" in.fields="MATNR,MAKTX" _
table.conditiontable="ctab" table.V1table="r1" table.V2table="r2"
endif
// product names to VB
CallVB charts.zcso.productnames_from_guixt
InputScipt zcso_create_order.txt
GuiXT
Parameter PROMOTION
Enter "/nVA01"
// Enter order type
Screen SAPMV45A.0101
Set F[VBAK-AUART] "TA"
Enter
// Enter customer number
Screen SAPMV45A.4001
Set F[KUAGV-KUNNR] "&V[zcso_kunnr]"
if U[PROMOTION=1]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] "M-20"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] "1"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,2] "PA-1000"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,2] "1"
endif
if U[PROMOTION=2]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] "M-20"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] "2"
endif
if U[PROMOTION=3]
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,1] "PA-1000"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,1] "1"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,2] "M-10"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,2] "1"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-MABNR,3] "P-103"
Set cell[SAPMV45A_TCTRL_U_ERF_AUFTRAG,RV45A-KWMENG,3] "1"
endif
Enter
// no delivery proposal?
Screen SAPLATP4.0500
Enter "=WEIT"
// no delivery proposal?
Screen SAPLATP4.0500
Enter "=WEIT"
InputScipt zcso_display_order.txt
GuiXT
if not V[zcso_vbeln]
return "E: Please select an order" -statusline
endif
Enter "/nVA03"
// Display order
Screen SAPMV45A.0102
Set F[VBAK-VBELN] "&V[zcso_vbeln]"
Enter
// Skip Popup
Screen SAPMSDYP.0010
Enter
InputScipt zcso_change_order.txt
GuiXT
if not V[zcso_vbeln]
return "E: Please select an order" -statusline
endif
Enter "/nVA02"
// Display order
Screen SAPMV45A.0102
Set F[VBAK-VBELN] "&V[zcso_vbeln]"
Enter
// Skip Popup
Screen SAPMSDYP.0010
Enter
InputScipt Zcso_display_customer.txt
GuiXT
Enter "/nxd03"
// Display customer
Screen SAPMF02D.7101
Set F[RF02D-KUNNR] "&V[zcso_kunnr]"
Set F[RF02D-VKORG] "&V[zcso_vkorg]"
Set F[RF02D-VTWEG] "&V[zcso_vtweg]"
Set F[RF02D-SPART] "&V[zcso_spart]"
Enter
InputScipt zcso_main_back.txt
GuiXT
// back to initial screen
Set V[zcso_main_screen] ""
Return