martes, 11 de junio de 2013

Run-time error 3146 ODBC--cal failed

¿Qué hacer si aparece el error Run-time error 3146 ODBC--cal failed?

1) Creamos una función como la siguiente:

Function TestODBCErr()
If Errors.Count > 1 Then
For Each errX In DAO.Errors
Debug.Print "ODBC Error"
Debug.Print errX.Number
Debug.Print errX.Description
Next errX
Else
Debug.Print "VBA Error"
Debug.Print Err.Number
Debug.Print Err.Description
End If
End Function

Fuente: http://www.utteraccess.com/forum/Runtime-Error-3146-t1993453.html&p=2285193

2) Insertamos esa función desde el menú Insert / Module del editor de VBA

3) Ejecutamos el programa hasta que aparezca el error y presionamos DEBUG

4) Abrimos una ventana Immediate Window con Ctrl+G o desde el menú View

5) Insertamos el código ? TestODBCErr() y presionamos enter

6) Luego obtenemos un mensaje detallado que varía de acuerdo a nuestro problema específico. Un ejemplo es:

ODBC Error
 2601 
[Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert duplicate key row in object 'dbo.Contactos' with unique index 'IX_Contactos'.
ODBC Error
 3621 
[Microsoft][ODBC SQL Server Driver][SQL Server]The statement has been terminated.
ODBC Error
 3146 
ODBC--call failed.

Espero les resulte útil!

martes, 30 de abril de 2013

No current record

Repentinamente aparece en una base de datos Access el siguiente error:

No current record

Buscando posibles causas en Internet, no encontré una solución a este problema. Revisando las tareas que había realizado en forma previa a que el error apareciera, encontré que:

  • Había creado varias columnas nuevas en una tabla existente en SQL Server
  • Luego había utilizado Link Table Manager para refrescar este cambio
  • Y luego había eliminado en SQL Server una de esas columnas
Aparentemente el paso tres fue la causa del problema, a pesar de que la columna no la estaba usando dentro de Access, con lo cual el problema se resolvió de la siguiente forma:
  1. Utilicé nuevamente Link Table Manager
  2. Luego reparé la base Access
Y todo volvió a la normalidad. Espero que a alguien le sirva.
Hasta la próxima!

viernes, 19 de abril de 2013

Access 2010 se cae al usar VBA - Código 1033

Problema:

Access se cae al procesar código VBA arrojando un mensaje de error como el siguiente:

Problem signature:  Problem Event Name: APPCRASH
  Application Name: MSACCESS.EXE
  Application Version: 14.0.6024.1000
  Application Timestamp: 4d83e4fc
  Fault Module Name: VBE7.DLL
  Fault Module Version: 7.0.16.27
  Fault Module Timestamp: 4f86f5aa
  Exception Code: c0000005
  Exception Offset: 00013a05
  OS Version: 6.0.6002.2.2.0.272.7
  Locale ID: 11274
Additional information about the problem:  LCID: 1033
  skulcid: 1033
Read our privacy statement:  http://go.microsoft.com/fwlink/?linkid=50163&clcid=0x0409

Solución:

Utilizar el comando "decompile" tal como se explica en: http://notasaccess.blogspot.com.ar/2013/02/the-expression-on-click-you-entered-as.html

martes, 19 de marzo de 2013

jueves, 14 de marzo de 2013

¿Cómo hacer consultas SQL desde VBA en Access?

Ejemplo 1: lectura secuencial

Dim db_m As Database
    Dim rs_m As DAO.Recordset
    Dim strSQL_m As String
    Dim strResult_m As String
    Set db_m = CurrentDb
    strSQL_m = "SELECT ..."
    Set rs_m = db_m.OpenRecordset(strSQL_m, dbOpenForwardOnly)
    If rs_m.RecordCount <> 0 Then
        While Not rs_m.EOF
            strResult = strResult & rs_m![Modelo]
            rs_m.MoveNext
        Wend
    End If

Ejemplo 2: lectura de un dato en particular

Dim db As Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strResult As String
    Dim VarRecords As Variant
    
    Set db = CurrentDb
    
    strSQL = "SELECT Snippet FROM dbo_Snippets WHERE ID = '" & Id_Snippet & "'"
    
    Set rs = db.OpenRecordset(strSQL)
    VarRecords = rs.GetRows(1)

Más información

miércoles, 6 de marzo de 2013

Error #type al pasar valores nulos en una función de VBA

Si se obtiene un error de tipo (#type) al pasar un valor nulo a una función en VBA, es posible que el problema sea haber definido los parámetros como String. En su lugar, podemos usar Variant que soporta:

  • Empty
  • Null
  • Error

Más información en http://msdn.microsoft.com/en-us/library/aa716185(v=vs.60).aspx

martes, 26 de febrero de 2013

¿Cómo saber si un archivo existe?

El siguiente código nos puede ayudar a saber desde Access si un archivo existe:

If Dir("C:\Prueba\Prueba.doc") = "" Then
  Msgbox "El archivo no existe"
Else
  Msgbox "El archivo existe"
End If

Más información en: