• 締切済み

ファイルメーカーで最大シリアル番号+1を自動入力

ファイルメーカーver7を使用しています。 自動シリアル番号の機能を利用してシリアル番号を振っているのですが、 新規レコードを作成して、その直後にレコード削除してと繰り返していると、 空のシリアル番号がどんどん作られてしまいます。 そこで、最大シリアル番号に1を足したものを 自動入力させたいのですが、どうしたらいいかわかりません。 どなたかアドバイスよろしくお願いします。

みんなの回答

  • zenjee
  • ベストアンサー率47% (50/106)
回答No.8

>テーブル内の一番大きいシリアル番号を求め、新規テーブルのシリアル番号に「最大シリアル番号 + 1」にしたい。 途中削除したシリアル番号は欠番のままでよい。 「新規レコード作成、今作成したレコードを削除」と連続操作したとき、新しいシリアル番号が生成されてしまうのを防ぎたい。  結論から言って、シリアル番号(以下「SN」と略)の自動入力による全置換も併用し、なおかつ削除レコードのSNは欠番のままでよい、というご希望なら、削除レコード以降のレコードのみを対象として全置換でSNを振り直すしかありません。  なぜならば削除後全レコードを対象にSNを振り直せば、削除分のSNは必ず削除分の次のレコードで穴埋めされるからです。  だから、レコードの新規作成、削除を頻繁に行うなら自動入力はあきらめて、その都度手入力するしかないと思います。 >テーブル内のシリアルの最大値の求め方もわかりません。  SNフィールドなど数値フィールドの最大値(MAX)を求めるのは、例えば「MAXSN」等新規フィールドを作り、タイプは「集計」にしてオプションで最大値にチェックし、SNを指定してOKすれば全レコードSMの最大値は出ます。  だからそのフィールドを画面のどこかに出しておいて、新規レコードを作成したときその数+1の数値をSNフィールドに手入力する方がよいでしょう。  これをまた別に計算フィールドを作って「=MAXSN+1」などと式を設けても、それをSNフィールドにCopy&Pasteするならともかく、自動的に入力しようとすれば再帰定義を起こすので、式自体が定義出来ません。  またレコード数がどれくらいあるか分かりませんが、仮に10万台としてもコピペするぐらいなら手入力が早いでしょう。  そもそも全レコードを増分1で自動入力して、しかも欠番OKというのは論理矛盾です。    一つ理解できないのは、現レコード数以外に必要というMAX番号とはどういう目的・性質のものでしょうか。  削除してもそれまでに一旦データ化したレコードの総数をどこかに記録して置きたいということでしょうか。でないと欠番OKの意味も分かりません。     残念ながら私の知識では、削除→欠番OK、かつMAX番号自動入力という矛盾した作業は、Excelならマクロで可能かも知れませんが、ファイルメーカーでは不可能というしかありません。    

yura64
質問者

お礼

アドバイスありがとうございます。 > 一つ理解できないのは、現レコード数以外に必要というMAX番号とはどういう目的・性質のものでしょうか。 このソフトを使用している方からの希望です。 > 削除してもそれまでに一旦データ化したレコードの総数をどこかに記録して置きたいということでしょうか。でないと欠番OKの意味も分かりません。 レコードの総数を記録しておきたいのではありません。 本来DBでは「削除」せず、削除フラグなどを利用し 削除したように見せかけるのが一般的です。 しかし、このソフトを実際使っている方々は 「以前のデータなんて要らない」という考えなのです。 (というとDBの役割はって感じなのですが) こういった流れから「欠番OK」ということになっています。 仕様自体を考え直してみたいと思います。 今のところ自己リレーションを使用しできました。 しかし、私の中でもっと簡単なやり方があるのでは と今も考え中です。

noname#83007
noname#83007
回答No.7

今、出先なのでFM7で確認できませんが、それ以前のバージョンにはMAX関数というのがありました。 ですのでFM7にも同じ名前か、同じ機能の関数があるはずです。 後は以下を参考にしてみてください。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=111972

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=111972
  • cheryl255
  • ベストアンサー率23% (15/63)
回答No.6

NO.1 の回答者です。 ファイルメーカー4.0を使っています。 フィールド定義についての御質問にお答えします。 1.最終レコードを削除してしまった。 2.次の新規レコードを作成する前にファイルからフィールド定義を立ち上げます。 3.シリアル番号をふってあるフィールドを選択。 4.オプションボタンを押して中身を立ち上げる。 5.「次の値」という番号に、削除してしまった最終レコードの番号を入力し直す。 6.保存をする。 7.新規レコードを作成してみると、削除してしまった最終レコードの番号になる。 と、いうわけです。 面倒ではありますが…。

  • zenjee
  • ベストアンサー率47% (50/106)
