Points d'exclamation dans une requête SQL
Je suis en train de lire au cours de cette requête, et je suis tombé sur une ligne où je ne comprends pas heres la ligne
[FETT List]![FETT Search]
- FETT de la Liste est un tableau
- FETT de Recherche est une colonne de FETT Liste
Quelqu'un peut m'expliquer ce que le point d'exclamation signifie?
Grâce
source d'informationauteur ChickSentMeHighE
Vous devez vous connecter pour publier un commentaire.
Généralement on le voit dans MS Access code (pour le point d'exclamation, une période de SQL server). Vous pouvez faire référence à une colonne de la table.colonne ou si vous donner à la table d'un alias, puis par alias.la colonne. Vous pouvez le faire si vous voulez être précis lors de l'utilisation de jointures, ou vous pouvez avoir à le faire lorsque deux (ou plus) des tables dans une requête de jointure ont le même nom de colonne de chaque table.
Bien, vous apprenez quelque chose de nouveau chaque jour!
J'avais prévu à l'origine pour expliquer que si tu avais dit la référence [Formulaires]![FETT de la Liste]![FETT], alors il serait facile d'expliquer, comme une référence à la [FETT de Recherche] sur le [FETT Liste]. Mais sans un parent (collection des Rapports de Formes), il ne ressemble pas à une référence valide dans n'importe quel contexte à l'intérieur d'une instruction SQL.
Mais ensuite j'ai pensé à le tester, et découvert (à ma grande surprise) que cette instruction SQL est traité comme valide dans un formulaire Access:
Dans l'Accès, c'est-à 100% équivalent à cette instruction SQL:
...donc je ne comprends pas pourquoi quelqu'un voudrait l'écrire, sauf si ils ont oublié le contexte (ou jamais compris c'est en premier lieu). Il pourrait être un cas de l'aliasing est mal passé, mais ce n'est pas ce que je considère comme une bonne forme.
Maintenant, la réponse à la question générale de ! (bang) vs . (dot):
En général, dans l'Accès, le bang opérateur définit la valeur par défaut de la collection d'un objet et de ses éléments. L'opérateur point délimite un objet et ses méthodes, les propriétés et les membres.
C'est pour Accèset s'applique à l'Accès des objets et le modèle objet pour Accéder à.
Mais vous pouvez également utiliser SQL dans Access, et donc, vous avez également TableName.Nom du champ en SQL, où l'opérateur point sépare un élément dans une collection par défaut. TableName.FieldName pourrait être considéré comme court pour TableName.Champs("FieldName"), que vous trouverez avec des Formes!MyForm!MyControl étant l'équivalent de Formes!MyForm.Les Témoins("MyControl"). Mais cette règle ne s'applique pas dans SQL -- TableName.Champs("FieldName") n'est pas valide SQL, seulement TableName.FieldName est.
Donc, vous avez à garder de droite dont le paradigme est le contrôle de l'espace de noms dans lequel vous travaillez, c'est à dire, si c'est un Accès à un espace de noms ou SQL espace de noms.
Formes!MyForm est aussi l'équivalent de Formes.Élément("MyForm"), de sorte que les ultra-forme longue serait Formes.Les Éléments("MyForm").Les Témoins("MyControl"). Notez comment le bang opérateur est un raccourci pour la forme longue de la version avec l'opérateur point, de sorte que le bang de l'opérateur est très fréquemment utilisé dans les préférences de l'opérateur point. Notez également que la forme longue finit par être utilisé lorsque vous avez besoin de se référer à un élément dont le nom est stocké dans une variable, ce qui n'est pas possible avec le bang opérateur:
Aussi, dans le code VBA, Microsoft a conçu des choses à dissimuler cette distinction dans les Formulaires et Rapports, où il sert à être que Moi!MyFavoriteControl était légal comme une référence de contrôle, et Moi.MyFavoriteControl aurait été légal seulement comme une référence à une propriété personnalisée (ou d'un module de niveau variable, qui serait membre de l'objet). Vous pouvez aussi imprudemment nom d'une fonction ou sous "MyFavoriteControl" et il peut être renvoyé avec l'opérateur point.
Mais avec l'introduction de VBA, MS introduit implicitement créés (et maintenu) propriété hidden wrappers autour de tous les contrôles, de sorte que vous pouvez utiliser l'opérateur point. Cela a eu un énorme avantage, et c'est au moment de la compilation de la vérification des références de contrôle. C'est, si vous tapez Moi.MyFavoriteControl et il n'y a aucun contrôle de ce nom et qu'aucun autre membre d'aucune sorte avec ce nom dans le formulaire de rapport de l'espace de noms, alors, vous obtiendrez une erreur de compilation (en effet, vous seriez informé de l'erreur dès que vous avez quitté la ligne de code où vous avez fait l'erreur). Donc, si vous avez eu ce code:
... et vous avez renommé Control1 être MyControl, vous obtiendrez une erreur, la prochaine fois que vous avez compilé le code.
Ce qui pourrait être la baisse de la compilation de vérification? Eh bien, plusieurs choses:
code devient plus difficile pour le programmeur de comprendre à vue. Dans le passé, Moi!Référence signifiait un élément dans la collection par défaut d'un formulaire/état (qui est une union des Champs et des Contrôles des collections). Mais Moi.Référence pourrait être un contrôle ou d'un champ ou une propriété personnalisée ou à un public de niveau module variable ou un public sub/function ou, ou, ou... Donc, il sacrifices immédiats code de la compréhensibilité.
vous êtes en fonction implicite comportement de VBA et de sa compilation. Tout cela est généralement un OK de chose à faire (surtout si vous prenez bien soin de votre code), VBA compilation est très complexe et sujette à la corruption. Au fil des années, les développeurs expérimentés ont signalé que l'utilisation de l'opérateur point rend le code plus sujette à la corruption, car elle ajoute une autre couche de code caché qui peuvent être synchronisés avec les parties de l'application que vous peut modifier explicitement.
puisque vous ne pouvez pas contrôler ces implicite de la propriété wrappers, quand ils vont mal, vous devez recréer votre module portant objet à partir de zéro (généralement SaveAsText est suffisante pour effacer la corruption, sans rien perdre).
De nombreux développeurs expérimentés (moi y compris) ne pas utiliser l'opérateur point pour les contrôles de formulaires et de rapports.
Il n'est pas un gros sacrifice comme certains peuvent le penser si vous utilisez un ensemble de conventions de nommage. Par exemple, avec des contrôles liés sur les formes, les laisser utiliser les noms par défaut (c'est à dire, le nom du champ le contrôle est lié à). Si je ne vous parle pas le contrôle dans le code, je n'ai jamais changer son nom. Mais la première fois que je référence dans le code, j'ai changer de nom afin que le nom de la commande est distinct du nom du champ, il est lié à (cette homonymie est crucial dans certains contextes). Ainsi, une zone de texte appelée MyField devient txtMyField à l'heure je décide de référence dans le code. La seule fois où je n'avais jamais changer le nom du champ après le code est écrit est si j'ai un peu décidé que le terrain était mal nommé. Dans ce cas, il est assez facile de faire un Rechercher/Remplacer.
Certains prétendent qu'ils ne peuvent pas renoncer à l'Intellisense, mais ce n'est pas vrai que vous avez entièrement renoncer lorsque vous utilisez le coup de l'opérateur. Oui, vous abandonnez la "vraiment intelligent" Intellisense, c'est à dire, la version qui limite la liste Intellisense pour les méthodes/propriétés/les membres de l'objet sélectionné, mais je n'en ai pas besoin, j'ai besoin d'Intellisense pour enregistrer les frappes au clavier, et avec Ctrl-barre d'ESPACE, vous bénéficiez d'une liste Intellisense que l'auto-complété tout comme le contexte spécifique de l'Intellisense, et peut alors court-circuit de la dactylographie.
Un autre domaine de la dot/bang confusion avec les jeux d'enregistrements DAO dans le code VBA, dans lequel vous utilisez l'opérateur point pour le SQL que vous utilisez pour ouvrir votre jeu d'enregistrements et le coup de l'opérateur pour faire référence à des champs dans le jeu d'enregistrements résultant:
Si vous gardez à l'esprit qui l'espace de noms dans lequel vous travaillez, ce n'est pas la confusion -- le point est utilisé dans l'instruction SQL et le bang dans le code DAO.
Donc, pour résumer:
en SQL, vous utilisez l'opérateur point des champs dans les tables.
dans les formulaires et les rapports, vous utilisez le coup de l'opérateur pour les contrôles et l'opérateur point pour les propriétés/méthodes (mais vous pouvez également utiliser l'opérateur point, mais ce n'est pas forcément conseillé).
dans le code VBA, des références à des contrôles sur les formulaires et les rapports peuvent utiliser le point ou le bang, bien que la dot peut être sujette à d'éventuelles code de la corruption.
en SQL, vous pouvez voir le bang opérateur utilisés, mais uniquement si il y a une référence à un contrôle sur un formulaire ou un état Access, de la forme "Forme!!!FormName!Nomchamp" ou "Rapport de!ReportName!Nomchamp".
dans le code VBA de travail avec les jeux d'enregistrements DAO, vous pouvez voir à la fois la dot et bang opérateur, le premier à définir le SQL utilisé pour ouvrir le jeu d'enregistrements, et le dernier pour faire référence à des champs dans le jeu d'enregistrements résultant une fois qu'il est ouvert.
Est que assez compliqué pour vous?
Je pense que le esclamation marque est seulement un classique de séparation.
En Oracle PL/SQL, vous utilisez le point:
[FETT Liste].[FETT]
Toutes les autres indices?!