!--a11y-->

論理データベースは 3 つのコンポーネントから構成されています (詳細は図を参照)。以下のコンポーネントがあります。
キ 構造
構造は、論理データベースのデータビューを定義します。構造は他のコンポーネントの構造を決定し、実行時における論理データベースの動作を決定します。データがユーザに利用可能になる順序は、関連する論理データベースの階層構造に依存します。
キ 選択
選択は、選択画面を定義します。選択画面は、論理データベースを使用する実行可能プログラムのユーザインタフェースになります。通常レイアウトは、構造によって決定されます。独自の必要条件に応じて選択基準を調整したり、新しい選択基準を追加したりすることができます。論理データベースを実行可能プログラムにリンクする際は、論理データベースの選択はプログラムの標準選択画面の一部になります (画面番号 1000)。汎用モジュール LDB_PROCESS を使用して論理データベースを呼び出すと、選択はインタフェースパラメータを使用して行われます。
キ データベースプログラム
データベースプログラムには、データを読み取って論理データベースのユーザに渡すのに使用する ABAP 命令が入っています。データベースプログラムの構造は、特別なサブルーチンを収集したものです。それは、構造と選択によって決定されます。独自の必要条件に応じてデータベースプログラムを調整したり、また拡張したりすることができます。
文書、言語固有のテキスト、ユーザ定義の選択画面などその他のコンポーネントにより、機能を拡張できます。
通常論理データベースの構造は、R/3 システム内の階層テーブルの間の外部キー関係に基づきます。論理データベースはツリー状の構造をしており、次のように定義できます。
キ 最高レベルに単一のノードがあります。これはルートノードと呼ばれています。
キ 各ノードには 1 個または複数の枝が可能です。
キ 各ノードは、他のノードから派生します。
ノードは、ABAP ディクショナリで定義された構造体であるか、データ型グループの中のデータ型である必要があります。通常、ノードはデータベーステーブルの構造です。論理データベースはその構体を読み取って、評価のためユーザに渡します。しかしまた、基礎となるデータベースのない ABAP ディクショナリ構造を使用でき、時には便利です。技術的な理由から、論理データベース構造において可能なノードの最大数は 300 です。
ノードにリンクされた論理データベースを持つ ABAP 実行可能プログラムには、構造の中の各ノードを GET する命令を加えることができます。プログラムを実行する場合、対応するイベントブロックは、論理データベースの階層構造で規定された順序で処理されます。プログラムに論理データベースの全ノードを GET する命令が含まれていなければ、ルートから GET 命令で指定されたノードまでのパスにあるすべてのノードが処理されます。
汎用モジュール LDB_PROCESS を使用して論理データベースを呼び出す場合、システムが読み取る深さは、インタフェースパラメータを使用して制御されます。

LFA1 はルートノードで、LFBK と LFB1 は LFA1 の枝、そして LFC1 は LFB1 の枝とします。

実行可能プログラムに全ノードの GET 命令が含まれていれば、GET イベントは LFA1、LFBK、LFB1、LFC1 の順序で実行されます。プログラムに LFB1 を取得する 1 つの GET 命令のみ含まれていれば、LFA1 と LFB1 のみ処理されます。
論理データベースの選択は、通常の選択画面の定義 命令、つまりPARAMETERS、SELECT-OPTIONS、および SELECTION-SCREEN を使用して定義されます。また論理データベースでは、入力および値のヘルプを定義するため、追加の VALUE-REQUEST と HELP-REQUEST を使用できます。選択インクルードと呼ばれる特別なインクルードプログラムの中で選択画面を定義します。
また論理データベースを使用してプログラムを書く場合、独自の選択を追加できます。その結果標準選択画面には、データベースに基づく選択と、ユーザが定義したプログラムに基づく選択が可能です。
実行可能プログラムの選択画面が生成されるとき、プログラムの中で NODES または TABLES 命令を使用してインタフェース作業領域を宣言した場合、データベースに基づく選択基準とパラメータは表示のみ可能です。

