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

 

 

 

VB.NET