Funktion Der Funktionsbaustein  /guixt/select bietet eine komfortable Möglichkeit, Datenbankzugriffe in GuiXT Scripten durchzuführen.

Der Baustein wird im Script über Call aufgerufen. Sowohl Einzelsatzzugriffe als auch Mengenzugriffe sind unterstützt.

Voraussetzung:

  • Der Funktionsbaustein ist in das betreffende SAP-System importiert (siehe unten "Import des Funktionsbausteins")
     
  • Der RFC-Benutzer verfügt über die nötigen Berechtigungen (siehe unten "Benutzerberechtigungen")

Hinweis: Bitte auch den Baustein /guixt/dbselect beachten; dieser Baustein erlaubt die Angabe von beliebig vielen Rückgabefeldern und ist bei insbesondere bei grossen Datenmengen schneller als /guixt/select.

Import des Funktionsbausteins
  • Speichern Sie den SAP-Transportauftrag /guixt/select in das Transportverzeichnis Ihres SAP-Systems (Verzeichnisse usr/sap/trans/cofiles und usr/sap/trans/trans/data)
     
  • Importieren Sie den Transportauftrag (Transaktion STMS)

Falls Sie den Funktionsbaustein ohne Einspielen des Transportauftrags direkt mit SE37 anlegen möchten, können Sie die Datei Sourcecode /guixt/select nutzen.

Benutzerberechtigungen Sie können für den Aufruf des Funktionsbausteins entweder den im GuiXT Profile hinterlegten RFC-Benutzer oder den aktuell angemeldeten Benutzer (Call-Anweisung mit Zusatzoption -currentUser)  für die RFC-Verbindung verwenden.

Die folgenden Berechtigungen sind erforderlich (entweder für den RFC-Benutzer oder bei Option -currentUser für den angemeldeten Benutzer):

Berechtigung zum RFC-Aufruf der Funktionsgruppe /GUIXT/DB01:
S_RFC
: RFC_TYPE=FUGR, RFC_NAME=/GUIXT/DB01, ACTVT=16

Berechtigung zum Lesen der jeweiligen Tabellengruppe:
S_TABU_DIS
: DICBERCLS=XXXXX, ACTVT=03
 

Dabei ist XXXX die Berechtigungsgruppe der zu lesenden Tabelle (abgelegt in SAP-Tabelle TDDAT).

Hinweis: Die Tabellen-Lese-Berechtigung S_TABU_DIS wird in gleicher Weise in den SAP-Transaktionen SE16, SM30 und im Standard-Funktionsbaustein RFC_READ_TABLE geprüft.
 

Parameter Folgende Parameter stehen zur Verfügung:
  • in.table=  Tabellenname
     
  • in.Condition=  Suchbedingung
     
  • in.Fields=  Feldliste
     
  • in.orderBy=  Sortierung
  • in.Distinct=  "X" = Select Distinct


     
  • out.Found "X"=Gefunden
     
  • out.ReccountAnzahl gefundener Sätze 0,1,2,...
     
  • out.Result Gefundene Tabellenzeile
     
  • out.V1out.V2=  ... out.V10= Einzelfelder gemäß Feldliste


     
  • table.Resulttable= Gefundene Tabellenzeilen (als Langtext)
     
  • table.Conditiontable= Suchbedingung  (als Langtext)
     
  • table.V1Table table.V2Table=  ... table.V10table= Einzelfelder gemäß Feldliste (als Langtexte)
 in.table= Name der Tabelle oder des Tabellenviews, der gelesen werden soll. Beispiel: 

... in.
table=
"T001"

Hilfreich sind auch die zu den Suchhilfen generierten Views M_... (z.B. M_MAT11) sowie Views, die einen Join mehrerer Tabellen darstellen. Zum Beispiel liefert der View "VBAKUK" zu einem Kundenauftrag sowohl allgemeine Informationen aus Tabelle VBAK als auch Statusinformationen aus Tabelle VBUK.
 

in.Condition= Suchbedingung im ABAP-Format der Select-Anweisung. Beispiel:

...
in.Condition="BUKRS = '1000' ".

Bitte beachten, daß Strings in ABAP in einfache Hochkommata eingeschlossen werden.
Variablen wie üblich mit &V[varname] angeben:

...
in.Condition="BUKRS = '&V[mybukrs]' ".

Falls Sie eine Spalte mit dem Inhalt einer zweiten Spalte vergleichen möchte, geht das über die Notation table~spalte, z.B.:

... in.Condition="PARVW = 'RE' AND KUNNR <> KNVP~KUNN2"

Weitere Details siehe Dokumentation der ABAP-Select-Anweisung.

 

Eine Suchbedingung muß immer angegeben sein, entweder über in.Condition=  oder über table.Conditiontable=.

Bei  in.Condition= ist die Gesamtlänge der Bedingung auf 4000 Byte beschränkt. Wenn Sie sehr viele Schlüssel übergeben wollen, z.B. 1000 Kundennummern, verwenden Sie bitte table.Conditiontable=.
 

