ここから本文です

Access2016でフォーム上の複数のテキストボックス(数値型)に値を入力し、主キー...

cha********さん

2020/7/318:12:10

Access2016でフォーム上の複数のテキストボックス(数値型)に値を入力し、主キーとなるIDを作成したいのですがうまくいきません。

具体的には年度のテキストボックスとあと2つのテキストボックスの値を合成して、8桁のIDを作成したいのです。
年度が2020(4桁のうち下2桁を採用)、X種別が例えば30(2桁)、Y区分が例えば4(1桁)、残る3桁を連番にする形です。つまり、年度+種別+区分毎に固有のIDを001から付番したいということです。
IDのフォーカス取得時のイベントプロシージャにVBAにより以下のように記述し、Dmax関数やDcount関数も組み合わせてトライしましたが、知識不足でうまくいきません。

例 ○○ID = ([年度] - 2000) * 1000000 + [X種別] * 100000 + [Y区分] * 1000 + 1
上記の条件から、20304001となり、種別が変わると新規で1番から採番される仕組みです。
つまり、20304001,002,003…010であるとか、20512001,002,003…010というように自動付番によりIDが作成できればと考えております。

また、年度が変わった際には、新たに21304001,002,003…010としたいのですが、難しくてお手上げ状態です。

解決するため、ネットで調べたり、Accessの教本を読みましたがダメでした。なんとか解決したいので、ご教授いただける方がおられましたら、よろしくお願いいたします。

閲覧数:
56
回答数:
4
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

m3_maki0さん

2020/7/817:19:36

参考
日付別の通し番号(連番)を付ける
https://www.sk-access.com/mailmaga/vol285.html
主キーに複数の意味を持たせるな
https://hatenachips.blog.fc2.com/blog-entry-201.html
ACCESSで日付ごとに自動連番(日付+連番)する方法
https://oshiete.goo.ne.jp/qa/5873225.html

この辺りのことはご理解なさっているでしょうか。

数字だけからなるキー項目のデータ型をどうするか、という問題ですが、
質問者さんの8桁の ID では上記3番目の問題が生じます。
尤も80年後ですが。(ほぼ出てこないと言っていい)

80年後には出てくるとわかっているバグをそのままリリースするのは
ちょっと問題ありです。
理系の人間なら耐えられないでしょうね。

ということで、ID はテキスト型に変更することをお勧めします。
抽出もはるかに簡単になります。
おそらくスピードも速くなると思われます。

とりあえず テキスト型に変更して
https://oshiete.goo.ne.jp/qa/5873225.html
こちらを参考にしてみてください。

  • m3_maki0さん

    2020/7/1016:29:10

    ID が 数値型の例です。
    [X種別] が2桁、[Y区分] が1桁の場合に動作するよう修正しました。

    Dim AutoID As Long
    Dim MaxID As Variant
    Dim strWhere As String

    AutoID = ([年度] - 2000) * 1000000 + [X種別] * 10000 + [Y区分] * 1000

    strWhere = "ID Between " & AutoID & " And " & AutoID + 999
    MaxID = DMax("ID", "テーブル1", strWhere)

    If MaxID - AutoID = 999 Then
    MsgBox "連番がオーバーフローしました。"
    Else
    Me.ID = Nz(MaxID, AutoID) + 1
    End If

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2020/7/10 19:14:13

ご教授ありがとうございました。当方、Accessはまだまだ勉強不足で、やりたいことは沢山あるのですが、知識が追いついておりません。教えていただいたことに、何とか当初の目的を実現したいと思います。丁寧な説明本当にありがとうございました。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

tho********さん

2020/7/722:36:41

ご質問の内容、例えば年度の取得はDate関数を用いればテキストボックスからの入力は不要です。
次に、区分についてはコンボボックスで選択した値を使えば良いです。
さらに、最後の3桁については、もともと取られている値に対してインクリメントをする必要があります。(重複を防ぐため)

したがって、まずは上7桁については自動で発番できると思いますから、これに対してSQL文のWHERE構文に上7桁に一致するレコードを抽出し、この中から最大になる値を取得して、インクリメントをすれば良いと思います。

レコードを細かくチェックする場合は、ADOを用いると良いです。

https://www.latest-info-system.com/access-vba%e3%80%80ado%e3%81%ab%...

私自身採番するシステムをAccessで作成しましたが、重宝しており社内システムで活用されていますよ!

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

bbw********さん

2020/7/606:54:25

連番ではダメなの?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

scpencilさん

2020/7/318:35:51

どうもです
例 ○○ID = ([年度] - 2000) * 1000000 + [X種別] * 100000 + [Y区分] * 1000 + 1
これは普通に計算してしまうようですが?
○○ID =Cstr([年度] - 2000) +Cstr( [X種別] ) +Cstr( [Y区分]+ 1)

数値にしたいなら
○○ID =Cint(Cstr([年度] - 2000) +Cstr( [X種別] ) +Cstr( [Y区分]+ 1))
かな?

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる