2010-05-18 65 views
10

estoy leyendo sobre esta consulta, y me encontré con una línea en la que no entiendo aquí está la líneasignos de admiración en una consulta SQL

[FETT List]![FETT Search] 
  1. Lista FETT es una tabla
  2. FETT La búsqueda es una columna en la lista FETT

¿Puede alguien explicar qué significa el signo de exclamación?

Gracias

+2

Por favor, añada las etiquetas apropiadas a su pregunta. Agregué 'ms-access', porque creo que esto está en Access, pero podría estar equivocado. Por favor, asegúrese de que esté bien. –

+0

No hay nada específico de la versión 2007 sobre esta pregunta, así que realmente, ms-access es una etiqueta adecuada (aunque se podría mencionar la versión 2007 en la pregunta). –

Respuesta

8

general que ver esto en MS Código de acceso (por el signo de exclamación, un período para el servidor SQL). Puede hacer referencia a una columna por table.column o si le da a la tabla un alias, luego por alias.column. Puede hacer esto si quiere ser específico cuando usa uniones, o puede tener que hacerlo cuando dos (o más) tablas en una consulta/unión tienen el mismo nombre de columna en cada tabla.

+1

¡El! es una forma no estándar de especificar campos en sentencias de SQL en Access. Se maneja, pero ahora está bien, ya que a [Table]! [Field] se le asigna un alias sobre la marcha dentro de QBE, mientras que Table.Field heredará el nombre de campo (es decir, sin aliasing). –

0

Creo que la marca de esclamation es solo un separador convencional.

En Oracle PL/SQL que utilizan puntos:.

[Lista FETT] [Buscar] FETT

Cualesquiera otras pistas ?!

+1

¿Oracle permite un espacio en el nombre de una tabla/columna? Creo que en Oracle probablemente sea 'FETT_List.FETT_Search'. – FrustratedWithFormsDesigner

+0

Sí, Oracle permite espacios en el nombre de una tabla o columna, PERO debe encerrar toda la cadena entre comillas, como en el siguiente ejemplo: CREAR TABLA goofy ("mi columna" VARCHAR2 (1000)); – UltraCommit

+0

Tenga en cuenta que el espacio entre la palabra y la palabra UltraCommit

16

¡Bueno, aprendes algo nuevo todos los días!

¡Originalmente había planeado explicar que si hubiera dicho que la referencia era [Forms]! [FETT List]! [FETT Search], entonces sería fácil de explicar, como referencia de [FETT Search] control en el formulario [Lista FETT]. Pero sin una colección principal (Informes de formularios), no parece una referencia válida en ningún contexto dentro de una declaración SQL.

pero luego pensé que probarlo, y descubrieron (para mi sorpresa) que esta sentencia SQL se considerará como válida en un formulario de Access:

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

En Access, que es 100% equivalente a este SQL declaración:

SELECT tblCustomer.LastName 
    FROM tblCustomer; 

... así que no entiendo por qué alguien podría escribirlo, excepto si se olvidaron el contexto (o nunca lo entendieron en el primer lugar). Podría ser un caso de alias que salió mal, pero no es lo que considero buena forma.

Ahora, la larga respuesta a la pregunta general de! (explosión) vs. (punto):

En general, en Access, el operador de explosión delinea la colección predeterminada de un objeto y sus elementos. El operador punto delinea un objeto y sus métodos, propiedades y miembros.

Esto es para Acceso, y se aplica a los objetos de acceso y al modelo de objetos para Acceso.

Pero también utiliza SQL en Access, por lo que también tiene TableName.FieldName en SQL, donde el operador de punto separa un elemento en una colección predeterminada. TableName.FieldName podría considerarse una abreviatura de TableName.Fields ("FieldName"), como se encuentra en Forms! MyForm! MyControl es equivalente a Forms! MyForm.Controls ("MyControl"). Pero esta regla no se aplica en SQL - TableName.Fields ("FieldName") no es SQL válido, solo TableName.FieldName es.

Por lo tanto, usted tiene que mantener recta la cual paradigma está controlando el espacio de nombres que esté trabajando, es decir, si se trata de un espacio de nombres de acceso o un espacio de nombres SQL.

Formas! MyForm es también equivalente a Forms.Item ("MyForm"), por lo que la forma ultralarga sería Forms.Items ("MyForm"). Controles ("MyControl"). Tenga en cuenta que el operador de bang es un atajo para la versión de formulario más larga con el operador de punto, por lo que el operador de bang se usa con bastante frecuencia antes que el operador de punto. Tenga en cuenta también que la forma más larga termina siendo utilizado cuando se necesita para hacer referencia a un elemento cuyo nombre se almacena en una variable, lo cual no es posible con el operador de explosión:

Dim strForm As String 

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

Además, en código VBA, Microsoft tiene diseñaron cosas para ofuscar esta distinción en Forms and Reports, donde solía ser que Me! MyFavoriteControl era legal como referencia de control, y Me.MyFavoriteControl habría sido legal solo como referencia a una propiedad personalizada (o variable a nivel de módulo, que sería miembro del objeto). También podría nombrar imprudentemente una función o sub "MyFavoriteControl" y podría referirse a ella con el operador de punto.

