Cita
Lo verdadero es siempre sencillo, pero solemos llegar a ello por el camino más complicado.
Lo verdadero es siempre sencillo, pero solemos llegar a ello por el camino más complicado.
El lenguaje sql de Access es un poco pobre por lo que respecta al control de flujo del código : No es posible utilizar intrucciones sql por lotes, no existen los triggers, apenas podemos utilizar Switch y IIf para de alguna manera tomar decisiones sobre los resultados a mostrar según nos convenga, etc.Sin embargo es increible la complicidad que se puede establecer en Access entre sql y vba. En concreto usando la función Eval(). Como ejemplo, esta consulta de parámetros :
–Ramon Poch, Terrassa a 02/01/2006–
PARAMETERS Cliente Text ( 255 );
SELECT Clientes.IdCliente, Clientes.NombreCompañía
FROM Clientes
WHERE IIf(DCount(“*”,”Clientes”,”NombreCompañía Like ‘*” & Cliente & “*’”)>0,True,Eval(“MsgBox(‘Atención, el cliente no existe.’,64,’NEPTUNO’)”)) And NombreCompañía Like “*” & Cliente & “*”;
Está basada en la tabla ‘Clientes’ de Neptuno.mdb. Al abrirla, un parámetro nos pide el nombre (o parte de él) de un cliente. Si lo encuentra, la consulta muestra el registro, caso contrario, lanza un MsgBox advirtiendonos que no hay ningún registro coincidente.
Se trata de un método para limitar el número máximo de registros que admite una tabla. Desde la versión 4.0 del motor Jet, se incorporaron algunas características nuevas, para mayor compatibilidad de Access con otros sistemas de bases de datos. En concreto esta versión de Jet, mediante ADO, permite crear restricciones Check sobre tablas o columnas, al estilo de Sql Server.
Para ello deberemos utilizar ADO, puesto que esta instrucción sql fallará si intentamos ejecutarla desde una consulta de Access o mediante DAO.
Una restricción Check es una regla de validación para una columna o una tabla. A diferencia de la propiedad ‘Regla de validación‘ de los campos de una tabla en vista diseño, con una restricción check podemos definir una regla basada en una instrucción sql (en la vista diseño de una tabla, ni siquiera podemos usar funciones agregadas de dominio como regla de validación).
Crear una regla de validación a nivel de tabla, que limite la cantidad de registros :
(En este ejemplo, la tabla se llama MiTabla, y el número de registros que permitiremos será de 1)
CurrentProject.Connection.Execute “ALTER TABLE MiTabla ADD CONSTRAINT Regla1 CHECK ((Select Count(*) From MiTabla) <= 1);”
Una vez ejecutado este código, el número máximo de registros que admitirá MiTabla será de uno. Tampoco podremos eliminar la tabla sin antes eliminar la restricción.
Para eliminar la restricción anterior :
CurrentProject.Connection.Execute “ALTER TABLE MiTabla DROP CONSTRAINT Regla1″
Finalmente comentar que este tipo de reglas solo están visibles en la tabla del sistema MSysObjects.
Si dispones de una versión de Access superior a la 2000, al activar la casilla de verificación en : Herramientas/Opciones/Tablas o consultas/Sintaxis compatible con sql server (ansi 92), las instrucciones sql para crear las restricciones, se pueden ejecutar directamente desde una consulta.
Utilizando la propiedad TAG de los cuadros de texto se limita el número de caracteres a introducir en un cuadro de texto. La instrucción Select Case permite la cancelación del carácter insertado en caso de error.
Private Sub txtCAP_KeyDown(KeyCode As Integer, Shift As Integer) On Error GoTo ErrHandle Select Case KeyCode Case 8, 46 Case Else If Len(Me.CAP.Text) > CAP.Tag - 1 Then KeyCode = 0 End Select ErrHandle: If Err.Number = 0 Then Exit Sub MsgBox "Errore numero: " & Err.Number & " Descrizione: " & Err.Description & " Sorgente: " & Err.Source & " Evento: CAP_KeyDown " End Sub