Um das Datenbankprogramm einer logischen Datenbank zu bearbeiten, d. h. anzuzeigen oder zu ändern, wählt man Datenbankprogramm auf dem Einstiegsbild des Logical Database Builders oder navigiert von anderen Komponenten in den ABAP Editor für das Datenbankprogramm. Der Name des Programms ist SAPDBldb wobei ldb der Name der logischen Datenbank ist.
Ruft man die Bearbeitung des Datenbankprogramm auf und es wurde vorher noch nie bearbeitet, wird es vom System generiert. Das generierte Datenbankprogramm ist ähnlich wie eine Funktionsgruppe aus mehreren generierten Include-Programmen aufgebaut, so dass insbesondere logische Datenbanken mit einer größeren Anzahl von Knoten übersichtlich strukturiert werden können. Ältere logische Datenbanken sind unter Umständen ohne Verwendung der Include-Technik nur aus einem Rahmenprogramm aufgebaut.
Das Rahmenprogramm SAPDBldb bindet in der Regel die folgenden Include-Programme ein:
· DBldbTOP
Enthält globale Deklarationen.
· DBldbXXX.
Bindet weitere Include-Programme für die einzelnen Unterprogramme ein.
· DBldbF001, DBldbF002 ...
Selbstdefinierte Include-Programme für zusätzliche Funktionalitäten.
Das Include-Programm DBldbXXX bindet in der Regel die folgenden Include-Programme ein:
· DBldb001, DBldb002, …
Enthalten die Unterprogramme PUT_node und AUTHORITY_CHECK_node für die einzelnen Knoten der logischen Datenbank.
· DBldbFXXX
Enthält die meisten übrigen Unterprogramme zur Behandlung von Initialisierung, PBO und PAI des Selektionsbilds etc.
· DBldbSXXX
Enthält das Unterprogramm FORM PUT_ldb_SP zur Behandlung der Suchhilfe.
Die vorgegebenen NODES- bzw. TABLES-Anweisungen und die vorgegebenen Namen der automatisch erzeugten Include-Programme und Unterprogramme dürfen nicht geändert werden. Es können jedoch weitere Include-Programme oder Unterprogramme definiert werden und die ABAP-Anweisungen zum Lesen von Daten geändert werden. Selbstdefinierte Include-Programme müssen der Namenskonvention DBldbFnnn folgen, um mit der logischen Datenbank transportiert zu werden.
Die logische Datenbank TEST_LDB habe folgende Struktur:
Alle Knoten sind Datenbanktabellen. Folgende Selektionen seien im Selektions-Include definiert:
SELECT-OPTIONS: SLIFNR FOR LFA1-LIFNR.
SELECT-OPTIONS: SBUKRS FOR LFB1-BUKRS.
SELECT-OPTIONS: SGJAHR FOR LFC1-GJAHR.
SELECT-OPTIONS: SBELNR FOR BKPF-BELNR.
Die wesentlichen Zeilen des automatisch erzeugten Datenbankprogramms und seiner Include-Programme sind im folgenden aufgeführt. Dass Programm enthält außerdem einige Benutzungs- und Performancehinweise als Kommentarzeilen, die hier nicht extra aufgeführt sind.
Rahmenprogramm SAPDBTEST_LDB
*----------------------------------------------------------*
* DATABASE PROGRAM OF LOGICAL DATABASE
TEST_LDB
*----------------------------------------------------------*
INCLUDE DBTEST_LDBTOP . "
header
INCLUDE DBTEST_LDBXXX . " all system
routines
* INCLUDE DBTEST_LDBF001 . " user defined
include
Include-Programm DBTEST_LDBTOP
PROGRAM SAPDBTEST_LDB DEFINING DATABASE TEST_LDB.
TABLES :
LFA1,
LFB1,
LFC!,
BKPF.
* data: ... "user defined variables
Include-Programm DBTEST_LDBXXX
*----------------------------------------------------------*
* Automatically generated
file
* contains all necessary system routines of the database program
* !!!!! DO NOT CHANGE MANUALLY
!!!!!
*----------------------------------------------------------*
INCLUDE DBTEST_LDBN001 . " Node
LFA1
INCLUDE DBTEST_LDBN002 . " Node
LFB1
INCLUDE DBTEST_LDBN003 . " Node
LFC1
INCLUDE DBTEST_LDBN004 . " Node
BKPF
INCLUDE DBTEST_LDBFXXX . " INIT, PBO,
PAI
INCLUDE DBTEST_LDBSXXX . " search
help
Include-Programm DBTEST_LDB001
*----------------------------------------------------------*
* Call event GET LFA1
*----------------------------------------------------------*
FORM PUT_LFA1.
* SELECT * FROM LFA1
* INTO LFA1
* INTO TABLE ? (choose one!)
* WHERE LIFNR = ?.
PUT LFA1.
* ENDSELECT.
ENDFORM. "PUT_LFA1
*----------------------------------------------------------*
* Authority Check for node LFA1
*----------------------------------------------------------*
* FORM AUTHORITY_CHECK_LFA1.
* AUTHORITY-CHECK ...
*
ENDFORM.
"AUTHORITY_CHECK_LFA1
Include-Programme DBTEST_LDB002 und DBTEST_LDB003
Entsprechend DBTEST_LDB001 für die Knoten LFB1 und LFC1.
Include-Programm DBTEST_LDB004
*----------------------------------------------------------*
* Call event GET BKPF
*----------------------------------------------------------*
FORM PUT_BKPF.
* STATICS FLAG.
* IF FLAG = SPACE.
* FLAG = 'X'.
*** Declarations for field selection for node BKPF ***
* STATICS BKPF_FIELDS TYPE RSFS_TAB_FIELDS.
* MOVE 'BKPF' TO BKPF_FIELDS-TABLENAME.
* READ TABLE SELECT_FIELDS WITH KEY BKPF_FIELDS-TABLENAME
* INTO BKPF_FIELDS.
* ENDIF.
* SELECT (BKPF_FIELDS-FIELDS) INTO CORRESPONDING FIELDS OF
* BKPF / TABLE ? " (choose one of them)
* FROM BKPF
* WHERE BUKRS = LFB1-BUKRS
* AND BELNR IN SBELNR
* AND GJAHR = ?.
PUT BKPF.
ENDFORM. "PUT_BKPF
*----------------------------------------------------------*
* Authority Check for node BKPF
*----------------------------------------------------------*
* FORM AUTHORITYCHECK_BKPF.
* AUTHORITY-CHECK ...
*
ENDFORM.
"AUTHORITY_CHECK_BKPF
Include-Programm DBTEST_LDBFXXX
*----------------------------------------------------------*
* BEFORE_EVENT will be called before event EVENT
* Possible values for EVENT: 'START-OF-SELECTION'
*----------------------------------------------------------*
* FORM BEFORE_EVENT USING EVENT.
* CASE EVENT.
* WHEN 'START-OF-SELECTION'
*
* ENDCASE.
*
ENDFORM.
"BEFORE_EVENT
*----------------------------------------------------------*
* AFTER_EVENT will be called after event EVENT
* Possible values for EVENT: 'END-OF-SELECTION'
*----------------------------------------------------------*
* FORM AFTER_EVENT USING EVENT.
* CASE EVENT.
* WHEN 'END-OF-SELECTION'
*
* ENDCASE.
*
ENDFORM.
"AFTER_EVENT
*-----------------------------------------------------------*
* Initialize global data for multiple processing
of
* one logical database.
* Set returncode:
* 0 -> all data are initialized,
multiple processing o.k.
* other -> no multiple processing
allowed
*------------------------------------------------------------*
FORM LDB_PROCESS_INIT CHANGING SUBRC LIKE
SY-SUBRC.
ENDFORM. "LDB_PROCESS_INIT
*------------------------------------------------------------*
* LDB_PROCESS_CHECK_SELECTIONS is
called
* after select-options and parameters are
filled
*------------------------------------------------------------*
FORM LDB_PROCESS_CHECK_SELECTIONS CHANGING SUBRC LIKE
SY-SUBRC
MSG
LIKE SYMSG.
ENDFORM. "LDB_PROCESS_CHECK_SELECTIONS
*----------------------------------------------------------*
* Initialize selection screen (processed before PBO)
*----------------------------------------------------------*
FORM INIT.
ENDFORM.
"INIT.
*----------------------------------------------------------*
* PBO of selection screen (processed always after ENTER)
*----------------------------------------------------------*
FORM PBO.
ENDFORM.
"PBO.
*----------------------------------------------------------*
* PAI of selection screen (processed always after ENTER)
*----------------------------------------------------------*
FORM PAI USING FNAME MARK.
* CASE FNAME.
* WHEN 'SLIFNR '.
* WHEN 'SBUKRS '.
* WHEN 'SBELNR '.
* WHEN 'SGJAHR '.
* WHEN '*'.
* ENDCASE.
ENDFORM.
"PAI
Include-Programm DBTEST_LDBSXXX
*************************************************************
* !!! PLEASE DO NOT CHANGE MANUALLY (BEGIN OF BLOCK) !!!!!! *
*-----------------------------------------------------------*
* Data structures for search pattern
selection
*
* !!! PLEASE DO NOT CHANGE MANUALLY (END OF BLOCK) !!!!!!!! *
*************************************************************
*-----------------------------------------------------------*
*
PUT_TEST_LDB_SP.
* Processed when search pattern selection is
used,
* i.e. user input into PARAMETERS p_sp AS SEARCH PATTERN
* STRUCTURE.
*-----------------------------------------------------------*
* FORM
PUT_TEST_LDB_SP.
*
ENDFORM.
"PUT_EXAMPLE_SP
Die Bedeutung der meisten Unterprogramme wird unter Aufbau logischer Datenbanken beschrieben.
Die Kommentarsterne '*' vor solchen ABAP-Anweisungen, die zusätzlich zu den obligatorischen Anweisungen verwendet werden sollen, können gelöscht und die Fragezeichen (?) durch passende Ausdrücke ersetzt werden. Bei der Syntax-Überprügung des Programms werden alle der Namenskonvention entsprechenden Include-Programme und auch das Selektions-Include überprüft.
In den Unterprogrammen PUT_node werden bei Datenbankzugriffen SELECT-Anweisungen mit Bedingungen für die Primärschlüsselfelder in den WHERE-Klauseln generiert. Es ist zu beachten, dass diese Anweisungen noch nicht den Performance-Hinweisen für Open SQL-Anweisungen genügen. Insbesondere stellen die Unterprogramme PUT_node eines Teilbaums der Struktur geschachtelte SELECT-Schleifen dar, die vermieden werden sollten. Statt dessen können die gelesenen Daten z.B. in internen Tabellen zwischengespeichert werden und von dort durch die PUT-Anweisung an das Anwendungsprogramm übergeben werden. Die Anweisung PUT node sollte aus technischen Gründen aber immer in einem Unterprogramm stehen, deren Name mit PUT_node beginnt.
Wenn in den Selektionen freie Abgrenzungen oder Feldselektionen für einen Knoten vorgesehen sind, werden in das Unterprogramm PUT_node entsprechende Anweisungen generiert und die automatisch erzeugten SELECT-Anweisung angepasst, wie im Beispiel für den Knoten BKPF zu sehen ist. Wie die Benutzereingaben in den freien Abgrenzungen und die Spaltenangaben hinter GET-Anweisungen im Datenbankprogramm bearbeitet werden können, zeigen nachfolgende Abschnitte.
Einige interne Tabellen und weitere Unterprogramme werden automatisch generiert und können im Programm verwendet werden:
· Die interne Tabelle GET_EVENT enthält die Knoten der logischen Datenbank, die vom Verwender GET-Anweisungen angefordert werden. Die Tabelle wird wie folgt generiert:
DATA: BEGIN OF
GET_EVENTS OCCURS 10,
NODE(10),
KIND,
END OF GET_EVENTS.
Sie enthält pro Zeile den Namen eines Knotens der logischen Datenbank im Feld NODE. Das Feld KIND gibt an, ob und wie der Knoten vom Verwender angefordert wird:
§ KIND = 'X': Knoten wird über GET und GET LATE angesprochen.
§ KIND = 'G': Knoten wird nur über GET angesprochen.
§ KIND = 'L': Knoten wird nur über GET LATE angesprochen.
§ KIND = 'P': Knoten wird weder über GET noch über GET LATE angesprochen. Es wird jedoch ein untergeordneter Knoten Tabelle über GET oder GET LATE angesprochen.
§ KIND = ' ': Knoten wird weder über GET noch über GET LATE angesprochen. Es wird auch kein untergeordneter Knoten angesprochen.
· Die Unterprogramme BEFORE_EVENT, AFTER_EVENT und PUT_ldb_SP werden im Datenbankprogramm als Kommentar erzeugt (siehe obiges Beispiel) und können modifiziert und durch Löschen der Sterne (*) aktiviert werden. BEFORE_EVENT wird aufgerufen, bevor das im Parameter EVENT angegebene Ereignis verarbeitet wird. AFTER_EVENT wird aufgerufen, nachdem das im Parameter EVENT angegebene Ereignis verarbeitet wurde. PUT_ldb_SP wird bei einer Selektion über Suchhilfe zur Bearbeitung der Rückgabewerte statt PUT_root aufgerufen, wobei root der Wurzelknoten ist.
Freie Abgrenzungen im Datenbankprogramm
Feldselektionen im Datenbankprogramm