Funktion



Beispiele und Erläuterungen

Der Funktionsbaustein  /guixt/dbselect 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")
Import des
Bausteins
Berechtigungen 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.

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.

Join mehrerer Tabellen
Ebenfalls möglich ist, mehrere Tabellen in einem Join zu kombinieren. Es handelt sich dabei um einen "inner join", d.h. in der Resultatmenge erscheinen nur die Werte, für die in allen beteiligten Tabellen entsprechende Werte existieren, welche die join-Bedingung erfüllen. So würden in Beispiel 4 (unten) Kunden fehlen, falls zu dem Länderkürzel in KNA1 keine Länderbezeichnung in Tabelle T005T existiert.

Bei einem Join wird die Berechtigung für alle beteiligten Tabellen geprüft.

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=.

Als Werte müssen Sie immer die interne Darstellung wählen, also z.B. als Kundennummer '0000001032' und nicht '1032'.
Durch Verwenden derParameter domname1, domname2,... und domvalue1, domvalue2,... erfolgt die Konvertierung von externem nach internehm Format in dem Baustein /guixt/dbselect.

Beispiel:
in.Condition="KUNNR = @KUNNR"   in.Domnane1="KUNNR"  in.Domvalue1="1032"

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

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

Die Felder werden in aufbereiteter Form zurückgeliefert. Durch einen * vor dem Feldnamen kann man angeben, dass der Wert nicht aufbereitet werden soll. Datumsangaben werden dann im Format YYYYMMDD und Zahlen mit '.' als Dezimaltrennzeichen zurückgegebem,  Kontonummern, Materialnummern etc. mit führenden Nullen, z.B.  0000002000 statt 2000. Das ist sinnvoll, wenn die Werte für weitere Datenbankzugriffe verwendet werden.

Es ist auch möglich, einen Feldnamen sowohl mit als auch ohne * anzugeben; dann werden beide Darstellungen geliefert. Beispiel:

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


Falls keine Feldliste angegeben ist, wird die Anzahl der Sätze, welche die angegebene Bedingung erfüllen, im Ausagebparameter Reccount zurückgeliefert.

Feldnamen und Join

Falls über "join" Daten aus mehreren Tabellen gelesen werden, bitte die Feldnamen mit dem jeweiligen Tabellennamen und dem ~ Zeichen angeben, z.B.:

... in.Fields="KNA1~KUNNR,KNA1~NAME1,T005T~LANDX".

Falls einige der Felder den Typ P (dezimal gepackt) I (integer), D (Datum) oder T (Zeit) haben, muss der Typ explizit angegeben werden. Das geht entweder über den Zusatz "type P", "type I", "type D",  "type T", z.B.

...  in.fields="KNA1~KUNNR,S001~UMNETWR type P,S001~STWAE"

oder mit der Klausel "as x", wobei für x die Bezeichnungen P1,...P30, I1,...I30, D1,...D30, T1,...T30 verwendet werden können, aus denen der Typ dann abgeleitet wird. Die Variante mit "as ..." hat den Vorteil, dass damit auch abgeleitete Werte wie SUM( ... ) in der orderby-Klausel verwendet werden können, siehe Beispiel 6 (unten).
Bei Charakter-Feldern kann  "as F1", "as F2",... bei Bedarf verwendet werden.

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.GroupBy= Optionale Liste von Feldnamen, durch Komma voneinander getrennt, nach denen die Resultattabelle gruppiert wird. Das ist bei der Verwenung von Aggregatfunktionen wie SUM( ) in der Feldliste nötig.
in.Having= Bedingung für die Selektion von Gruppen
in.Distinct= Mit Wert "X" wird ein "Select Distinct" ausgeführt.
in.UseGroupSeparator= Mit Wert "X" werden in der Ausgabe von Zahlen Tausendergruppen mit einem Trennzeichen gemäß Benutzereinstellungen separiert
in.NoDecimals= Mit Wert "X" werden in der Ausgabe von Zahlen keine Dezimalstellen angezeigt
in.Maxcount= Maximale Anzahl der zurückzuliefernden Sätze. Bei keiner Angabe oder "0": keine Beschränkung.
in.Username= Angabe eines Benutzers, dessen Aufbereitungsparameter (Dezimaltrennzeichen und Datumsdarstellung) für die Werte verwendet werden. Falls nichts angegeben, wird der RFC-Bnutzer verwendet. Meist ist
... in.Username="&V[user]"
sinnvoll, also der gerade angemeldete Benutzer.
out.Found= Erhält den Wert "X", wenn mindestens ein Satz zurückgeliefert wurde, sonst "".
out.Reccount= Anzahl der zurückgelieferten Sätze
table.Values= Enthält die zurückgelieferten Werte. Pro Zeile wird jeweils eines der mit in.Fields spezifizierten Felder ausgegeben. Falls mehrere Tabellenzeilen gelesen wurden, wiederholen sich dann pro gelesener Tabellenzeile alle Felder.
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.

Bitte beachten:

  • Pro Zeile maximal 8000 Zeichen
  • Es gibt pro Datenbanksystem eine Maximalzahl von Bedingungen pro Select-Anweisung, in HANA z.B.16 000 oder 32 000 Bedingungen je nach Version.

Beispiel:

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

GuiXT
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/dbselect in.table="KNA1" _ 
    in.fields="KUNNR,NAME1,ORT01"   _ 
    table.conditiontable="ctab" ...


Beispiel 



Weitere Beispiele und Erläuterungen

Lesen aller Kunden in Ort "Heidelberg" mit Testausgabe:

GuiXT
// Ausgabetabelle löschen
Clear text[r]

// Daten lesen
Call /guixt/dbselect in.table="KNA1" _ 
    in.fields="KUNNR,NAME1,NAME2,PSTLZ,ORT01,LAND1" _ 
    in.condition="ORT01 = 'Heidelberg'" table.values="r"

// Testausgabe
Message "&text[r]"

Komponente GuiXT + InputAssistant