Sin embargo, con la introducción de VBA, MS introdujo creado implícitamente (y mantiene) envoltorios de propiedad ocultos alrededor de todos los controles, para que puedas utilizar el operador punto. Esto tiene una gran ventaja, y es la verificación en tiempo de compilación de las referencias de control. Es decir, si escribe Me.MyFavoriteControl y no hay control con ese nombre y ningún otro miembro de ningún tipo con ese nombre dentro del espacio de nombre del formulario/informe, entonces obtendría un error en tiempo de compilación (de hecho, estaría informado del error tan pronto como salió de la línea de código donde cometió el error). Por lo tanto, si usted ha tenido este código:

Debug.Print Me.Control1 

... y le cambió el nombre a ser Control1 MyControl, se obtendría un error la próxima vez que lo compiló el código.

¿Cuál podría ser el inconveniente de la verificación en tiempo de compilación? Bueno, varias cosas:

  1. El código se vuelve más difícil de entender para el programador. En el pasado, Me! Reference significaba un elemento en la colección predeterminada de un formulario/informe (que es una unión de las colecciones Fields and Controls). Pero Me.Reference podría ser un control o un campo o una propiedad personalizada o una variable pública a nivel de módulo o una sub/función pública o, o, o ... Por lo tanto, sacrifica la comprensión inmediata del código.

  2. depende del comportamiento implícito de VBA y su compilación. Aunque esto suele ser una buena opción (especialmente si cuida bien de su código), VBA compilation is very complex and subject to corruption. A lo largo de los años, los desarrolladores experimentados informaron que el uso del operador punto hace que el código esté más sujeto a corrupción, ya que agrega otra capa de código oculto que puede desincronizarse con las partes de la aplicación que puede modificar explícitamente.

  3. dado que no puede controlar esos envoltorios de propiedades implícitas, cuando salen mal, debe volver a crear el objeto que contiene el módulo desde cero (generalmente SaveAsText es suficiente para borrar la corrupción sin perder nada).

Por lo tanto, muchos desarrolladores con experiencia (incluido yo mismo) no utilizan el operador punto para controles en formularios/informes.

No es un sacrificio tan grande como algunos pensarían si utiliza un conjunto estándar de convenciones de nomenclatura.Por ejemplo, con controles vinculados en formularios, déjelos usar los nombres predeterminados (es decir, el nombre del campo al que está vinculado el control). Si no me refiero al control en el código, nunca cambio su nombre. Pero la primera vez que me refiero a él en código, cambio su nombre para que el nombre de control sea distinto del nombre del campo al que está vinculado (esta desambiguación es crucial en ciertos contextos). Entonces, un cuadro de texto llamado MyField se convierte en txtMyField en el momento en que decido referirme a él en el código. La única vez que cambiaría el nombre del campo después de escribir el código es si de alguna manera decidí que el nombre del campo era incorrecto. En ese caso, es bastante fácil hacer una búsqueda/reemplazo.

Algunos argumentan que no pueden renunciar al Intellisense, pero no es cierto que lo abandone por completo cuando usa el operador bang. Sí, abandonas el Intellisense "realmente inteligente", es decir, la versión que limita la lista de Intellisense a los métodos/propiedades/miembros del objeto seleccionado, pero no la necesito para eso. Necesito Intellisense para guardar las pulsaciones de teclas. y con Ctrl-BARRA ESPACIADORA obtienes una lista completa de Intellisense que se autocompleta al igual que el Intellisense específico del contexto, y luego puede provocar un cortocircuito en el tipado. Otro área de confusión punto/bang es con conjuntos de registros DAO en código VBA, donde utiliza el operador punto para el SQL que usa para abrir su conjunto de registros y el operador bang para referirse a campos en el conjunto de registros resultante:

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 

Si tiene en cuenta el espacio de nombres en el que está trabajando, esto no es tan confuso: el punto se usa en la instrucción SQL y en el código DAO.

tanto, para resumir:

  1. en SQL, se utiliza el operador punto de campos de tablas.

  2. en formularios e informes, utiliza el operador bang para controles y el operador punto para propiedades/métodos (aunque también puede usar el operador punto, pero no es necesariamente recomendable).

  3. en código VBA, las referencias a los controles en las formas y los informes, puede usar cualquiera de puntos o explosión, aunque el punto puede ser propenso a la posible corrupción código.

  4. en SQL, puede ver el operador bang utilizado, pero solo si hay una referencia a un control en un formulario o informe de acceso, del formulario "Form! FormName! ControlName" o "Report! ReportName! ControlName" ".

  5. en código VBA trabajando con conjuntos de registros DAO, puede ver tanto el operador punto y bang, el primero en definir el SQL que se utiliza para abrir el conjunto de registros, y el último para hacer referencia a los campos en el conjunto de registros resultante una vez Esta abierto.

¿Es lo suficientemente complicado para usted?

+1

Esta es la respuesta más larga que creo que he visto en SO – msarchet

+2

¡He escrito mucho más que eso! –

Cuestiones relacionadas