Imprimir página | Cerrar ventana

Ayuda Do until en vba

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=84276
Fecha de impresión: 26/Junio/2019 a las 06:14


Tema: Ayuda Do until en vba
Publicado por: Xantus
Asunto: Ayuda Do until en vba
Fecha de publicación: 07/Febrero/2019 a las 13:39
Buenos días/tardes!.

He creado en vba un formulario para enviar correos electrónicos a unos clientes para realizar reclamaciones de documentación pendiente, al grano.

Tengo una consulta en la que el campo "fecha_1_reclamacion" está en blanco, lo que quiero es que al ejecutar, vaya pasando por cada una de las columnas vacias en de la fecha 1 reclamación y envíe el correspondiente correo dependiendo de lo que necesite esa gestión en concreto.

Ya tengo el código del correo correcto, pero estoy atascado en esto:

Código:

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim dbs As Database, consulta As String, fechadesde As String, fechahasta As String
    Dim rs As Recordset
    
    MsgBox "Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención"
    
 consulta = "SELECT * FROM EnvioPrimeraReclamacion;"
    Set dbs = CurrentDb
    Set rs_previa = dbs.OpenRecordset(consulta)
  
  
    FECHA_1_RECLAMACION = rs_previa("Fol").Value
    rs_previa.MoveFirst
    Do Until rs_previa.EOF = True

        Enviar_Email_EnvioPrimeraReclamacion rs_previa("NUMERO_DE_CONTRATO").Value, rs_previa("OFICINA").Value, rs_previa("CLIENTE").Value, rs_previa("FECHA_1_RECLAMACION").Value, rs_previa("CONTRATO").Value, rs_previa("CCM").Value, rs_previa("SEGURO").Value, rs_previa("GARANTIA_RECOMPRA").Value, rs_previa("ENVIO_RENT_and_TECH").Value
        Me.[FECHA_1_RECLAMACION].Value = Date
        
        rs_previa.MoveNext
    Loop
    
    rs_previa.Close
    
    dbs.Close
    
    MsgBox "Correos Enviados Correctamente."
    
    
    Exit Sub

Err_Buscar_Click:
        
    MsgBox Err.Description

End Sub


En la fila 13, he modificado para añadir la fecha_1_reclamación (este código es reutilizado) pero me da error en esa fila 13.

Alguien sería tan amable de revisarme el código y modificarlo para que haga lo que necesito?, bucle para que vaya pasando por cada fila de la consulta, y cuando vea el campo en fecha_1_reclamación vacio envíe el correo, escriba en ese campo el día de hoy y salte a la siguiente fila repitiendo el proceso. Hasta que todos los campos de la columna fecha_1_reclamación tengan la fecha del "dia de hoy" y termine el proceso cn el msgbox "Correos enviados correctamente".


Mil gracias de antemano.

Un saludo.
Xantus.



Respuestas:
Publicado por: javier.mil
Fecha de publicación: 07/Febrero/2019 a las 14:58
Prueba lo siguiente

Donde Pone
rs_previa("Fol").Value

Cambialo por
Nz(rs_previa.Fields("Fol"))


-------------
http://www.accessdemo.info" rel="nofollow - http://www.accessdemo.info





Publicado por: Xantus
Fecha de publicación: 07/Febrero/2019 a las 16:02
Buenas!

Gracias por la respuesta, por desgracia lo he cambiado y me sigue dando error en esa misma linea.

Si se te ocurre algo mas estaría muuuy agradecido. Como si tengo que cambiar todo el código, con que haga lo que necesito me vale, cualquier info que necesites te la paso.

Un saludo.
Xantus.


Publicado por: xavi
Fecha de publicación: 07/Febrero/2019 a las 19:31
Hola Xantus y bienvenido al foro,

Analicemos el código que has puesto y lo que pides

El código

1. Lo ejecutas desde un botón llamado Comando60. 
2. Declaras variables. 
3. Lanzas un MsgBox pidiendo confirmación
4. Abres un recordset sin filtros sobre la tabla EnvioPrimeraReclamacion
5. La línea FECHA_1_RECLAMACION = rs_previa("Fol").Value, intuyo que sirve para guardar el valor del campo Fol del primer registro en un control del formulario. 
6. Recorres el recordset y, en cada registro, lanzas una función que asumiré que lanza un correo con un determinado asunto y mensaje.


