リレーションのフィールドタイプが違う場合の動作

 リレーションシップで、テキストフィールド=数字フィールドのように、フィールドタイプが違うものをリレーションさせると、バグの元になる。ここでは、実際に起きた問題(の最小の再現)を例に解説する。

状況設定

 以下のようにリレーションシップが組まれている。「受注」テーブルから、「顧客別集計」のレコードを作成するように設定されている。ここで、「受注::顧客コード」はテキストフィールド、「顧客別集計::顧客コード」が数字フィールドになっている。

 「受注」テーブルには次のようなレコードがあるとする。顧客コード「0001」と「その他」が2件ずつ用意されている。「顧客コード」には4桁揃えの数字が入ることが想定されているが、数字を含まない「その他」という値が入力されている。本来このような運用は避けるべきだが、実際の運用ではこのようなことはよく起こる。

顧客コード 金額
0001 1000
0001 1000
その他 1000
その他 1000

 

レコード作成時の動作

 ここで、上記の対象レコードに対して、次のスクリプトを実行する。

レイアウト切り替え [「受注」(受注); アニメーション:なし]

レコード/検索条件/ページへ移動 [最初の]
Loop
フィールド設定 [受注_顧客別集計::金額; 受注_顧客別集計::金額 + 受注::金額]

レコード/検索条件/ページへ移動 [次の; 最後まできたら終了:オン]
End loop

 各顧客ごとに受注の金額を集計するスクリプトである。顧客コード「0001」「その他」でそれぞれ金額が2000の顧客別集計が作成されることが予想できる。しかし、実際に実行すると、「顧客別集計」のレコードは次のようになる。

顧客コード 金額
0001 2000
その他 1000
その他 1000

  顧客コード「0001」は想定通り集計されているが、「その他」は別々のレコードが作成されてしまっている。「その他」は数字タイプとしての値を持たないためか、うまく照合されなかった。「顧客別集計::顧客コード」をテキストフィールドに変更すると、以下のように正しく集計される。

顧客コード 金額
0001 2000
その他 2000

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

one × 5 =