Ansicht
Dokumentation

READ_TABLE_BUFFERED - Gepuffertes Lesen einer Datenbanktabelle

READ_TABLE_BUFFERED - Gepuffertes Lesen einer Datenbanktabelle

PERFORM Short Reference   rdisp/max_wprun_time - Maximum work process run time  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

Funktionalität

Dieser Funktionsbaustein dient zum (gepufferten) Lesen von Daten aus Datenbank-Tabellen.

Er baut zur Laufzeit ein dynamisches SELECT-Statement auf. Das Ergebnis des SELECT's wird im Gedächtnis der Funktionsgruppe gespeichert, so daß ein erneuter Lesezugriff, da er zuerst in der internen Tabelle nachschaut, nicht nochmals die Datenbank liest.

Das Gedächtnis besteht aus internen Tabellen unterschiedlicher Breite. Welche dieser Tabellen genutzt werden soll, wird beim dynamisch ermittelt.

Dadurch kann der Speicherplatz optimal ausgenutzt werden, denn es ist sicherlich nicht sinnvoll, für eine Tabelle die nur ein Key-Feld und eine Bezeichnung enthält, volle 1024 Byte bereitzustellen.

I_BUFFER_TYPE bestimmt, ob überhaupt gepuffert werden soll:

  • I_BUFFER_TYPE = 'X': Gelesene Einträge puffern,
  • I_BUFFER_TYPE = ' ': Gelesene Einträge nicht puffern.

Der Zugriff auf eine Datenbanktabelle wird durch folgende
Parameter gesteuert
I_TABLE Tabellenname
I_KEY1 Name des 1. Key-Feldes der Tabelle
I_KEY2 Name des 2. Key-Feldes der Tabelle
I_KEY3 Name des 3. Key-Feldes der Tabelle
I_KEY4 Name des 4. Key-Feldes der Tabelle
I_VALUE1 Wert des 1. Key-Feldes der Tabelle
I_VALUE2 Wert des 2. Key-Feldes der Tabelle
I_VALUE3 Wert des 3. Key-Feldes der Tabelle
I_VALUE4 Wert des 4. Key-Feldes der Tabelle
I_VALUE4 Wert des 4. Key-Feldes der Tabelle

Das Ergebnis, also die gelesene Workarea der Tabelle, wird in dem Export-Parameter E_TABLE_WORKAREA zurückgegeben.

Falls kein Eintrag gefunden wurde, wird die Exception NO_ENTRY_FOUND ausgelöst.

Falls der übergebene Tabellenname leer ist, kann kein Lesezugriff durchgeführt werden. Es wird die Exception NO_TABLE_NAME ausgelöst.

Beispiel

Sie wollen die Tabelle KNA1 lesen (Kundenstamm, allgemeiner Teil). Diese Tabelle ist folgendermaßen aufgebaut:
Name Key Typ Länge /Dez Bedeutung
----------------------------------------------------------------------
KNA1-MANDT X CLNT C 3 Mandant
KNA1-KUNNR X CHAR C 10 Debitorennummer
KNA1-ADRNR CHAR C 10 Adresse
KNA1-ANRED CHAR C 15 Anrede
KNA1-AUFSD CHAR C 2 Zentrale Auftragssperre
KNA1-BAHNE CHAR C 25 Expressbahnhof
KNA1-BAHNS CHAR C 25 Bahnstation
...
...

Wenn Sie also zu dem Kunden 'XYZ' die Daten lesen möchten, dann sollte der Aufruf des Funktionsbausteins folgendermaßen aussehen:

data: l_kna1 like kna1.
call function 'READ_TABLE_BUFFERED'
exporting
i_table = 'KNA1'
i_key1 = 'KUNNR'
i_value1 = 'XYZ'
i_buffer_type = 'X'
importing
e_table_workarea = l_kna1
exceptions
no_entry_found = 1
no_table_name = 2
others = 3.
if sy-subrc = 0.
write / l_kna1-name1.
endif.

Der Mandt wurde als Schlüsselfeld nicht extra aufgeführt, da er bei einem SELECT-statement vom ABAP automatisch mitgegeben wird.

