みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になります。
ver14です
これまで採番を運用するにあたり、空き番(欠番)があった場合でも
それを埋めることなく新規に最大値+1で採番してきました。
このような採番は問題なく作れて運用しております。
今回、採番時に空き番があれば(小さい値から)埋めるタイプが必要になりました。
自分なりに考えたり掲示板など見ましたが、埋めるタイプのヒントが見つからず。。。
1から運用上想定される上限の値をもたせた連番のテーブルを作って・・・とか
考えたのですが、このような採番をさせる方法にはどのようなものがあるのでしょうか?
なにかスマートなやり方があれば教えていただきたいのですが。
よろしくお願いします。
Offline
次の番号へのリレーションを作って、番号の差が1でないものを検索する。
削除時に空き番を登録するようにしないと、どっちみち全レコードを小さいほうから調べる必要が出てくるんで、高速にできない気がする。
採番が、1から順番、という事でしたら、そのフィールドでソートしておいて、小さい方からレコード番号と一致しないレコードを探す、という作業で良いのでしょうね。レコード数が数千以内でしたら、順番に探してもさほど時間はかからないはずです。
レコード数がそれ以上の場合の、これを高速化した2分法での作例です。
https://www.dropbox.com/s/vb50e2t0o1o86 … 7.zip?dl=0
空き番が複数有る場合には、必ずしも小さい方を見つけるわけでは有りません。
Offline
ありがとうございます。
レコード数としてはそんなに多くはなく、1000までと想定しています。
運用後どうなるかわかりませんが、レコード数は減る可能性のほうが高いです。100程度まで。
100程度なら繰り返しフィールドとかなにかを利用してもできそうな気もします。
挙げていただいたそれぞれの方法を一度検討してみます。
Offline
1000ぐらいなら、SQLでいいかも。
indexがテーブル名、numが番号のフィールド名。
ExecuteSQL ("
SELECT MIN(t1.num)
FROM \"index\" t1
WHERE t1.num NOT IN (SELECT t2.num - 1 FROM \"index\" t2)
";"";"") + 1
100くらいなら、単にloopを回した方が簡単でしょうね。
Offline
いろいろご教示いただいて光栄です。
まずは簡単にループでやってみようかと思います。
それで後々問題があれば別の方法でやってみます。
SQLもまだやったことがないのですが、機会があれば試してみます。
皆様ありがとうございました。
Offline
Pages: 1
[ Generated in 0.004 seconds, 9 queries executed - Memory usage: 510.38 KiB (Peak: 516.46 KiB) ]