変更データ・タグおよび modified プロパティー

テキスト書式の各フィールドには、変更データ・タグ があります。このタグは、前回書式を表示した際にユーザーが書式に変更を行ったかどうかを示す状況値です。 CICS® に関して変更データ・タグが持つ利点の 1 つは、ネットワーク・トラフィックが削減されることです。 これは、ユーザーからプログラムへのデータ転送に、変更されたフィールドのみが含まれるようになるためです。

後述するように、変更データ・タグとフィールドの modified プロパティーは別のものです。このプロパティーは、変更データ・タグの値を事前設定するために、プログラム内に設定されるものです。

ユーザーとの対話

ほとんどの場合、プログラムがユーザーに対して書式を表示する時点で変更データ・タグは NO に事前設定されています。 このとき、ユーザーが書式フィールド内のデータを変更すると、変更データ・タグが YES に設定されます。プログラムでは以下のロジックを使用できます。
  • データ・テーブルまたは関数を使用して、変更されたデータを検証する (フィールドの変更データ・タグが YES になると自動的に実行)。
  • 以下の構造を持つ if ステートメントにフィールドの名前を組み込むことによって、ユーザーがフィールドに変更を行ったかどうかを検出する。
      if (field is modified)
        ;
      end
    詳しくは、テキスト UI 書式の論理式を参照してください。

変更データ・タグは、フィールド内で文字を入力したり削除したりすることによって設定します。 書式を送信する前にフィールドの内容を表示されたときの値に戻した場合でも、変更データ・タグは設定されたままです。

検証には 2 つのフェーズが含まれます。フェーズ I には、InputRequired などのプロパティー、およびデータ・テーブルに関連した検証が含まれます。フェーズ II ではバリデーター関数を実行します。フェーズ I でのエラーにより書式が再表示された場合でも、プログラムが converse または show を実行した後で変更されたすべてのフィールドで、変更データ・タグは YES に設定されています。 ただし、フェーズ II でのエラーにより書式が再表示された場合は、バリデーター関数がタグをリセットした場合を除いてどのフィールドでも変更データ・タグはオンになっていません。

modified プロパティーの設定

ユーザーが特定のフィールドを変更したかどうかとは無関係に、プログラムにタスクを実行させることができます。例えば、以下のような場合です。
  • ユーザーがフィールドにデータを入力しなかった場合にもパスワード・フィールドの検証を実行することができます。
  • プログラムが常に特定の相互フィールド検証を実行するように、クリティカル・フィールド (保護フィールドの場合も含む) に対して検証関数を指定することができます。つまり、フィールドのグループを検証して、あるフィールドの値が他のフィールドの妥当性にどのように影響するかをプログラム・ロジックで確認できます。
このようなケースを処理するには、以下のようにしてプログラム・ロジックまたは書式宣言の特定のフィールドに modified プロパティーを設定します。
  • 書式の表示より前にあるロジックに、set field modified ステートメントを組み込みます。 結果として、書式が表示されたときに、フィールドの変更データ・タグは YES に事前設定されています。
  • 書式宣言で、フィールドの modified プロパティーを YES に設定します。 この場合は、以下の規則が適用されます。
    • 書式を最初に表示する際、フィールドの変更データ・タグは YES に事前設定されています。
    • 書式を表示する前に以下のいずれかの状態になっている場合、書式を表示する際の変更データ・タグは YES に事前設定されています。
      • コードにより実行された set field initial ステートメントで、フィールドの元の内容およびプロパティー値が再割り当てされている。
      • コードにより実行された set field initialAttributes ステートメントで、書式上の各フィールドの元のプロパティー値 (内容は対象外) が再割り当てされている。
      • コードにより実行された set form initial ステートメントで、書式上の各フィールドの元の内容およびプロパティー値が再割り当てされている。
      • コードにより実行された set form initialAttributes ステートメントで、書式上の各フィールドの元のプロパティー値 (内容は対象外) が再割り当てされている。
set ステートメントは、変更データ・タグの現行設定ではなく、modified プロパティーの値に影響します。 以下のタイプのテストは、前回プログラムに書式データが返されたときに有効であった変更データ・タグ値に基づいて行われます。
  if (field is modified)
    ;
  end
ロジックで最初に書式を表示する前に、フィールドの変更データ・タグをテストしようとすると、実行時にエラーが発生します。
ユーザー (プログラムではありません) がフィールドを変更したかどうかを検出する必要がある場合は、以下のようにしてフィールドの変更データ・タグの値を NO に事前設定するようにしてください。
  • 書式宣言でフィールドの modified プロパティーを NO に設定する場合、set field modified ステートメントは使用しないでください。 このステートメントがない場合、各書式を表示する前に、modified プロパティーが自動的に NO に設定されます。
  • 書式宣言でフィールドの modified プロパティーを YES に設定する場合は、書式の表示より前にあるロジックで set field normal ステートメントを使用してください。 このステートメントにより modified プロパティーが NO に設定され、(第 2 の結果として) 無保護の通常輝度のフィールドが表示されます。

書式が変更されているかどうかのテスト

いずれかの可変書式フィールドの変更データ・タグが YES に設定されている場合、その書式全体が変更されていると見なされます。 ユーザーに対してまだ表示されなかった書式の変更状況をテストした場合、そのテスト結果は FALSE です。

書式 form01 が以下のように設定されている場合を想定しています。
  • フィールド field01modified プロパティーが NO に設定されている。
  • フィールド field02modified プロパティーが YES に設定されている。

以下のロジックは、さまざまなテストの結果を示したものです。

  // tests false because a converse statement 
  // was not run for the form
  if (form01 is modified)
    ;
  end

  // causes a runtime error because a converse 
  // statement was not run for the form
  if (field01 is modified)
    ;
  end

  // assume that the user modifies both fields
  converse form01;

  // tests true
  if (field01 is modified)
    ;
  end

  // tests true
  if (field02 is modified)
    ;
  end

  // sets the modified property to no 
  // at the next converse statement for the form 
  set field01 initialAttributes;
  
  // sets the modified property to yes 
  // at the next converse statement for the form 
  set field02 initialAttributes;

  // tests true 
  // (the previous set statement takes effect only
  // at the next converse statement for the form
  if (field01 is modified)
    ;
  end

  // assume that the user does not modify either field
  converse form01;

  // tests false because the program set the modified 
  // data tag to no, and the user entered no data 
  if (field01 is modified)
    ;
  end

  // tests true because the program set the modified 
  // data tag to yes
  if (field02 is modified)
    ;
  end
  
  // assume that the user does not modify either field
  converse form01;

  // tests false
  if (field01 is modified)
    ;
  end

  // tests false because the presentation was not
  // the first, and the program did not reset the
  // field properties to their initial values
  if (field02 is modified)
    ;
  end


フィードバック