アクセスで顧客管理をしています。
DMax関数を用いて、レコードを追加する度に自動で連番を振る設定に
したいと思っていますが、上手くいかないため質問させてください。
【テーブル名】T_顧客一覧
【入力用のフォーム名】F_顧客登録
【連番を入力させたい項目(フィールド名)】No(テーブルでは主キーに設定)
とし、フォームの”No”の既定値に
=DMax("No","T_顧客一覧")+1
と入力するのですが、フォームには1としか表示されません。
非常に初歩的な質問だとは思うのですが、
何か原因として考えられることがありますでしょうか?
情報が足りないようでしたら補足させていただきます。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
追記。
一番小さい「空き番号」から埋めて行く方法を書いておきます。
フォームのテキストボックス「No」の「フォーカス取得時」のイベントプローシジャに、以下のコードを追加して下さい。
Private Sub No_Enter()
Dim db As Database
Dim rs As Recordset
Dim i As Integer
If Me.NewRecord Then
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT T_顧客一覧.[No] FROM T_顧客一覧 ORDER BY T_顧客一覧.[No];")
rs.MoveFirst
i = 1
Do Until rs.EOF
If rs.Fields(0) <> i Then
Exit Do
End If
i = i + 1
rs.MoveNext
Loop
[No] = i
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End If
End Sub
これは「頭から1、2、3…になってるか見ていって、抜けてる番号があったら、その番号をテキストボックスにセットする」と言う事をしています。
テーブル、レコードにはセットせず、テキストボックスにセットするだけなので「ユーザーが手入力した場合と同じ動作」をする為、ユーザーがフォーム上で「ESCキーを押す」などすれば、セットした値は無効になり、レコードの追加をキャンセル出来ます。
ご回答ありがとうございます。
追記いただいた方法で満足のいく結果が得られました!
おまけに、今まで手入力していたデータのミスも見つかり
非常に助かりました。
勉強不足で恥ずかしい限りです。
どうもありがとうございました。
No.4
- 回答日時:
補足: 出来ればオートナンバーではなく採番方式を!
私は、採番方式は、[DMax]->[DBMax]->[採番方式]と進化すると思います。
・テーブルが破損した場合の対策が容易です。
・なんと言っても高速処理が実現できます。
[id管理表]
id_name_____final_value
顧客一覧_ID___________0
Private Sub Form_BeforeInsert(Cancel As Integer)
If Nz(Me.ID) = 0 Then
Me.ID = NewID("ID", "顧客一覧_ID")
End If
End Sub
これですと、[final_value]を更新するだけですので超高速で処理できます。
なお、欠番対策なんて意味ないですから、それは考えられないことです。
ご回答ありがとうございます。
勉強不足のため理解するのに時間がかかってしまいました。
参考にさせていただきます!
ありがとうございました。
No.3
- 回答日時:
>オートナンバーはレコードを削除した場合などに欠番が発生すると聞いたので、出来ればそれ以外の方法で設定したいと思っています。
最大値を求める関数を使用しても、欠番が出るのは同じです。
だって「1、3、4、5、6、7、9、10」の「最大値+1」は「11」ですから。でも、貴方の欲しいのは11でなく「2」でしょう?
だったら「オートナンバーにしても、結果は同じ」ですよ。
問題なのは「規定値をどうするか?」ではなく「欠番が出た場合に、どう欠番を埋めるか?」であって、貴方は見当違いな事をしてます。
だって「欠番を埋める方法」は「オートナンバーでも、貴方のやりたい方式でも、方法は同じ」なんですから。
「方法が同じ」なら「楽な方法を使う」のが「賢い方法」ですよ。
No.2
- 回答日時:
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
もちろん、
DBMax = IIf(N <> "", N, ReturnValue)
と同じヌル対策をすれば DMax()でもOKです。
が、DMax()は実行速度がえらく遅いのでお勧めではありません。
なお、既定値を0にしておいて何かデータが入力されたら主キー値を更新するという手法もあります。
(主キーの列名は予約語と重複しない'ID'にしています)
Private Sub Form_BeforeInsert(Cancel As Integer)
If Nz(Me.ID) = 0 Then
Me.ID = DBMax("ID", "顧客一覧") + 1
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
あなたは何にトキメキますか?
「きゅんとした〜♪」 と思う瞬間ってありますよね。 それは恋愛だったり、推し活だったり、映画のワンシーンだったり……。
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
アクセスで「空き番」の確認
Access(アクセス)
-
Access 複数フォームを開き、画面の最上面にしたいフォームをコント
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データベースの1要素に複数デー...
-
ACCESS で マクロの中でフィ...
-
顧客IDを入力すると顧客名や住...
-
Access VBAでクエリーのレコー...
-
Accessデータベースで行と列を...
-
Access フォームのデータがテー...
-
Access クロス集計クエリについて
-
ACCESS2003 Aアクロバットを介...
-
Access 新規入力画面にするコー...
-
シングルクォーテーションとダ...
-
Access レコードロックについて...
-
ACCESS 顧客データ 購入履歴...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
Access テキスト型に対する指定...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
Accessでテーブル名やクエリ名...
-
エクセルグラフの凡例スペース
-
Accessのクエリでデータの入力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAでクエリーのレコー...
-
シングルクォーテーションとダ...
-
Access フォームのデータがテー...
-
Access IF文でテーブルに存在し...
-
データベースの1要素に複数デー...
-
ACCESS で マクロの中でフィ...
-
ACCESS2003 Aアクロバットを介...
-
Access 既に開いているフォー...
-
顧客IDを入力すると顧客名や住...
-
ワードでの単純作業の効率化に...
-
Access クエリ このレコードセ...
-
テーブル1 2 3 の結合
-
VBAで検索条件式の書き方教えて...
-
ワードで保存するファイル名の...
-
Accessデータベースで行と列を...
-
access フォーム間で情報が引...
-
Access レコードロックについて...
-
ACCESS 顧客データ 購入履歴...
-
文字化け、記号の含まれるフィ...
-
別のDBからテーブルをコピーす...
おすすめ情報