Tips

Sequence number の特徴

日付2017/12/22
ID17-008
バージョン
プラットフォームWindows, Mac

時々、Sequence numberコマンドが同じ番号を返すというようなご質問や、Sequence numberコマンドを利用して保存した番号に空き(欠番)が生じるというご質問を頂くことがあります。これらは、Sequence numberコマンドの仕様になります。

Sequence numberコマンドリファレンスには「最適化のため、Sequence number コマンドまたはその他のシーケンス番号にアクセスする機能を最初に処理したときに初めてインクリメントが開始します」と書かれていますが、実際にコードを書いて試してみることにします。

ケース1:インクリメントが処理されないケース

次のコードは、同じプロセスでインクリメントが処理されないケースです。

For ($i;1;3)
	ALERT(String(Sequence number([Table])))
End for 

このコードを実行すると、アラートで同じ番号が3回表示されます。インクリメントが処理されていないので、同じ番号が返されるケースです。



インクリメントが処理されない場合には、番号に無駄が生じないように同じ番号が返されるようになっていることが分かります。

ケース2:インクリメントが処理されるケース

次のコードは、同じプロセスでインクリメントが処理されるケースです。

For ($i;1;3)
	ALERT(String(Sequence number([Table])))
	CREATE RECORD([Table])
	SAVE RECORD([Table])
End for 

Sequence number コマンドで返される番号が更新されていくのが、アラートで確認できます。

Sequence number コマンドで返された番号を使うかどうかは、Sequence numberの更新とは別だということも、このコードから分かります。

ケース3:別プロセスで同時に取得するケース

次のコードは、別のプロセスでインクリメントが Sequence numberコマンドが同時に実行された時のケースの再現したものになります。

$my_name:=Current method name
PROCESS PROPERTIES(Current process;$procName;$procState;$procTime)
If ($procName#$my_name)	
	For ($i;1;3)
		$proc:=New process($my_name;0;$my_name)
	End for 
Else 
	ALERT(String(Sequence number([Table])))
End if 

実行すると、アラート画面が3つ重なって表示されますが、そのどれもが違う番号になります。

このようなときに、もし、インクリメントされないプロセスがありますと、その番号が欠番となることがあります。

まとめ

こうした振る舞いを理解することはとても重要です。Sequence number コマンドだけでなく、これは自動インクリメントにも言えることです。