DBテーブル
DBテーブルはデータベーステーブルのこと。
ABAPデータディクショナリで最も重要なオブジェクトの一つ。
データを保管しておく場所のようなイメージ。
以下のような種類が存在する。
・透過テーブル
透過テーブルはデータディクショナリで定義すると、データベースに同じ名前、項目を持つテーブルが1つ作成される。
基本的にデータを格納するテーブルはすべて透過テーブルとして作成する必要があるので注意しよう。
・プールテーブルとクラスターテーブル
データディクショナリで定義すると、データベースに同じ名前、項目を持つテーブルが複数作成される。
基本はSAPによって使用されるもの。
・グローバル一時テーブル
LUW(作業論理単位)で一時データを格納するために使用する透過テーブル。
最初は値が入っていなく、使い終わった後はDELETEで明示的にCLEARする必要がある。(しないとエラーになる)
DBテーブルは次のコンポーネントで構成される。
・テーブルフィールド
DBテーブルの構造を定義する。データ型を割り当てたりする。
・外部キー
DBテーブルとほかのDBテーブルの関係を定義するのに使用。
・インデックス
キー項目→プライマリインデックスを作成
追加でセカンダリインデックスを作成し、データの取得を高速化することも可能だ。
DBテーブルの作成方法
SE11で「DBテーブル」に作るDBテーブルの名前を入れて登録を押す。(名前はZまたはYで始まる必要があるので注意。)
「ディクショナリ:テーブルの変更」ビューが開くのでヘッダの部分でテーブルの説明やテーブルの種類などを決定
各種タブでテーブルの項目など詳細な設定を行う。
・属性タブ 「更新日付」や「パッケージ」、「マスタ言語」が表示される。
・出荷と更新タブ 「出荷クラス」と「データブラウザ/テーブルビュー編集」を編集できる。登録するとき最初に表示されるのはこのタブ。 出荷クラスはデータを格納するための透過テーブルであれば「A:アプリケーションテーブル」を選択する。
「データブラウザ/テーブルビュー編集」はこのテーブルにデータを手動で入れることができるか、更新すること自体ができないか、などを設定することが可能だ。
・項目タブ テーブルの中身を設定するタブ 項目のID、キーかどうか、項目のデータ型、内容説明のテキストなどを設定することができる。
①項目:項目の名前。文字,数字,アンダーバーが使用可能 先頭は文字で始まる必要があり、長さは16文字まで。
②KEY:チェックした場合、その項目はこのテーブルでのキー項目となる キー項目は先頭に連続して表示するようソートされる。
③初期値:NOT NULLのフラグを立てることが可能 基本的にはテーブルに後から項目を追加するときに使用する このフラグなしで項目を追加すると既に存在するデータすべてに対してその項目は「NULL」が割り当てられる。
④データエレメント:データエレメントを指定する 新しくデータエレメントを作る場合は名前を入力してダブルクリックすることで可能だ。
⑤データ型:データエレメントから自動で反映されるため入力不可
⑥長さ:データエレメントから自動で反映されるため入力不可
⑦小数点以下:データエレメントから自動で反映されるため入力不可
・入力ヘルプ/チェックタブ
関連するチェックテーブルや入力ヘルプおよび項目の検索ヘルプに関する情報が表示される
・通貨/数量項目タブ
項目で通貨型(CURR)や数量(QUAN)がある場合は参照項目にそれぞれ通貨の場合はCUKYの項目、数量の場合はUNITの項目を設定する必要がある。
ここまでの項目を更新したらテーブルの拡張カテゴリを変更する。これを変更しないと有効化するときに警告メッセージが出てくるので注意しよう。
拡張カテゴリはぞれぞれ以下の種類が存在する。
・拡張可能(DEEP) どのタイプの項目でも追加してテーブルを拡張することが可能
・拡張可能(文字タイプまたは数値)
文字または数値項目で拡張できるが、テーブル、オブジェクト参照、文字列などのDEEPデータ型を含めることができないようにする場合、このオプションを選択する。
・拡張可能(文字タイプ):文字タイプの項目(タイプC、N、D、T、およびX)でのみ拡張可能。
・拡張不可:テーブルをどの方法でも拡張できないようにする場合、このオプションを選択。
拡張カテゴリを設定したらテーブルの技術設定を更新する必要がある。
アプリケーションツールバーの技術設定ボタンを押すことで設定画面に移動することが可能だ。
・データクラス:データベースの物理領域を決定する。
データベースがHANAの場合は設定不要 Oracleなどの場合必要
・サイズカテゴリ:DBテーブルに割り当てる初期メモリ領域を設定する
・バッファリング:DBテーブルのデータをバッファリングするかどうか設定 頻繁に変更されないデータはバッファリングするのがおすすめだ。
バッファリングしてあるとバッファテーブルにコピーデータを持っておくのでアクセスにかかる時間、ネットワーク負荷などを軽減することが可能。
データが変更されるとバッファのデータとDBテーブルのデータを同期させるプログラムが実行されるため、頻繁に変更されるテーブルでバッファリングをONにしてしまうとパフォーマンスに影響が出てしまうので注意が必要だ。
バッファリングの設定は次の通り
許可しない→バッファリングができない設定
許可されているがオフに→最初はオフだけどあとからオンに切り替え可能
バッファリング有効→バッファリングが設定されている
・バッファリングタイプ:バッファリングが有効な場合はバッファリングタイプの設定が必要となる。
バッファリングタイプには以下のものが存在する。
単一レコードバッファ→プログラムでアクセスされる行だけがバッファリングされる
汎用領域バッファ→指定した行までをバッファ
完全バッファ→すべての行をバッファ
・ログデータの変更:テーブル内のデータへの変更に対してログを記録するか設定
・JAVAからのみアクセス:テーブル内のデータをJAVAからのみ更新・変更をできるようにするかどうか
☆GTT(グローバル一時テーブル)は技術設定が事前にされていてバッファリングを使用することはできない。
ここまで設定が完了したら保存・有効化することでテーブルの作成は完了だ。
インデックス
インデックスには「プライマリインデックス」と「セカンダリインデックス」の2種類がある。
・プライマリインデックス:テーブル作成時に自動で作成されるインデックス。テーブルのキー項目で作成される。
インデックスに含まれるコンポーネントはアクセスが高速になる。 例えば、SELECTするときにWHERE句でインデックスに含まれるコンポーネントを指定するとデータの取得が速くなる。また、取得したデータの順番はインデックスのポインタ順になる。
・セカンダリインデックス:自分で作成できるインデックス。WHERE句で完全な主キーを選択していない場合に必要となる。
プライマリインデックスが使用できない場合、テーブル全体をスキャンする必要がありパフォーマンスが悪化してしまう。これを避けるために主キー以外をWHERE句に使用する場合はセカンダリインデックスを使用すると良い。
テーブルのエントリ数が少なかったりしてパフォーマンスに問題がなければあえてセカンダリインデックスを使用せず全体をスキャンしても良いかもしれない。
INDEX名の確認や登録はSE11でDBテーブルの照会画面に入り、「INDEX」ボタンを押すことで行うことが可能だ。
INDEXを登録するときは以下の項目を設定する。
・INDEXの説明
・INDEXを一意とするかどうか
一意の場合はキー項目の値の組み合わせがDBテーブルに複数存在できない
・このINDEXを複数のDBに作成するか、特定のDBのみに作成するか
・INDEXで使用する項目
この中で「INDEXで使用する項目」は特に重要となってくる。
INDEXが使用される条件は
・INDEXで指定した項目の順番と同じ順番のWHERE句
・HINTを使用して指定したINDEX
INDEXを作りすぎるとSQLオプティマイザが正しいINDEXを選択できなくなったりするため、作成するINDEXは最低限の数にしよう。
ヒント
データベースカーネルはSQLオプティマイザというもので構成されていて、INDEXを使うべきか、全件スキャンするべきかを分析して最適な方法でデータを取得してくれる。
ただし、SQLオプティマイザが全件スキャンを選択した場合でも、実際はINDEXを使用した方がパフォーマンスが良い場合もある。そういった場合には「HINT」を使用し、使用するべきINDEXのヒントを教えてあげることが可能だ。
使用方法は次の通り。
SELECT コンポーネント名
FROM DBテーブル名
INTO TABLE 内部テーブル名
WHERE 条件
%_HINTS <DB名> ‘INDEX(“<DBテーブル名>” “INDEX名”)’.
テーブル更新ジェネレータ
ユーザーがテーブルにデータを入力しやすくするためのメンテナンスビューのこと。これを作っておくことでSM30でのテーブル更新が可能となる。TMGと略したりする。
作成方法は次の通り。
SE11で作成したいテーブルの照会画面を開く。
ユーティリティ>テーブル更新ジェネレータ を選択する
以下の項目をそれぞれ設定する。
・権限グループ テーブル更新ジェネレータを使用できるユーザーを制限できる。
・汎用グループ 汎用モジュールを入れる箱のようなもの。 テーブル更新ジェネレータはテーブルを更新するプログラム(モジュールプール)を自動生成するのでそのプログラムが入る先的なイメージ。 汎用グループは同一IDだとテーブルが変わっても同じものとして扱われるため、テーブル更新ジェネレータを生成するたびに新しい汎用グループを作成する方がおすすめ。
・パッケージ 割り当てられているパッケージが表示される。
・更新タイプ
1ステップ 単一の画面で表示と更新を行う。
2ステップ 表示用と交信用が別画面になる。
・更新画面番号 画面番号を入力することが可能 アプリケーションツールバーのボタンから使用可能な番号を検索することも可能だ。
・記録ルーチン
標準記録ルーチン 変更時に移送依頼を取得
なし/またはユーザ記録ルーチン 変更時に移送を聞かれない/独自のロジックを追加することが可能
各種項目を入力し、作成ボタンを押すことでテーブル更新ジェネレータの作成は完了だ。
◇イベント
テーブル更新ジェネレータの変更/照会画面から環境 > 変更> イベント と進むことでイベント発生時に追加するロジックを登録することができる。
表示されるポップアップを選択することでどのイベントで発生させるか決めることができる。
イベントを選択してエンターキーを押すとそのイベントに対するフォームルーチン名を決めることができる。
決定後、右隣のエディタアイコンをクリックし、汎用グループにインクルードプログラムを作成、その中に
FORM フォームルーチン名で入力した名前.
:
ENDFORM.
としてコーディングし、有効化することでテーブル更新ジェネレータ実行時のイベントで呼び出される追加ロジックを作成することができる。
特定の条件でエラーメッセージを出力したりアドオンテーブルを用意しておいて更新履歴、日付を管理するなどが可能だ。
外部キー
外部キーはテーブル同士の関係を定義する。
あるテーブルAの項目が別のテーブルBのキーとなっている場合、テーブルAを外部キーテーブル(従属テーブル)、テーブルBをチェックテーブル(被参照テーブル)と呼ぶ。
チェックテーブルを使うことで自動で入力される値のチェックを行うことが可能となり、整合性が保証される。
外部キーテーブルのキー項目に入れた値がチェックテーブルの対応する項目に存在する場合のみ、データの登録が可能となる。
この外部キーでの関係はABAPデータディクショナリのみに登録されるため、DB側には登録されない。また、このチェックはユーザが画面からデータを登録する場合にのみ行われる。そのため、アドオンプログラムでデータを登録するときはプログラム内でチェックを考慮する必要があるので注意が必要だ。
外部キーを登録するにはSE11で照会で入った後に鍵と左下向きの矢印が書いてあるボタンを押すことで可能だ。
インクルード構造
テーブルには既存の構造を含めることが可能だ。
条件は「フラット構造」「名前が16文字まで」
構造がテーブルに含まれるとその構造に含まれるコンポーネントはテーブルの一部とみなされるため、テーブルと構造で同一のコンポーネントを持つ必要はない。
登録する方法は次の通りだ。
SE11でテーブルを開き、追加したい部分を選択した状態で編集>インクルード>挿入を押す
表示されるポップアップで
構造→追加する構造名
グループ→インクルード構造のコンポーネントはここで指定する名前を使ってアドレス指定することが可能になる。
サフィックス→名前が被るのを避けるためにここで指定した文字がコンポーネント名に追加される。
をそれぞれ必要に応じて入力しチェックボタンを押す
有効化することで構造の追加が完了だ。
「展開ボタン」「折り畳みボタン」で構造の中身を確認することが可能だ。
追加構造
追加構造はSAP標準テーブルなどに項目を追加するときに使用される。
追加する項目はテーブルの下に追加されていく。
テーブルには複数の追加構造を登録することができるが、ほかのテーブルにはその追加構造は使いまわすことができない点に注意が必要だ。
名前は「YY」「ZZ」で始まる必要がある。(SAPのアップデートで上書きされないようにするため)
追加構造を使用できるのは「透過テーブル」「タイプLCHRまたはLRAW以外のタイプのテーブル」となる。
追加方法は次の通り。
SE11でテーブルを照会し、変更モードにする。
構造の追加ボタンを押す
追加構造の名前を決めてチェックボタンを押す
追加構造に入れたい項目を追加して保存・有効化することで追加構造の作成が完了だ。
ビュー
関連しているデータでも複数のテーブルにデータが分かれていることもSAPでは多い(BKPF:会計伝票のヘッダとBSEG:会計伝票の明細など) このデータを組み合わせる「ビュー」を登録することが可能だ。
ビューによってアクセスされるDBテーブルを基本テーブルと呼ぶ。ビューに複数の基本テーブルが含まれる場合、基本テーブル同士は結合される。
ビューの構造は結合された基本テーブルの項目から作成される。
ビュー自体はデータベースに物理的には作成されず、データも保持しない(都度基本テーブルのデータを読みに行くイメージ)ため、容量の圧迫の心配もない。
プログラム中で構造の型として呼び出すことも可能。
◇ビューの種類
・クラシックビュー→SE11で作成可能
データベースビュー
基本の形。複数の基本テーブルを結合したりすることが可能
作り方は次の通り。
SE11でビューを選択、名前を入力しCreateボタンを押す
データベースビューを選択
ビューの概要、結合するテーブル、結合条件を設定
設定が完了したら「ビューフィールド」タブに移動する。
ビューフィールドタブでこのビューで表示させたい項目を設定
有効化する。
投影ビュー
不要な項目を非表示にすることが可能。
必要な項目だけを表示することが可能になるので表示される一覧がシンプルになる。
テーブルを結合することはできない。
作成方法は次の通りだ。
SE11でビューを選択、名前を入力しCreateボタンを押す
投影ビューを選択
ビューの概要やビューで表示させたい項目を設定し、有効化する。
メンテナンスビュー
メンテナンス用。OpenSQLでの使用はできない。
作成方法は次の通りだ。
SE11でビューを選択、名前を入力しCreateボタンを押す
メンテナンスビューを選択
ビューの概要や対象のテーブルを設定する。
使用する項目を設定する。
ヘルプビュー
検索ヘルプに使用する。
作成方法は次の通りだ。
SE11でビューを選択、名前を入力しCreateボタンを押す
ヘルプビューを選択する。
ビューの概要や対象のテーブルを設定する。
使用する項目を設定する。
・その他→Eclipseで作成可能
ABAP CDSビュー
データモデルを作成するために使用できるインフラストラクチャを形成する。これもABAPからアクセス可能で集計などをDB側で行うことが可能となる。
基本的にどのビューもSE11から作成することが可能だ。
コメント