Datenbankprogramm bearbeiten 

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 SAPDB<ldb> wobei <ldb> der Name der logischen Datenbank ist.

Organisation de Datenbankprogramms

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 daß 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 SAPDB<ldb> bindet in der Regel die folgenden Include-Programme ein:

Enthält globale Deklarationen.

Bindet weitere Include-Programme für die einzelnen Unterprogramme ein.

Selbstdefinierte Include-Programme für zusätzliche Funktionalitäten.

Das Include-Programm DB<ldb>XXX bindet in der Regel die folgenden Include-Programme ein:

Enthalten die Unterprogramme PUT_<node> und AUTHORITY_CHECK_<node> für die einzelnen Knoten der logischen Datenbank.

Enthält die meisten übrigen Unterprogramme zur Behandlung von Initialisierung, PBO und PAI des Selektionsbilds etc.

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 DB<ldb>F<nnn> folgen, um mit der logischen Datenbank transportiert zu werden.

Vollständiges Beispiel für generiertes ABAP-Programm

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. Daß 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, daß 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> sollten 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 angepaßt, 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.

Generierte Datenobjekte und Unterprogramme

Einige interne Tabellen und weitere Unterprogramme werden automatisch generiert und können im Programm verwendet werden:

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:

 

Freie Abgrenzungen im Datenbankprogramm

Feldselektionen im Datenbankprogramm

Suchhilfen im Datenbankprogramm

Eigenständiger Aufruf und Datenbankprogramm