• ベストアンサー

Accessで主キーの最終番号を取得したい

Access2000を使用しています。 以下のようなテーブルを作成し、町内毎に 実施したアンケートを集計しようと思います。 *************************************** 「アンケートテーブル」 --------------------------------------- 町内    テキスト  3バイト   入力連番  数値    4バイト 設問1   テキスト  1バイト (主キー= 町内+入力連番(7バイト)) **************************************** これに対し入力用のフォームを作成しました。 非連結のテキストボックスに町内名を入れると自動的に 町内ごとの入力連番の最終番号を取得し、「町内」と「入力連番」 のテキストボックスに町内名と入力連番(の最終番号)を表示させ 「設問1」のテキストボックスにフォーカスを移動させたいのですが 主キーが2つ以上のフィールドを組み合わせてできている場合の最終 番号の取得のやり方とテキストボックスに表示させるやり方がよく 分かりません。 Dmaxを駆使すればよいのだと思いますが、どなたか解説していただけ ばありがたいのですが・・・・。 どうぞよろしくお願いいたします。

  • enako
  • お礼率62% (298/476)

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 新規レコードの入力連番に、既存データの最大値+1を自動でセットしたいということでしょうか。 そうと仮定して書きます。 非連結のテキストボックス[町内名入力]と、コマンドボタン[入力連番セット]を配置して、このコマンドボタンのクリックイベントに記述することにします。 Private Sub 入力連番セット_Click()   Me!町内.Value = Me!町内名入力.Value   If DCount("入力連番", "アンケートテーブル", "町内 = '" & Me!町内名入力.Value & "'") = 0 Then     '既存にない町内名の場合は、1を表示     Me!入力連番.Value = CStr(1)   Else     '存在する場合は、最大値+1を表示     Me!入力連番.Value = CStr(DMax("入力連番", "アンケートテーブル", "町内 = '" & Me!町内名入力.Value & "'") + 1)   End If   Me!設問1.SetFocus End Sub ちなみに、[町内名入力]が未入力の状態でコマンドボタンをクリックすると、エラーになるので、対処して下さい。

enako
質問者

お礼

まさにその通りです!! ありがとうございました!!!!

その他の回答 (2)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

サンプルコードです。 こんなもので如何でしょうか? 解説するまでもありませんので省略させて頂きます。 AccessのヘルプでDmax関数の解説をご覧ください。 町内名を入力するテキストボックス等の「更新後処理」イベントに 次のように記述します。 Private Sub 町内名入力_AfterUpdate()   Dim MaxVal As Variant   DoCmd.GoToRecord acForm, "アンケートテーブル", acNewRec   Me.町内.Value = Me.町内名入力.Value   MaxVal = DMax("[入力連番]", "アンケートテーブル", _     "[町内]='" & Me.町内名入力.Value & "'")   If IsNull(MaxVal) Then     Me.入力連番.Value = 1   Else     Me.入力連番.Value = MaxVal + 1   End If   Me.設問.SetFocus End Sub フォームの「レコード移動時」のイベントに次のように記述します。 Private Sub Form_Current()   Me.町内名入力.SetFocus   Me.町内名入力.Value = Null End Sub

enako
質問者

お礼

答えがひとつだけではないというのがよく分かりました。 とても助かりました。 ありがとうございました。

  • souta_n
  • ベストアンサー率33% (79/234)
回答No.1

DAOを使用してテーブルの最終のレコードのフィールドの値をテキストボックスに代入すればよいのではと思います。具体的には、下記の通り。 1.まずフォームを新規作成します。元になるテーブルクエリは無しで結構です。 2.ツールボックスからボタンとテキストボックスを1つずつ作ります。ボタンは最終番号取得、テキストボックスは最終番号表示としておきます。 3.ボタン最終番号取得のプロパティのイベントのクリック時で次のコードを記述します。 ********************************************** Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("アンケートテーブル", dbOpenTable) rs.MoveLast Me!最終番号表示 = rs!町内 & rs!入力連番 rs.Close db.Close ************************************************* Dmaxを使用したやり方ではありませんが一度試してみてください。

enako
質問者

お礼

