- ベストアンサー
テーブルの主キー採番を標準モジュールで簡単に行う方法
- 現在、各フォームのコマンドボタンのクリック時にテーブルに主キーを採番するコードを記述しているが、同じコードを複数回書く必要があり効率的ではない。
- そのため、Functionプロシージャを使用して各フォームのコマンドボタンのクリック時にテーブルに主キーを採番する方法を検討している。
- 具体的には、T会社テーブルにレコードが存在しない場合は会社コードを'001'とし、存在する場合は最大の会社コードに1を加えた値を会社コードとする。
- みんなの回答 (2)
- 専門家の回答
関連するQ&A
- ACCESS標準モジュールでテーブルの主キー採番したい。
ACCESS標準モジュールでテーブルの主キー採番したい。 フォームが (1) [Fメインメニュー] (2) [F会社] "(1)(2)全て非連結のtxtbox" と2つあり、(1)のコマンドボタンから(2)のフォームを開く時に (2)のtxtboxに現在下記のコードで採番しています。 If DCount("*", "T会社") = 0 Then Forms("F会社").txt会社コード = "001" Else Forms("F会社").txt会社コード = _ Format(DMax("会社コード", "T会社") + 1, "000") End If これを標準モジュールで行いたいのですが、良い方法を教えて下さい。 宜しくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- テーブルのデータをフォームに表示したい。
テーブルのデータをフォームに表示したい。 Access2003で顧客管理のシステムを作成しています、 下記コードで検索フォームより顧客フォームを開き顧客テーブルのデータを渡していますが、 現在では顧客データを渡したいフォームが増えた為、各フォームにtxt顧客コードを設けて 標準モジュールで行った方が良いかと思うのですが、どの様にしたら良いか解りません。 良い方法がありましたらご教授よろしくお願いいたします。 Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T顧客", cn, adOpenKeyset, adLockOptimistic rs.Find "顧客コード=" & Forms!F顧客検索!S顧客.Form.顧客コード Forms!F顧客!txt顧客コード = rs!顧客コード Forms!F顧客!cmb顧客区分 = rs!顧客区分 Forms!F顧客!txt顧客名 = rs!顧客名 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing
- ベストアンサー
- その他(プログラミング・開発)
- サブフォームで自動採番
お世話になります。ACCESS2000で制作しています 主テーブル(マスタ)に顧客コード(主キー)、 サブテーブル(トラン)に顧客コードと枝番 というフィールドがあります。 顧客コードでリレーションシップを結んでいます。 それぞれのテーブルからクエリを経てフォームをつくり (Q_マスタ→F_マスタ、Q_トラン→F_トラン) また、検索フォームも別に作っています。 F_トランはF_マスタに埋め込んでいます。 検索フォームで検索して該当するデータが無い場合 DoCmd.OpenForm "F_マスタ", , , , acFormAdd で新規フォームを呼び出します。 このときサブフォームの枝番に自動的に「1」を入れたいのですが (開く時でも読み込み時でもいつでもいいのですが) どうしたら良いのでしょうか? ちなみに今は サブフォームのプロシージャで Private Sub Form_Open(Cancel As Integer) If Me.NewRecord Then Me![枝番] = 1 Else Me![枝番] = DMax("枝番", "Q_トラン") + 1 End If End Sub としています。 こうするとQ_マスタの一番上のデータが 例えばQ_トランレコードを2つ持っていると 「3」と出てしまいます。 どのようにすればいいのでしょうか。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
- 自前採番処理について
Access2013で、自前で採番処理をスル場合 以下のどちらが正しいでしょうか? 1) フォームの保存ボタンで、採番管理テーブルを参照して、現在の主キーのID番号を取得して、それに+1したものを採番管理テーブルに保存し、エラーがなければ、画面にセットして保存。 2) フォームのレコードソースのID番号の最大値を取得して、それに+1加算したものを採番管理テーブルに保存し、エラーがなければ、画面にセットし保存。 1) 2)どちらも、採番管理テーブルに+1した番号を保存する時にエラーが起きたら、画面は Me.Undoする。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
- ACCESS+SQL Serverで主キーを自動採番する
ACCESS+SQL Serverで主キーを自動採番する ACCESSを独学で勉強を開始しているものです。 顧客管理のようなものを作りたいと思っているのですが、 オートナンバーではない主キー(顧客コード)を設定しているテーブルがあります。 顧客コードの構成はアルファベット1文字+数字8桁です。 そのうち、数字は西暦2桁+月2桁+日2桁+下2桁は連番です。 ACCESS2007プロジェクトで、SQL Server 2005 Express Editionへ接続しテーブルは作ってあり、既に顧客データが10件ほど入っています。 新規に顧客データを追加する際に、必要事項を入力し、登録ボタンを押した段階で顧客コードを自動生成し、重複チェックし、採番したいと考えています。 アルファベットは必要事項入力時に入力済み、日付もその日の日付を6桁設定し、とりあえず「01」と下2桁を採番して、現在のデータに同じものがないかチェックします。 そして、同じものがあれば「01」+1を繰り返しながらチェックしていくというようなコードはどのようにすればいいでしょうか? わかりづらいとは思いますが、よろしくお願いします。
- ベストアンサー
- Visual Basic
- 文字を含むIDの自動採番
Access2013を使っています。 IDはテキスト型で、 A00000000 っていう書式なんですが、 新規レコード作成時のイベントで、ID自動採番(連番をふる)をしたいのですが、下記だと最初の1レコード(A00000001)以降がエラーになってしまいます。 Format(Nz(DMax("ID", "T_テーブル名"), 0) + 1, "\A00000000" ) もちろん、すでにあるIDがA00000001なので、DMaxが使えないんですが、どうやって分けてやったら良いのかわかりません。 やりたい結果は、新規レコード作成時に、IDが"A"&"8ケタの最大値+1"が自動に振られて、テーブルのIDフィールドにA00000001、A00000002・・・とデータ保持したいのです。 説明が判り辛くて恐縮ですが、ご教示お願いします。
- ベストアンサー
- その他MS Office製品
- Accessで日付が変わると番号がリセットされる自動採番がしたい
Microsoft Accessで下記のようなデータベースを作っています。 テーブル名:TB_受付 テーブルデザイン 受付番号:テキスト型 受付日:日付/時刻型(yyyy/mm/dd) 番号:数値型 コース種類:テキスト型 備考:テキスト型 テーブルイメージ 受付番号 受付日 番号 コース種類 備考 ------------------------------------------------------------ 20051201受付1 2005/12/01 1 20051201受付2 2005/12/01 2 20051201受付3 2005/12/01 3 ・ ・ ・ ・ 20051202受付1 2005/12/02 というように、受付日が変わると番号が1に戻るような採番をしたいのです。 上記テーブルを元に作成したフォームで、 受付日にはDate関数でその日の日付が入るようにしています。 フォームの更新前処理に下記のコードをいれています。 Private Sub Form_BeforeInsert(Cancel As Integer) If DCount("番号", "TB_受付") = 0 Then Me![番号] = "1" Else Me![番号] = Format(DMax("番号", "TB_受付") + 1) End If End Sub さらにコース種類の更新後処理に Me![受付番号]=Format("受付日,"TB_受付")&"受付"&Format("番号","TB_受付") というコードを書いて日付&番号が、[受付番号]のところに表示されるようにいろいろやっているのですが、日付が変わると番号をリセットさせることがなかなかできません。 VBAはあまり理解できている方ではないのですが、いろいろ検索をしたり調べたりしてたどり着いたのが上記です。 日付でリセットされる採番をするにはあと何をすればよいか、もしくは根本からこうしたほうがいいというのがあれば、とも思うのですが 詳しい方に教えていただけないでしょうか?
- ベストアンサー
- オフィス系ソフト
- access 自動採番 「10-AA-0001」にするには。
宜しくお願いします。 仕様環境:access(2002-2007) 自動で番号を割り振る機能を作っています。 (以前に似た質問をしたのですが、前より理解度が上がったので、ご了承くださいm(__)m) ・・・ まずテストDBなので、テーブルは「案件」一つだけです。 フォームも簡易的な単票形式で簡単なものです。 番号は他のテキストボックスに何か挿入する前の 「挿入前」のイベントを遣っています。 そこで、ご相談です、 まず自動採番で「AA-0001」というものが作れました。 また別フォームに移動し、他のテキストボックスを入力しようとすると 「AA-0002」になりました、以降も~0003、~0004となり成功しました。 そこで更に付け加えたいと思っています。 それは、 「2010-AA-0001」にしたいと思っています。 ご覧の通り、「2010」は「年」です。 更には完成系として「10-AA-0001」と言う風に「年」にあたる、2010の「10」だけ、 抜き出したいと思っており、来年には自動的に2011の「11」にしたいと思っております。 date関数なのかなー、とは何となく思っているのですが、いろいろ工夫してみたのですが、 うまくいきません。 これはマクロでは無理でしょうか? フォームをVBAに変換したものとマクロを記載させて頂きます。 よろしくお願いします。 '------------------------------------------------------------ ' Form_BeforeInsert ' '------------------------------------------------------------ Private Sub Form_BeforeInsert(Cancel As Integer) On Error GoTo Form_BeforeInsert_Err If (DCount("見積り番号", "案件") = 0) Then 見積り番号 = "AA-0001" Exit Sub End If 見積り番号 = Format(DMax("Right(見積り番号,4)", "案件") + 1, "AA-" & "0000") Form_BeforeInsert_Exit: Exit Sub Form_BeforeInsert_Err: MsgBox Error$ Resume Form_BeforeInsert_Exit End Sub ・・・・ マクロの場合 条件 アクション ---------------------------------------------------------- 1行目 DCount("見積り番号","案件")=0 値の代入 アイテム: [見積り番号] 式: "AA-0001" ---------------------------------------------------------- 2行目 ... マクロの中止 ---------------------------------------------------------- 3行目 値の代入 アイテム: [見積り番号] 式: Format(DMax("Right(見積り番号,4)","案件")+1,"AA-" & "0000") ---------------------------------------------------------- ・・・・ こんな感じです、 (単体のテーブルを作り、他のテーブルと組み合わせるつもりです) また余談ですが、DMAX関数とDBMAX関数の違いがわかりません、 調べても(google)出てきません、これは何か違いがあるのでしょうか? 教えてください、宜しくお願いします。
- ベストアンサー
- その他(データベース)
- 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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!
- ベストアンサー
- その他(データベース)
- 条件付MAX値取得について
ACCESS2000を使用しています。 このたび、グループごとに自動的に連番を採番する プログラムをVBAで組みたいと思っています。 そこで、下記のように作りました。 VBA初心者のためあまりつくりがよくないかもしれませんが、やりたかったことは、フォームと一致してる会社コードの中で会社テーブルの会社連番の最大値から1を足してをF会社連番に入れなさいって意味です。 このVBAを会社名を入力した後に実行するようにしています。 ところが、このVBAだとただしくMAX値を取得できず、 NULL値を取ってきてしまい、0が入ってしまいます。 長文になりましたが、数時間迷っているので、 手助けしていただけないでしょうか。 [会社テーブル] 会社コード・・・グループ化したいフィールド 会社連番・・・連番したいフィールド 会社名・・・会社の名前 [会社フォーム] F会社コード・・・会社コードと連結 F会社連番・・・会社連番と連結 F会社名・・・会社の名前と連結 Dim aa As Variant aa = DMax("会社連番", "会社テーブル", "会社コード = 'Form_会社フォーム!F会社コード'") If IsNull(aa) Then Me!F会社連番 = 0 Else Me!F会社連番 = aa + 1 End If
- ベストアンサー
- オフィス系ソフト
お礼
遅くなりましてすみません。 間違えて「補足にお礼を書いていました・・・ 返答ありがとうございます。 さっそく試してみました・・・が 「Set テーブル定義集合 = CurrentDb.TableDefs」 でエラーが発生してしまいました。 別のフォームのコマンドボタンからの呼び出しなので、 CurrentDbではないと言う事なのでしょうか? アドバイス宜しくお願いいたします。
補足
返答ありがとうございます。 さっそく試してみました・・・が 「Set テーブル定義集合 = CurrentDb.TableDefs」 でエラーが発生してしまいました。 別のフォームのコマンドボタンからの呼び出しなので、 CurrentDbではないと言う事なのでしょうか? アドバイス宜しくお願いいたします。