まったくわかりません!
よろしくお願いします。
仕様環境
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も見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
access 自動採番 「10-AA-0001」にするには。
その他(データベース)
-
accessのレポートであとから他のテーブルのフィールドを追加する方法
Access(アクセス)
-
ACCESSで日付ごとに自動連番(日付+連番)する方法
Access(アクセス)
-
-
4
access 自動採番 年が変わるごとに0001に戻る仕組み。
その他(データベース)
-
5
accessでの文字列の混ざった連番処理について
Access(アクセス)
-
6
accessでオートナンバーを使わずに「文字+数字」の自動採番する方法
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
【SQL】existsでの商演算
-
SQL文で右から1文字だけ削除す...
-
カレントレコードが無い事を判...
-
ファイル書込みで一行もしくは...
-
実績累計の求め方と意味を教え...
-
複数テーブルのMAX値の行データ...
-
アクセス クエリ-で空白以外の...
-
複数の表の条件でのDELETE文
-
【初歩】ラジオボタンをつかっ...
-
Excelで、改行がある場合の条件...
-
集計後の数値が倍になる
-
【MYSQL】asでリネームしてwher...
-
SQLについて質問です。 AVG関数...
-
DataGridViewの内容をDBに反映...
-
ワードの差込印刷で教えて下さ...
-
OracleのSQL*PLUSで、デー...
-
データグリッドのセルにtex...
-
アクセスでレポートの1印刷内...
-
月別、販売員別の集計がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessで別テーブルの値をフォ...
-
Accessで日付が変わると番号が...
-
Accessでのレコード存在チェック
-
最新の日付とその金額をクエリ...
-
SELECT * FROM `生徒名簿` INNE...
-
access 自動採番 年が変わる...
-
〜のような結果を出すためのSQL...
-
【アクセスVBA】テーブルにフィ...
-
access 自動採番 「10-AA-000...
-
Access:抽出して、色をつけたい。
-
アクセスで「空き番」の確認
-
access 請求番号の自動採番
-
[Access]異なるレコード間の文...
-
条件をつけて日付の古い行を抜...
-
Access 文字+年ごとの自動採番
-
【SQL】existsでの商演算
-
【Access】選択クエリのグルー...
-
vba 直前の操作はキャンセルさ...
-
access2003で学籍番号から生徒...
-
質問です。 下記のテーブルとデ...
おすすめ情報