Mis sugerencias (siguiendo los mismos números)
1. Pon nombres descriptivos a los controles.
2. En general bien aunque tengo matices.
2.1 Para evitar problemas, Database y Recordset estaria bien indicar el tipo: DAO.Database o DAO.Recordset
2.2. Declaras rs y utilizas rs_previa
2.3 fechadesde y fechahasta no veo que se utilicen
3. El  MsgBox contiene las opciones Si y No pero no lo haces correctamente y, obviamente, no evalúas la respuesta.
4. Dices que quieres recorrer los registros y, cuando no tenga fecha, le ponga la de hoy y lance el correo. Imaginemos que la tabla tiene 1 millón de registros y a 999999 ya les has mandado el mail (o peor aun: se lo has mandado a todos). ¿Que sentido tiene recorrer toda la tabla? --> filtra el recordset a los registros que no tengan fecha.
5. No se para que, la verdad
6. No editas el registro para almacenar la fecha

Otras consideraciones
7. Solo cierras el recordset y no le haces el Nothing
8. Tienes algo parecido a un control de errores que no hace nada.

Mi propuesta

Private Sub cmdEnviaReclamacion_DblClick(Cancel As Integer)
    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimeraReclamacion WHERE fecha_1_reclamación Is Null", , dbForwardOnly)
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_EnvioPrimeraReclamacion rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End
    
    rs.Close
    Set rs = Nothing
End Sub


Analízalo y adaptalo a tus necesidades



-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Xantus
Fecha de publicación: 08/Febrero/2019 a las 08:24
Buenos días.

He puesto el código que me has propuesto, modificando el nombre de la consulta y mail para que sea más sencillo, ha quedado así.

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera WHERE fecha_1_reclamación Is Null", , dbForwardOnly)
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_EnvioPrimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
    
End Sub

Sin embargo al ejecutarlo me da un error "3061" - Pocos parámetros. Se esperaba 1.

Sinceramente, no entiendo que significa, al querer depurar me indica que el error está en esta linea:

Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera WHERE fecha_1_reclamación Is Null", , dbForwardOnly)

Si me lo puedes revisar te lo agradecería muchisimo. Quizá si cambio el nombre en la consulta de "fecha_1_reclamacion" a "fechaprimera" por ejemplo? o no tienen nada que ver?

Un saludo.
Xantus.




Publicado por: Xantus
Fecha de publicación: 08/Febrero/2019 a las 10:02
Buenos días de nuevo, me autorrespondo.

Modificado la linea a = isEmpty ha desaparecido el error, el código está asi:


Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM Envio1Recl WHERE FECHA_1_RECLAMACION = isEmpty", , dbForwardOnly)
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_Envio1Recl rs("NUMERO DE CONTRATO"), rs("OFICINA"), rs("FECHA 1 RECLAMACION"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA RECOMPRA"), rs("ENVIO RENT and TECH"), rs("SITUACION")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
    
End Sub

Sin embargo ahora me tirar un nuevo error.

"El número de argumentos es incorrecto o la asignación de propiedad no es válida.

El error de me da aquí "Enviar_Email_Envio1Recl"

Te copio el principio del código de envio de email al que debe hacer referencia.

Private Sub Enviar_Email_Envio1Recl(NUMERO_DE_CONTRATO, OFICINA, FECHA_1_RECLAMACION, CLIENTE, CONTRATO, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH, SITUACION)

    On Error GoTo Err_CORREO_Click
    Dim dbs As Database, qdf As QueryDef, consulta As String
    Dim cuerpo As String, para As String, cc As String, asunto As String
    Dim comentario As String
    Dim CONTRATO As String
    Dim CCM As String, GARANTIA_RECOMPRA As String, SEGURO As String, _
        Anexo_1 As String, Anexo_2 As String, _
        Anexo_3 As String, Anexo_4 As String


Ojalá me puedas decir qué hay mal para que no enlace uno con el otro y envíe los correos.

Gracias.
Xantus.



Publicado por: happy
Fecha de publicación: 08/Febrero/2019 a las 10:44
Lo de IsEmpty quitalo, ya lo estabas haciendo bien. Lo que pasa si te fijas bien es que estas poniendo un acento en el nombre del campo fecha_1_importacion y por eso te salta ese error 3061

-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: Xantus
Fecha de publicación: 08/Febrero/2019 a las 11:15
Buenos días. Gracias por la respuesta.

Te copio el código actual

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera WHERE fecha_1_reclamacion Is Null", , dbForwardOnly)
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
End Sub

He quitado el acento como me indicas, pero aún asi al iniciar me sigue dando el error 3061
Tambien he probado a quitar  aqui el ,date

Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), 

pero en ese caso me da el error de compilación : El argumento no es opcional.

Sabrias decirme por donde tirar?
GRAcias!
Xantus.



Publicado por: jilo
Fecha de publicación: 08/Febrero/2019 a las 18:52
Hola
Te da el error 'El argumento no es opcional' es por que la funcion:

