!--a11y-->

論理データベースのデータベースプログラムを表示または変更するには、論理データベースビルダの第一画面で データベースプログラムを選択するか、または別のコンポーネントからデータベースプログラムにナビゲートします。プログラム名は SAPDB<ldb> となり、<ldb> は論理データベース名を表します。
初めて編集するデータベースプログラムを開くと、このデータベースプログラムがシステムによって生成されます。生成されたデータベースプログラムは、生成された一連のインクルードプログラムによって構成されるために、汎用グループのように見えます。このため、論理データベースに大量のノードが含まれる場合でも、分かりやすい構造となります。以前の論理データベースにはインクルードが使用されておらず、代わりに 1 つのメインプログラムだけで構成されていました。
メインプログラム SAPDB<ldb>
には、通常、以下のインクルードプログラムが含まれます。
キ DB<ldb>TOP
グローバル宣言を保持します。
キ DB<ldb>XXX.
個々のサブルーチンのためのインクルードプログラムを保持します。
キ DB<ldb>F<001>、DB<ldb>F<002> ...
その他の機能のためのユーザ定義インクルードプログラムです。
インクルードプログラム DB<ldb>XXX には、通常、以下のインクルードプログラムが含まれます。
キ DB<ldb>001、DB<ldb>002、…
論理データベースの各ノードに対する PUT_<node> および AUTHORITY_CHECK_<node> サブルーチンを保持します。
キ DB<ldb>FXXX
選択画面の初期化、PBO、PAI など、その他のほぼすべてのサブルーチンを保持します。
キ DB<ldb>SXXX
検索ヘルプを処理するための FORM PUT_<ldb>_SP サブルーチンを保持します。
NODES およびTABLES 文、または自動生成されたインクルードプログラムおよびサブルーチンの規定の名前は 変更しないでください。ただし、追加のインクルードおよびサブルーチンを定義したり、データの読込に使用する ABAP 文を変更したりすることは可能です。ユーザ定義インクルードプログラムは、論理データベースに正しく転送されるように、命名規則DB<ldb>F<nnn> に従う必要があります。

論理データベース TEST_LDB が、以下の構造を持つとします。

すべてのノードは、データベーステーブルです。選択インクルードには、以下の選択内容が定義されているとします。
SELECT-OPTIONS: SLIFNR FOR LFA1-LIFNR.
SELECT-OPTIONS: SBUKRS FOR LFB1-BUKRS.
SELECT-OPTIONS: SGJAHR FOR LFC1-GJAHR.
SELECT-OPTIONS: SBELNR FOR BKPF-BELNR.
以下に、自動生成されたデータベースプログラムとそのインクルードプログラムにおける重要な行を示します。プログラムには、ユーザやパフォーマンスに対するヒントもコメント行として含まれますが、この例では表示していません。
メインプログラム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
インクルードプログラムDBTEST_LDBTOP
PROGRAM SAPDBTEST_LDB DEFINING DATABASE TEST_LDB.
TABLES
:
LFA1,
LFB1,
LFC!,
BKPF.
* data: ... "user defined variables
インクルードプログラム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
インクルードプログラム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
インクルードプログラムDBTEST_LDB002 およびDBTEST_LDB003
DBTEST_LDB001 に似ていますが、LFB1 および LFC1 ノードが対象となります。
インクルードプログラム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
インクルードプログラム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
インクルードプログラム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
ほとんどのサブルーチンの機能については、論理データベースの構造セクションで説明しています。
ABAP 文の先頭のコメント記号(*) はオプションであり、削除することができます。また、疑問符は、適切な式に置き換えるためのものです。プログラムの構文をチェックすると、命名規則に従うすべてのインクルードプログラム、および選択インクルードもチェックされます。
PUT_<node> サブルーチンでは、ノードの一次キー項目に対する条件が WHERE 句に設定された SELECT 文が生成されます。これらの文は、Open SQL 文のパフォーマンスルールには準拠していないことに注意してください。特に、サブツリーの PUT_<node> サブルーチンでは、ネストされた SELECTED ループ構造が生成されてしまうので、この使用は避けてください。代わりに、データをいったん内部テーブルにバッファしてから、PUT 文を使用してこのデータを適切なアプリケーションプログラムに渡すことができます。ただし技術的な理由により、PUT <node> 文は、PUT_<node> で始まる名前を持つサブルーチン内で常に発生させる必要があります。
選択に、ノードに対する動的選択または項目選択が含まれる場合は、対応する文が PUT_NODE サブルーチン内で生成され、自動生成された SELECT 文が調整されます (BKPF ノードの例を参照)。次のセクションでは、動的選択でのユーザ入力を処理し、GET 文の後で列の指定を行う方法について説明します。
一部の内部テーブルとその他のサブルーチンは自動生成され、プログラム内で使用できるようになります。
キ GET_EVENT 内部テーブルには、GET 文でユーザから要求された論理データベースのノードが保持されます。このテーブルは、次のように生成されます。
DATA:
BEGIN OF GET_EVENTS OCCURS 10,
NODE(10),
KIND,
END OF GET_EVENTS.
各行は、NODE 項目内の、論理データベースのノード名を保持します。KIND 項目は、ノードがユーザに要求されたかどうか、またその要求方法を示します。
キ KIND = 'X': ノードが GET およびGET LATE 文内で指定されたことを示します。
キ KIND = 'G': ノードが GET のみで指定されたことを示します。
キ KIND = 'L': ノードが GET LATE のみで指定されたことを示します。
キ KIND = 'P': ノードが GET、GET LATE のどちらにも指定されなかったことを示します。ただし、下位ノードが GET または GET LATE 内で指定されています。
キ KIND = ' ': ノードが GET、GET LATE のどちらにも指定されなかったことを示します。下位ノードも指定されていません。
キ BEFORE_EVENT、AFTER_EVENT、および PUT_<ldb>_SP サブルーチンは、データベースプログラム内でコメントとして生成されます (上記の例を参照)。このコメントは修正でき、また、コメント記号 (*) を削除して有効化することもできます。BEFORE_EVENT は、EVENT パラメータに指定されたイベントが処理される前に呼び出されます。AFTER_EVENT は、EVENT パラメータに指定されたイベントが処理された後に呼び出されます。PUT_<ldb>_SP は、検索ヘルプが選択に使用される場合に、PUT_<root> の代わりに値を処理するために呼び出されます。<root> は、論理データベースのルートノードを示します。