またまた新しい「技」を教わりました。 こつこつ「技術」を磨いていこうと 思います。 ありがとうございました。

関連するQ&A

  • (ACCESS)連番取得について

    アクセスで顧客管理をしています。 DMax関数を用いて、レコードを追加する度に自動で連番を振る設定に したいと思っていますが、上手くいかないため質問させてください。 【テーブル名】T_顧客一覧 【入力用のフォーム名】F_顧客登録 【連番を入力させたい項目(フィールド名)】No(テーブルでは主キーに設定) とし、フォームの”No”の既定値に   =DMax("No","T_顧客一覧")+1 と入力するのですが、フォームには1としか表示されません。 非常に初歩的な質問だとは思うのですが、 何か原因として考えられることがありますでしょうか? 情報が足りないようでしたら補足させていただきます。 よろしくお願いします。

  • access 請求番号の自動採番

    まったくわかりません! よろしくお願いします。 仕様環境 WinXP  access2002 顧客管理のシステムを作っています。 テーブル 顧客テーブル(主キーは顧客番号 テキスト型) 請求テーブル(主キーは請求番号 テキスト型) 明細テーブル(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客テーブル(1)→(多)請求テーブル(1)→(多)明細テーブルになっています。 顧客情報を入力するフォームを作りました。 主キーは顧客番号(テキスト型,入力モードON,インデックス いいえ)で 他のテキストボックス(例えば名前)に何かしら文字を入力すると自動で顧客番号を採番してくれます。 例:0001 0002 0003~ そしてそのフォームから請求書作成フォームに飛ぶように 「請求書作成ボタン」を作り、顧客情報も一緒にひっぱっていってくれる 請求書作成フォームを作りました。(入力したばかりの情報も最新の情報で更新してくれます。) ・・請求書作成フォームはサブフォームを使い3つのテーブルからなっています。・・ 親フォーム:顧客テーブルから。 子フォーム:請求テーブルから。 孫フォーム:明細テーブルから。 主キーは請求番号で(テキスト型,入力モードON,インデックス はい(重複なし)) 他のテキストボックス(例えば請求日)に何かしら入力すると自動で請求番号を採番してくれます。 例:A0001 そこで問題なのですが、顧客情報は入力する度、次々自動で採番してくれるんですが、 請求番号は一番最初のレコードの”A0001”だけ採番してくれて、 新しいレコードで請求書を作ろうとテキストボックスに文字を入力すると「型が一致しません」というエラーが出ます。 ○ エラー内容 アクションエラーの実行 条件 true アクション名 値の代入 引数 [請求番号],Format(DMax("請求番号","請求マスタ")+1,"A0001") マクロは・・(参考書を参考にしています、マクロ名:自動採番マクロ) ------------------------------------------------- 条件 : DCount("請求番号","請求テーブル")=0 アクション : 値の代入 アイテム  : [請求番号] 式     :"A0001" ------------------------------------------------- 条件    : ... アクション : マクロの中止 ------------------------------------------------- アクション : 値の代入 アイテム  : [請求番号] 式     : Format(DMax("請求番号","請求テーブル")+1,"A0001") ------------------------------------------------- となっています。 念のため、主キーの入力モードを切り替えたり、式の"A0001"を単純に"1"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

  • アクセス2000で番号をふりたいです。

    アクセス2000の質問です。よろしくお願いします。 VBAが初めてなので、本を見ながらやってるんですけど なかなか理解できずに困ってます。 今、フォームで番号をふりたいんですけど、連番で 2007001でもH19001でもいいんですが、年&3桁の番号にしたいです。 現状はテーブルが「sheet5」、フォームの番号を出すテキストボックス の所が「連番」にしてあります。ボタン式にしました。 んで自分で考えて打ち込んだのが Private Sub コマンド77_Click() If "連番" / 1000 Is Date Then Me!連番 = DMax("連番", "sheet5") + 1 Else Me!連番 = Format(Date * 1000, "yyyy" & "001") End If End Sub こんな感じでいれたのですが、さっぱり動きません。 きっと見てる方は笑ってると思いますが、私の実力じゃ こんなのしか出来ません。 同じような質問もあったのですが、理解不能でした。 詳しい方、教えてください。

  • 主キーの取得

    現在SQLServer2000を使用しています。 存在しているテーブルから主キーを取得したいのですが うまく行きません。 sysobjects,syscolumnsシステムテーブル辺りから 取得できそうでできないのでイライラしています。 どなたかご教授お願いいたします。

  • 【アクセス】最大値を取得したい

    テーブルの番号フィールド(主キー、数値型)は1~100000くらいまでの番号が振られていますが 80%は空き番号です。 (例えば3の次は100のような) VBAで1~100までのなかで 最大値を取得したいのですがどうしたらよいでしょう? 1 2 3 の次が 100の場合 4を最大値として取得するコードがあれば教えてください! 宜しくお願い致します。

  • Access2003 伝票番号を自動的につけるには

    お世話になっております。 受注テーブルに[伝票番号]があって、番号を自動的につけたいと思っています。 入力用の[受注伝票]フォームがあります。 3月17日最初の入力 2006031701 3月17日の3番目の入力(最初、2番目は入力済み) 2006031703 このように日付+自動的に2桁の番号をつけたいのですが方法がわかりません。 参考になるページがあってこのように書いてみましたがエラーになりました。 [受注伝票]フォームの[伝票番号]テキストボックスプロパティの規定値 =IIf(DMax("伝票番号","受注伝票","伝票番号 Is Not Null") Is Null,CLng(Format$(Now(),"yyyymmdd"))*100+1,IIf(Left(CStr(DMax("伝票番号","受注伝票","伝票番号 Is Not Null")),8)=Format$(Now(),"yyyymmdd"),DMax("伝票番号","受注伝票","伝票番号 Is Not Null")+1,CLng(Format$(Now(),"yyyymmdd"))*100+1)) ご教授いただけると幸いです。よろしくお願いいたします。

  • 主キーから他のレコードを表示させる。

    access2000です。 フィールドが「主キー」と「年」「名称」しかないテーブルが有ります。 非連結で「主キー」としたテキストは作りました。 この非連結のテキストに主キーを入れると、別のテキストに「年」「名称」が表示されるようにしたいです。 どうすればいいのでしょうか? 超初心者の質問ですみません。

  • Accessの関数で、フィールド名に入力する""と[ ]の違い

    フォームのテキストボックスに関数を入れて表示するとき、 例1 貸出日のフィールドから曜日を表示させる =Format([貸出日],"aaa") とテキストボックスに入力。 例2 D001のテーブルにある会員番号のフィールドの最大値を表示させる =DMax("会員番号","D001") とテキストボックスに入力。 例2でフィールド名に付けるのが[ ]でなく""なのはなぜでしょうか? フィールドを使うならすべて[ ]でくくればいいと思ってましたが""でないとだめなようですが、なぜか教えてください。

  • Accessで自動に番号を振る方法

    AccessのマクロやVBAにお詳しい方、教えてください。 現在、Access2010を使っています。 たとえば、テーブル1が、 種別  番号 りんご  1 みかん  1 りんご  2 メロン  1 みかん  2 メロン  2 メロン  3 とあります。 フォーム1には、種別と番号のテキストボックスがあります。 新規データ入力で、「種別」テキストボックスに「みかん」と入力し、「番号」テキストボックスをダブルクリックしたとき、「みかん」の番号の最大値の次の番号「3」が自動的に振られるようにしたいのですが、どうしたらいいでしょうか。 なお、 1.「種別」テキストボックスが空欄の場合 または、 2.「番号」テキストボックスに既に数値が入っている場合 は、ダブルクリックしても番号が振られないようにもしたいです。

  • Accessで指示書番号の自動採番

    入力フォームで指示書番号が自動採番され、テーブルにも保存されるようにするための方法を教えていただけないでしょうか。 テーブル:T_指示書 フィールド:指示書番号 フィールドはテキスト型で、番号の構成は8桁の番号で "年(二桁)" + "月(二桁)" +"部署番号(一桁、固定の数字)"+ "連番(三桁)" (例:09091001) という感じで、 年月が変われば、連番が001になるようにしたいです。 どなたか、ご教授いただければありがたいです。 よろしくおねがいします。 Access2002 winXP

専門家に質問してみよう