Funktionsaufrufe aus einem InputScript heraus sind eine schnelle Möglichkeit, zusätzliche Daten aus dem SAP System zu erhalten. Sie können hierfür sowohl Einzelfelder als auch Tabellen verwenden. Bei dynamischen Daten (wie beispielsweise Texten oder einer größeren Anzahl von Objekten) ist die Verwendung von Tabellen die beste Art, Informationen zwischen SAP System und InputScript zu transportieren.

Hier stellen wir Ihnen zwei Beispiele vor. Beide lassen sich gut als Grundlage für Ihre eigenen Entwicklungen verwenden. Im zweiten Beispiel demonstrieren wir auch die Erstellung "dynamischer" Bildelemente.

 

Beispiel 1: Anzeige der Materialbeschreibung in VA03

In der Transaktion VA03 (Kundenauftrag anzeigen) möchten wir dem Anwender die Möglichkeit geben, durch Doppelklick auf die Materialbezeichnung in der Tabelle die ausführliche Materialbeschreibung anzuzeigen.


 VA03: Doppelklick auf den Materialkurztext (Tabellenspalte "Bezeichnung") 


Die ausführliche Materialbeschreibung wird angezeigt. 

Die folgende Technik wird angewandt:

  • Im GuiXT Script behandeln wir den Doppelklick durch eine  On "/2" Anweisung. Daraufhin wird das InputScript VA03_doubleclick.txt ausgeführt.
    Beachten Sie den Parameter Fcode="/2" in der  On Anweisung. Dies bedeutet, dass der Doppelklick an die SAP Anwendung weitergegeben wird, wenn nicht das InputScript einen anderen FUnktionscode durch "Enter" setzt. 
  • Im InputScript stellen wir zuerst fest, ob der Cursor auf die Spalte "Bezeichnung" zeigt, indem wir die Systemvariablen V[_tabrow] und V[_tabcol] verwenden. 
    Zeigt er nicht auf diese Spalte, dann geschieht nichts, so dass der Standard Doppelklick durch die SAP Anwendung durchgeführt wird. Zeigt der Cursor auf die Spalte, dann nehmen wir die Materialnummer und die Kurzbezeichnung aus dieser Zeile. Wir lösen "Enter" aus, um die Standard Doppelklick Funktion in diesem Fall auszuschalten.
  • Das GuiXT Script wird nach diesem Enter erneut ausgeführt.  Wir rufen eine Funktion auf, die die komplette Materialbeschreibung liefert. Diese zeigen wir in einer Textbox mit der Materialbezeichnung an. Zum Schluß setzen wir die Variable für die Materialnummer zurück, so dass die Textbox beim nächsten Enter wieder verschwindet.

GuiXT script "SAPMV45A.E4001.TXT"
if Q[Transaction=VA03] and Q[Page=Verkauf]

  // Bei Doppelklick
  On "/2" Fcode="/2" process="VA03_doubleclick.txt"

  // Text anzeigen? (nach Doppelklick)
  if V[VA03_DisplayTextMatnr]
    Call "ZZ_GUIXT_MATERIAL_TEXT" in.artnr="&V[VA03_DisplayTextMatnr]" table.text="matxt"

    Text (7,84) "&V[VA03_DisplayTextMatnr]: &V[VA03_DisplayTextDesc]" size=40 -border 
    TextBox (8,84) (14,124) name="matxt" -readOnly

    Set V[VA03_DisplayTextMatnr] ""
  endif
endif

InputScript "VA03_doubleclick.txt"

// Cursor in Spalte "Bezeichnung"   (intern nr 6)?
if V[_tabrow>0] and V[_tabcol=6]

  Set V[VA03_DisplayTextMatnr] "&cell[Alle Positionen,Material,&V[_tabrow]]"
  Set V[VA03_DisplayTextDesc]  "&cell[Alle Positionen,6,&V[_tabrow]]"

  // Ersetze "/2" mit normalem "Enter"  
  Enter 

endif

Function "ZZ_GUIXT_MATERIAL_TEXT"

FUNCTION ZZ_GUIXT_MATERIAL_TEXT.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(ARTNR) TYPE ARTNR
*" VALUE(LANGUAGE) LIKE SY-LANGU DEFAULT SY-LANGU
*" VALUE(ID) LIKE THEAD-TDID DEFAULT 'GRUN'
*" TABLES
*" TEXT STRUCTURE W3HTML OPTIONAL
*"----------------------------------------------------------------------


DATA: TNAME LIKE THEAD-TDNAME.
  TNAME = ARTNR.

data: lt_stream type w3_html occurs 10.

Refresh text.

DATA: LT_SSTEXT LIKE TLINE OCCURS 0.

CALL FUNCTION 'READ_TEXT'
   EXPORTING ID       = ID
             LANGUAGE = LANGUAGE
             NAME     = TNAME
             OBJECT   = 'MATERIAL'
   TABLES
             LINES    = LT_SSTEXT
   EXCEPTIONS
            OTHERS = 1.

IF SY-SUBRC EQ 0.

  CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
       TABLES
           ITF_TEXT    = LT_SSTEXT
           TEXT_STREAM = lt_stream.

  LOOP AT lt_stream INTO text. 
    append text. 
  ENDLOOP.
ENDIF.

ENDFUNCTION.

 

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