ACCESS2000でのサブフォームでの自動採番方法

このQ&Aのポイント
  • ACCESS2000で制作したデータベースで、サブフォームの枝番に自動的に「1」を入れる方法を教えてください。
  • 現在、Private Sub Form_Open(Cancel As Integer)のプロシージャを使用して、新規フォームの場合は「1」を、既存のデータがある場合はQ_トランの最大値+1を入れる処理を行っていますが、Q_マスタの一番上のデータがQ_トランのレコードを2つ持っている場合であっても「3」と表示されてしまいます。
  • どのようにすれば、期待する結果を得ることができるでしょうか。
回答を見る
  • ベストアンサー

サブフォームで自動採番

お世話になります。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」と出てしまいます。 どのようにすればいいのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

こんにちは。 今できていることは、検索フォームで顧客コードを検索した結果、検索した顧客コードに一致した顧客のF_マスタを開き、無い場合は新規レコードのF_マスタを開く。 やりたいことは、(自分の勝手な想像もはいっていますが) 【新規レコードのF_マスタを開くとき】 F_マスタの顧客コードを自動採番 F_トランの枝番を1 【一致した顧客のF_マスタを開いたとき】 F_トランの枝番を自動採番(顧客コード単位の枝番+1) でよろしいでしょうか? そうであれば、下記のようにすればいいかもしれません。 F_マスタの開くときのイベントでのコードを下記とする。 Private Sub Form_Open(Cancel As Integer) If Me.Recordset.EOF Then Me.Requery Me.顧客コード = DMax("顧客コード", "Q_マスタ") + 1 Me.[F_トラン]![枝番] = 1 Else If MsgBox("新しい枝番を追加しますか?", vbYesNo) = vbYes Then Me.[F_トラン]![枝番] = DMax("枝番", "Q_トラン", "顧客コード=" & Me.顧客コード) + 1 End If End If End Sub F_トランの開くときのイベントでのコードを下記とする。 Private Sub Form_Open(Cancel As Integer) DoCmd.GoToRecord , , acNewRec End Sub ご参考になれば幸いです。m(__)m

holse1234
質問者

お礼

ShadowMoonさん、回答ありがとうございます。 早速やってみたところ、うまく動きました。 厳密にはShadowMoonさんの想像なさってたのとは ちょっと違ったのですが 応用も利きまして、大変参考になりました。 ほっとしています。 ありがとうございました