回答No.5

 私の回答の意味を取り違えてらっしゃるようですね。  私はまず、TODAY関数によって必ずデータが入る「作成日」というフィールドを作り、別に例えば「シリアルナンバー」というフィールドを設けてそのタイプを「集計」にし、オプションをクリックして「カウント」と「現在のカウント」にチェックを入れることによって、最初のレコードから選択したレコードまでの「作成日」フィールドの個数をカウントし、それによってレコードが現在何番目にあるかということを表すということを言っている訳ですから、この数値が重複するなんてことは絶対にあり得ません。    フィールド内容の全置換のダイアログボックスでいうシリアルナンバー(初期値1、増分1という)とは全く意味が違うのです。  だからレコードがNO1から5まであるとすれば、NO3のレコードを削除して新たにレコードを追加するなら、当然今までのNO4のレコードはNO3に、NO5のレコードはNO4にそれぞれ繰り上がり、新しいレコードがNO5になる訳で、コンピューターが計算間違いをしない限り「シリアルナンバー」フィールドの値が重複するなんてことがあり得る筈がありません。  ただこの番号(数値)はステータスエリアの番号と常に一致する訳ですから、新たに設ける必要があるかどうかということをNo.4でお尋ねしている訳です。  ついでにちょっと訂正しておきますが、作成日フィールドをTODAY関数にしていましたが、TODAY関数では常にその日の日付に更新されますから、それでなく、フィールド定義のオプション画面の入力値の自動化にチェックを入れ、「作成日」を選択した方がレコード作成日も記録されるので画面に表示する意味もあり、よりベターだと考えます。

yura64
質問者

補足

#3で回答いただいた内容を取り違えて理解していました。 せっかく回答していただいたのに本当にすみません。 #5の方法を試してみました。 回答どおりの動作をしました。 ありがとうございます。 しかし、実現したい動作とは違います。 テーブル内の一番大きいシリアル番号を求め、 新規テーブルのシリアル番号に「最大シリアル番号 + 1」 にしたいのです。 途中削除したシリアル番号は欠番のままでよいのですが、 「新規レコード作成、今作成したレコードを削除」 と連続操作したとき、新しいシリアル番号が 生成されてしまうのを防ぎたいのです。 テーブル内のシリアルの最大値の求め方もわかりません。 いろいろ調べているのですが、なかなかわからなくて。 実現したい動作の説明が足らなくて本当にすみません。

  • zenjee
  • ベストアンサー率47% (50/106)
回答No.4

No.3 zenjeeです。 一つ言い忘れていましたが、No.3で私が説明したような意味でのシリアル番号なら、左のステータスエリア(日めくりカレンダーのようなもの)に全レコード数と現在レコードの順番が必ず表示されるので、別にシリアルナンバーフィールドを設ける必要もないような気がしますが、いかがでしょうか。 もし私がご質問の意味を取り違えたのなら、よければ補足説明をお願いします。

yura64
質問者

お礼

ありがとうございます。 早速試してみました。 しかし、この方法ですとシリアルが重複してしまいます。 例えば「1、2、3、4、5」とシリアル番号があって、 シリアル番号3のレコードを削除し、 新規レコードを追加すると、シリアル番号は「5」となってしまいます。 シリアル番号はユニークとしたいのですが。 既存のMax(シリアル番号)+1 をとりたいのですが、 どうやったらよいかわかりません。 何か良い方法がありましたらアドバイスよろしくお願いします。

  • zenjee
  • ベストアンサー率47% (50/106)
回答No.3

こういう方法はいかがでしょうか。 ウインドウに表示しないフィールド1個とシリアル番号が表示されるフィールドを1個作ります。 非表示のフィールド名は、例えば「作成日」としてタイプは計算、式は「=TODAY」とします。 次にシリアルナンバーのフィールドです。 名称は例えば「シリアルナンバー」とし、タイプは集計です。 オプションをクリックすると『集計フィールド「シリアルナンバーのオプション』というダイアログボックスが現れますので、左側の「カウント」と下の「現在のカウント」にチェックを入れOKをクリックします。 レイアウトモードに戻り、「シリアルナンバー」フィールドを画面に表示します。 するとデータの順に応じた番号(数値)が常に表示されます。データを追加・削除しても常に「作成日」フィールドの個数(COUNT)が反映されますから、シリアルナンバーとしての機能が果たされる訳です。 なお、「作成日」フィールドは表示しても特に支障がある訳ではありませんし、何らかの役に立つ場合があるかも知れません。 要するにどこかのフィールドには必ず何らかのデータが入っている(特定のフィールドが空白ということがない)と仮定すれば、別にこのフィールドを作る必要はなく、それをカウントすればいい訳で、そうでない可能性もあるかから、TODAY関数で必ずデータが入る非表示のフィールドを作り、その現在カウント数(順番)をシリアルナンバーとして活用する訳です。

回答No.2

私は5.5です。 あるフィールドの最大値に1足したものを同じフィールドに自動入力 しようとすると、再帰定義でエラーになりますね。 レコードの追加や削除をスクリプト経由で行なう仕様にしておい て、スクリプトの中で数値フィールドに「計算結果を入力」で最大 値を格納するようにすれば、自動入力は単なる数値フィールドを参 照するだけになるから、出来るかも。でも面倒くさそう…

yura64
質問者

お礼

回答ありがとうございます。 今のところ、ショートカットでレコードの新規作成・削除 ができることを前提として考えています。 どちらにしても面倒な作業になりそうなんですかね・・・。

  • cheryl255
  • ベストアンサー率23% (15/63)
回答No.1

私は、ファイルメーカー4を使っています。 私は削除する度に変更をかけるようにしています。 変更はフィールド定義からかけますが、結構面倒で 手間です。4はコレしかできないように思いますが… お役にたてますかかどうか…

yura64
質問者

お礼

ありがとうございます。 フィールド定義からどのようにしているのですか? お時間があるようでしたら、ほんの少しヒントでもかまいませんので 教えていただけないでしょうか?