Problema con recordset DAO

Tengo una base de datos en access 2007 con una tabla llamada clientes con los siguientes campos: Nombre(text), Apellido(Text) y Contrato(Datos adjuntos); y un formulario con:un cuadro combinado(cbonombre)que contiene los nombres del campo Nombre y un botón de comando.
He conseguido con en el evento hacer click del botón guardar los datos adjuntos en una carpeta que yo especifico mediante el siguiente código:
    Dim db As Database
    Dim rstAttachments As Recordset2
    Dim strsearch As String
    Dim fso As Scripting.FileSystemObject
    Dim rstTable
    Dim strFileAndPath
    MkDir "C:\CarpetaTemporal"
    strFileAndPath = "C:\CarpetaTemporal"
    Set fso = CreateObject("scripting.fileSystemObject")
    Set db = CurrentDb
    Set rstTable = db.OpenRecordset("Clientes", dbOpenDynaset)
    Do While Not rstTable.EOF
        Set rstAttachments = rstTable.Fields("contrato").Value
        With rstAttachments
            Do While Not .EOF
                .Fields("fileData").SaveToFile strFileAndPath
                .MoveNext
            Loop
                .Close
        End With
        rstTable.MoveNext
    Loop
    RstTable. Close
El problema es que no quiero que me guarde todos los adjuntos sino solo aquellos que correspondan al Nombre indicado en cbonombredel formulario. Es decir, si en cbonombre=maría entonces sólo guarde los datos adjuntos de aquellos registros que tengan por Nombre maría.
Creo que debería hacerlo mediante una consulta o un filtro, pero no sé como realizarlo con recordset. Por cierto, estoy utilizando recordset DAO.

2 Respuestas

Respuesta
1
El problema que tienes es porque no has usado ningún tipo de filtro ni comparación, y mediante el While Not EOF(), se están procesando todos los registros hasta fin de tabla.- Aquí te envío el código, como debería de ir para que te funcione bien...
_____________________________________
Dim db As Database
    Dim rstAttachments As Recordset2
    Dim strsearch As String
    Dim fso As Scripting.FileSystemObject
    Dim rstTable
    Dim strFileAndPath
    Dim CadBusqueda as string     'Servirá para seleccionar el registro que deseas
    MkDir "C:\CarpetaTemporal"
    strFileAndPath = "C:\CarpetaTemporal"
    Set fso = CreateObject("scripting.fileSystemObject")
    Set db = CurrentDb
    Set rstTable = db.OpenRecordset("Clientes", dbOpenDynaset)
   'Aquí se define la búsqueda y el FindFirst de abajo, realiza la búsqueda.
   CadBusqueda:= "[CampoClienteEnClientes] = " & "'" cboNombre & "'"
    rstTable.FindFirst CadBusqueda
    If rstTable.NoMatch Then
            MsgBox "No se ha encontrado el nombre " & cboNombre
    Else
      Set rstAttachments = rstTable.Fields("contrato").Value
        With rstAttachments
            Do While Not .EOF
                .Fields("fileData").SaveToFile strFileAndPath
                .MoveNext
            Loop
                .Close
        End With
    End If      
    rstTable.Close