次のような行を含む選択インクルードがあるとします。
SELECT-OPTIONS SLIFNR FOR LFA1-LIFNR.
PARAMETERS PBUKRS LIKE LFB1-BUKRS FOR TABLE LFB1.
選択基準 SLIFNR はテーブル LFA1 にリンクされ、パラメータ PBUKRS はテーブル LFB1 にリンクされています。実行可能プログラム (report) 内の TABLES 命令が LFA1 を宣言しても LFB1 を宣言しない場合、SLIFNR は選択画面に表示されますが、PBUKRS は表示されません。
論理データベースの選択画面には、 動的選択ならびに静的選択を加えることができます。動的選択は特別でユーザ定義の選択であり、ユーザが作成できて、選択インクルードで定義された静的選択を使用して作成できます。パフォーマンスを改善するため、必要以上のデータを読み取って、アプリケーションプログラムでソートする代わりに、常にこのオプションを使用するとよいでしょう。
論理データベースのノード <node> で利用可能な動的選択を行うには、選択インクルードには次の命令が含まれている必要があります。
SELECTION-SCREEN DYNAMIC SELECTIONS FOR NODE|TABLE <node>.
ノード <node> が論理データベースのユーザにより要求された場合、動的選択が選択画面に含まれます。次にユーザは、対応する項目の特別な選択を入力する 動的選択を選択できます。汎用モジュール LDB_PROCESS を使用して論理データベースを呼び出すと、対応するパラメータを渡すことができます。論理データベースプログラムの中でデータを読み取るため、動的命令の選択を使用できます。また動的選択の利用可能なノードに定義されたプログラムに基づく選択基準 の値は、論理データベースに渡されます。またユーザは、動的選択の項目を論理データベースの選択ビューとして定義できます。
論理データベースの選択画面は、論理データベースが接続されている実行可能プログラムの標準選択画面 (番号 1000) の一部です。選択画面には標準化されたレイアウトがあり、選択基準およびパラメータは宣言された順序で別の行に表示されます。レイアウトは SELECTION-SCREEN 命令を使用して変更できます。
実行時環境は、別の選択画面を含む属性のないすべてのプログラムに番号 1000 の選択画面を生成します。選択インクルードで画面番号 1000 より小さい選択画面を定義することにより、論理データベースの選択画面の一部の入力項目を表示しないようにできます。そこで F4を押すと、関連する論理データベースで定義された選択画面の概要を取得できます。選択画面を定義するには、SELECTION-SCREEN BEGIN|END OF VERSION 命令を使用します。これらの命令の中で、選択画面で表示されない項目を指定するため、SELECTION-SCREEN EXCLUDE を使用できます。
実行可能プログラムの属性として選択画面の番号が含まれていれば、そのバージョン番号は標準選択画面で使用されます。選択画面から除外した入力項目は表示されませんが、対応する選択はなお存在するので、プログラムで編集したり、汎用モジュール LDB_PROCESS を呼び出したりして編集できます。
論理データベース <ldb> のデータベースプログラム名は、名前付け規則 SAPDB<ldb> に準拠します。これは、論理データベースが処理される際に ABAP 実行時環境が呼び出すサブルーチンのコンテナとして機能します。呼び出しの順序、および実行可能プログラム内のイベントまたは汎用モジュール LDB_PROCESS との対話は、論理データベース構造に依存します。
通常論理データベースプログラムに含まれているサブルーチンを次に示します。
キ FORM LDB_PROCESS_INIT
論理データベースが処理される前に 1 度だけ呼び出されます。汎用モジュール LDB_PROCESS により 2 回以上呼び出される準備を行います。
キ FORM INIT
選択画面が処理される前に 1 回だけ呼び出されます。
キ FORM PBO
いつでも選択画面が表示される前に呼び出されます。したがって、汎用モジュール LDB_PROCESS ではなく実行可能プログラムの付属した論理データベースを使用する場合だけ呼び出されます。
キ FORM PAI
ユーザが選択画面と対話する際に呼び出されます。したがって、汎用モジュール LDB_PROCESS ではなく、実行可能プログラムの付属した論理データベースを使用する場合だけ呼び出されます。インタフェースパラメータ FNAME と MARK は、サブルーチンに渡されます。
FNAME には、選択画面の選択基準またはパラメータの名称が含まれています。
MARK は、ユーザが実行した選択を説明します。MARK = SPACE は、ユーザが単一値を入力したか範囲選択を行ったという意味です。MARK = '*' は、ユーザが 複数選択画面でも入力したという意味です。
キ FORM LDB_PROCESS_CHECK_SELECTIONS
汎用モジュール LDB_PROCESS を使用して選択画面を表示しないで論理データベースが呼び出される場合、サブルーチン PAI に代わって呼び出されます。このサブルーチンは、汎用モジュールインタフェースに渡された選択をチェックできます。
キ FORM PUT_<node>
構造で定義された順序で呼び出されます。データをノード <node> から読み取って、ABAP 実行時環境で PUT <node> 命令を使用して対応する GET イベントを起動します。PUT 命令は、このサブルーチンの中心的な命令です。この命令は、論理データベースのサブルーチン内でのみ使用できます。論理データベースには、ノード <node> が含まれている必要があり、サブルーチン名は、PUT_<node> で始まる必要があります。PUT 命令は、論理データベース構造に従ってプログラムが流れるよう指令します。論理データベースを読み取る深さは、アプリケーションプログラムの GET 命令、または汎用モジュール LDB_PROCESS のインタフェースパラメータ CALLBACK により決定されます。
最初に、ルートノード用のサブルーチン PUT_<root> が実行されます。次に PUT 命令は、プログラムフローを以下のように指令します。
i) データベースプログラムにサブルーチンAUTHORITY_CHECK_<table> が入っていれば、PUT_<node> 命令の最初の仕事はそのサブルーチンを呼び出すことです。
ii) 次に、PUT 命令は実行時環境で GET イベントを開始します。論理データベースがリンクされている実行可能プログラムの中に対応する GET <node> 命令があれば、関連するイベントブロックが処理されます。それに応じて汎用モジュール LDB_PROCESS の CALLBACK パラメータに値が入力されれば、対応するコールバックルーチンが呼び出されます。
iii) 次に PUT 命令は、プログラムフローを以下のように指令します。
(a) 実行可能プログラムまたは汎用モジュールの GET が同一サブツリーの下位レベルノード (必ずしも真下でなくてよい) を要求した場合、直後のノードの次のサブルーチンに移行します。
(b) 前のノードが同一レベルのノードに分岐するか、実行可能プログラムまたは汎用モジュールの中に同一レベルのノードを GET する命令が存在する場合、同一レベルのノードのサブルーチンに移行します。
そのサブルーチンの PUT 命令は、ふたたびステップ (i) を開始します。GET を使用して処理されるサブツリーの最下位ノードのサブルーチンでは、プログラム制御はそれ以上分岐しません。代わって、現在のサブルーチンの処理が続行されます。サブルーチンPUT_<node> の実行が完了したら、プログラムフローはPUT_<node> に分岐する元の PUT 命令に戻ります。
iv) 制御が下位レベルのサブルーチン PUT_<node> から戻ると、PUT 命令は実行時環境でイベント GET <node> LATE を開始します。
キ FORM AUTHORITY_CHECK_<node>
PUT <table> 命令により自動的に呼び出されます。このサブルーチンでは、論理データベース構造から適切なノード <table> の権限チェックを指定できます。
キ FORM PUT_<ldb>_SP
検索ヘルプで選択されたキーを処理するため、ユーザが検索ヘルプを使用して選択を実行する際に呼び出されます。<ldba> は、論理データベースの名称です。このサブルーチンでは、関連するエントリをルートノード <root> から読み取るため、検索ヘルプテーブルのエントリを使用できます。プログラム内の処理は、次に PUT <root> を使用して開始できます。サブルーチン PUT_<root> は、自動的に呼び出されません。
キ FORM BEFORE_EVENT
イベントの前に呼び出されます。イベント名は、パラメータ EVENT に渡されます。現在 EVENT 項目は、このイベントの前にサブルーチンを呼び出すため、値 START-OF-SELECTION のみ格納できます。
キ FORM AFTER_EVENT
イベントの後に呼び出されます。イベント名は、パラメータ EVENT に渡されます。現在 EVENT 項目は、このイベントの後にサブルーチンを呼び出すため、値 END-OF-SELECTION のみ格納できます。
キ FORM <par>_VAL、<selop>_VAL、<selop>-LOW_VAL、<selop>-HIGH_VAL
ユーザがパラメータ <par> または選択基準 <selop> の可能な値のヘルプを呼び出す際に、呼び出されます。これらは、論理データベースの選択に属している必要があります。
キ FORM <par>_HLP、<selop>_HLP、<selop>-LOW_HLP、<selop>-HIGH_HLP
ユーザがパラメータ <par> または選択基準 <selop> の入力ヘルプを呼び出す際に、呼び出されます。これらは、論理データベースの選択に属している必要があります。