関連するQ&A

  • サブフォームのビューを切り替えたい

    親フォーム(フォーム1)にサブフォームとして、 テーブルをソースとするサブフォーム(テーブル1のサブフォーム)を配置しました。 親フォームからサブフォームのビューを変更したいのですが どうすればいいか教えてください。 親フォームのコマンドボタンにはそれぞれ Private Sub 単票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 1 '帳票フォーム End Sub Private Sub 帳票フォームへ切り替え_Click() Me.Controls("テーブル1のサブフォーム").Form.DefaultView = 0 '単票フォーム End Sub としたのですが、 実行すると 実行時エラー 2136 "このプロパティを設定するには、フォームまたはレポートをデザインビューで開きます"。 となってしまいます。 Private Sub 帳票フォームへ切り替え_Click() DoCmd.SelectObject acForm, "テーブル1のサブフォーム" DoCmd.RunCommand acCmdFormView End Sub にしたところ、 実行時エラー 2489 “オブジェクト テーブル1が開いていません、” になります。 サブフォームに埋め込んでいて親フォームを開いていても 開いてない事になるのですね。 フォームビューの時に、切り替える事は不可能なのでしょうか? 帳票ビュー表示用フォーム、 単票ビュー表示用フォーム を作るしかないのでしょうか?

  • サブフォームのデータをそのままひっぱってきたい。

    Access2002です。 T_マスタ・T_サブ・T_備考という3つのテーブルをもとに F_マスタ・F_サブ・F_備考という3つのフォームを作成しています。 F_マスタの中にF_サブをサブフォームとして設定してあります。(氏名IDでリンク) F_サブの中に、Fサブ上の情報(氏名ID・データ年)で検索をして開く F_備考を開くためのコマンドボタンを設置してあります。 そこでF_備考を開いた後に、何も検索結果が出されなかったら、 入力をするために、「入力」というボタンを設置しました。 このボタンを押すと、F_サブ上の「氏名ID」「データ年」を 自動でF_備考の同じ名前のところへ入力したいのです。 ですが、実行すると「F_サブフォームは見つからない」という旨の エラーが出てしまいます。 それならF_サブを開いてしまえと、コマンドボタン上に、 F_サブを開く設定をしたのですが、今度は 「サブフォームに設定してあるフォームは開けない」という エラーメッセージが表示されてしまいました。 サブフォームのデータをそのまま参照することはできないのでしょうか? 実際のコードは以下のような簡単なものです。 F_備考の「入力」ボタン Me!氏名ID = Forms![F_サブ]![氏名ID] Me!データ年 = Forms![F_サブ]![データ年] どうやったらデータをひっぱってこれるのでしょうか? 宜しくお願いします。

  • サブフォームをリクエリしたい

    メインフォームのコマンドボタンを押下するとvbaを使ってテーブルのデータを更新します。 メインフォームの中にはサブフォームがあり、 そのサブフォームとテーブルがリンクしています。 サブフォームにはテーブルのデータが表示されており、 メインフォームのコマンドボタン押下→テーブルデータ更新 がされると、全て#Deletedという文字が表示されます。 なので、 Private Sub cmd_データ更新_Click() Call データ更新 Me.Controls("Fサブ").Form.Requery End Sub としたのですが、 「実行時エラー’2465’:指定した式で参照されている’Fサブ’フィールドが見つかりません。」 が発生します。 Me.Controls("Fサブ").Requery これにしても同じでした。

  • 親フォームからサブフォームのレコードソースを設定

    親フォームからサブフォームのレコードソースを設定するには? フォーム1にテーブル1をドロップアンドドラッグして、「テーブル1のサブフォーム」を作成しました。 フォーム1にあるコマンドボタンから「テーブル1のサブフォーム」のRecordSourceを設定する方法を教えてください。 「テーブル1のサブフォーム」からなら Private Sub Form_Load() Me.RecordSource = "" End Sub とできるのですが、 やりたいことはフォーム1からのイベントなので 「テーブル1のサブフォーム」からのイベントは使えません。 だからってフォーム1の Private Sub コマンド2_Click() Me.テーブル1のサブフォーム.RecordSource = "テーブル1のサブフォーム" End Sub とするとコンパイルエラーになります。 良い方法があれば教えてください。アドバイスよろしくお願いします。

  • Accessでチェックしたらサブフォームもチェック

    T_マスタテーブル ・ID ・氏名 ・チェック T_サブテーブル ・ID ・住所 ・チェック となっていて、それぞれフォームを作成していて、 F_マスタフォームの中にF_サブフォームが入っています。 (IDでリンク) マスタテーブルに 1001  山田 太朗   というデータがあったとすると サブには 1001 東京都*** と入っているのですが、 サブは1人につき、1件とは限らず、 1001 東京都渋谷区*** 1001 東京都新宿区*** 1001 埼玉県さいたま市*** となっていることもあります。 F_マスタフォームのチェックの「更新後処理」に Private Sub チェック_AfterUpdate() If チェック = True Then [Form]![F_サブフォーム]![チェック] = True Else [Form]![F_サブフォーム]![チェック] = False End If End Sub と入っていて、F_マスタの方にチェックをすればF_サブのほうにもチェックが 入るようにしたいのですが、 1件目しかチェックがされません。 IDが同じもののチェックにはすべてチェックがされるようにするには どのようにかけばいいのでしょうか? 宜しくお願いします。 Ac2000です。

  • Accessのフィルター機能について質問です。

    こんにちは。 以前に http://okwave.jp/qa/q7072953.html で「別フォームから主フォームに反映」という質問をさせていただいた者です。 「  With Forms("F01-1")     .Filter = "顧客コード = " & Me!顧客コード     .FilterOn = True   End With  」 というコードを検索フォーム(別フォーム)に記入することにより、 主フォーム上に検索フォームで選択したものが表示されるようになりました。 ※検索フォームにおけるデータの追加・変更・削除等は行えません。 上の質問での設定を前提で質問なのですが、どうかどなたかお答えください。 検索フォームから主フォームに、絞り込み検索が行えるようになったのですが、 主フォームの検索結果を(主フォーム上の)サブフォームに影響させないようにするには どうしたら良いのでしょうか? 主フォームのレコードが変わっても、サブフォームは常に新規登録状態にしておきたい ということです。 説明が足りないところもあるかと思いますが、よろしくお願いいたします。

  • サブフォーム用のテーブルのデータで検索をしてマスタフォームに表示したい。

    Access2000での質問です。 T_マスタ(氏名ID・氏名)・T_サブ(氏名ID・データ年・データ種類)というテーブルから F_マスタ・F_サブというフォームを作成し、 F_マスタの中にサブフォームとしてF_サブを入れています。(氏名IDでリンク) F_検索というフォームを作成し、 データ年・データ種類で検索するようにしました。 この結果を、F_マスタで表示したいのですが、 F_マスタはT_マスタから作成されているため、検索結果が 希望するものではなくなってしまいます。 F_サブでみればきちんと検索されているのですが、 それでは氏名がみれないので。。。 このようなことはできるのでしょうか? F_検索の検索ボタンのコードです。 ------- Private Sub コマンド1_Click() Dim SQL As String Dim WhereCond As String Dim condNendo As String Dim condSyurui As String 'データ年 If Me!データ年.Value <> "" Then condNendo = "(T_サブ.データ年 like '*" & Me!データ年.Value & "*')" WhereCond = WhereCond & " AND " & condNendo End If '種類 If Me!データ種類.Value <> "" Then condSyurui = "(T_サブ.データ種類 like '*" & Me!データ種類.Value & "*')" WhereCond = WhereCond & " AND " & condSyurui End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_サブ", acNormal, , WhereCond End Sub ------- *上記の「F_サブ」を[F_マスタ」で開くようにしたいのです。 宜しくお願いします。

  • データシート形式のサブフォームでコンボボックスでの入力がうまくいかない

    サブフォームはデータシート形式です。 メインフォームは受注フォーム。サブフォームは受注明細フォームです。 サブフォームのソースは受注明細テーブルです。 サブフォームに商品コードのコンボボックスがあって選択すると 該当する商品名、販売価格を商品マスタテーブルから検索して表示 したいので以下のようにためしてみました。 Private Sub 商品コード_AfterUpdate() ' ' 商品名 = DLookup("商品名", "T_商品マスタ", "商品コード='" & 商品コード & "'") ' 販売価格 = DLookup("販売価格", "T_商品マスタ", "商品コード='" & 商品コード & "'") 商品名 = 商品コード.Column(1) 販売価格 = 商品コード.Column(2) End Sub そうすると、商品コードを選択すると商品名と販売価格が 全行同じものに変わってしまいます。 どうすればよいでしょうか? ご教示していただけませんでしょうか? よろしくお願い致します。

  • エラーが出ます

    Stressmanと言います。 ACCESS2002を使っています。 今、「報告書」というフォームから「顧客」というフォームを開きます。 「顧客」フォームにはサブフォームとして「顧客一覧」のデータシート が組み込まれています。 「顧客一覧」の該当する行をダブルクリックしたら、フォームを閉じて、 「報告書」フォームの「顧客ID」にダブルクリックした顧客の「顧客ID」 がコピーされる。っていうのを実現させようとしています。 下記がそのコードです。 まず「報告書」フォームのコマンドボタンに下記のコードを設定 「顧客」フォームを開きます。 Private Sub コマンド110_Click() DoCmd.OpenForm "顧客", , , , acFormAdd, , Me.Name End Sub そして、「顧客」のサブフォームの「顧客一覧」(データシート)の ダブルクリックのイベントのところに下記のコードを設定 Private Sub Form_DblClick(Cancel As Integer) Dim strFormName As String strFormName = Me.OpenArgs ← エラー Forms(strFormName).[顧客ID] = Me.[Frm_04顧客マスタ_サブフォーム].Form.[顧客ID] DoCmd.Close acForm, Me.Name End Sub エラーがでるのがここです。 どうやら、Me.OpenArgsの値がNullらしいのですが、 どうやって回避すればいいのか、分かりません。 分かりにくい説明ですが、宜しくお願いします

  • ボタン押下でサブフォームのレコードソースを変更

    ボタン押下でサブフォームのレコードソースを変更 する方法を探しています。 元とするテーブルは同じですが、拾うべきフィールドが全く異なるため2つのクエリを作成しました。 元テーブル「メンバー一覧」 クエリ「q_1組のみ」「q_女性のみ」 フォームヘッダーにコンボボックスでどちらかのクエリを選択し、ボタンを押したら サブフォームが表示されるようにしたいのですが、 現在のところ、「閉じているかまたは存在しないオブジェクトを参照」というエラーが出てしまっています。 Me.でもForms("検索ウィンドウ").でも結果は同じでした。 ソースはクエリを指定しています。 Access2007 --------------------------------- Private Sub 検索ボタン_Click() If [Forms]![検索ウィンドウ]![申込形態] = "1組のみ" Then Me.検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ1" Else Forms("検索ウィンドウ").検索結果サブフォーム.Form.RecordSource = "q_しぼりこみ2" End If