Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/update_c.htm]
現在地:

...

7.125.2 UPDATE についてのコメント/警告

UPDATE コマンドを理解する

...

UPDATEコマンドによる自動「相互更新」検査の使用方法について明確に理解しておいてください。

以下のようなコマンド・フローについて考えます。 FETCH   WITH

     FETCH   WITH_KEY(

...

 ) or WITH_RRN(

...

 )
DISPLAY
IF_MODE *CHANGE
UPDATE
ENDIF

このUPDATEコマンドにはWITH_KEYまたはWITH_RRNパラメータが指定されていないため、RRNパラメータが指定されていないため、(FETCHコマンドによって)最後に読み取られたレコードが更新されます。 最後に読み取られたレコードが更新されます。 

この状況では、レコードが取得(FETCH)されてから更新(UPDATE)されるまでの間が「相互更新時間枠」になります。DISPLAYコマンドがユーザーのワークステーションで実行されたときにユーザーが席を離れてコーヒーを飲みに行っていれば、この時間は非常に長くなる可能性があります。
これは、自動「相互更新」検査機能の正しく有効な使用方法です。FETCHからUPDATEまでの間にレコードが別のジョブされるまでの間が「相互更新時間枠」になります。DISPLAYコマンドがユーザーのワークステーションで実行されたときにユーザーが席を離れてコーヒーを飲みに行っていれば、この時間は非常に長くなる可能性があります。 

これは、自動「相互更新」検査機能の正しく有効な使用方法です。FETCHからUPDATEまでの間にレコードが別のジョブ/ユーザーによって変更された場合、UPDATEによって「相互更新エラー」(他の妥当性検査エラーと同様に処理される)が生成されます。 が生成されます。  ここで、以下のようなコマンド・フローについて考えます。
FETCH   WITH

ここで、以下のようなコマンド・フローについて考えます。 

     FETCH   WITH_KEY(

...

 ) or WITH_RRN(

...

 )
DISPLAY
IF_MODE *CHANGE
UPDATE  WITH_KEY( ) or WITH_RRN( )
ENDIF

このUPDATEコマンドにはWITH_KEYまたはWITH_RRNパラメータが指定されているため、特定のレコードRRNパラメータが指定されているため、特定のレコード(またはレコードのグループ)が読み取られ、更新されます。 読み取られ、更新されます。 

これは、陥りやすいコーディングの間違いです。UPDATEコマンドのWITH_KEYまたはWITH_RRNの値は、FETCHコマンドのものと同じになります。ただし、RDMLコンパイラには、その値が変更されたかどうかがわらないため、UPDATEの実行前にレコードを(再)読み取りせざるを得ません。 読み取りせざるを得ません。 

この状況では、UPDATEコマンドによってレコードが(再)読み取りされてからUPDATEコマンドによって更新されるまでの間が「相互更新時間枠」です。この間隔は非常に短いため、実質的には「相互更新」検査に意味がなくなります。
このように、実質的に自動「相互更新」検査に意味がなくなることから、上記のような対話型プログラムでは、これはUPDATEコマンドの有効で正しい使用方法とは言えません。 読み取りされてからUPDATEコマンドによって更新されるまでの間が「相互更新時間枠」です。この間隔は非常に短いため、実質的には「相互更新」検査に意味がなくなります。 

このように、実質的に自動「相互更新」検査に意味がなくなることから、上記のような対話型プログラムでは、これはUPDATEコマンドの有効で正しい使用方法とは言えません。 

キーなし

WITH_KEYまたはWITH_RRNパラメータを指定せずにUPDATE操作を実行すると、ファイルから最後に読み取られたレコードが更新されます。これは、以下のように指定した場合と同じです。CHANGE FIELD

     CHANGE FIELD(#DATDUE)

...

 TO(*DATE)

...


UPDATE FIELDS(#DATDUE)

...

 IN_FILE(ORDHDR)

...

 WITH_KEY(#ORDNUM)

...

...

これは機能的に以下と同等です。 

     FETCH  FIELDS(#DATEDUE)

...

 FROM_FILE(ORDHDR)

...

 WITH_KEY(#ORDNUM)

...


CHANGE FIELD(#DATDUE)

...

 TO(*DATE)

...


UPDATE FIELDS(#DATDUE)

...

 IN_FILE(ORDHDR)

...

...

また、以下とも同等です。 

     CHANGE FIELD(#QUANTITY)

...

 TO(100)

...


UPDATE FIELDS(#QUANTITY)

...

 IN_FILE(ORDLIN)

...

 WITH_KEY(#ORDNUM)

...

...

これは機能的に以下と同等です。 

     SELECT FIELDS(#QUANTITY)

...

 FROM_FILE(ORDLIN)

...

 WITH_KEY(#ORDNUM)

...


CHANGE FIELD(#QUANTITY)

...

 TO(100)

...


UPDATE FIELDS(#QUANTITY)

...

 IN_FILE(ORDLIN)
ENDSELECT

...

最後の2つの例では、すべての明細行の#QUANTITYフィールドが100に変更されることに注意してください。これは、複数レコードの更新最後の2つの例では、すべての明細行の#QUANTITYフィールドが100に変更されることに注意してください。これは、複数レコードの更新(すなわち「一括設定」更新)の例です。

SELECTループ内、またはSELECTループ内から呼び出されたサブルーチン内では、'UPDATE WITH_KEY'を使用しないでください。 を使用しないでください。 

SQL NULL について

WhenSQL Nullフィールドを更新してテーブルのデータベース列に設定すると、以下のいずれかが起こります。

  • 列にNOT NULL制約が適用されていない場合、列はSQL Nullに設定されます。
  • 列にNOT NULL制約が適用されている場合、その更新は失敗します(列のデータベース定義がフィールドのLANSA定義と一致していない場合のみ失敗します)。

...