計算レコードセット

CalculatedRecordSetは、LocalRecordGridにセル間で計算する機能を付加します。セルの値が変更されると、値を参照しているセルの値も自動的に再計算されます。

サンプル

calcrec.jpg

http://developers.curlap.com/curl/curl-ext/hp2/calculatedemo.curl

各行の値の合計値を右端の列に表示しています。

使い方

RecordSetを作成する代わりにCalculatedRecordSetのインスタンスを作成します。そのコンストラクタにはCalculatedFieldManagerクラスのインスタンスを渡します。以下の部分です。

def rs1 = {CalculatedRecordSet manager, rf1,
    {RecordData index = 0, a = 3, b = 2, c = 25},
    {RecordData index = 1, a = 4, b = 3, c = 22},
    {RecordData index = 2, a = 5, b = 4, c = 21}
  }

CalculatedRecordSetのコンストラクタは以下のようになっています。

{default
  ||このレコードセットが操作するCalculatedFieldManagerです。
  manager:CalculatedFieldManager,     
  ||データアイテムの特徴を定義するフィールド記述子。ここではrf1を渡しています。
  fields:RecordFields,                  
  ||内容の変更が許可されているかどうかを示します。
  modifiable?:bool = true,
  …:Object
}

計算ロジックを定義します。CalculatedRecordSetから取り出したレコードをCalculatedRecordにキャストして、set-calculated-fieldメソッドに引数として渡します。

{for record in rs1 do
  def rec = record asa CalculatedRecord
  {rs1.set-calculated-field
      rec,
      rf1[“row-sum”],
      update-proc = sum-proc,
  {rs1.get-or-create-calculated-field rec, rf1[“a”]},
  {rs1.get-or-create-calculated-field rec, rf1[“b”]},
  {rs1.get-or-create-calculated-field rec, rf1[“c”]}}
}

set-calculated-fieldメソッドの引数は以下のようになっています。

{set-calculated-field 
  ||計算処理をセットするレコードです。
  record:CalculatedRecord,                       
  ||計算処理をセットするフィールドです。
  record-field:RecordField,              
  ||計算処理を定義するプロシージャ。CalculatedFieldUpdateProcTypeは
  ||{proc-type {CalculatedField}:void}と定義されていて、
  ||これが呼び出される際にここに渡される引数は、第二引数で指定したフィールドです。
 
  update-proc:#CalculatedFieldUpdateProcType = null,     
  ||レコードやフィールドが削除されるとき、自動的に削除されてもよいかどうかを設定します。
  weak-predecessors?:bool = false,        
  ||変更を検知するCalculatedFieldを指定します。
  …:CalculatedField                       
}

ここでは…引数をget-or-create-calculated-fieldの戻り値として渡しています。get-or-create-calculated-fieldは、引数で与えられるレコードとフィールドに関連付けたCalculatedRecordFieldを、必要であれば作成して返すメソッドです。
get-or-create-calculated-fieldメソッドの引数は以下のようなものです。

{get-or-create-calculated-field
  record:CalculatedRecord,      || 関係するレコード
  record-field:RecordField       || 関係するフィールド
}