ABAPディクショナリ

 

ABAPディクショナリは、データベーステーブルの他にアプリケーションの中に取り扱うデータも含め、SapECCシステムで使用されているすべてのデータ定義を一元的に管理するリポジトリです。 SAP標準だけでなく、ユーザ定義のデータ型もABAPディクショナリに登録されます。 ABAPディクショナリで管理されるオブジェクトタイプは大きく分けると、データ型定義、データベースオブジェクト及びツール関連の三つに分類することができます、その中に最も重要なのはそれぞれ以下のものがあります。

  • データ型定義:オブジェクトのデータ定義はABAPディクショナリにのみ存在する
    • ドメイン
    • データエレメント
    • 構造
    • テーブルデータ
  • データベースオブジェクト:オブジェクトのデータ定義は基盤となるデータベースにも自動登録される
    • テーブル
    • ビュー
    • 索引
  • ツール関連: Dynpro 項目の編集に使用されるツールも提供
    • 検索ヘルプ
    • ロックオブジェクト

ABAPディクショナリオブジェクトは、ABAPプログラムから参照できます。実行時にABAPプログラムがロードされる際に、動的にABAPディクショナリオブジェクトの定義を展開されます。

以下にて各オブジェクトタイプをそれぞれ説明します。

ドメイン

ドメインは項目の技術属性を定義するものであり、項目のデータ型と長さを指定することで項目の値範囲を記述します。 例として、「性別」のドメインの定義を次に示します。

データエレメント

データエレメントは意味属性であり、同じ意味を持つデータ項目は同じデータエレメントに割り当てるべきです。

下記の例を利用して、データ項目、データエレメント、ドメインの関連関係を説明します。

Noテーブル項目データエレメントドメイン技術タイプ
1VBRK(請求書:ヘッダデータ)VBELN(請求伝票)VBELN_VF(請求伝票)VBELN(販売管理伝票番号)CHAR(10)
2VBRP(請求伝票: 明細データ)VBELN(請求伝票)
3AUBEL(販売伝票)VBELN_VA (販売伝票)
4VBAK(販売伝票:ヘッダデータ)VBELN(販売伝票)

上記のテーブルに示された四つのデータ項目とも10文字の伝票番号であるため、同じドメインのVBELNを割り当てられます。但し同じ伝票番号といっても、請求伝票の伝票番号と受注伝票の伝票番号と二種類があるため、データエレメントは二つに分かれることになります。同じデータエレメントのデータ項目であれば結合検索できます。

構造

構造は複数のコンポーネント(項目)で構成されます。構造を構成するコンポーネント(項目)は、基本データ型の他に別の構造やテーブルデータ型を参照することができます。

テーブルデータ

テーブルデータ型は、ABAPにおける内部テーブルをグローバルで定義します。

テーブル

テーブルタイプ

ABAPディクショナリのテーブルには、3種類のテーブルタイプが存在します。

  1. 透過テーブル
    例:「VBRK」KNA1(得意先マスタ)など、殆どのテーブルです。
    透過テーブルは名前の通り、ABAPディクショナリと同じ構造で、DBテーブルが登録されています。
  2. プールテーブル
    例:「Annn」条件マスタや「T001T」カスタマイズテーブルなどなど、テーブルプールに割り当てられたテーブルのことです。テーブルプールには、複数プールテーブルが格納され、DB上は、テーブルプールにデータが登録されています。
    複数のプールテーブルのデータが、どのようにテーブルプールに登録されているかというとプールテーブルの1行1行が、それぞれテーブルプールの1行となっていて、内部結合ではなく、単純に複数のテーブルがまとまっているだけです。

  3. クラスタテーブル
    クラスタテーブルとは、例:「BSEG」会計伝票明細のようにテーブルクラスタに割り当てられたテーブルのことです。テーブルクラスタには、複数クラスタテーブルが割り当てられ、DB上は、テーブルクラスタにデータが登録されています。

クラスタテーブルとプールテーブルは、透過テーブルと違って以下の特徴が存在します。

  • NativeSQLでは使用できません。
  • Select文で、外部結合・内部結合できません。
  • キー項目以外の項目は、ほとんどが文字列結合された状態で1項目に登録されています。
  • 上記理由により、キー以外の項目を抽出条件とするとパフォーマンス悪化の要因になります。