Das Ergebnis des Lesezugriffs wurde in eine Workarea gestellt, die genau die Struktur der zu lesenden Tabelle besitzt, denn sonst kann man später nicht auf die einzelnen Werte zugreifen.

Durch die Pufferung wird bei einem erneuten Lesezugriff mit dem gleichen Schlüssel nicht mehr die Datenbank gelesen, sondern nur der interne Puffer. Dies kann zu erheblichen Beschleunigungen führen.

Hinweise

ACHTUNG:

Wenn die mit dem Parameter i_table spezifizierte Tabelle nicht existiert, kommt es zu einem Laufzeitfehler ! Das gleiche gilt, wenn eines der spezifizieren Key-Felder i_key1, ... ,i_key4 nicht existiert.

Weiterführende Informationen

Eine Möglichkeit, derartige Lesezugriffe weiter zu vereinfachen, besteht darin, für die Tabellen Konstanten zu definieren.

Beispiel:
* Konstanten-Typ definieren
types: begin of tabletype,
tablename like dd02d-tabname,
separator1(1) type c,
key1 like dd03d-fieldname,
separator2(1) type c,
key2 like dd03d-fieldname,
separator3(1) type c,
key3 like dd03d-fieldname,
separator4(1) type c,
key4 like dd03d-fieldname,
separator5(1) type c,
buffer_type(1) type c,
end of tabletype.

* Konstante definieren
constants:
customer type tabletype value
'KNA1 |KUNNR | | | |4'.

********************************************************************
* Form-Routine, die die Konstante verarbeiten kann
********************************************************************
form read using value(i_table) type tabletype
value(i_val1) type any
value(i_val2) type any
value(i_val3) type any
value(i_val4) type any
c_workarea type any.

call function 'READ_TABLE_BUFFERED'
exporting
i_table = i_table-tablename
i_key1 = i_table-key1
i_key2 = i_table-key2
i_key3 = i_table-key3
i_key4 = i_table-key4
i_value1 = i_val1
i_value2 = i_val2
i_value3 = i_val3
i_value4 = i_val4
i_buffer_type = i_table-buffer_type
importing
e_table_workarea = c_workarea
exceptions
no_entry_found = 1
no_table_name = 2
others = 3.

if not ( sy-subrc is initial ).
clear c_workarea.
endif.

endform. " READ

Der Aufruf kann jetzt folgendermaßen aussehen:

data: l_kna1 like kna1.
perform read using customer 'XYZ' space space space l_kna1.
write / l_kna1-name1.

Vorteile:

  • Der Aufruf ist wesentlich kürzer, übersichtlicher und sprechender
  • Will man an mehreren Stellen Kundendaten lesen, so kann sich bei der Definition des Lesezugriffs nicht so leicht ein Fehler einschleichen, da ja eine Konstante benutzt wird und nicht jedesmal Tabellenname und Feldname angegben werden muß
  • Das gepufferte Lesen anderer Tabellen ist jetzt mit minimalem Aufwand realisierbar. Um z.B. auch Daten von Lieferanten gepuffert lesen zu können, ist nur die Definition einer einzigen Konstante notwendig:
    constants:
    vendor type tabletype value
    'LFA1 |LIFNR | | | |4'.
    Allgemeine Daten des Lieferanten 'ABC' können gelesen werden durch:

    data: l_lfa1 like lfa1.
    perform read using vendor 'ABC' space space space l_lfa1.
    write / l_lfa1-name1.

    Im INCLUDE RV56BUFF sind jede Menge derartige Konstanten definiert.




Parameter

E_TABLE_WORKAREA
I_BUFFER_TYPE
I_KEY1
I_KEY2
I_KEY3
I_KEY4
I_TABLE
I_VALUE1
I_VALUE2
I_VALUE3
I_VALUE4

Ausnahmen

NO_ENTRY_FOUND
NO_TABLE_NAME

Funktionsgruppe

V56A

CPI1466 during Backup   Addresses (Business Address Services)  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 8533 Date: 20240523 Time: 064254     sap01-206 ( 78 ms )