質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

2385閲覧

Access 件数指定を超えた場合の処理

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/07/04 04:18

##質問内容
管理システムを作成しているのですが、マスタにそれぞれ登録できるレコード数(件数)
が、指定してある件数を超える場合、追加できないような処理について質問させていただきます。

それぞれ顧客、商品、担当者etc 各マスタがあるのですが、そこに最大で
999999件登録できるようにしてあります。

マスタフォームのフッターに追加コマンドボタンがあり、それを押すと新規登録フォームが開きます。そこでは、自動採番して、開いたときに番号を振るようにしています。
※採番については、過去に協力していただいた私の質問を参考に→こちら

この場合、マスタの追加コマンドボタンを押して、新規入力フォームが開くときにIf文で番号の大きさで、分岐させればよいのでしょうか。

追加コマンドボタンをクリック時は今のところこのような感じです。

VBA

1'---------------------------- 2'追加ボタン使用時 3'---------------------------- 4Private Sub Button_Add_Click() 5 '顧客入力を開く 6 DoCmd.OpenForm "F_WCustomerInput", , , , , , "追加" 7End Sub

アドバイスのほうお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そもそもですけど、必要な情報を追加できないシステムには意味がありません。
番号を管理する場合の番号の上限は上限を迎えないように設計するのが普通です。

それを前提に、もし上限を迎えた時の考慮というなら、
・登録フォームを開く前に最大番号をチェックして番号を超えている場合は、メッセージ表示して登録フォームは開かない
という処理は考えられるでしょう。

投稿2019/07/04 04:38

編集2019/07/04 04:39
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/04 05:10

>番号の上限は上限を迎えないように設計 というのは、上限自体まず制限するものではないということでしょうか?それとも、まず、普通に考えて到達するはずのない上限を設定するということでしょうか? 本題ですが、 処理の考え方としては、上記のものでも大丈夫ということでしょうか?
sazi

2019/07/04 05:53 編集

>普通に考えて到達するはずのない上限を設定する です。 「上記のもの」というのが、私の回答という事なら、上限超過が起きた場合の本題への回答です。
退会済みユーザー

退会済みユーザー

2019/07/04 05:39

了解いたしました。 ありがとうございます。
guest

0

ベストアンサー

過去の質問と回答をきちんと確認してませんが、レコードが途中で削除され採番値が歯抜けになる可能性はあるのでしょうか。
(仮に途中のレコードが1件削除されている場合、999998件しかデータがないのに採番値は999999になるという状況はあるのか)

その場合999999件目のレコードの採番値は1000000になると思いますが、採番値が6桁を超えることで不都合がありますか?

vba

1もしテーブルの件数が登録可能上限値以下なら 'もしくは採番値が最大値以下なら 2 登録用のフォームを開く 3それ以外の場合 4 「これ以上登録できません」というメッセージを出す 5終了

ここから追記
コメントしたDLookup("最大値設定フィールド名", "採番テーブル名", "[ID] = 1")"[ID] = 1"について
質問に提示してあった過去の質問を見ると採番用のテーブルがあったようなのでこういう状態を想定してました。

ID採番値最小最大フォーマット備考
1006425000001999999000000顧客用
2000753000001999999000000商品用
3076152000001999999000000担当者用

テーブル名、フィールド名が前の質問のままかわからず、例として挙げた顧客マスターを表すレコードをどう表現していいかわからなかったのですが、おそらくIDをF_NumCode、1を顧客用の所のF_NumCodeの値に読み替えていただければいいのではないかと思います。この辺はDLookupの使い方調べてみてください。
採番テーブルではなく顧客マスターテーブルの最大値(DMaxの方)を使うなら気にしなくて大丈夫です。

投稿2019/07/04 05:17

編集2019/07/05 07:40
dit.

総合スコア3235

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/04 05:35

回答ありがとうございます。 レコードの削除については、論理削除にしているで、マスタのもとになっているテーブルに削除フラグのフィールドがあり削除ボタンを押すことによってフォーム上では表示されませんがテーブルにはチェックが入っているだけで実際にはデータが残っているという状況になっています。 ですので、フォームで表示されている件数が999998という場合でも実際にテーブルに999999件入っているわけなので結論をいうと、歯抜けになる可能性はあります。
退会済みユーザー

退会済みユーザー

2019/07/04 05:38

あらかじめ採番テーブルで最小0から最大999,999までと定めているので、実際1,000,000を超えようとすると当然ですが、エラーが発生するといった現状です。
dit.

2019/07/04 06:01

あぁ、削除用のYes/Noフィールド的なものがあるんですね。 その場合テーブルには999999件登録されているけど有効レコードは999998件ですよね。 次の新規レコードの扱いはどうする仕様なのでしょうか。 登録させないようにする という方向の場合、回答のコメント部にある通り「採番値と最大値を比較」し、上限なので登録できません と表示して終わらせるだけです。 使用者からしたら「あと1件登録できるはずなのに…」となりますが。
退会済みユーザー

退会済みユーザー

2019/07/04 06:28

登録させないようにします。 その場合どのように比較対象を文で書けばいいのでしょうか。 ifの条件式 比較対象 >= 999999 という風にしたいのですが。
dit.

2019/07/04 07:41

「顧客マスターの現在の最大値」or「採番テーブルの採番値」と「設定された上限」を比較することになります。 顧客マスターの現在の最大値:DMax("IDフィールド名", "顧客マスターテーブル名") 採番テーブルの採番値:DLookup("採番フィールド名", "採番テーブル名", "[ID] = 1") '採番テーブルにおける顧客マスターのIDが1なら 設定された上限:DLookup("最大値設定フィールド名", "採番テーブル名", "[ID] = 1") '採番テーブルにおける顧客マスターのIDが1なら ifに直接入れるのがごちゃごちゃして嫌なら、適当な変数を作って入れてください。(変数名はお好きにつけてください/型が違うようなら修正を) Dim 現在顧客最大 As Long, 設定上限 As Long 現在顧客最大 = DMax("IDフィールド名", "顧客マスターテーブル名") 設定上限 = DLookup("最大値設定フィールド名", "採番テーブル名", "[ID] = 1") If 現在顧客最大< 設定上限 Then 登録フォームを表示 Else msgbox "登録の上限に達しているためこれ以上登録できません" End If テストしてないのでうまく動くかわかりませんが…。
退会済みユーザー

退会済みユーザー

2019/07/05 07:05

回答ありがとうございます。 恥ずかしながら、"ID = 1" という条件がまだいまいちピンと来ていないので、よろしければ詳しくお願いしてもよろしいでしょうか。
dit.

2019/07/05 07:26

コメント欄だとわかりづらいので回答に追記します。 しばしお待ちを。
退会済みユーザー

退会済みユーザー

2019/07/08 00:12

Private Sub Button_Add_Click() Dim MGT As String Dim SETMAX As String MGT = DLookup("F_MgtCode", "T_Num", "F_TableName = Customer") SETMAX = DLookup("F_Max", "T_Num", "F_TableName = Customer") If MGT < SETMAX Then '顧客入力を開く DoCmd.OpenForm "F_WCustomerInput", , , , , , "追加" Else MsgBox "登録の上限に達しているためこれ以上登録できません" End If End Sub ※dit.さんのいうところのF_NumCodeをF_TableNameに変更、値をCustomrにしました。 のように実行してみたのですが、Customerのところでクエリのパラメータについての実行時エラーがでてうまく分岐が出来なかったです。アドバイスがあれば、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2019/07/08 02:04 編集

↑Customerの部分を文字列としての、シングルクォーテーションを忘れていました。 お騒がせしました。 以上で問題を解消することが出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問