クラスタテーブルかプールテーブルかによって、プライマリキーがかさなっている複数テーブルが存在する場合、そのデータの登録方法は異なります。

  • クラスタテーブル 
    プライマリキーで内部結合された状態で複数テーブルがまとまって登録されています。
  • プールテーブル 
    プライマリキーで内部結合せず単純に複数テーブルがまとまって登録されています。

出荷クラス

テーブルには出荷クラス属性をもっております。出荷クラスは、インストールやアップグレード、クライアントコピー、およびカスタマシステム間移送の際に、テーブルデータの移送を制御します。出荷クラスは、拡張テーブル更新でも使用されます。

以下の出荷クラスがあります。

出荷クラス説明
Aアプリケーションテーブル (マスタ及びトランザクションデータ)
Cカスタマテーブル。データを更新するのはカスタマのみです。
L一時データ保管用テーブル
Gカスタマテーブル。SAP が新規データレコードを挿入する場合がありますが、既存データレコードは上書きまたは削除されません。カスタマ名称領域をテーブル TRESC で定義する必要があります
Eシステムテーブル。カスタマ入力のための独自の名称領域があります。カスタマ名称領域をテーブル TRESC で定義する必要があります
Sシステムテーブル。データ変更のステータスは、プログラム変更と同一です
Wシステムテーブル。データは独自の移送オブジェクト (たとえば、R3TR、PROG、R3TR TABL など) を使用して移送されます

技術設定

ABAPディクショナリに透過テーブルを定義する際、技術設定を更新する必要があります。

  • データクラス
    データクラスは、テーブルを格納するデータベースの物理領域 (ORACLE では表領域と呼ばれます) を論理的に定義したものです。データクラスを正しく選択すれば、テーブルを ABAPディクショナリで有効化したときに、そのテーブルがデータベースの正しい領域に自動的に登録されます。
    データクラスには、マスタデータ、トランザクションデータ、組織データ、およびシステムデータなどがあります。さらに、カスタマデータクラス (USER、USER1) と呼ばれるデータクラスもあります。これは、カスタマ開発に使用されます。データベースに特別な保管域を割り当てる必要があります。
    • マスタデータ 
      マスタデータは、ほとんど変更されることのないデータです。マスタデータの例としては、名称、住所、および電話番号など、住所のデータが挙げられます。
    • トランザクションデータ 
      トランザクションデータは、頻繁に変更されるデータです。たとえば、倉庫の在庫品目は購買発注が登録されるたびに変更されるデータです。
    • 組織データ
      組織データは、システムの導入時にカスタマイジングで定義され、その後はほとんど変更されることのないデータです。たとえば、国コードなどです。
    • システムデータ
      システムデータは、SapECCシステム自体が必要とするデータです。たとえば、プログラムソースなどです。
  • 􀂄バッファリング
    テーブルのレコードをバッファに入れるかを定義します。
  • サイズカテゴリ 
    テーブルの予想レコード数はいくつかを定義します。
  • ログ記録 
    データレコードへの変更ログを記録するかを定義します。

ビュー

ビューとは、1つ以上の実テーブル表から任意のデータを選択し、それらをカスタマイズして表した仮想テーブルのことです。

索引

索引は、いくつかの項目に縮小されたデータベースのコピーということができます。索引を使用すると、特定の検索条件を満たすデータレコードをテーブルから検索することができます。

検索ヘルプ

検索ヘルプは、入力ヘルプ (F4 ヘルプ) を定義するための ABAPディクショナリオブジェクトです。

ロックオブジェクト

DBトランザクションレベルの排他制御はデータベース管理システムが用意していますが、それとは別に、SapECCは、独自のロックオブジェクトに基づいてアプリケーションレベルの排他制御を実現しています。

ロックオブジェクトにはロックするテーブルとロックするレコードのキー項目情報が定義され、ロックオブジェクトを有効にすると、汎用モジュールENQUEUE_<ロックオブジェクト名>とDEQUEUE_<ロックオブジェクト名>がロックを設定 / 解除するためにその定義から生成されます。

ロック設定汎用モジュールから掛けられたロックの情報はロックテーブルに格納されます。ロックテーブルは、エンキューサーバのメインメモリに存在するテーブルであり、システム内の現在のロックを記録します。ロック設定汎用モジュールでロックを掛けようとする前に、まずロックテーブルを参照して同じロックが既に存在する場合、エラー終了したり、待ち状態にしたりすることによって、排他制御の仕組みを実現します。