web-dev-qa-db-ja.com

クエリSQLの感嘆符

このクエリを読んでいると、ここに行がわからない行に出くわしました

[FETT List]![FETT Search]
  1. FETTリストは表です
  2. FETT検索はFETTリストの列です

感嘆符の意味を誰かが説明できますか?

ありがとう

16

さて、あなたは毎日何か新しいことを学びます!

私は当初、参照が[フォーム]![FETTリスト]![FETT検索]であると言えば、[FETT検索]コントロールの[FETT検索]コントロールへの参照として説明するのは簡単だと説明する予定でした。 FETTリスト]フォーム。ただし、親コレクション(フォームのレポート)がないと、SQLステートメント内のどのコンテキストでも有効な参照のようには見えません。

しかし、それをテストしようと思ったところ、(驚いたことに)このSQLステートメントがAccessフォームで有効として扱われていることがわかりました。

  SELECT [tblCustomer]![LastName] AS LastName 
  FROM tblCustomer;

Accessでは、これは次のSQLステートメントと100%同等です。

  SELECT tblCustomer.LastName 
  FROM tblCustomer;

...だから、文脈を忘れた(またはそもそも理解しなかった)場合を除いて、なぜ誰かがそれを書くのか理解できません。エイリアシングがうまくいかなかった場合かもしれませんが、それは私が良い形だと思うものではありません。

さて、!の一般的な質問に対する長い答え。 (強打)対。 (ドット):

一般に、Accessでは、bang演算子は、オブジェクトとそのアイテムのデフォルトのコレクションを示します。ドット演算子は、オブジェクトとそのメソッド、プロパティ、およびメンバーを示します。

これはAccess用であり、AccessオブジェクトとAccessのオブジェクトモデルに適用されます。

ただし、AccessでもSQLを使用しているため、SQLにはTableName.FieldNameもあり、ドット演算子はデフォルトのコレクション内のアイテムを区切ります。 TableName.FieldNameは、Forms!MyForm!MyControlがForms!MyForm.Controls( "MyControl")と同等であることがわかるように、TableName.Fields( "FieldName")の略であると見なすことができます。ただし、このルールはSQLには適用されません。TableName.Fields( "FieldName")は有効なSQLではなく、TableName.FieldNameのみが有効です。

したがって、作業している名前空間を制御しているパラダイム、つまり、Access名前空間かSQL名前空間かを正確に把握する必要があります。

Forms!MyFormもForms.Item( "MyForm")と同等であるため、超長形式はForms.Items( "MyForm")。Controls( "MyControl")になります。 bang演算子は、ドット演算子を使用した長い形式のバージョンのショートカットであるため、ドット演算子よりもbang演算子が頻繁に使用されることに注意してください。また、名前が変数に格納されているアイテムを参照する必要がある場合は、長い形式が使用されることになります。これは、bang演算子では不可能です。

  Dim strForm As String

  strForm = "MyForm"
  ' This is OK
  Debug.Print Forms(strForm).Controls.Count
  ' This is not
  Debug.Print Forms!strForm.Controls.Count

また、VBAコードでは、Microsoftは、フォームとレポートでこの区別を難読化するように設計しました。以前は、Me!MyFavoriteControlはコントロール参照として合法であり、Me.MyFavoriteControlはカスタムへの参照としてのみ合法でした。プロパティ(またはオブジェクトのメンバーとなるモジュールレベルの変数)。また、関数またはサブに「MyFavoriteControl」という不適切な名前を付けて、ドット演算子で参照することもできます。

しかし、VBAの導入により、MSは、ドット演算子を使用できるように、すべてのコントロールの周りに暗黙的に作成された(および維持された)非表示のプロパティラッパーを導入しました。これには1つの大きな利点がありました。それは、制御参照のコンパイル時チェックです。つまり、Me.MyFavoriteControlと入力し、その名前によるコントロールがなく、フォーム/レポートの名前空間内にその名前を持つ他の種類のメンバーがない場合、コンパイル時エラーが発生します(実際には、エラーが発生したコード行を離れるとすぐにエラーが通知されます)。したがって、このコードがある場合:

  Debug.Print Me.Control1

...そしてControl1の名前をMyControlに変更すると、次にコードをコンパイルしたときにエラーが発生します。

コンパイル時チェックの欠点は何でしょうか?まあ、いくつかのこと:

  1. コードは、プログラマーが一目で理解するのが難しくなります。以前は、Me!Referenceは、フォーム/レポートのデフォルトコレクション(フィールドコレクションとコントロールコレクションの結合)のアイテムを意味していました。ただし、Me.Referenceは、コントロール、フィールド、カスタムプロパティ、パブリックモジュールレベルの変数、パブリックサブ/関数、または、または...である可能性があります。したがって、コードの即時理解性が犠牲になります。

  2. vBAとそのコンパイルの暗黙の動作に依存しています。これは通常は問題ありませんが(特にコードを適切に管理している場合)、 VBAコンパイルは非常に複雑で、破損する可能性があります 。長年にわたり、経験豊富な開発者は、ドット演算子を使用すると、アプリケーションの一部と同期しなくなる可能性のある非表示のコードの別のレイヤーが追加されるため、コードが破損しやすくなると報告していますcan明示的に変更できます。

  3. これらの暗黙的なプロパティラッパーを制御できないため、問題が発生した場合は、モジュールを含むオブジェクトを最初から再作成する必要があります(通常、SaveAsTextは、何も失うことなく破損をクリアするのに十分です)。

そのため、多くの経験豊富な開発者(私自身を含む)は、フォーム/レポートのコントロールにドット演算子を使用していません。

標準的な命名規則のセットを使用する場合、一部の人が考えるほど大きな犠牲にはなりません。たとえば、フォームにバインドされたコントロールがある場合は、デフォルトの名前(つまり、コントロールがバインドされているフィールドの名前)を使用できるようにします。コードでコントロールを参照しない場合、その名前を変更することはありません。ただし、コードで初めて参照するときは、コントロール名がバインドされているフィールドの名前と異なるように名前を変更します(この明確化は特定のコンテキストで重要です)。したがって、MyFieldというテキストボックスは、コードで参照することにしたときにtxtMyFieldになります。コードを記述した後でフィールド名を変更するのは、フィールドの名前が間違っているとどういうわけか判断した場合だけです。その場合、検索/置換を行うのは簡単です。

Intellisenseをあきらめることはできないと主張する人もいますが、bang演算子を使用するときに完全に諦めるというのは真実ではありません。はい、あなたは「本当にインテリジェントな」インテリセンス、つまりインテリセンスリストを選択したオブジェクトのメソッド/プロパティ/メンバーに制限するバージョンをあきらめますが、そのためには必要ありません-キーストロークを保存するためにインテリセンスが必要です、およびCtrl-SPACEBARを使用すると、コンテキスト固有のIntellisenseと同じようにオートコンプリートする完全なIntellisenseリストを取得し、入力を短縮できます。

ドット/バンの混乱のもう1つの領域は、VBAコードのDAOレコードセットです。ここでは、レコードセットを開くために使用するSQLのドット演算子と結果のレコードセットのフィールドを参照するためのバン演算子を使用します。

  Dim rs As DAO.Recordset

  Set rs = CurrentDB.OpenRecordset("SELECT MyTable.MyField FROM MyTable;")
  rs.MoveFirst
  Debug.Print rs!MyField

  rs.Close
  Set rs = Nothing

作業している名前空間を覚えていれば、これはそれほど混乱しません。ドットはSQLステートメントで使用され、バングはDAOコードで使用されます。

したがって、要約すると:

  1. sQLでは、テーブルのフィールドにドット演算子を使用します。

  2. フォームとレポートでは、コントロールにbang演算子を使用し、プロパティ/メソッドにdot演算子を使用します(ただし、dot演算子を使用することもできますが、必ずしもお勧めできるわけではありません)。

  3. vBAコードでは、フォームとレポートのコントロールへの参照でドットまたはバングのいずれかを使用できますが、ドットはコードが破損する可能性があります。

  4. sQLでは、bang演算子が使用されていることがありますが、Accessフォームまたはレポートに、「Form!FormName!ControlName」または「Report!ReportName!ControlName」の形式のコントロールへの参照がある場合に限ります。

  5. dAOレコードセットを操作するVBAコードでは、ドット演算子とbang演算子の両方が表示される場合があります。前者は、レコードセットを開くために使用されるSQLを定義し、後者は、開いたときに結果のレコードセットのフィールドを参照します。

それはあなたにとって十分に複雑ですか?

21
David-W-Fenton

感嘆符は従来のセパレーターに過ぎないと思います。

Oracle PL/SQLでは、ドットを使用します。

[FETTリスト]。[FETT検索]

他の手がかりはありますか?!

0
UltraCommit