Reemplazar datos para plantilla |
Responder |
Autor | |
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Tema: Reemplazar datos para plantilla Enviado: 01/Junio/2023 a las 00:22 |
Muy buenas noches.
Tengo una duda desde hace bastante tiempo que no sé cómo resolver. Espero explicarme más o menos bien. Veamos... En una base de datos de mi trabajo (curro para la Administración) que yo suelo hacerme para facilitar la tarea, tengo un código dentro de un formulario que realiza la acción de abrir un documento World (plantilla) y coger campos de ese formulario y rellenarlo en la plantilla. Tira de una tabla donde se identifican las campos del formulario y hace las sustituciones. Esta tabla tiene dos campos:
CodeToReplace ({Cambia1}, es lo que ponemos en la plantilla) ReplaceWithFieldName (Forms!Formulario!campo_txt, es el valor en el formulario
El código es un poco largo pero lo transcribo:
Private Sub
Comando306_Click()
La plantilla, (documento1.dot) debe estar en la ruta de la base de datos (o se puede cambiar indicándoselo). Hace una llamada a la tabla (ReemplazaCodigos) para hacer las sustituciones y, poco más. Pues bien, ocurre lo siguiente. Abre la plantilla y hace sustituciones hasta que se encuentra un campo en el formulario sin datos y, a partir de ahí, no hace más sustituciones y deja los campos en la plantilla sin cambiar. No tengo ni idea de dónde dice eso en el código o porqué lo hace. La solución más "estúpida" por mi parte, es rellenar los campos del formulario con un guión, espacio, punto o "algo", pero no es lo suyo. Aparte de todo esto (me estoy extendiendo demasiado), el código lo adapté con ayuda de un foro de OpenOfficce, para abrir un documento de LibreOfficce Writer en vez de World (cosas de la Administración) y funcionaba igual de bien abriendo la plantilla de Writer pero haciendo lo mismo: Se paraban las sustituciones al encontrar un campo vacío en el formulario. Pongo también el código:
Public Sub
Comando413_Click()
Bueno, ustedes sois los "máquinas", por si veis algo… y lo queréis comentar Muchas gracias de antemano.
|
|
happy
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Moderador Unido: 29/Enero/2005 Localización: España Estado: Sin conexión Puntos: 3192 |
Enviado: 01/Junio/2023 a las 09:27 |
Lo que yo te sugiero es que compruebes el valor que va tomando la variable varReplaceWith, pues parece que esta es la variable que utilizas para colocar los valores de sustitución. Por lo que comentas a partir de que la rutina encuentra algún valor vacío o nulo es cuando empieza a hacer el tonto. Por eso te sugiero que pongas un punto de interrupción en alguna línea y a partir de ahí vayas ejecutando el código paso a paso pulsando F8. Comprueba qué valor va tomando cada vez la variable y mira qué efecto tiene en el documento final (mientras haces pruebas hazlo visible si no lo está, y así podrás ver qué ocurre con cada instrucción)
Espero que te sirva
|
|
Saludos,
Juan M. Afan de Ribera |
|
prga
Moderador Unido: 16/Noviembre/2004 Localización: España Estado: Sin conexión Puntos: 3523 |
Enviado: 01/Junio/2023 a las 13:10 |
Hola
Salvo mejor opinión, no hay que confundir un "nulo" con una cadena vacía -space(0)- La función isnull en varReplaceWith = IIf(IsNull(varReplaceWith), " ", CStr(varReplaceWith)) detecta nulos, pero no cadenas vacías y cabe la posibilidad de que el writer no admita ese tipo de cadena vacía. Espero que ayude a resolver la duda. Ya comentas.
Un saludo a todos |
|
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 01/Junio/2023 a las 15:52 |
Buenas. Me pongo a mirar y hacer pruebas con lo comentado pero ya adelanto (Sr. prga), que el "efecto" es el mismo tanto si abres la plantilla en Writer como en World
|
|
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 01/Junio/2023 a las 19:30 |
Buenas. No entiendo mucho ésto... Y además no creo que sea "tan simple". La primera prueba que he realizado es comentar la línea: 'varReplaceWith = IIf(IsNull(varReplaceWith), "", CStr(varReplaceWith)) pensando que era la que gestionaba los campos sin datos. Pues bien. Ahora no se para y sigue calculando los campos. Se supone que se ha solucionado? A tal extremo no me atrevo yo a decir... pero Vds. dirán. He hecho un miniejemplo para que se observe lo ocurrido. Con el libro calc no lo he probado. Si el foro me puede indicar algún link dónde ponerlo lo subo. Salu2
Editado por maserrano - 01/Junio/2023 a las 19:31 |
|
happy
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Moderador Unido: 29/Enero/2005 Localización: España Estado: Sin conexión Puntos: 3192 |
Enviado: 01/Junio/2023 a las 20:22 |
Yo sigo pensando que lo mejor es poner un punto de interrupción y luego ejecutar paso a paso con F8 para ver qué valor toma la variable varReplaceWith.
Al menos yo, cuando me pasan cosas que no comprendo no dejo las cosas al azar, aunque parezca que se arreglan. Lo mejor es averiguar qué pasa y por qué. De esa manera controlas el tema y aprendes cosas que para futuro siempre viene bien saber. De paso, si averiguas algo interesante y lo quieres compartir, pues aprendemos el resto de los mortales . Pero en fin, dependerá del tiempo que quieras o puedas dedicarle ... Sí te puedo decir que la línea que has comentado, aunque como dice Prga, no tiene en cuenta los valores Empty (por defecto las variables Variant toman ese valor, no un Null), sí que sería la que se encargaría de los nulos. En mi opinión puedes hacerlo de esta otra manera y así abarcas tanto Null como Empty: varReplaceWith = Iif(Len(Nz(varReplaceWith,"")) = 0, "", Cstr(varReplaceWith))
|
|
Saludos,
Juan M. Afan de Ribera |
|
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 01/Junio/2023 a las 21:18 |
No, no sí que lo haré Sr. happy. Lo que ocurre es que me ha sorprendido tanto el efecto de "quitar" esa línea que lo he comentado con vds.
|
|
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 02/Junio/2023 a las 00:19 |
Buenaas. Aprovecho ahora que tengo un ratito (niños acostados). He puesto un punto de interrupción y hago los pasos uno a uno (F8). En el caso de que todos los campos (3) están rellenos y con el código completo (sin nada comentado): Abre el documento Writer en: Call document.getCurrentController.getFrame.getComponentWindow.setVisible(True) Luego procesa un bucle entre: Do While Not snpReplaceCodes.EOF y Loop Hace una sustitución en cada bucle en la línea: snpReplaceCodes.MoveNext Cuando hace la última, se va a Exit Sub Veamos ahora cuando falta el 2º campo de 3: Todo igual hasta hacer la primera sustitución; llega a Loop y vuelve a: Do While Not snpReplaceCodes.EOF y cuando llega a la línea: varReplaceWith = IIf(IsNull(varReplaceWith), "", CStr(varReplaceWith)) automáticamente se va a Beep y acaba ..., está claro que es esa línea (la que dejé comentada) la que casca. Si realizo el ejemplo con la línea comentada el Loop sigue y no se detiene en el Beep de error. y sigue rellenando campos. Bueno, hasta aquí llego. La parte "dura" de todo ésto ya se me escapa ... Por cierto, el ejemplito está en este enlace: (La línea no está comentada. Para hacer pruebas hay que comentarla) Buenas noches y salu2 Editado por maserrano - 02/Junio/2023 a las 00:21 |
|
happy
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Moderador Unido: 29/Enero/2005 Localización: España Estado: Sin conexión Puntos: 3192 |
Enviado: 02/Junio/2023 a las 08:57 |
Y qué mensaje de error se produce? (porque dices que se va a Beep y termina, pero en medio tienes un msgbox que indica el error que se ha producido). También deberíais averiguar qué valor (si es que lleva alguno) contiene la variable varReplaceWith en ese momento del error. Quién sabe, ¿podría contener hasta algún error del tipo #Err, o cosas así? varReplaceWith es una variable Variant, o sea que puede contener casi cualquier cosa y además viene del resultado del Eval() de la línea anterior.
Es posible que todo venga por ahí: de la fórmula que tienes definida en la tabla o consulta ReemplazaPropuesta, que en caso de un elemento vacío, casca y vete a saber qué cosa devuelve Eval() en un caso como ese ... Si es eso, entonces, lo que debes hacer es rehacer la fórmula para que tenga en cuenta un valor vacío o Nulo Son sugerencias ...
Editado por happy - 02/Junio/2023 a las 08:58 |
|
Saludos,
Juan M. Afan de Ribera |
|
prga
Moderador Unido: 16/Noviembre/2004 Localización: España Estado: Sin conexión Puntos: 3523 |
Enviado: 02/Junio/2023 a las 13:32 |
Hola.
Haciendo alguna prueba, parece ser que el problema venía por lo apuntado por happy en la función eval, vamos cambiando por: varReplaceWith = CStr(Nz(Eval(snpReplaceCodes!ReplaceWithFieldName), " ")) varReplaceWith = IIf(IsEmpty(varReplaceWith), " ", varReplaceWith) al menos a mí me funciona. Por otra parte, es buena práctica anular el "gestor" de errores en la función o procedimiento mientras de problemas, así el código se bloquea en la línea correspondiente al error ( que haga beep no nos sirve para nada) y nos sirve para buscar una solución Ya comentas. Un saludo a todos
|
|
maserrano
Colaborador Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 02/Junio/2023 a las 19:17 |
Pues va genial. He realizado un puñado de pruebas y lo dicho, está genial. Muchas gracias por la aportación y si queréis se puede cerrar el hilo.
|
|
Responder | |
Tweet
|
Ir al foro | Permisos de foro Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |