AccessでFieldsオブジェクトやDmax関数の曖昧な理解を克服したいです

こちら
https://gist.github.com/AuroraNorthernQuarter/7b9e95818e3169c0187ee5be271efaa2
にありますAccess VBAのコードに関しまして、どうしても解読できない部分が3点ほど、あります。

-------------
①SQLステートメントを作成していると思われます、

・・・
tSql = tSql & "and not (水族館ID =" & bench & "and 都道府県ID = " & storage & ")"
tSql = tSql & "and (開館日 is null or 開館日 > " & date & ")"
・・・

という箇所の、and notの使い方につきまして。
その前にwhere文があるので。

~~~~~~~
「where 管轄 = 1」であることを満たし、同時に「水族館ID = bench and 都道府県ID = storage」ではないが、「開館日 is null or 開館日 > date」である
~~~~~~~

という認識で正しいでしょうか?

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2020/05/15 07:20:07
id:moon-fondu

②「If Not kansu2(.Fields(0).Value, .Fields(1).Value, money) Then GoTo Err_Proc」
というステートメントですが、kansu2の引数に「.Fields(0).Value」等があります。
この書き方は…どういう意味でしょうか?
.(ドット)の前には、何かしらオブジェクト名等が入ったりはしないのでしょうか?
他にも「spot = spot & "and 水族館ID = " & .Fields(0).Value」や「tSql = tSql & .Fields(0).Value & "," & Fields(1).Value & ","」など、多くの箇所で利用されているので、これが何を意味しているのか…疑問です。

③number = IIf(IsNull(Dmax("番号","入場者数")),1, Dmax("番号","入場者数") + 1)
という箇所なのですが。
IIf関数でtrueの時は1に、falseの時はDmax("番号","入場者数") + 1になるというのは判ります。
ただそれを判定する評価式である「IsNull(Dmax("番号","入場者数"))」ですが。
これは「何らかの式になっていないのでは?」という疑問です。

入場者数テーブルを確認してみますと「番号」列は、単に1から1000程度の番号が並んでいるだけで、空白レコードはなさそうではあるのですが。
その状況において、「最大値の値がnullかどうか?」を示す「IsNull(Dmax("番号","入場者数"))」は、矛盾しているような…そもそも最大値は値なので、nullなんていうのはあり得ないような…どういう式なのか、疑問です。
-------------

上記疑問につきまして、ご助言いただけますと幸いです。
よろしくお願い致します。

ベストアンサー

id:a-kuma3 No.1

回答回数4867ベストアンサー獲得回数2099

ポイント1300pt

>①

「ではないが」の取りようにも思うのですが、

	tSql = tSql & "where 管轄 = 1"
	tSql = tSql & "and not (水族館ID =" & bench & "and 都道府県ID = " & storage & ")"
	tSql = tSql & "and (開館日 is null or 開館日 > " & date & ")"

の部分は、以下の条件をすべて満たすレコードを抽出する、です。

  • 管轄 = 1
  • 水族館ID = bench 且つ 都道府県ID = storage ではない
  • 開館日が設定されていないか、もしくは、開館日が date 以降である


質問用に SQL を変えていると思うので、ID の意味合いは微妙ですが、指定された bench と storage に該当するレコードは抽出の対象外、ということになります。


長ったらしく書きましたが、多分、id:moon-fondu さんの認識通りなんじゃないかと想像します。



>②
with ステートメントの内側にあるドットから始まる表記は、with で指定した変数が補われると思ってください。
With aquarium の内側にあるので、.Fields(0) は、aquarium.Fields(0) と読み替えます。

# タイプ量を少なくするための文法だと思ってください



>③
実物が分からないと何とも言えないのですが、DMax 関数は、ヒットしたレコードの一部が Null の場合には、それを無視するのですが、

  • 全てのレコードで、そのフィールドが Null だった場合
  • ひとつも該当レコードが無かった場合

には、Null を返します。
https://docs.microsoft.com/en-us/office/vba/api/access.application.dmax
# 日本語のページは、自動翻訳がおかしいので英語のページの URL にしています

扱っているシステムで、それを満たす検索条件を指定できるのかどうか分かりませんが、そういったケースを考慮してのコードだろうかと思います。

他1件のコメントを見る
id:a-kuma3

「aquarium.Fields(0)」は、tSqlに含まれております「水族館マスタ」テーブルの1列目を
参照している…という認識で正しいでしょうか?

きっと、そうなんでしょうが、正確には違います。
SQL の select が以下のようになっています。

tSql = "select 水族館ID,都道府県ID from 水族館マスタ"

select 文で指定した列のひとつ目が「aquarium.Fields(0)」です。
コードの SQL なら、水族館ID。
仮に、水族館マスタのテーブルで、水族館IDの列が4番目にあったとしても、先の SQL であれば、.Fields(0) が水族館ID の列を指します。

2020/05/14 18:52:26
id:moon-fondu

そうなんですね。確かに既に列を指定してるので、そちらが優先されるということですね。ありがとうございます、スッキリしました!

2020/05/15 07:19:53

その他の回答0件)

id:a-kuma3 No.1

回答回数4867ベストアンサー獲得回数2099ここでベストアンサー

ポイント1300pt

>①

「ではないが」の取りようにも思うのですが、

	tSql = tSql & "where 管轄 = 1"
	tSql = tSql & "and not (水族館ID =" & bench & "and 都道府県ID = " & storage & ")"
	tSql = tSql & "and (開館日 is null or 開館日 > " & date & ")"

の部分は、以下の条件をすべて満たすレコードを抽出する、です。

  • 管轄 = 1
  • 水族館ID = bench 且つ 都道府県ID = storage ではない
  • 開館日が設定されていないか、もしくは、開館日が date 以降である


質問用に SQL を変えていると思うので、ID の意味合いは微妙ですが、指定された bench と storage に該当するレコードは抽出の対象外、ということになります。


長ったらしく書きましたが、多分、id:moon-fondu さんの認識通りなんじゃないかと想像します。



>②
with ステートメントの内側にあるドットから始まる表記は、with で指定した変数が補われると思ってください。
With aquarium の内側にあるので、.Fields(0) は、aquarium.Fields(0) と読み替えます。

# タイプ量を少なくするための文法だと思ってください



>③
実物が分からないと何とも言えないのですが、DMax 関数は、ヒットしたレコードの一部が Null の場合には、それを無視するのですが、

  • 全てのレコードで、そのフィールドが Null だった場合
  • ひとつも該当レコードが無かった場合

には、Null を返します。
https://docs.microsoft.com/en-us/office/vba/api/access.application.dmax
# 日本語のページは、自動翻訳がおかしいので英語のページの URL にしています

扱っているシステムで、それを満たす検索条件を指定できるのかどうか分かりませんが、そういったケースを考慮してのコードだろうかと思います。

他1件のコメントを見る
id:a-kuma3

「aquarium.Fields(0)」は、tSqlに含まれております「水族館マスタ」テーブルの1列目を
参照している…という認識で正しいでしょうか?

きっと、そうなんでしょうが、正確には違います。
SQL の select が以下のようになっています。

tSql = "select 水族館ID,都道府県ID from 水族館マスタ"

select 文で指定した列のひとつ目が「aquarium.Fields(0)」です。
コードの SQL なら、水族館ID。
仮に、水族館マスタのテーブルで、水族館IDの列が4番目にあったとしても、先の SQL であれば、.Fields(0) が水族館ID の列を指します。

2020/05/14 18:52:26
id:moon-fondu

そうなんですね。確かに既に列を指定してるので、そちらが優先されるということですね。ありがとうございます、スッキリしました!

2020/05/15 07:19:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません