まったくわかりません!
よろしくお願いします。
仕様環境
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"にしたりしましたが、
請求番号はエラーが発生します。
原因がまったくわかりません。
よろしくお願いします!
No.3ベストアンサー
- 回答日時:
エラーの原因は#1のご回答通りだと思いますが、請求書番号作りなどで苦労しなくても良いような気もします。
単純に請求書番号をオートナンバーにしておき、入力フォームで請求番号を
・書式:\A0000
・使用可能:いいえ
にしておく。後は請求書印刷時などにFormat関数で整形してやればよいのでは?
回答ありがとうございます!
とりあえず、テーブルやクエリ、フォーム等、リレーションで
作りこんでしまったので、主キーをオートナンバー型にするのは諦め
普通に数字のみで番号を振ることにしました。
次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!
ありがとうございました!
No.4
- 回答日時:
補足:ちょっと手法に疑問が・・・。
? Format(DBMAx("Right(請求番号, 4)", "請求台帳")+1, "A0000")
? Format(DBMAx("Mid(請求番号, 2, 10)", "請求台帳")+1, "A0000")
で動作するが、致命的な欠陥があります。
Right(請求番号, 4) <--- 4 というマジックナンバーを埋め込んでいる!
Mid(請求番号, 2, 10) <--- 2、10 というマジックナンバーを埋め込んでいる!
こういうマクロを残すと受け継いだ開発者はどこで何がやられているのかサッパリ。
<自動採番>というのならば、セオリー通りに<採番テーブル>を用意した方が良いと思います。
でなければ、単純に長整数で管理するがお勧め!
回答ありがとうございます!
とりあえず、テーブルやクエリ、フォーム等、リレーションで
作りこんでしまったので、主キーをオートナンバー型にするのは諦め
普通に数字のみで番号を振ることにしました。
次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!
ありがとうございました!
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
No.1
- 回答日時:
たぶんなんですけど、
「DMax("請求番号","請求テーブル")+1」が悪さしているのかと。
DMax("請求番号","請求テーブル")で返ってくる値って
"A0001"となるから、文字型ですよね?
文字型に対して、数値を加算する事はできないよー!
と言うわけではないでしょうか?
ちょっと、Accessの関数に疎いので何ともいえませんが、イメージだと、
Right(DMax("請求番号","請求テーブル"),4)+1
みたいな感じにしてみたらどうでしょう?
回答ありがとうございます!
原因はそうだったのですか。
無知ですいませんでした(ペコリ)。
とりあえず、テーブルやクエリ、フォーム等、リレーションで
作りこんでしまったので、普通に数字のみで番号を振ることにしました。
次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!
ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- Visual Basic(VBA) 複数ページあるPDFファイル内の文字列等の情報をキーにPDFをグループ分け分割したい。 2 2022/06/25 09:51
- その他(データベース) accessでのフォームの連携について 2 2022/06/14 00:45
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- 消費税 インボイスの事業者登録番号を仕入れ先から求められました? 3 2023/03/19 21:48
- Access(アクセス) access レポート 請求書について 2 2022/07/04 22:52
- Excel(エクセル) PDFファイルに日付を名前にして保存したい。 エクセル2019でワークシートに請求書のフォームを作り 2 2023/05/27 11:13
- その他(悩み相談・人生相談) クレジットカード不正利用の被害後の対応 9 2022/07/22 11:55
- Excel(エクセル) 【エクセル】元データからの引用 5 2022/04/18 10:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessで自前の自動採番処理で...
-
アクセスで「空き番」の確認
-
[Access]異なるレコード間の文...
-
Accessでのレコード存在チェック
-
Accessで日付が変わると番号が...
-
【Access】選択クエリのグルー...
-
ACCESSでの行番号の自動採番
-
条件をつけて日付の古い行を抜...
-
ACCESSで累計数量管理 仕入時...
-
access2003で学籍番号から生徒...
-
Access:抽出して、色をつけたい。
-
GROUP BYを行った後に結合した...
-
SQL文で右から1文字だけ削除す...
-
ファイル書込みで一行もしくは...
-
Oracleでの文字列連結サイズの上限
-
select句副問い合わせ 値の個...
-
ADO VBA 実行時エラー3021
-
SELECTで1件のみ取得するには?
-
アクセスでレポートの1印刷内...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
access 自動採番 年が変わる...
-
[Access]異なるレコード間の文...
-
【アクセスVBA】テーブルにフィ...
-
vba 直前の操作はキャンセルさ...
-
Accessで日付が変わると番号が...
-
条件をつけて日付の古い行を抜...
-
質問です。 下記のテーブルとデ...
-
Recordset.FindFirstについて
-
Access 文字+年ごとの自動採番
-
アクセスで「空き番」の確認
-
access2003で学籍番号から生徒...
-
Access:抽出して、色をつけたい。
-
Accessの色番号について
-
【Access】選択クエリのグルー...
-
access 自動採番 「10-AA-000...
-
sqlで質問です。 Aテーブルの登...
-
電話番号の局番と住所の検索に...
おすすめ情報