• ベストアンサー

ファイルメーカーでユニークなシリアル番号を自動入力させる方法

 ファイルメーカーProでは、フィールドに対し「入力値の自動化・シリアル番号」のオプション設定を行った場合、新規レコードを作成するとフィールドに連続した番号が自動入力できます。このシリアル番号機能に似た方式で、特定のフィールドの内容を参照し、その内容ごとにシリアル番号を自動入力する機能を実装させようと試行錯誤しているのですが、どうにもいい方法が思いつきません。 【実装したい機能の例】  ・「商品名」「シリアル番号」の2つのフィールドを持つDBがあります。  ・「商品名」を入力または修正すると、「シリアル番号」のフィールドへ「商品ごとに異なるシリアル番号」が自動入力されていきます。 【実装時の例】  レコード1:商品名=みかん、シリアル番号=1  レコード2:商品名=みかん、シリアル番号=2  レコード3:商品名=リンゴ、シリアル番号=1  レコード4:商品名=みかん、シリアル番号=3  レコード5:商品名=リンゴ、シリアル番号=2  レコード6:商品名=バナナ、シリアル番号=1  エクセルでは、countif関数を使っていとも簡単に実装できたのですが、「最初のレコードから現在入力中のレコードの間で、現在入力中のフィールドと内容が同じレコードの数を取得する」方法が、ファイルメーカーProでは見つかりません。  良き解決方法をご教示いただけますでしょうか。

質問者が選んだベストアンサー

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

ちょっと複雑かつ原始的?な方法ですが、ご希望のようなシリアルナンバー(ナンバーというより数値ですが)を表示することは可能です。 その方法は 1、商品名フィールドが「りんご、みかん、梨、バナナ、メロン」と仮定します。 2、画面表示が不要な計算用のフィールドを次のように作ります。 (1) 「りんご」というフィールドを作ります。フィールドタイプは「計算」で、式は   「IF(商品名="りんご",1,"")」とします。 以下、ミカン、梨、バナナ、メロンも同様に定義します。 (2) 次に「りんご計」というフィールドを作ります。フィールドタイプは「集計」で、「カウント」及び「現在のカウント」にチェックを入れ、フィールド「りんご」を選択します。 以下、ミカン計、梨計、バナナ計、メロン計も同様に定義します。 この2種類(合計10個)のフィールドは計算用ですから、画面に表示する必要はありませんが、参考のため欄外に表示してみると経過が分かります。 3、最後に「シリアルナンバー」フィールドです。 フィールドタイプは「計算」で、計算式は  Case(商品名 = "りんご" , りんご計, 商品名 = "みかん" , みかん計,商品名 = "梨",梨計,商 品名 = "バナナ",バナナ計,商品名 = "メロン",メロン計 )  とします。  以上です。データを入力して試してみてください。 (私も20件ほど入力し、OKでした。)

Bonsoir
質問者

お礼

ありがとうございます。 ご教示いただいた方法で上手くいきました。 とはいうものの、一番最初にテストした時は、「メロン計」のカウントに不具合があって、思いっきりつまづいてしまいました。 計算式の設定も何度か再確認したのですが、さっぱり原因がわからず、それならばと新規にファイルとデータベースを作り直したら、あっさり動いてしまい、妙な脱力感を感じています。 最後に、夏期休暇でご教示いただいた手法を試すことができずご返答が遅くなってしまいましたことお詫びいたします。ごめんなさい。

その他の回答 (2)

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

文字の変換ミスですが、ANo2の記述内容に1か所誤りがあったので訂正します。 2、(2)の、以下「ミカン計」は「みかん計」です。 なお、シリアルナンバーの計算式設定に際し、商品数が多数あり、一つの式にはめ込むのが容易でないときは、商品名及び集計フィールドを別表(FM7の場合、FM6なら別ファイルにしてリンク)に設けることにより、リレーションを組むことも可能かと思われます。(忙しくて試してはいませんので今のところ「自信なし」としておきます)

  • bucchukun
  • ベストアンサー率43% (18/41)
回答No.1

fmp7形式で説明します。 fmp6以下ならテーブルをファイルと読み替えてください。 「カウンター」というテーブルを作成し、「商品名」と「カウント」フィールドを作成します。 そして、いま使っているDB(テーブル)と商品名でリレーションを張っておきます。 「シリアル番号」フィールドの計算式を ------------------------------------ IF(MAX(カウンター::カウント)<1 ; 1 ; MAX(カウンター::カウント)+1) ------------------------------------ にします。 頭の中だけなので外しているかもしれません。 要はシリアル番号を別に保管しておき、リレーションの中で一番大きい番号に1を足したものをシリアル番号として使用する、ということです。

Bonsoir
質問者

補足

 bucchukunさん、すばやいご回答ありがとうございました。  なるほど、ファイルメーカーを触って3日程度の半端な知識では、リレーションシップ機能を使うことにまたく思い至りませんでした。  さっそく、ご教示いただいたように新規テーブルを作成し、「商品名」フィールドにリレーションシップを設定した後、「シリアル番号」フィールドに計算式を設定してみた……のですが、残念ながら思う結果が得られませんでした。  私のやり方がまずいのかもしれませんが、ご教示いただいた方法だけでは、「カウンター」テーブルの「カウント」フィールドを、「商品名」フィールドの入力にあわせてカウントアップさせていないため、正しい結果が得られていないのだと思われます。  せっかく良いヒントを与えていただいたので、もう一度冷静にカウントアップの方法を考えてみたいと思います。  とはいうものの実際には、1番目のレコードから現在のレコードの間で、フィールドに記入された項目と同じ項目がいくつあるか数える関数があれば、私の望む処理が実現できるのですが、うまくヘルプの中に見つけることができませんでした。もしかすると、フィールドに設定する計算式ではなく、ボタンを押してスクリプトを実行させて自動記入させるほうが良いのでしょうか。  ちなみにエクセルを使った場合、A列に商品名を記入するとB列にシリアル番号が自動記入される手法は、B2のセルに「=COUNTIF($A$2:A2,A2)」と記載し、B3以降のセルには同じように「=COUNTIF($A$2:A3,A3)」とすることで実装できています(下図参照)。 ____A______B____  +----------+----------------+ 1|_商品名_|_シリアル番号_| 2|_みかん_|___1____| 3|_みかん_|___2____| 4|_リンゴ_|___1____| 5|_みかん_|___3____| 6|_リンゴ_|___2____| 7|_バナナ_|___1____|  過去に所有ソフト管理などで、カード型データベースを使ったことはあったのですが、データベース作成の経験は少なく、何か基本的なところで見落としをしているような気がしてなりません。  引き続き、情報をお待ちしております。

関連するQ&A