Private Sub Enviar_Email_Envio1Recl(NUMERO_DE_CONTRATO, OFICINA, FECHA_1_RECLAMACION, CLIENTE, CONTRATO, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH, SITUACION)

Tiene 11 argumentos. Y tu le pasas 9
Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
SAludos


-------------
Espero te sirva !!!!!!
Iñaki


Publicado por: happy
Fecha de publicación: 08/Febrero/2019 a las 19:09
Mira, yo creo que en principio no te deberías liar haciendo cambios "a ver si funciona". Si lo haces así, al final todo será mucho más liado. En principio, yo me guiaría por el esquema de código que te ha dado Xavi, quien además te ha dado un montón de pistas que estaría bien seguir.

El error "3061 Pocos parámetros. Se esperaba 1" significa que ha encontrado en la línea que te marca el error, un nombre de campo, de tabla o de lo que sea que te interprete, que no le cuadra, que no encuentra. Eso suele querer decir, que o bien has escrito mal el nombre de un campo, tabla o lo que sea o que simplemente el campo o tabla o lo que sea no se encuentra en la sentencia SQL que estás intentando poner en marcha.

Asegúrate de que los nombres que escribes estén totalmente correctos y luego vuelve a probar e informa.

El error de compilación: El argumento no es opcional, te sale porque estás quitando uno de los parámetros que la función Enviar_Email_Envioprimera espera encontrar (en este caso dice que le has quitado el parámetro Date).

Ves probando la solución para cada error que te vaya saliendo y cuando informes aquí, informa del nº de error, descripción del error y la línea en el que se produce, si puede ser copia el texto de esa línea para que sea más claro


-------------
Saludos,

Juan M. Afan de Ribera


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 10:45
Buenos días.

Por mas que busco y rebusco no encuentro de donde puede venir el fallo.

Código

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera WHERE FECHA_1_RECLAMACION Is Null")
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("FECHA_1_RECLAMACION"), rs("CLIENTE"), Date, rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
End Sub


Es el mismo error 3061 pocos parámetros, se esperaba 1.

En esta linea me da el error:
Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera WHERE FECHA_1_RECLAMACION Is Null")

Por explicar a ver si sirve para aclarar.

Tengo una consulta llamada EnvioPrimera, que filtra los campos de una tabla y que filtra el campo fecha primera reclamación por los campos en blanco.
Es desde esa consulta desde la que se escribe este código y se quiere hacer el envío de correo.

He revisado y los nombres de los campos están bien, lo único es que en el código que me pasó el compañero si incluye "Date  y ni en la consulta ni en el código de envío de correo aparece.

Código:

Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, Oficina, FECHA_1_RECLAMACION, CLIENTE, CONTRATO, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

Puede ser por el "Date?? , he probado a quitarlo pero me da error 

Error de compilación : El argumento no es opcional.

Por donde puedo tirar?
Gracias!!


Publicado por: xavi
Fecha de publicación: 10/Febrero/2019 a las 11:24
1. Es la primera vez que veo explicitamente que EnvioPrimera es una consulta que ya filtra los registros de una tabla a los que no tengan fecha de reclamación en blanco. Siendo asi (y no impactando en el error) la SQL que te había puesto yo es redundante. 
2. En el ultimo código posteado pasas como argumento rs("FECHA_1_RECLAMACION") al procedimiento Enviar_Email_EnvioPrimera. Segun se desprende el punto1, al ser una consulta dónde filtras los registros, el valor de ese argumento es blanco. Posibilidad de error.
3. Dices que quieres indicar a los registros que la Fecha_1_reclamación es la fecha de hoy y mandar el correo. Tu código lo hace... al revés: primero manda (la fecha es nula) y después salva el registro. Solo con que la línea de envío de correo se ejecutara DESPUÉS del Update ya tendrías posibilidades de que funcionara.
4. Date es la función del sistema para devolver la fecha de hoy. Si mantienes el código como est´`a, debería funcionar.
5. Todos los argumentos del procedimiento Enviar_Email_Envioprimera están sin especificar el tipo. No es que sea la causa del error pero es una buena práctica indicar el tipo datos que se espera para cada argumento.
6. Pon un punto de interrupción en la primera línea del procedimiento Comando60_Click y ejecuta paso a paso evaluando los valores de las variables (pasando el ratón por encima, preguntando en la ventada de inmediato, poniendo inspecciones o consultando la ventanas de locales). Así verás cuando "algo" no cuadra.

Un saludo
 


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 11:48
Buenos días y gracias por la respuesta.

He modificado el código, que ya no me haga el WHERE fecha1reclamacion is null, ya que como bien dices en la consulta ya me filtra para que aparezcan solo los datos en blanco, y desaparece el error.

3. Lo quiero es que envíe el correo a la primera fecha 1 reclamacion en blanco, le ponga la fecha, y pase al siguiente volviendo a empezar el proceso hasta que estén todos con la fecha y termine.

He vuelto a incluir date al código pero me da el error:

El numero de argumentos es incorrecto o la asignacion de propiedad no es válida.

Y si lo compilo sin el date, el error es el siguiente:

Error 3265 ,No se encontro el elemento en esta colección.

Gracias de antemano por tu ayuda, ya parece va quedando menos!

Un saludo.




Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 12:31
Escribo el código tal como lo tengo ahora:

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM EnvioPrimera")
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("FECHA_1_RELAMACION"), Date, rs("CLIENTE"), rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA_1_RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
End Sub

He puesto puntos de interrupcion y el error me salta en esta linea

Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("FECHA_1_RELAMACION"), Date, rs("CLIENTE"), rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")

Error de compilacion: El número de argumentos es incorrecto o la asignación de propiedad no es válida.

Gracias de antemano!


Publicado por: xavi
Fecha de publicación: 10/Febrero/2019 a las 17:00
Insisto en los puntos 5 y 6. 

El punto 5 para indicar cuales son los tipo de datos que espera el procedimiento
El punto 6 para evaluar los valores que vamos a utilizar.

En cuanto al último error está clarisimo: tu función espera 9 argumentos. Tu le pasas 10.

Otra cosa que veo ahora: FECHA_1_RELAMACION. En unos sitios dice RECLAMACION en otros RELAMACION.




-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: pitxiku
Fecha de publicación: 10/Febrero/2019 a las 17:10
La cabecera de la función Enviar_Email_Envioprimera es esta:

Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, Oficina, FECHA_1_RECLAMACION, CLIENTE, CONTRATO, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

Y tú la llamas así cuando te da error de número de argumentos incorrecto:

Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("FECHA_1_RECLAMACION"), Date, rs("CLIENTE"), rs("CONTRATO"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")

Si cuentas el número de argumentos, en la cabecera o declaración tienes 9; y cuando la usas "metiendo" el Date, le pasas 10 valores. Es normal que se queje: estás pasando más argumentos de los declarados, y no sabe qué hacer con ellos. Si quieres usar la función Date, tienes que quitar el dato que te sobra. Que en un principio, y si he leído el hilo bien, debe ser el campo de la fecha, rs("FECHA_1_RECLAMACION").

Y digo en un principio, porque dices que con ese campo y sin el Date, te da otro error: No se encontró el elemento en esta colección. Entiendo que el error te lo daba desde el principio, porque en tu último mensaje te has "comido" una "C": FECHA_1_RELAMACION. Aunque en el primer mensaje sí que aparece.

Así que suponiendo que sólo es una errata, vamos a ver otro error: cuando Xavi pensó que EnvioPrimera era una tabla y no una consulta, te dijo que la filtrases, algo así:

SELECT * FROM EnvioPrimera WHERE FECHA_1_RECLAMACION Is Null

Pero eso te daba otro error: Pocos parámetros, se esperaba 1. Si "troceamos" esa sentencia, tenemos:

- SELECT, FROM, WHERE, Is y Null: Son funciones y palabras que Access entiende en una sentencia SQL, así que por ahí no van los tiros.

- *: Devuelve todos los campos, nada de parámetros.

FECHA_1_RECLAMACION: Es, en teoría, el nombre del campo que hay en la consulta, y por el cual queremos filtrar. Y digo en teoría, porque Access no lo encuentra en la consulta. Y como no lo encuentra, te está diciendo que está esperando que al parámetro FECHA_1_RECLAMACION le asignes un valor para poder usar ese valor en donde está el parámetro.

Y esto nos lleva al otro error: No se encontró el elemento en esta colección. Como no existe el campo FECHA_1_RECLAMACION en la consulta, ni lo puedes usar, ni le puedes asignar valores, ni nada de nada.

Así, comprueba que el "campo" FECHA_1_RECLAMACION existe y se llama de esa forma en la consulta que estás usando en el código.


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 17:27
Gracias a los dos por vuestras respuestas e intento ir por partes:

Si es cierto que en la cabecera tengo 9 y hago el decimo con Date, he quitado el fecha_1_reclamacion dejando 9 en total.

Y quitándolo me da el error de "No se encontró el elemento en la colección"
Era una errata lo de Reclamación.

Y por último sobre:

SELECT * FROM EnvioPrimera WHERE FECHA_1_RECLAMACION Is Null

Lo modifiqué, puesto que ya en la misma consulta pongo que solo me muestre aquellos cuya fecha 1 reclamacion sea null, por lo que he borrado desde where dejando solo:

Set rs = CurrentDb.OpenRecordset("Select * from EnvioPrimera")

Por último, he abierto la consulta y la he revisado, te pongo captura de la consulta abierta con los campos en un enlace.

https://drive.google.com/open?id=13t-Wt9FKMuWC0eJ41zOkssnWsTb0WZUl

Son pocos campos en la consulta.

Espero me podais dar alguna pista más
Mil Gracias!.




Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 17:31

Os dejo como está ahora mismo el código, y el inicio de la función Enviar_Email_EnvioPrimera

Private Sub Comando60_DblClick(Cancel As Integer)

    Dim rs As DAO.Recordset
    
    If MsgBox("Se va a proceder al envío de 1ª Reclamación, ¿Continuar?", vbYesNo + vbExclamation, "Atención") = vbNo Then Exit Sub
    
    Set rs = CurrentDb.OpenRecordset("Select * from EnvioPrimera")
    If rs.EOF Then
        MsgBox "No hay registros pendientes de reclamar.", vbInformation, "Atención"
    Else
        Do Until rs.EOF
            Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CONTRATO"), Date, rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")
            rs.Edit
            rs("FECHA 1 RECLAMACION") = Date
            rs.Update
            rs.MoveNext
        Loop
        MsgBox "Correos Enviados Correctamente.", vbInformation
    End If
    
    rs.Close
    Set rs = Nothing
End Sub
------------------------------------------------------------------------------------------------------------------
Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, OFICINA, FECHA_1_RECLAMACION, CONTRATO, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

    On Error GoTo Err_CORREO_Click
    Dim dbs As Database, qdf As QueryDef, consulta As String
    Dim cuerpo As String, para As String, cc As String, asunto As String
    Dim comentario As String
    Dim CONTRATO As String
    Dim CCM As String, GARANTIA_RECOMPRA As String, SEGURO As String, _
        Anexo_1 As String, Anexo_2 As String, _
        Anexo_3 As String, Anexo_4 As String


Gracias de nuevo!


Publicado por: pitxiku
Fecha de publicación: 10/Febrero/2019 a las 17:40
2 cosas:

1. En la consulta, pásala a vista SQL y copia y pega aquí la sentencia; para mí es más sencillo verla.

2. En la función Enviar_Email_Envioprimera, el tercer parámetro es las fecha, y tú le estás pasando en esa posición el contrato. Y al parámetro del contrato le estás pasando la fecha. Y si es posible, pega toda la función, no sólo el inicio (NOTA: si hay datos sensibles, cámbialos por algo ilógico).


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 18:01
La consulta en vista SQL

SELECT [RESUMEN DOC PENDIENTE].[NUMERO DE CONTRATO], [RESUMEN DOC PENDIENTE].OFICINA, [RESUMEN DOC PENDIENTE].[FECHA 1  RECLAMACION], [RESUMEN DOC PENDIENTE].CONTRATO, [RESUMEN DOC PENDIENTE].CCM, [RESUMEN DOC PENDIENTE].SEGURO, [RESUMEN DOC PENDIENTE].[GARANTIA RECOMPRA], [RESUMEN DOC PENDIENTE].[ENVIO RENT and TECH]
FROM [RESUMEN DOC PENDIENTE]
WHERE ((([RESUMEN DOC PENDIENTE].[FECHA 1  RECLAMACION]) Is Null));


Ahora el código Enviar_Email_Primera:

Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, OFICINA, CONTRATO, FECHA_1_RECLAMACION, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

    On Error GoTo Err_CORREO_Click
    Dim dbs As Database, qdf As QueryDef, consulta As String
    Dim cuerpo As String, para As String, cc As String, asunto As String
    Dim comentario As String
    Dim CONTRATO As String
    Dim CCM As String, GARANTIA_RECOMPRA As String, SEGURO As String, _
        Anexo_1 As String, Anexo_2 As String, _
        Anexo_3 As String, Anexo_4 As String
 
    Anexo_1 = ""
    Anexo_2 = ""
    Anexo_3 = ""
    Anexo_4 = ""
 
    If CONTRATO Is False Then
        Anexo_1 = vbCr & vbCr + "DOCUMENTO 1"
    End If
 
    If CCM Is False Then
        Anexo_2 = vbCr & vbCr + "DOCUMENTO 2"
    End If
 
    If GARANTIA_RECOMPRA Is False Then
         Anexo_3 = vbCr & vbCr + "DOCUMENTO 3"
    End If
 
    If SEGURO Is False Then
        Anexo_4 = vbCr & vbCr + "DOCUMENTO 4"
    End If
    
    asunto = "ASUNTO DE CORREO"
    
    
    texto = "Buenos días," & vbCr & vbCr + _
            "Texto de Correo:" & _
            vbCr & vbCr + OFICINA & _
            Anexo_1 & Anexo_2 & Anexo_3 & Anexo_4 & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "<b>Texto de correo" & _
            vbCr & vbCr + vbCr & "Gracias, " & _
            vbCr & vbCr + vbCr & "Un saludo. " 'MsgBox texto
            
    
    If IsNull(Usuario) Then
        MsgBox "No existe Email de Usuario para la operación: NUMERO_DE_CONTRATO"
        GoTo Exit_CORREO_Click::
    End If
    
    Set miCorreo = CreateObject("CDO.Message")

    With miCorreo
        
          '.from = "mi correo" & "< >"
          
          .from = "mi correo" & "<mi correo>"
        '.from = "mi correo"
        '.To = "mi correo"
        .To = "mi correo"
        .Bcc = "mi correo"
        .replyto = "mi correo"
        
        .Subject = asunto
        .TextBody = texto
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
        "smtpbbva"
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
        .Configuration.Fields.Update
        '.display
        .Send
    End With
    
    Set miCorreo = Nothing
    
    
Exit_CORREO_Click:
    Exit Sub

Err_CORREO_Click:
    MsgBox Err.Description
    Resume Exit_CORREO_Click
End Sub


Solo he quitado las direcciones de correo y el texto del correo, lo demás está tal cual.

Gracias!


Publicado por: pitxiku
Fecha de publicación: 10/Febrero/2019 a las 18:25
Ahora que tenemos más datos, vamos a hacer pruebas:

1. Si revisas bien el nombre del campo que te da problemas (en la consulta SQL), verás que hay 2 espacios entre el "1" y "RECLAMACION"; y estamos colocando 1 espacio en el código. Pon 2 espacios y vuelve a probar:

Enviar_Email_Envioprimera rs("NUMERO_DE_CONTRATO"), rs("OFICINA"), rs("CONTRATO"), rs("FECHA_1__RECLAMACION"), rs("CCM"), rs("SEGURO"), rs("GARANTIA_RECOMPRA"), rs("ENVIO_RENT_and_TECH")

2. Como tienes muchos espacios en los nombres de los campos, podemos probar a olvidarnos de los subrayados y usar los corchetes:

Enviar_Email_Envioprimera rs![NUMERO DE CONTRATO], rs![OFICINA], rs![CONTRATO], rs![FECHA 1  RECLAMACION], rs![CCM], rs![SEGURO], rs![GARANTIA RECOMPRA], rs![ENVIO RENT and TECH]

3. En la línea en la que actualizas la fecha, también tendrás que cambiar cómo haces referencia al nombre del campo:

rs("FECHA_1__RECLAMACION") = Date
rs![FECHA 1  RECLAMACION] = Date

P.D.: Siempre se recomienda evitar los caracteres extraños o símbolos de subrayado en los nombres de tablas, campos, formularios, … Dan más problemas que soluciones.

P.D.: En la función que envía el correo tienes varios objetos creados que no usas. Puede ser porque la has recortado para evitar que se vean datos sensibles. Si no es así, puedes eliminarlos.


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 19:02
Vamos avanzando!!

He modificado las 2 lineas que me indicas con los corchetes tal como me lo has puesto, y ya no da el error, da otro:

Declaración duplicada en el  ámbito actual.

Y lo da sobre la linea 

Dim Contrato as String

Esa linea está en la función de envío de correo, te copio el inicio donde está la función (la tienes completa en el que te puse antes:

Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, OFICINA, CONTRATO, FECHA_1_RECLAMACION, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

    On Error GoTo Err_CORREO_Click
    Dim dbs As Database, qdf As QueryDef, consulta As String
    Dim cuerpo As String, para As String, cc As String, asunto As String
    Dim comentario As String
    Dim CONTRATO As String
    Dim CCM As String, GARANTIA_RECOMPRA As String, SEGURO As String, _
        Anexo_1 As String, Anexo_2 As String, _
        Anexo_3 As String, Anexo_4 As String

Al indicar como duplicada, la borro directamente? o la modifico por ???

Gracias!!


Publicado por: xavi
Fecha de publicación: 10/Febrero/2019 a las 19:10
El error viene porque un argumento se llama CONTRATO y, dentro de la función, tambien declaras CONTRATO (lo que decía pitxiku de declaraciones innecesarias)

-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 19:15
Vamos avanzando, he ido borrando lo que me ha indicado duplicado, hasta llegar hasta este nuevo error:

Copio el código del correo tal cual está

Ahora el código Enviar_Email_Primera:

Private Sub Enviar_Email_Envioprimera(NUMERO_DE_CONTRATO, OFICINA, CONTRATO, FECHA_1_RECLAMACION, CCM, SEGURO, GARANTIA_RECOMPRA, ENVIO_RENT_and_TECH)

    On Error GoTo Err_CORREO_Click
    Dim dbs As Database, qdf As QueryDef, consulta As String
    Dim cuerpo As String, para As String, cc As String, asunto As String
    Dim comentario As String _
        Anexo_1 As String, Anexo_2 As String, _
        Anexo_3 As String, Anexo_4 As String
 
    Anexo_1 = ""
    Anexo_2 = ""
    Anexo_3 = ""
    Anexo_4 = ""
 
    If CONTRATO Is False Then
        Anexo_1 = vbCr & vbCr + "DOCUMENTO 1"
    End If
 
    If CCM Is False Then
        Anexo_2 = vbCr & vbCr + "DOCUMENTO 2"
    End If
 
    If GARANTIA_RECOMPRA Is False Then
         Anexo_3 = vbCr & vbCr + "DOCUMENTO 3"
    End If
 
    If SEGURO Is False Then
        Anexo_4 = vbCr & vbCr + "DOCUMENTO 4"
    End If
    
    asunto = "ASUNTO DE CORREO"
    
    
    texto = "Buenos días," & vbCr & vbCr + _
            "Texto de Correo:" & _
            vbCr & vbCr + OFICINA & _
            Anexo_1 & Anexo_2 & Anexo_3 & Anexo_4 & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "Texto de Correo" & _
            vbCr & vbCr + "<b>Texto de correo" & _
            vbCr & vbCr + vbCr & "Gracias, " & _
            vbCr & vbCr + vbCr & "Un saludo. " 'MsgBox texto
            
    
    If IsNull(Usuario) Then
        MsgBox "No existe Email de Usuario para la operación: NUMERO_DE_CONTRATO"
        GoTo Exit_CORREO_Click::
    End If
    
    Set miCorreo = CreateObject("CDO.Message")

    With miCorreo
        
          '.from = "mi correo" & "< >"
          
          .from = "mi correo" & "<mi correo>"
        '.from = "mi correo"
        '.To = "mi correo"
        .To = "mi correo"
        .Bcc = "mi correo"
        .replyto = "mi correo"
        
        .Subject = asunto
        .TextBody = texto
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
        "smtpbbva"
        .Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
        .Configuration.Fields.Update
        '.display
        .Send
    End With
    
    Set miCorreo = Nothing
    
    
Exit_CORREO_Click:
    Exit Sub

Err_CORREO_Click:
    MsgBox Err.Description
    Resume Exit_CORREO_Click
End Sub


En el texto que te marco en negrita me da el error:

"Error de compilación: No coinciden los tipos"

Se supone que si el cambo contrato es False, debe añadir una linea al correo (que he renombrado con Documento 1) y asi sucesivamente con los 4 anexos, para que al rellenar el formulario se marquen las casillas de la documentación que se posee, y se solicite en el correo aquella que falte.

Gracias!


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 19:24
Señores, os invitaba a unas buenas cañas si pudiera, pero sin pensármelo!

FUNCIONA.

He cambiado False en el If por Null.

Solo me quedo con una duda, y es que al ir avanzando, me indica por dos veces una pantalla que dice.

"Se espera un objeto"

tras 2 aceptar, me termina la funcion y me indica que se han enviado correctamente.

Si bien es cierto, no puedo probarlo hasta el martes que vaya al trabajo, porque creo que hasta que no esté en la red no me va a enviar el correo.
Si sabeis porque aparece ese mensaje os lo agradecería, si el martes veo que no se envían cuando lo pruebe, vuelvo al foro con la duda.

Pero ya es un enorme avance el que no me de ningún error.

Gracias!


Publicado por: pitxiku
Fecha de publicación: 10/Febrero/2019 a las 19:38
En la función que prepara y envía el correo, tienes un control e errores que muestra el mensaje de error y sale de la función.

Como ejecutas la función para cada registro, pero sólo sale el mensaje 2 veces, parece como que tienes 2 registros a los cuales les falta algún dato necesario.


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 19:48
No va a ser casualidad, puesto que para la prueba hice 2 registros con la fecha 1 reclamación en blanco.

Solo tienen el número de contrato, lo demás está en blanco, quizá cambiar False a Null no era la solución.


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 19:58
He puesto puntos de interrupción y la ventana aparece cuando llega a los If, en el primero me da la ventana de "se espera un objeto" y salta al siguiente, al ser solo 2 finaliza sin enviar nada.

Código:


    If CONTRATO Is False Then
        Anexo_1 = vbCr & vbCr + "DOCUMENTO 1"
    End If
 
    If CCM Is False Then
        Anexo_2 = vbCr & vbCr + "DOCUMENTO 2"
    End If
 
    If GARANTIA_RECOMPRA Is False Then
         Anexo_3 = vbCr & vbCr + "DOCUMENTO 3"
    End If
 
    If SEGURO Is False Then
        Anexo_4 = vbCr & vbCr + "DOCUMENTO 4"
    End If

Lo que hice fue modificar False por Null, con False me daba el error

Error de compilación: No coinciden los tipos.


Publicado por: Xantus
Fecha de publicación: 10/Febrero/2019 a las 20:18

Me autorrespondo

Código

He puesto puntos de interrupción y la ventana aparece cuando llega a los If, en el primero me da la ventana de "se espera un objeto" y salta al siguiente, al ser solo 2 finaliza sin enviar nada.

Código:


    If CONTRATO  Then
        Anexo_1 = vbCr & vbCr + "DOCUMENTO 1"
    End If
 
    If CCM  Then
        Anexo_2 = vbCr & vbCr + "DOCUMENTO 2"
    End If
 
    If GARANTIA_RECOMPRA  Then
         Anexo_3 = vbCr & vbCr + "DOCUMENTO 3"
    End If
 
    If SEGURO  Then
        Anexo_4 = vbCr & vbCr + "DOCUMENTO 4"
    End If

Al dejar el código así, ahora si deja de dar error.
Buscando, en los If si no especificas por defecto es False, de forma que al dejarlo así es exactamente lo que quiero.
Me indica que no es posible conectar con el envío del correo, pero eso si se que se debe a que es un correo de empresa al que puedo acceder solo desde alli, tenemos otro código que usa el mismo envío de correo y funciona perfectamente, por lo que el martes si debe funcionar sin problemas

El martes pruebo y vuelvo aunque solo sea para dar las gracias por las molestias.

Un saludo.


Publicado por: pitxiku
Fecha de publicación: 10/Febrero/2019 a las 20:21
Si no, también puedes probar con la función IsNull, más cómoda con valores nulos.


Publicado por: Xantus
Fecha de publicación: 12/Febrero/2019 a las 09:50
Buenos días.

Definitivamente funciona, llegan los correos etcetc.

Si tengo una duda, puesto que me "solicita" la documentación de los checkbox marcados, y yo quiero lo contrario, que me solicite los que no estén marcados.

He probado a poner los If con "is False" pero me da error en el tipo.
He probado con If Contrato IsNull Then  ó If contrato = Isnull Then pero en ambos me da error.

Lo que quiero es que cuando se de de alta, se marquen de las 4 casillas aquellas sobre las que tenemos documento, y que me solicite lo que no tengo.

Sabeis como ponerlo?

Gracias!


Publicado por: Xantus
Fecha de publicación: 12/Febrero/2019 a las 13:59
Me autorrespondo por si alguien tiene la duda en algun momento y cae en este post.

Código:

    If CONTRATO Then
        Anexo_1 = ""
    Else
        Anexo_1 = vbCr + "          - CONTRATO INTERVENIDO Y SUS RESPECTIVOS ANEXOS"
    End If
 
    If CCM Then
        Anexo_2 = ""
    Else
        Anexo_2 = vbCr + "          - CERTIFICADO DE CONFORMIDAD DE MATERIAL"
    End If
 
    If GARANTIA_RECOMPRA Then
         Anexo_3 = ""
    Else
         Anexo_3 = vbCr + "         - GARANTÍA DE RECOMPRA"
    End If
 
    If SEGURO Then
        Anexo_4 = ""
    Else
        Anexo_4 = vbCr + "         - CERTIFICADO DE SEGUROS"
    End If

De esta forma si el checkbox se marca, no va a añadir linea, y si no está marcado la añadirá con lo que le indiques.

Resuelto queda!

Mil gracias!


Publicado por: Xantus
Fecha de publicación: 22/Febrero/2019 a las 08:30
Buenos días!

Vuelvo por aqui para 2 cosas.

Primero agradecer la ayuda, porque ha funcionado perfectamente y se están enviando los correos sin problema.

Y segundo para ver si alguien sabe responderme a:

Los correos enviados, sé que están llegando a sus destinatarios, pero en la pestaña enviados de mi correo no puedo verlos, alguien sabe porque? hay algo que se pueda añadir para que se vean?

Gracias!


Publicado por: Xantus
Fecha de publicación: 22/Febrero/2019 a las 09:00
Solucionado! Gracias!

Nota

.bcc + "tucorreo"




Imprimir página | Cerrar ventana