in.Fields= Optionale Liste von Feldnamen, durch Komma voneinander getrennt. Nur die angegebenen Felder werden aus der Datenbank gelesen.  Beispiel:

...
in.Fields="KUNNR,NAME1,NAME2,ORT01,STRAS,PSTLZ,LAND1".

Bei  Verwendung von
out.V1out.V2= ... oder out.V1Tableout.V2Table= ... ist die Feldliste erforderlich; die Felder der Feldliste werden dann in die angegebenen Variablen bzw. Langtexte gestellt.

Im Fall von
out.Result= oder table.Resulttable= wird der gesamte Satz zurückgegeben, aber nur die angegebenen Felder sind gefüllt.
 
in.Orderby= Optionale Liste von Feldnamen, durch Komma voneinander getrennt, nach denen die Resultattabelle aufsteigend sortiert wird. Beispiel:

...
in.Orderby="ORT01,NAME1".

Hinter jedem Feldnamen kann durch den Zusatz "DESCENDING" eine absteigende Sortierung erreicht werden. Beispiel:

...
in.Orderby="NAME1 DESCENDING, ORT01 DESCENDING".

in.Distinct= Mit Wert "X" wird ein "Select Distinct" ausgeführt.
out.Found= Erhält den Wert "X", wenn mindestens ein Satz zurückgeliefert wurde, sonst "".
out.Reccount= Anzahl der zurückgelieferten Sätze
out.Result= Enthält den ersten zurückgelieferten Satz, oder "" falls nichts gefunden wurde. Falls in.Fields angegeben ist, sind nur die dort angegebenen Felder gefüllt.

Beispiel:

// Testkonto
Set V[mykunnr] "0000000001"

Call /guixt/select in.table="KNA1" in.fields="NAME1,ORT01" in.condition="KUNNR = '&V[mykunnr]'" out.result="kwa"

// Testausgabe
Message "&V[kwa](KNA1-NAME1) &V[kwa](KNA1-ORT01)"
 

out.V1=
out.V2=
...

out.V10=

Nur sinnvoll in Verbindung mit in.Fields. Die dort angegebenen Felder werden für den ersten gefundenen Satz in die jeweils angegebenen Variablen gesetzt.

Beispiel:

// Testkonto
Set V[mykunnr] "0000000001"

Call /guixt/select in.table="KNA1" in.fields="NAME1,ORT01" in.condition="KUNNR = '&V[mykunnr]'" out.V1="name" out.v2="city"

// Testausgabe
Message "&V[name] &V[city]"

 

table.Resulttable= Enthält die zurückgelieferten Sätze. Falls in.Fields angegeben ist, sind nur die dort angegebenen Felder gefüllt.

Beispiel: Lesen aller Kunden in Ort "Heidelberg"

Call /guixt/select in.table="KNA1" in.fields="KUNNR,NAME1" in.condition="ORT01 = 'Heidelberg'" table.resulttable="r"

// Testausgabe
Set V[i] 1
label
next

CopyText fromText="r" toString="kwa" line="&V[i]"
if Q[ok]
  Message "&V[kwa](KNA1-KUNNR) &V[kwa](KNA1-NAME1)"
  Set V[i] &V[i] + 1
 
goto next
endif

 

table.V1table=
table.V2table=
...

table.V10table=

 
Nur sinnvoll in Verbindung mit in.Fields. Die dort angegebenen Felder werden in die jeweiligen Langtexte gestellt, eine Zeile pro gefundenem Satz.

Beispiel: Lesen aller Kunden in Ort "Heidelberg":

Call /guixt/select in.table="KNA1" in.fields="KUNNR,NAME1" in.condition="ORT01 = 'Heidelberg'" table.v1table="r1" table.v2table="r2"

// Testausgabe
Set V[i] 1
label next

CopyText fromText="r1" toString="account" line="&V[i]"
if Q[ok]
  CopyText fromText="r2" toString="name" line="&V[i]"
  Message "&V[account] &V[name]"
  Set V[i] &V[i] + 1
 
goto next
endif

 

table.Conditiontable=
 
Suchbedingung im ABAP-Format der Select-Anweisung. Im Unterschied zu in.Condition= übergeben Sie hier eine Langtextvariable, die beliebig viele Zeilen enthalten kann.

Beispiel:

Aus einer Liste von Kontonummern in einer Langtextvariablen "kns" wird die Bedingung für den Select-Aufruf in einer Langtextvariablen "ctab" zusammengestellt:

Set text[ctab] ""
Set V[i] 1

label next
CopyText fromText="kns" toString="kn" line="&V[i]"
if Q[ok]
   if V[i=1]
  
Set V[condline] "KUNNR = '&V[kn]'"
   else
      Set V[condline] "OR KUNNR = '&V[kn]'"
   endif

 CopyText fromString="condline" toText="ctab" -appendLine
  Set V[i] &V[i] + 1
 
goto next

endif

Call /guixt/select in.table="KNA1" in.fields="KUNNR,NAME1,ORT01"   table.conditiontable="ctab" ...
 

Komponente GuiXT + InputAssistant