lunes, 23 de septiembre de 2013

¿Cómo recorrer controles en Access?

Supongamos que queremos recorrer controles de una pantalla o de un control para realizar una tarea. Por ejemplo inhabilitar los controles de un determinado tipo. Esto se puede hacer con el siguiente código:

        For Each ctrl In [Form_Certificados_Editor]!Page63.Controls
            If ctrl.ControlType = acCheckBox Or ctrl.ControlType = acComboBox Or ctrl.ControlType = acTextBox Or ctrl.ControlType = acSubform Then
                ctrl.Enabled = False
            End If
        Next

¿Cómo hacer una validación antes de aplicar un cambio en la Base de Datos?

Supongamos que queremos realizar una validación luego de que el usuario completó un campo. ¿Cómo hacemos para volver atrás el cambio si no pasamos la validación? Aquí el código:

Private Sub Fecha_finalización_BeforeUpdate(Cancel As Integer)
    If Not Internal.validar_cierre_proceso(Me.ID) Then
        Cancel = True
        Me![Fecha finalización].Undo
    End If
End Sub

Fuente: http://msdn.microsoft.com/en-us/library/office/bb238523(v=office.12).aspx

viernes, 20 de septiembre de 2013

Can Grow no funciona

Supongamos que tenemos un reporte en Access que tiene configurada la opción CanGrow en Yes, pero no está funcionando. Bien, pueden ser muchas las causas del problema. Una de ellas es que en realidad el campo (de tipo memo) esté siendo truncado en el query.

¿Cómo saberlo? 

Leyendo esto: http://allenbrowne.com/ser-63.html (Truncation of Memo fields)

En mi caso el problema erá que estaba usando UNION. Tal como dice el artículo, se resolvió al utilizar UNION ALL. Más info en http://msdn.microsoft.com/en-us/library/office/bb208962(v=office.12).aspx.

Nuevo problema

Sin embargo, apareció un nuevo problema. De pronto para Access, mi query resultó Muy Complejo. Así que opté por lo que debería haber hecho desde un principio. Armar directamente la vista en SQL Server, lo cual es válido en mi proyecto porque Access es sólo el Front End.

Y listo, problema solucionado: reporte sin campos truncados.
Hasta la próxima!

jueves, 19 de septiembre de 2013

¿Cómo cerrar Access desde VBA?

i = MsgBox("No tiene permiso para utilizar esta aplicación. Contacte a su administrador.", vbOKOnly, "Error")
Application.Quit

¿Cómo crear usuarios en SQL Server con TSQL?

Imaginemos que en nuestro proyecto de Access con SQL Server como base de datos, queremos crear usuarios usando scripts. Simplemente ejecutamos:


CREATE LOGIN ezequiel WITH PASSWORD = 'blablabla'

Y dentro de nuestra base de datos:

CREATE USER ezequiel FROM LOGIN ezequiel
GO
SP_ADDROLEMEMBER 'db_datawriter', 'ezequiel';
GO
SP_ADDROLEMEMBER 'db_datareader', 'ezequiel';
GO


¿Cómo obligar al pedido de credenciales al conectar Access con SQL Server?

Supongamos el siguiente escenario:

  • Access como front end, SQL Server como base de datos
  • Trabajamos en un ambiente de desarrollo con un usuario administrador
  • Al abrir nuestra aplicación Access no nos pide credenciales
¿Por qué?

La razón es simple. Nuestro usuario de Windows tiene acceso directo a SQL Server, con lo cual está ignorando el pedido de credenciales del ODBC. Está almacenado dentro de nuestra aplicación.

¿Cómo resolverlo?

Configuramos el ODBC así:


[ODBC]
DRIVER=SQL Server
UID=blabla
DATABASE=blabla
WSID=blabla
APP=Microsoft Office 2010
SERVER=blabla

Pero no funciona, aún así no nos pide las credenciales

¿Cómo solucionarlo?
  1. Cambiamos el driver de SQL Server a SQL Native Client
  2. Volvemos a configurar las vinculaciones desde 
    1. External Data
    2. Link Table Manager
    3. Opción "allways prompt for new location"
Veremos luego que nos pedirá las credenciales cada vez que ingresemos a Access.