Interrupción ejecución de consulta de parámetros si no devuelve valor alguno.

Dudas sobre código
Rafael
Nivel 6
Mensajes: 239
Registrado: Dom Dic 27, 2015 10:33 am

Interrupción ejecución de consulta de parámetros si no devuelve valor alguno.

Mensajepor Rafael » Mar Abr 06, 2021 11:51 pm

Mediante el código que escribo al final de este post pretendía, primero, comprobar si la ejecución de determinada consulta -en 'MiAplicación' se llama "C_Datos_Cosecha_UVA_2", utilizando para ello una variable -'rcd'- declarada públicamente en un módulo de la aplicación-; en el supuesto de que la consulta devuelva valores se ejecuta ésta y exporta a Excel tales datos; en el caso de que los datos exportados, esto en un archivo .xls -que tiene por cierto el nombre de la consulta que los exporta y escribe en la ruta 'C:/Usuarios/.../Documentos, por lo que teniendo siempre el mismo nombre, tras preguntar si lo hace reescribiría el fichero anteriormente exportado...-.
Bien. Con un Else final, el código, todo en el caso de que la consulta no devuelva valor alguno, se limitaría a enviar al usuario un mensaje advirtiéndole de tal circunstancia cancelando el proceso de exportación.
Añado a lo anterior que la consulta exportada tiene 4 parámetros y que al ejecutarse el código que ahora escribiré, ya en la primera línea del mismo, me lanza el error: "Se ha producido el error 3061 en tiempo de ejecución. Pocos parámetros. Se esperaba 5".
El código erróneo:

Código: Seleccionar todo

Set rcd = CurrentDb.OpenRecordset("SELECT* FROM C_Datos_Cosecha_UVA_2")
If rcd.RecordCount > 0 Then

DoCmd.Echo False, ""
    Beep
    MsgBox "A continuación EXCEL le presentará blablablabla...", vbInformation, "AgroLaboreo"
    DoCmd.OpenQuery "C_Datos_Cosecha_UVA_2", acViewNormal, acReadOnly
    DoCmd.Maximize
    DoCmd.RunCommand acCmdOutputToExcel
    DoCmd.Close acQuery, "C_Datos_Cosecha_UVA_2"

Else
MsgBox "Los parámetros seleccionados para la emisión de su consulta no devuelven  valor alguno; si fuera el caso modifique tales parámetros.", vbInformation, "AgroLaboreo"
End If


Alguien... ??¿¿ :?: :?:

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1307
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Interrupción ejecución de consulta de parámetros si no devuelve valor alguno.

Mensajepor Sveinbjorn » Mié Abr 07, 2021 8:35 am

Si tienes la consulta parametrizada no puedes abrir un recorset directamente sobre ella, porque te dará el error de que faltan parámetros.

O bien usas la colección "Parameters" (https://docs.microsoft.com/es-es/office ... ection-dao) para pasarle los valores previamente a abrir el recordset (de los distintos ejemplo que vienen en el enlace el más sencillo de implementar es el último), o bien creas el recordset sobre la SQL de la consulta ya pasándole los valores de los parámetros (Set rst=CurrentDb.OpenRecordset("SELECT Campo1,Campo2... FROM Tabla WHERE Campo1=" & Valor1 & " AND Campo2= " & Valor2 & " AND ...") ). Lógicamente la escritura de la SQL tendrá que tener en cuenta el tipo de dato de que se trate en cada parámetro...

También podrías obviar todo el sistema de recorset y usar un DCount() para saber si hay registros que cumplan o no esas condiciones...

Ya tienes para investigar un rato.... ;)

Saludos
Sveinbjorn El Rojo

Rafael
Nivel 6
Mensajes: 239
Registrado: Dom Dic 27, 2015 10:33 am

Re: Interrupción ejecución de consulta de parámetros si no devuelve valor alguno.

Mensajepor Rafael » Sab Abr 10, 2021 10:49 pm

Gracias Diego, te debo otra -pierdo la cuenta de cuántas van...- :)
De las soluciones que me has dado me quedo con la del DCount, fenomenal, :) ha resultado mucho más fácil de lo que esperaba, lo dejo aquí por si sirviese a alguien:

Código: Seleccionar todo

If DCount("*", "C_Datos_CosechaYGasto_UVA") = 0 Then
MsgBox "Los parámetros de filtrado seleccionados no devuelven ningún valor. Si fuera el caso debe establecer otros.", vbInformation, "AgroLaboreo"
Exit Sub
End If

MsgBox "A continuación EXCEL le presentará los Datos de GASTO y COSECHAS de su BD acordes con blablablablabla.", vbInformation, "AgroLaboreo"
    DoCmd.OpenQuery "C_Datos_Cosecha_UVA", acViewNormal, acReadOnly
    DoCmd.RunCommand acCmdOutputToExcel
    DoCmd.Maximize
    DoCmd.Close acQuery, "C_Datos_CosechaYGasto_UVA"

He tardado en responder porque he sufrido daños colaterales con la macro que exportaba los datos a EXCEL -que por cierto he convertido a código (automáticamente, ya sabes Diego que mis conocimientos de código dejan mucho más que desear... :oops: ).

Voy a relatar aquí los daños colaterales sufridos por si algún alma caritativa puede darme darme algún consejo o ... confirmar mis sospechas:

Como he dicho antes, mediante una macro -que se correspondería con la segunda parte del código insertado arriba…- creo una consulta de parámetros desde un formulario de filtrado en el que, a través de cuadros combinados, primero selecciono los ítems de ellos que deseo y después los transfiero como parámetros –viajando como nulos los combos no informados… - a la consulta lanzada mediante el código insertado arriba.
Siguiendo con la ejecución del código, inmediatamente antes de escribir el nuevo archivo .xlsx en la ruta de defecto predeterminada –Mis documentos-, al encontrarse normalmente un .xlsx con el mismo nombre, ACCESS me pregunta si lo reescribe… y … aquí VIENE EL 'SUCESO': Sin saber por qué –aunque tengo una sospecha no sé si un tanto paranoica que diré a continuación- ... en aproximadamente 7.587.973.876.967 ;) veces :lol: que he probado, al cabo de varias pruebas de exportación correctas, sin haber dado con ello a ciencia cierta, la pregunta de si reescribe el archivo xlsx –que lógicamente ‘lleva’ el nombre de la consulta misma- troca en ‘DESEA REESCRIBIR EL ‘NOMBRE_DEL_FILTRO’? (en lugar del ¿Desea escribir el nombre-de_la_consulta.xls? habitual… y a partir de ese momento la exportación de datos a EXCEL deja de funcionar… y así ya digo: 7.587.973.876.966 veces, aproximadamente :D :D :D

Mi sospecha: entre las 7.587.973.876.967 versiones de la aplicación empleadas hasta el momento en que se produce el bloqueo ¿puede haber influido que haya introducido en el formulario de filtrado el código:

Código: Seleccionar todo

Me.Admiracion.visible = Not Me.Admiracion.visible
Me.Admiracion2.visible = Not Me.Admiracion2.visible

… que ‘inocentemente’ no pretendía otra cosa que el ‘parpadeen’ dos signos de admiración incrustados en el formulario, cosa que debo haber hecho a lo largo de las transiciones entre las tropecientas versiones de la aplicación que he empleado en el proceso?

Obviamente a partir de mis sospechas he eliminado todo vestigio del código sospechoso… seguiré probando… cosa que me da cierto repelús.. son tantos intentos y tantos errores...

P.S.- Edito para añadir: mi gozo en un pozo, mi sospecha no era acertada. En una nueva prueba, se me ha preguntado si reescribía el filtro y ... :?: , eso sí, me lo pregunta una vez, reescribe el objeto filtro, cualquiera que sea mi respuesta o no-respuesta, y kaputt... ya no vuelve a hacerlo; y, en todo caso, Excel se me presenta sin datos... ; solo, curiosamente, :shock: con la fila de los títulos de las columnas escrito, y, para seguir con el desconcierto, repetido dos veces en la misma fila... :shock: :shock: :shock: :shock:


Volver a “Código VBA”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados