Versions Compared

Key

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

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

...

7.35.2 DELETE についてのコメント/警告

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

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

Code Block

...

FETCH   WITH_KEY(

...

 ) or WITH_RRN(

...

 )
DISPLAY
IF_

...

MODE *DELETE
DELETE
ENDIF

...

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

この状況では、レコードが取得 (FETCH) されてから削除 (DELETE) されるまでの間が「相互更新時間枠」になります。DISPLAYコマンドがユーザーのワークステーションで実行されたときにユーザーが席を離れてコーヒーを飲みに行っていれば、この時間は非常に長くなる可能性があります。

これは、自動「相互更新」検査機能の正しく有効な使用方法です。FETCHからDELETEまでの間にレコードが別のジョブ されるまでの間が「相互更新時間枠」になります。DISPLAYコマンドがユーザーのワークステーションで実行されたときにユーザーが席を離れてコーヒーを飲みに行っていれば、この時間は非常に長くなる可能性があります。
これは、自動「相互更新」検査機能の正しく有効な使用方法です。FETCHからDELETEまでの間にレコードが別のジョブ/ユーザーによって変更された場合、DELETEによって「相互更新エラー」 (他の妥当性検査エラーと同様に処理される) が生成されます。

次に、以下のコマンド・フローについて考えます。

Code Block

...

FETCH   WITH_KEY(

...

 ) or WITH_RRN(

...

 )
DISPLAY
IF_

...

MODE *DELETE

...


DELETE  WITH_KEY(

...

 ) or WITH_RRN(

...

 )
ENDIF

...

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

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

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

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

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

...

DELETE FROM_FILE(ORDHDR)

...

 WITH_KEY(#ORDNUM)

...

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

Code Block
FETCH  FROM_FILE(ORDHDR)

...

 WITH_KEY(#ORDNUM)

...



DELETE FROM_FILE(ORDHDR)

...

また、以下のような指定について考えます。

Code Block

...

DELETE FROM_FILE(ORDLIN)

...

 WITH_KEY(#ORDNUM)

...

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

Code Block
SELECT     FROM_FILE(ORDLIN)

...

 WITH_KEY(#ORDNUM)

...


DELETE     FROM_FILE(ORDLIN)

...


ENDSELECT