最近のアクセス:
例: New コマンド

このコマンドにより、データベース内のテーブルにレコードを追加できます。ここでは、拡張テーブルの概念を使用しません。このコマンドは、単一の物理テーブルに (Blocking 節がある場合でも) 単一のレコードを追加することで動作します。
システム内で管理する製品に関する情報、および対応する価格表を格納するための Product トランザクションがあります。構造は次のとおりです:
イメージ:6738.jpg
この構造から、GeneXus は次の 2 つのテーブルを作成します: 構造内のレベルに対応する PRODUCT テーブルと PRODUCTPRICELIST テーブル。
上記のように、PRODUCTPRICELIST テーブルには、次の 3 つの項目属性があります: 主キー {ProductId, ProductPriceListDate} を持つ、ProductId、ProductPriceListDate、および ProductPriceListPrice。
次のようなプロシージャーを実装するとします: 製品のコードをパラメーターとして受け取り、プロシージャーが実行された日に対応する日付に対して、価格表に新しい価格 (これもパラメーターとして受け取る) を追加します。
プロシージャーの Rules セクションに次の内容が含まれるようにします:
Parm(&ProductId, &price);
その後、ソースに次のように入力します:
New
    ProductId = &ProductId
    ProductPriceListDate = &Today
    ProductPriceListPrice = &price
EndNew
new コマンド内には割り当てコマンドがあるため、レコードを挿入するテーブル内の各項目属性に値が割り当てられることに注意してください。
この場合、PRODUCTPRICELIST テーブルにレコードを挿入し、このテーブルからこのレコードの項目属性に取らせる値を割り当てによって指定します。

new コマンドテーブルの識別

ユーザーが特に指定しない場合に、レコードを挿入するテーブルが PRODUCTPRICELIST テーブルであるということを GeneXus が認識する方法について説明します。
new コマンドがある場合、GeneXus はレコードを挿入するテーブルを必ず確認する必要があります。このテーブルは、new コマンド内にある属性に基づきます。つまり、割り当ての左辺、および Defined by 節がある場合は、この節にある属性になります。このテーブルのことを、new コマンドのベーステーブルといいます。
この例では、割り当てコマンド内の左側の new コマンド内に項目属性が 3 つ表示されています。これらによりテーブルが識別されます。
GeneXus は、これらの項目属性すべてを含む物理テーブルを検索します。そのようなテーブルが存在しない場合、プロシージャーを指定するとその状況に関するエラーメッセージがナビゲーション一覧に表示され、オブジェクトが生成されません。
上の例では、ProductId、ProductPriceListDate、および ProductPriceListPrice のすべてを含むテーブルは、PRODUCTPRICELIST というテーブル 1 つだけです。

重複コントロール

上記のプロシージャーを同じ日に同じ製品について 2 回実行する場合について説明します。
同じ主キーの値を持つレコードを PRODUCTPRICELIST テーブルに 2 回追加しようとしたとします。
new コマンドは重複コントロールを実行するため、レコードは 1 つのみ挿入されます。つまり、新しいレコードを挿入する場合、挿入しようとしているレコードと同じ主キーの値を持つレコードがテーブル内に存在しないかどうか事前に確認が行われます。一意のインデックスで定義された Candidate Key (キー候補) があった場合は、値の一意性も確認されます。挿入しようとしているレコードと同じキー候補を持つレコードがテーブル内に既にある場合は、どちらも挿入されません。
New コマンドでは、オプションの「When Duplicate」節を指定できます。この節を使用して、主キーまたはキー候補においてレコードが重複していた場合に実行するアクションをプログラムします。  たとえば、価格一覧に今日の日付に対応する製品のレコードが既にあるが、既存の価格を 10% 上げたいとします。
これを実現するには、new コマンドに When Duplicate 節を追加します。
イメージ:6743.jpg
上の図では、レコードが重複する場合に、ProductPriceListPrice 項目属性の値が更新されます。つまり、主キーに &ProductId および &Today の値のあるレコードがテーブル内に既にあると、このレコードの価格が更新されて 10% 上がります。
項目属性を更新するには、直観的ではありませんが、For Each コマンド (X Evolution 2) 内に割り当てを配置します。
for each コマンドなしで上記のように入力する方が、より直観的です:
New
   ProductId = &ProductId
   ProductPriceListDate = &Today
   ProductPriceListPrice = &price
when duplicate
   ProductPriceListPrice *= 1.1
endnew 
挿入に失敗したため、When Duplicate 節の中でコマンドが実行される場合、コマンドは既にテーブル内のレコードに置かれています。したがって、レコードにアクセスするため for each コマンドを指定する必要はありません。 
ただし、上記の指定は間違いであり、このレコードの価格更新は実行されません。つまり、When Duplicate 節が含まれていない場合と同じになります。
for each コマンドはクエリまたは更新のためにデータベースにアクセスできる唯一のコマンドです。
When Duplicate 節を入力する場合は既に更新するレコードの位置にありますが、このときも for each コマンド内で割り当てを行う必要があります。
new コマンドに対して When Duplicate 節を指定していない場合、挿入されるレコードが重複していると、アクションが実行されないままで次のコマンドに進みます。つまり、既存のレコードがあるためにレコードは挿入されず、何も実行されないままプロセスが続行します。
 








サブページ
Created: 14/09/18 03:19 by Admin Last update: 21/05/20 06:20 by Admin
カテゴリ
Powered by GXwiki 3.0