プロが教えるわが家の防犯対策術!

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

原因がまったくわかりません。
よろしくお願いします!

A 回答 (4件)

エラーの原因は#1のご回答通りだと思いますが、請求書番号作りなどで苦労しなくても良いような気もします。


単純に請求書番号をオートナンバーにしておき、入力フォームで請求番号を
・書式:\A0000
・使用可能:いいえ
にしておく。後は請求書印刷時などにFormat関数で整形してやればよいのでは?
    • good
    • 0
この回答へのお礼

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

次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!

ありがとうございました!

お礼日時:2008/06/27 23:56

補足:ちょっと手法に疑問が・・・。



? Format(DBMAx("Right(請求番号, 4)", "請求台帳")+1, "A0000")
? Format(DBMAx("Mid(請求番号, 2, 10)", "請求台帳")+1, "A0000")

で動作するが、致命的な欠陥があります。

Right(請求番号, 4) <--- 4 というマジックナンバーを埋め込んでいる!
Mid(請求番号, 2, 10) <--- 2、10 というマジックナンバーを埋め込んでいる!

こういうマクロを残すと受け継いだ開発者はどこで何がやられているのかサッパリ。
<自動採番>というのならば、セオリー通りに<採番テーブル>を用意した方が良いと思います。
でなければ、単純に長整数で管理するがお勧め!
    • good
    • 0
この回答へのお礼

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

次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!

ありがとうございました!

お礼日時:2008/06/27 23:56

請求台帳:



[請求番号]__[請求日]_____[顧客マスタ_顧客番号]
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
    • good
    • 0

たぶんなんですけど、


「DMax("請求番号","請求テーブル")+1」が悪さしているのかと。
DMax("請求番号","請求テーブル")で返ってくる値って
"A0001"となるから、文字型ですよね?
文字型に対して、数値を加算する事はできないよー!
と言うわけではないでしょうか?

ちょっと、Accessの関数に疎いので何ともいえませんが、イメージだと、
Right(DMax("請求番号","請求テーブル"),4)+1
みたいな感じにしてみたらどうでしょう?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
原因はそうだったのですか。
無知ですいませんでした(ペコリ)。

とりあえず、テーブルやクエリ、フォーム等、リレーションで
作りこんでしまったので、普通に数字のみで番号を振ることにしました。

次作る際は英数字でチャレンジしたいと思います。
このページは大切に保管します!

ありがとうございました!

お礼日時:2008/06/27 23:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す