________________________________________
Espero que con estos pequeños cambios, funcione todo sin problemas, en caso contrario.
Hola,
Intente lo que me comentaste pero no me funciono. Te comento el problema:
- CadBusqueda:= "[CampoClienteEnClientes] = " & "'" cboNombre & "'
Me da error de compilación porque se esperaba expresión. Si le quito : me lo compila pero me da el error en la siguiente linea. Es decir:
- rstTable.FindFirst CadBuqueda
Error de sintaxis (falta operador) en la expresión
No tengo mucha idea ya que lo que he hecho hasta ahora es a base de prueba y error. Lo estaba intentando también mediante un filtro:
Set rstTable=db.openrecordset("Clientes", dbopendynaset)
rstTable.filter= "Nombre=" &  "Me.cbonombre"
Set rstFiltrado=rstTable.openrecordset /*aqui me da error
Pero me da el siguiente error : error 3061, pocos parámetros se esperaban 2
Tengo rstTable y rstFiltrado definidos como DAO. Recordset.
Además, el caso es que en principio debería filtrar tanto por nombre como por apellido. Es decir, algunas veces sólo por nombre, otras sólo por apellido y otras por ambos.
¿Supongo qué eso podría hacerse con IIf (IsNull) mediante un select?
Espero tu ayuda. Muchas gracias
Disculpa, pero no me acordaba que Acess 2007 no acepta operadores de asignación ":=" Con el signo igual, es suficiente.
- Haz las siguientes cosillas, a ve si así funciona:
1.- Quítale el "dbOpenDynaset" en la asignación de la variable de Recordset
         rstTable = db.OpenRecordset("Clientes", dbOpenDynaset 'quita lo subrayado
2.- Pon un punto de depuración en "CadBusqueda", a ver si te queda algo así:
    CadBusqueda:= "[CampoClienteEnClientes] = 'Nombre_a_buscar"
   -Lógicamente, el "CampoClienteEnClientes] tiene que ser el que tu hayas definido en la tabla y "Nombre_a_Buscar", tiene que ser los datos que hayas introducido en el campo "cboNombre"
3.- Comprueba que en el editor de Visual Basic, en las "Referencias" (buscalo en el menu), no tienes activado más que el DAO 3.6 (o superior)... si tienes el 3.5, el ADO, o el CDAO quítalos, porque producen errores...
En fin, espero que esto te ayude... no obstante, echale un vistazo a la ayuda del FindFirst que creo que te solucionará el problema...
Un saludo, y espero tu respuesta diciéndome que funciona,-)
Hola,
He hecho lo que me comentaste y nada, sigue sin funcionar.
El problema creo que está en que como utilizó campo datos adjuntos, tengo activada la referencia Microsoft office 12.0 access database engine object library y al activar la referencia a DAO 3.6 me da error porque el nombre entra en conflicto con un módulo, proyecto o biblioteca existente.
¿Sabes cómo podría solucionarlo?
He intentado crear el recordset mediante un select:
Set rstTable = db.OpenRecordset("select * from Clientes Where Nombre='" & cbonombre & "'", dbOpenDynaset)
Pero me crea un recordset vacío. Ya no sé que puedo hacer. ¿Puedes ayudarme?
Desactiva el Microsoft Office 12.0 y el Access database engine... y activa el DAO 3.6.- Hace las mismas funcionas y no tiene conflictos.-
En caso de duda, enviame la base de datos y lo intento resolver yo mismo.-
Hola,
No puedo hacer lo que me sugieres porque al utilizar recorset2 me hace falta la referencia a Microsoft office 12.0 engine.
Si quieres dime cual es tu correo y te mando la base de datos a ver si consigues encontrar el problema.
Espero tu respuesta.
Tendrás que cambiar el recordset2 por Recordset a secas... hace exactamente lo mismo.- No obstante, si quieres enviarme la base de datos, puedes hacerlo a esta dirección:
[url=http://mailto:[email protected]][email protected]
[/url]
No puedo cambiar el recordset2 porque si no, no me reconoce la instrucción SavetoFile, que es nuevo de access 2007.
He conseguido que cargue el recordset pero como intenta buscar el nº del combo en lugar del contenido no carga nada.
Te envío la base de datos a ver si me puedes ayudar porque me urge y ya no sé que más puedo hacer. Espero tu ayuda. Mi correo es [email protected].
Ya te he enviado el programa arreglado.- No olvides finalizar y puntuar mis respuestas si consideras que ya está resuelto tu problema...
Muchísimas gracias pr tu ayuda. Estoy muy agradecida por el interés mostrado. Gracias de nuevo.
Ahora estoy liada con otro problema, ya te pediré ayuda si no consigo resolverlo.
Respuesta
1
Creo que hay un diseño incorrecto
Puedes enviarme la base para revisar a [email protected]
Coloca tu nick y el titulo de la pregunta
Por favor enviala en formato 2003
Hola,
No te la puedo enviar en formato 2003 porque utilizo un campo especifico del formato 2007:campo tipo dato adjunto. Además me hace falta poder utilizar este campo.
Te la envío aunque no sé si podrás abrirla.
Set rstTable = db.OpenRecordset("Clientes", dbOpenDynaset)
bueno la solución seria colocar
Set rstTable = db.OpenRecordset("select * from Clientes Where Nombre='" & cbonombre & "'", dbOpenDynaset)
Hola,
No sé si tu lo has probado, pero a mi no me selecciona nada, es decir, el recordset está vacío. ¿Sabes dónde puede estar el problema?
enviame la base a [email protected]
Pon tu nick y titulo de la pregunta
No importa que este en 2007
Hola experto,
Te he enviado la base de datos. Espero que puedas ayudarme
No la veo, cual es tu email
O reenviamela
Pon tu nick y titulo de la pregunta
Hola experto,
Mi email es [email protected]. Te la volveré a enviar.
Ok
ya te vi
Muchísimas gracias por tu ayuda y el interés mostrado.
Ahora estoy con otra cosilla, ya te pideré ayuda si veo que no me sale... gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas