見出し画像

Accessオブジェクト命名規則

■ "わかりやすさ"を目指す為


アプリの作り方、作る順番は、人それぞれ。

私🍶の場合は、「メインメニュー」を一番最初に作ります。

理由があります。

一番の理由は、Accessの各オブジェクトの命名の為。

二番目の理由もあって、自分の作り方を確立。

自分1人で制作しても、後から見たら、赤の他人が作った様に思えてしまうのが、自作ツールというもの。

いわゆる「明日の自分は他人現象」
その現象を緩和させる為にもあります。

要するに、システム内の構造を "わかりやすく" する為。

実際の画面。

メインメニューとオブジェクトの関係性


メインメニューの機能に番号を付与しています。

実例で、一番上のコマンドが
「1.送料テーブルのメンテナンス」です。

番号が「1」です。

で、クエリ、フォーム、レポート、マクロ、モジュールにも、001、002、と番号を付与させています。

各オブジェクトの名前の番号は、メインメニューの番号に合わせています。

メインメニューの「1.送料テーブルのメンテナンス」で新しいフォームが開きますが、そのフォームは、「frm_001_送料メンテナンス」となります。
コードを見る必要なし。

「frm_001_送料メンテナンス」で使用されている
クエリは、
「qry_001_サイズ荷姿対比表」と「qry_001_送料テーブル」。
レポートは、
「rpt_001_送料一覧」となるわけです。


私が初めてAccessを触って、アプリを作り始めたのは、1998年の頃。
あれから25年以上は経過。
25年の結果での、命名規則が図の様になっています。

これだけでも、「このクエリは、ここの機能で使われている」が見ただけで判断ができます。

ただし、この命名規則には、Accessのシステム作りにて、1つの制限を与えます。

それは、「サブメニュー禁止」

例えば、メインメニューで、「1.送料テーブルのメンテナンス」をクリックすると、「frm_001_送料メンテナンス」が開きます。
「frm_001_送料メンテナンス」から、新たに開けるフォームを作成することを禁止するルールです。

サブメニューを許してしまうと、この命名規則が複雑化します。
だから禁止としています。
Accessでアプリを作っている人で、このルールを明記している人はいるのかは不明瞭ですが・・・これが25年間Accessでシステムを作ってきた結論です。

ということで、Accessで新規に作成する場合、私🍶は、初めにこの操作を実行します。

オブジェクトブラウザを名前の順にする

オブジェクトブラウザで右クリックメニューで名前の順番で並び替えします。

■ 連続データ処理のクエリ名


シンプル イズ ベスト

ま、素晴らしい言葉ですが、実務って簡単じゃないから、処理も複雑なものになりがちです。

ある一つの結果を出力する為に、複数のデータ処理をしなければならない場合もあります。

実例は下図のようになりますが、正直良くない💦

クエリ名

でも、処理する順番はわかりますね。

それと、クエリ名は、恐れず長い名前を付けちゃいましょう!

正直、SQL文やクエリのデザインを見たところで、
理解できる人はどのくらいいるのでしょうか。

疑問です。

ある程度の処理内容を名前に書いてしまうのが良いです。

一つのフォームに、複数の独立した処理がある場合なら、下のような命名をすると良いと思います。


--- 連続した処理例 ---

qry_008_02_売上データ更新_01_トランザクションテーブルクリア
qry_008_02_売上データ更新_02_更新データ抽出01_○○情報_01
qry_008_02_売上データ更新_02_更新データ抽出01_○○情報_02
qry_008_02_売上データ更新_03_更新データ抽出02_△△情報_01
qry_008_02_売上データ更新_03_更新データ抽出02_△△情報_02
qry_008_02_売上データ更新_04_更新データをトランザクションテーブルに追加
qry_008_02_売上データ更新_05_本テーブルのデータ更新
qry_008_02_売上データ更新_06_本テーブルにデータ追加

qry_008_03_売上データのダウンロード_01_データ抽出
qry_008_03_売上データのダウンロード_02_抽出データのインポート
qry_008_03_売上データのダウンロード_03_ダウンロードデータ

-------

qry_<処理番号>_<処理の名前>_<処理順番>_<処理している内容>_<[順番]>

こんな感じです。
名前を長くして、分かりやすくを求めるのが吉です。
これによって「明日の自分は他人現象」を抑えられます。

■ 番号が無いオブジェクト


番号を付けましょうと書いておきながら、番号がないオブジェクトも存在します。

番号が無いオブジェクト


クエリであれば
「qry_送料抽出クエリ」

マクロは、全部。

モジュールにも複数存在しています。

これらは、「汎用オブジェクト」です。

つまり、複数の機能から使用されるオブジェクトのこと。
番号が無いオブジェクトは、どこの機能からでも利用されていると意味付けしており、変更するには、注意が必要と、無言の警告。


あまり、テクの記事を書かないと宣言しましたが、まったくしないとは書いていないので、テクの話をします。

「qry_送料抽出クエリ」

こいつの中身を見せます。

PARAMETERS Mover Text ( 255 ), KeyDate DateTime, Region Text ( 255 ), SizeA Long;
SELECT tbl_送料テーブル.配送方法, tbl_送料テーブル.[サイズ], tbl_送料テーブル.都道府県, tbl_地方テーブル.地方, tbl_送料テーブル.送料, tbl_送料テーブル.有効開始日 AS 有効開始日の最大
FROM (tbl_送料テーブル INNER JOIN tbl_地方テーブル ON tbl_送料テーブル.都道府県 = tbl_地方テーブル.都道府県) INNER JOIN (SELECT A.配送方法, A.[サイズ], B.地方, Max(A.有効開始日) AS 有効開始日の最大 FROM tbl_送料テーブル AS A INNER JOIN tbl_地方テーブル AS B ON A.都道府県 = B.都道府県 WHERE A.有効開始日<=[KeyDate] GROUP BY A.配送方法, A.[サイズ], B.地方)  AS C ON (tbl_送料テーブル.有効開始日 = C.有効開始日の最大) AND (tbl_地方テーブル.地方 = C.地方) AND (tbl_送料テーブル.[サイズ] = C.[サイズ]) AND (tbl_送料テーブル.配送方法 = C.配送方法)
WHERE (((tbl_送料テーブル.配送方法)=[Mover]) AND ((tbl_送料テーブル.都道府県)=[Region]) AND ((tbl_送料テーブル.[サイズ])=[SizeA]))
GROUP BY tbl_送料テーブル.配送方法, tbl_送料テーブル.[サイズ], tbl_送料テーブル.都道府県, tbl_地方テーブル.地方, tbl_送料テーブル.送料, tbl_送料テーブル.有効開始日
ORDER BY tbl_送料テーブル.[サイズ], tbl_地方テーブル.地方;


個人的感想ですが、Accessでシステムを作る人で、クエリにパラメータを設定している人は少ないと思います。
多くの人は、WHERE句に、フォームの値、オブジェクト名を指定していると思います。

ただ、WHERE句に、オブジェクト名を指定してしまうと、汎用性0で専用のオブジェクトになります。

悪くはないですが、事例のような、複雑なクエリの場合、何個も作りたくないものです。

その時に、パラメータクエリが便利になってきます。
VBAでパラメータ値を指定して、レコードセットとして取り扱い可能になります。

VBAでは、ADODBのCommandオブジェクトを利用して、パラメータ値を設定します。
CommandオブジェクトのParamerersコレクションに、CreateParameterメソッドを利用することで、パラメータ値を設定できるようになります。

■ まとめ?

Access では、オブジェクトの組み合わせでシステムを作っていきます。

その為、これからの作業をした説明をする前に、命名規則の事例を紹介しました。
たぶん、ここまで細かく説明した記事は無いと思います。
参考にしていただければ、嬉しく思います。


余談ですが、私は、Accessで、クエリを1個も作成しない人を見た事があります。(現役の人です)
その人曰く「増えると混乱してくるから、修正が大変だから」と言っていて、全てVBAでSQL文ゴリゴリ書いていました。

内心は「そんなに変更あるかな?混乱するかな?」と思っていますが、
作り方は人それぞれです。
正解も無ければ不正解もないです。

でも、SQL文の訂正って苦な作業です。
だったら、出来る限りクエリを利用した方が良いと思います。

ま、以上になります。

ここまで読んでいただいてありがとうございました。

この記事が気に入ったらサポートをしてみませんか?