• ベストアンサー

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"にしたりしましたが、 請求番号はエラーが発生します。 原因がまったくわかりません。 よろしくお願いします!

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

  • ベストアンサー
noname#182251
noname#182251
回答No.3

エラーの原因は#1のご回答通りだと思いますが、請求書番号作りなどで苦労しなくても良いような気もします。 単純に請求書番号をオートナンバーにしておき、入力フォームで請求番号を ・書式:\A0000 ・使用可能:いいえ にしておく。後は請求書印刷時などにFormat関数で整形してやればよいのでは?

23tomo-u
質問者

お礼

回答ありがとうございます! とりあえず、テーブルやクエリ、フォーム等、リレーションで 作りこんでしまったので、主キーをオートナンバー型にするのは諦め 普通に数字のみで番号を振ることにしました。 次作る際は英数字でチャレンジしたいと思います。 このページは大切に保管します! ありがとうございました!

その他の回答 (3)

noname#140971
noname#140971
回答No.4

補足:ちょっと手法に疑問が・・・。 ? Format(DBMAx("Right(請求番号, 4)", "請求台帳")+1, "A0000") ? Format(DBMAx("Mid(請求番号, 2, 10)", "請求台帳")+1, "A0000") で動作するが、致命的な欠陥があります。 Right(請求番号, 4) <--- 4 というマジックナンバーを埋め込んでいる! Mid(請求番号, 2, 10) <--- 2、10 というマジックナンバーを埋め込んでいる! こういうマクロを残すと受け継いだ開発者はどこで何がやられているのかサッパリ。 <自動採番>というのならば、セオリー通りに<採番テーブル>を用意した方が良いと思います。 でなければ、単純に長整数で管理するがお勧め!

23tomo-u
質問者

お礼

回答ありがとうございます! とりあえず、テーブルやクエリ、フォーム等、リレーションで 作りこんでしまったので、主キーをオートナンバー型にするのは諦め 普通に数字のみで番号を振ることにしました。 次作る際は英数字でチャレンジしたいと思います。 このページは大切に保管します! ありがとうございました!

noname#140971
noname#140971
回答No.2

請求台帳: [請求番号]__[請求日]_____[顧客マスタ_顧客番号] A0001________2008/06/18___0001 A0002________2008/06/16___0002 [イミディエイト] ? Format(DBMAx("Right(請求番号, 4)", "請求台帳")+1, "A0000") A0003 ? Format(DBMAx("Mid(請求番号, 2, 4)", "請求台帳")+1, "A0000") A0003 ? Format(DBMAx("Mid(請求番号, 2, 10)", "請求台帳")+1, "A0000") A0003 で、DMax()よりDBMax()がお勧めです。 Public Function DBMax(ByVal strField As String, _            ByVal strTable As String, _            Optional strWhere As String = "", _            Optional ReturnValue = 0) As Variant On Error GoTo Err_DBMax   Dim N   Dim strQuerySQL As String   Dim rst     As ADODB.Recordset      Set rst = New ADODB.Recordset   strQuerySQL = "SELECT MAX(" & strField & ") FROM " & strTable   If Len(strWhere) > 0 Then     strQuerySQL = strQuerySQL & " WHERE " & strWhere   End If   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = Nz(.Fields(0), "")      End If   End With Exit_DBMax: On Error Resume Next   rst.Close   Set rst = Nothing   DBMax = IIf(N <> "", N, ReturnValue)   Exit Function Err_DBMax:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBMax)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBMax End Function

  • Tiffa9900
  • ベストアンサー率31% (68/216)
回答No.1

たぶんなんですけど、 「DMax("請求番号","請求テーブル")+1」が悪さしているのかと。 DMax("請求番号","請求テーブル")で返ってくる値って "A0001"となるから、文字型ですよね? 文字型に対して、数値を加算する事はできないよー! と言うわけではないでしょうか? ちょっと、Accessの関数に疎いので何ともいえませんが、イメージだと、 Right(DMax("請求番号","請求テーブル"),4)+1 みたいな感じにしてみたらどうでしょう?

23tomo-u
質問者

お礼

回答ありがとうございます! 原因はそうだったのですか。 無知ですいませんでした(ペコリ)。 とりあえず、テーブルやクエリ、フォーム等、リレーションで 作りこんでしまったので、普通に数字のみで番号を振ることにしました。 次作る際は英数字でチャレンジしたいと思います。 このページは大切に保管します! ありがとうございました!

関連するQ&A