論理データベース構造において、LFB1 は LFA1 の枝であり、選択インクルードには次の選択基準が定義されているとします。
SELECT-OPTIONS: SLIFNR FOR LFA1-LIFNR,
SBUKRS
FOR LFB1-BUKRS.
データベースプログラムの読み取りセクション:
FORM
PUT_LFA1.
SELECT * FROM LFA1
WHERE LIFNR IN
SLIFNR.
PUT LFA1.
ENDSELECT.
ENDFORM.
FORM PUT_LFB1.
SELECT * FROM LFB1
WHERE LIFNR
= LFA1-LIFNR.
AND
BUKRS IN SBUKRS.
PUT LFB1.
ENDSELECT.
ENDFORM.
論理データベースにリンクされた実行可能プログラム (report) には、以下の行があります。
GET
LFA1.
WRITE LFA1-LIFNR.
GET
LFB1.
WRITE LFB1-BUKRS.
この例では実行時環境は、イベント START-OF-SELECTION の後にルーチン PUT_LFA1 を呼び出します。イベント GET LFA1 は、 PUT LFA1 命令により開始されます。プログラム内の対応するイベントブロックが完了すると、PUT LFA1 はサブルーチン PUT_LFB1 に分岐します。イベント GET LFB1 は、このサブルーチンからアプリケーションプログラムで開始されます。LFB1 が読み取る最後のノードの場合、処理は PUT_LFB1 内の SELECT ループから再開されます。そうでない場合、プログラムフローは、次ノードのサブルーチン PUT_<node> に移行します。最終ノードの SELECT ループの終わりで、処理は次レベルのノード SELECT ループを再開します。ネストされた SELECT ループを使用したプログラミングの例は、プログラムフローを明快にするためにのみ使用されています。実際の論理データベースでは、データベースのアクセス回数を最小化するため使用しない方がよいでしょう。
次のグラフでプログラムフローを示します。
この例では PUT 命令は、権限チェックサブルーチンに分岐しません。