Saludos,
tengo que hacerle un favor a mi madre para su base de datos en access del trabajo. De momento es tan simple como acceder a una tabla, hacerle una consulta sql y hacer ciertos cálculos de fechas, etc.
No he trabajado nunca con Access ni con VB, así que ando un poco perdido. Hice un día una macro que te ponía lo que metías en el campo "e-correo" como un hipervínculo, pero ya ni recuerdo ni nada.
El caso es que estoy intenando acceder a la tabla para hacer la consulta y no me funcionan los componentes DAO. Lo he intentado con ADO, pero también me falla. Os cuento los fallos:
- DAO:
No me aparecen los componentes en autocompletar (no están), así que al ejecutar me sale error de "tipo no definido", por ejemplo para "Database", "Workspace", etc.
- ADO:
...
Dim resultado As New ADODB.Recordset
Dim conexion As New ADODB.Connection
conexion = New ADODB.Connection
With conexion
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "origen de datos=" & CurrentDb.Name
.Open
End With
...
Me da el error de "No se encuentra el archivo ISAM instalable"
Creo que debo instalar algo más? estoy con OfficeXP en WinXPpro.
Cualquier ayuda es bienvenida. Gracias.
Herramientas > Referencias > Microsoft DAO 3.6 Object Library
OK, lo del DAO ya está ;)
La de ActiveX es 2.1 la que está activada, es correcto?¿
Este DAO parece funcionar, continúo sobre ello si no me comentáis nada en favor de ADO.
Dim resultado As Recordset
Dim basedatos As Database
Set basedatos = CurrentDb
Set resultado = basedatos.OpenRecordset("SELECT * FROM TablaPrueba WHERE [DNI] = 1")
Utiliza ADO que es más moderno.
Prueba con:
Dim resultado As New ADODB.Recordset
resultado.Open "tabla", CurrentProject.Connection
Cita de: "NeLo"Utiliza ADO que es más moderno.
Prueba con:
Dim resultado As New ADODB.Recordset
resultado.Open "tabla", CurrentProject.Connection
Con ADO me sigue saliendo el "No se pudo encontrar el archivo ISAM instalable", por eso he tirado con DAO de momento.
Pues ese error no me suena.
Mira a ver si tienes todas las referencias puestas, porque parece ser algo de librerias.
Saludos.
Sólo tengo 5 referencias (tuve que añadir la de ADO).
- Visual Basic For Applications
- MS Access 10.0 Object Library
- OLE Automation
- MS DAO 3.6 Object Library
- MS ADO 2.1 Library
Con DAO tengo un problema, a ver si alguien tiene un rato y me mira qué le pasa a este sencillo código.
El problema viene al añadir la funcion Controlar_Mensaje (eso creo), que lo único que hace es dejar que se impriman sólo unos MsgBox (que ahora probando quiero ver unos pocos para ver si hace la cuenta, pero luego no sé como interrumpir la ejecución).
El error que me sale al final de la ejecución es:
Error de sintaxis (falta operador) en la expresión de consulta 'NIF ='He comprobado que si pongo NIF = 3, en vez de trabajadores![NIF] en la consulta, el error no sale; sin embargo, con lo que tengo me sale bien para los N mensajes que imprimo con el MsgBox. ¿Alguien ve el problema? Gracias de antemano.
Option Compare Database
Private Function Controlar_Mensaje(Cuenta As Integer, Mensaje As String)
On Error GoTo Err_Controlar_Mensaje
Dim MAX_MENSAJES As Integer ' Limite para MsgBox
MAX_MENSAJES = 2
If (Cuenta < MAX_MENSAJES) Then
MsgBox Mensaje
Else
If (MAX_MENSAJES = Cuenta) Then
MsgBox "Se ha llegado al limite de mensajes. No se imprimen más."
End If
End If
Controlar_Mensaje = Cuenta + 1
Exit_Controlar_Mensaje:
Exit Function
Err_Controlar_Mensaje:
MsgBox "Fallo en Controlar_Mensaje: " & Err.Description
Resume Exit_Controlar_Mensaje
End Function
Public Function Calcular_Periodos_Trabajo()
On Error GoTo Err_Calcular_Periodos_Trabajo
Calcular_Periodos_Trabajo = 1
Dim numMensajes As Integer
numMensajes = 0
Dim trabajadores As Recordset
Dim contratos As Recordset
Dim basedatos As Database
Dim qryTrab As String
Set basedatos = CurrentDb
Set trabajadores = basedatos.OpenRecordset("Trabajad")
While Not trabajadores.EOF
Set contratos = basedatos.OpenRecordset("SELECT * FROM Contrats WHERE [NIF] = " & trabajadores![NIF])
If (contratos.RecordCount() = 0) Then
numMensajes = Controlar_Mensaje(numMensajes, "NO HAY PARA " & trabajadores![NIF])
Else
trabajadores.Edit
While Not contratos.EOF
numMensajes = Controlar_Mensaje(numMensajes, "Contrato (" & trabajadores![NIF] & ") => " & contratos![Fecha_ini] & " hasta " & contratos![Fecha_fin])
contratos.MoveNext
Wend
trabajadores.Update
End If
trabajadores.MoveNext
Wend
basedatos.Close
Exit_Calcular_Periodos_Trabajo:
Exit Function
Err_Calcular_Periodos_Trabajo:
MsgBox "Fallo en Calcular_Periodos_Trabajo: " & Err.Description
Resume Exit_Calcular_Periodos_Trabajo
End Function
Hay alguna cosa rara como lo del trabajadores.Edit, etc. que antes asignaba valores y lo tengo que volver a hacer después. Eso está controlao ;)
Uhm, ya no me deja editar.
Descubrí que el error era que faltaba un:
If (Not IsNull(trabajadores![NIF])) Then
Al parecer las tablas pueden tener NIFs nulos y eso provocaba el fallo en sintaxis en tiempo de ejecución.
(nooo)