!--a11y-->

コンテキストの主な目的は、他のキーデータから導出される、頻繁に使用されるデータの繰り返し計算を防ぐことにあります。導出されたデータをコンテキストバッファに格納することでそれが可能となります。各モジュールのデータはバッファに別々に格納されます。
コンテキストバッファと、データベースインタフェースのデータベースバッファ、または
SAP テーブルバッファの主な相違は、(毎時)定期的にリフレッシュされるかどうかという点だけです。システムはコンテキストバッファの同期更新は行わず、同期に近い頻度でも更新されることはありません。そのため、バッファを各コンテクスト、またはコンテキスト内の各モジュールに使用することはできません。むしろ、バッファはあまり変化しないデータのみに対して使用する必要があります。 モジュールテーブルのバッファタイプ列で、使用するバッファのタイプを設定することができます。タイプはコンテキストバッファ自身( P )、一時バッファ( T )、またはバッファなし( N )に設定することができます。個別バッファリングタイプ
これはデフォルトのバッファ設定であり、この場合はクロストランザクションアプリケーションバッファが使用されます。このバッファについて詳しく調べるときは、
コンテキストバッファの内容を現在のアプリケーションサーバで照会するには、コンテキストビルダでジャンプ
→ バッファ照会を選択します。バッファは1時間ごとにリセットされます。編集 → バッファ削除を選ぶことで、コンテキストビルダでマニュアルでリセットすることもできます。これですべてのアプリケーションサーバのバッファがリセットされます。このバッファタイプを選択すると、導出データは1つのトランザクション内だけでバッファリングされます。1つのトランザクション内では、バッファは最大で 1024 のエントリを格納することができます。これらのエントリはまとめてクロストランザクションアプリケーションバッファにエクスポートされます。コンテキストの各種インスタンスの結果は、プログラム内の同じバッファに格納されます。
バッファなしを選ぶと、導出データはバッファリングされません。このバッファリングタイプをコンテキスト内の全モジュールに使用すると、コンテキストを使用してもシステムパフォーマンスは向上せず、単にプログラムロジックを再利用するだけになります。
カスタマイジング設定をテストするときに、常駐バッファリングが問題の原因となることがあります。したがって、コンテキストビルダでは、現在の端末セッション中にコンテキストバッファ(バッファリングタイプ P )を無効にすることができます。その場合は、 設定 → バッファリングと選択します。これでダイアログボックスが現れます。無効を選択し、続行を指します。ユーザ更新トランザクション( SU01 )を使用してユーザパラメータ BUF を Y または SPACE または N (デフォルト)に設定することで、特定のユーザに対してコンテキストバッファを有効化または無効化することができます。
バッファの構造
コンテキストバッファには、各モジュールに対して2つのバッファテーブルが含まれます。
1つのコンテキスト内の各種モジュールは導出スキーマによってリンクされます。モジュールの入力パラメータは、キー項目か、別のモジュールの出力パラメータです。別の、前からあるモジュールに従属するモジュールに対する
E バッファでのエントリは、前からあるモジュールに対する I バッファと同じです。従属モジュールに対する E バッファのバッファリングタイプは、それが従属するどれかのモジュールの最低バッファリングタイプと同じです。したがって、前のモジュールの1つのバッファリングタイプが N の場合、どのエントリも従属モジュールの E バッファに格納されません。テスト中または
DEMAND 命令を使ってコンテキストバッファにアクセスすると、最初に各モジュールの E バッファが検索され、そのあと I バッファが検索されます。 E バッファへのアクセスは、通常は高いアクセス頻度が必要な I バッファを使用する場合よりも直接的で高速です。2回以上照会されたエントリの
E バッファへの格納は、高速アクセスの代償としてのデータの冗長性を認めるものです。 I バッファは E バッファに対するフィルタであり、絶対に必要な場合にかぎって冗長データを許可します。 I バッファと E バッファを組合わせることで、高速なアクセス時間と、該当するエントリを見つける高い確率のバランスが保たれます。

ユーザ自身のコンテキストを登録するときは、このバッファリング概念の利点を念頭に置く必要があります。同じプログラムで複数のコンテキストを使用するのではなく、各プログラムのコンテキストごとにデータオブジェクト間の関係をできるだけ多く取り入れるようにしてください。コンテキストのグループを単一の、より大きなコンテキストのモジュールとしてまとめることもできます。コンテキストのなかでは、すべての中間結果が最適な形でバッファリングされます。異なるコンテキストを使用中の場合、個別バッファの間ではリンクは存在しません。
バッファの削除
コンテキストバッファの内容は次のように削除することができます。
これらの機能は、コンテキストのテストやバッファリングを行うときに使用することができます。
これらの汎用モジュールをデータベースの内容の変更の際に使用し、コンテキストバッファの内容が常に最新のものであるようにすることができます。

非同期更新で使用できる例を次に示します。
DATA CONTEXT_NAME LIKE RS33F-FRMID.
CONTEXT_NAME = 'DOCU_TEST1'.
...
CALL FUNCTION 'CONTEXT_BUFFER_DELETE' IN UPDATE TASK
EXPORTING
CONTEXT_ID = CONTEXT_NAME
EXCEPTIONS
OTHERS = 0.
....
COMMIT WORK.
この例では、
CONTEXT_BUFFER_DELETE が更新モジュールとしてコールされます。これはデータベース変更後の COMMIT WORK 命令の前の最後の更新コールとして使用することができます。非同期更新の詳細については、 データベース更新のプログラミングを参照してください。