Una de las características que más presume Velneo son las “Actualizaciones”: modificar un campo en una tabla maestra (o referenciada de alguna manera) al cambiar los valores de un campo.
Tengo implementadas algunas actualizaciones, por ejemplo, en la tabla de líneas de factura actualizan el total de la factura y otro ejemplo los cobros actualizan el saldo pagado de la tabla de vencimiento.
El problema que he visto es que las actualizaciones a veces funcionan y en otras no. No hay un patrón por lo que se podría decir que es aleatorio.
¿Ustedes recomiendan el uso de las actualizaciones o creen que debo de revisar algo en mi aplicación por el cual las actualizaciones no apliquen correctamente?
Buenos días, Marco
Por supuesto que te recomiendo utilizar las actualizaciones. Son una parte fundamental de la BBDD de Velneo. Tareas como acumulados de saldos, gestión de stocks, cálculo de totales, etc. se simplifican completamente.
Si en algún caso no te funcionan puede deberse a que alguna ficha esté en uso y por eso no se ejecute la actualización. El único caso en el que he tenido problemas ha sido el siguiente:
Tenemos que DETALLE actualiza EXISTENCIAS y EXISTENCIAS actualiza ARTICULO. EN esta situación no podemos tener otra actualización en DETALLE que actualice ARTICULO ya que encontraría la ficha bloqueada por la otra actualización.
Por lo demás, yo las utilizo sin problemas.
Un saludo
Gracias por tus comentarios @gontorre, efectivamente me parecen una excelente opción las actualizaciones, pero como he tenido estas experiencias, mi satisfacción no ha sido completa, sobre todo, por lo que comentas de registros usados, donde más incidentes de malas actualizaciones he tenido ha sido precisamente en la pantalla de factura, al agregar y quitar detalles, hay un 50-50 de posibilidades de que el total no me lo calcule bien (por lo menos algún detalle no se suma) y ahí se supone que la pantalla misma tiene bloqueado el registro de cabecera.
De cualquier manera agradezco tus comentarios.
Buenas tardes,
Deberías revisar dónde está el problema porque en un formulario de factura en el que las líneas de detalle acumulan en la cabecera no deberías tener ningún problema. Si las actualizaciones no funcionaran en ese escenario iríamos apañados.
Tiene que haber algún error en algún sitio.
Un saludo
Hola marco_rangel.
Las Actualizaciones funcionan siempre y son una pieza fundamental en Velneo. Funcionan siempre porque de lo contrario, como dice Gonzalo, sería un desastre, y son una pieza fundamental porque de lo contrario, al no disponer de comandos avanzados de agregación de datos, Velneo quedaría como una herramienta de Base de datos bastante pobre.
Por lo tanto, hay que entender muy bien el Sistema transaccional de Velneo, que es muy simple pero realmente efectivo si se programa de forma adecuada.
Puedes ver un ejemplo de problemas con la Actualización cuando se programa de forma no adecuada:
Saludos
Paco Satué
Buenos disa pacosatu aunque no sea del hilo seguro que es del interes de todos, ya esta disponible la app de ejemplos que tenias para poder consultarla y si no es asi sabrias decirnos para cuando estaria. Gracias
Hola, pues ya revisé hasta el cansancio y la actualización durante la ejecución del programa extrañamente sigue sin funcionar.
Mi sistema hace esto en concreto:
Toma n partidas y mediante un botón crea una factura (encabezado y n detalles).
Esto hasta aquí funciona correcto, tengo el subtotal en automático actualizado por el correspondiente proceso de actualización.
El sistema entonces manda llamar la edición de la factura. Se abre la pantalla de la edición de la factura.
En la rejilla del detalle de la factura hay dos botones, uno para agregar más fichas de detalle y otro para eliminarlas (a la izquierda, imagenes de la app, a la derecha del vDataClient).
El botón de eliminar manda llamar el formulario de eliminación.
Lo presiono, confirmo la eliminación. No hay programación como tal aquí, todo lo hace velneo y esto es lo que tengo (en la parte de abajo en el mismo órden):
El registro que quité, ya no aparece, pero vean el subtotal (o en este caso el total, calculado a partir del subtotal, pero para efectos de este ejemplo es el mismo valor, ya que no hay elementos que lo modifiquen.
A continuación muestro como está configurado mi proceso de actualización:
Hice unas pruebas eliminando registros desde el vDataCliente, y ahí si me descuenta correctamente el importe de la ficha eliminada “manualmente”, o incluso modifico el importe de la ficha de detalle y después de unos pocos segundos veo que se actualiza en automático el valor del importe en el encabezado, por lo que el problema entonces debe de ser con el formulario, que no permita de alguna manera que el campo subtotal se actualice (es lo único que se me ocurre, ya que solo en esta pantalla, al agregar o quitar fichas, el subtotal no se actualiza).
Finalmente tengo que resolverlo de una u otra manera, y aquí es donde me salta una duda: ¿Si el campo “subtotal” del encabezado recibe actualizaciones de los detalles, hay algún problema en que yo manipule directamente este valor? Es decir, lo que he hecho es que después de que se agregue o quite un registro, tomar el evento “Lista cambiada” y ahí hacer el recalculo manual del importe total y plancharlo en el encabezado. ¿Esto afecta en como funciona el proceso de velneo de “Actualización”?
Si no hay problema, puedo dejarlo entonces con esta solución, solo necesito que alguien que sepa me confirme.
Saludos.
Sigo con algunas pruebas y he notado algo curioso.
Como mencioné, tengo una pantalla que me muestra una lista y un botón que dice “Facturar los seleccionados” y manda llamar un proceso que, de acuerdo a los datos del detalle, crea la ficha de encabezado de la factura y las líneas del detalle, las cuales se pueden ver en la primera imagen del post anterior.
Después de crear los registros de la factura viene una instrucción para seleccionar la ficha de encabezado de la factura y posteriormente el comando “Modificar ficha seleccionada con formulario”.
En la app todo aparentemente OK, el problema es que al abrir la ficha y su detalle de esta forma, pareciera que los campos quedan con una especie de bloqueo que no logro entender del todo. Explico mis pruebas, trato de modificar los campos tanto del encabezado como del detalle desde el el vData y no me deja (esto debe de ser obvio), pero mi corrección que actualiza y plancha el importe total si funciona (dado que la actualización no).
Ahora viene el dato curioso, si genero la factura, y confirmo y cierro esta pantalla de edición, y vuelvo a abrir esta factura, la edición a partir de este momento se hace con otro formulario un poco diferente al anterior (pero otro a final de cuentas), y si desde aquí quito y agrego fichas de detalle SI FUNCIONA!!!.
Entonces mi problema esta en el formulario, solo que sigo sin saber cual es.
Hola marco_rangel.
Reinicia, reinicia, reinicia, …
Empieza desde cero y hasta que no lo entiendas bien, no sigas.
Las Actualizaciones funcionan siempre y son una de las Funcionalidades más interesantes de la Base de Datos Real de Velneo.
Mi consejo: usa el depurador, ejecuta tu aplicación paso a paso y observa cómo se crean y se cierran las transacciones en el vAdmin.
Los problemas siempre son consecuencia de una programación inadecuada. La Actualización no es más que una escritura en el Maestro desde el registro actual. Tendrás que averiguar qué ocurre justo en el momento de ejecutar la Actualización sobre el registro Maestro de la línea de detalle.
Reconozco que Velneo aporta pocas herramientas para detectar problemas con las transacciones en el vServer, pero es algo a lo que hay que acostumbrarse.
Saludos
Paco Satué
Hola Paco, un gusto saludarte, pues si, en eso ando, como vez es un tema que tengo “atorado” desde hace algo de tiempo, precisamente las imágenes que tomé son precisamente usando las herramientas, pero al final con depuración no puedo ir más allá ya que no hay nada que pueda ver, es decir, el botón de “Eliminar” manda llamar el formulario de eliminación de la ficha de detalle, y de ahí esta el botón de “Eliminar” (definitivo) el cual en el Comando tiene la acción “Eliminar”, por lo que nada de esto se ve en el depurador, y eso es lo que me molesta, que en ese punto estoy completamente ciego y lo único que tengo es el vData que tampoco me ha servido de mucho en este caso.
Pues a seguir haciendo revisiones, e incluso me estoy planteando el volver a hacer el formulario desde cero, por que como coementé, fuera de ese formulario, incluso en otro similar (de hecho este formulario “que no sirve” es una copia modificada de otro el cual si que funciona).
Saludos!
Hola marco_rangel.
Responde a una pregunta:
Cuando en tu formulario que falla, eliminas o añades/cambias el Importe de una línea de Detalle
¿se llega a eliminar realmente el Detalle o se añade/cambia el Importe de dicho Detalle?
Es decir, ¿la Transacción se ejecuta y se cierra correctamente a pesar de que la Actualización no se haya ejecutado?
Abre el vAdmin y ejecuta paso a paso el proceso de Edición del Detalle y observa la Transacción. Ésta debe afectar a las 2 Tablas (cabecera y detalle) y debe contener al menos 2 operaciones (añadir/cambiar/eliminar detalle y modificar cabecera).
En resumen, si la transacción se ejecuta completamente, la Actualización debe ejecutarse también, de lo contarrio sería un Bug grave de Velneo vServer.
Saludos
Paco Satué
Hola Marco, espero que esto te ayude:
Lo que tu comentas es correcto, no se si es un bug o es normal el comportamiento de lo que te ha pasado. Sin embargo solo pasa esto cuando creas un registro mediante proceso y mediante un evento abres ese registro para su modificación mediante un formulario, si modificas el detalle no actualiza la cabecera.
Pues bien te comento que yo sufrí de la misma forma y aunque como dice @pacosatu, algo no hacemos bien en la forma de como llamamos para abrir ese formulario. yo lo solucione cambiando la forma , y no se si es la correcta pero me funciona y elimino tener que hacer refrescos mediante botones con mas código
.
Hola Fischerpro.
Gracias por la aportación.
Los 2 códigos que planteas deben de funcionar correctamente, aunque tendrán comportamientos diferentes.
- Si usamos Pedir formulario
En este caso el Formulario abre la la Cabecera de la factura en modo lectura. En este escenario cualquier cambio que hagamos en las Líneas de detalle se guardarán si generamos transacciones desde los Manejadores del formulario y la Cabecera se actualizará correctamente desde esa misma transacción.
Otro tema distinto son los cambios que hagamos en la Cabecera de la Factura usando los controles del Formulario, en este caso no se guardarán los cambios porque el comando Pedir formulario no genera transacción. Cualquier cambio que hagamos directamente en la Cabecera se perderá cuando salgamos del Formulario.
Código para abrir la Cabecera de la Factura en modo Lectura.
Cargar lista (FACTURA, ID, ID_SEL)
Seleccionar ficha por posicion (1) // Seleccionamos la Ficha
Leer ficha seleccionada // Obtenemos la Ficha en modo Solo lectura
Pedir formulario // Abre la Factura en Formulario para Solo lectura
// NO hay transacción abierta y por lo tanto los cambios en la Factura se pierden
- Si usamos Modificar ficha seleccionada con formulario
El formulario abre la Cabecera de la factura en modo lectura/escritura, creando una transacción desde el principio de la edición. La Factura quedará bloqueada para el resto de procesos que no estén dentro de la transacción. Las Líneas de detalle podrán ser modificadas y la Actualización de la Cabecera se realizará correctamente, aunque la grabación definitiva en las tablas no se realizará hasta que se cierre el formulario, es decir, cuando se termina la transacción.
Código para abrir la Cabecera de la Factura en modo Escritura.
Cargar lista (FACTURA, ID, ID_SEL)
Seleccionar ficha por posicion (1) // Seleccionamos la Ficha
Modificar ficha seleccionada con formulario // Abre la Factura para Escritura (transacción)
// Hay transacción abierta y por lo tanto los cambios en la Factura se guardan
En los 2 casos la Actualización se realiza correctamente.
Lo que ocurre es que en el segundo caso, el Importe acumulado de la Factura no lo veremos reflejado en el Textbox del formulario, debido a que el registro está bloqueado y no funciona el refresco secundario en esta situación.
Consejo: en un proceso, antes de modificar una Línea de detalle, asegúrate que puedes bloquear la Cabecera para que la Actualización no falle.
Y no dejes de mirar el Log de las transacciones en el vAdmin, que aunque no ganará el premio a la mejor herramienta del desarrollador, te dirá si lo estás haciendo bien o no.
Saludos
Paco Satué
Gracias @pacosatu, excelente explicación de como funcionan esos eventos. Quedo muy claro y es correcto.
Aprovechando el tema y ya que sabemos esto, mi pregunta y creo que para Marco seria igual:
¿Como debe ser el proceso o evento si uno quiere abrir un formulario en edición completa, tanto cabecera como detalle después de haberlo creado mediante proceso y no de forma directa?
Lo pregunto pues es lógico que si lo creo y luego lo busco y edito no pasa esto. En mi caso yo duplico una ficha y el cliente al duplicar se le abre de manera inmediata el registro generado para su edición completa y fue ahí donde empezamos a batallar pues notamos que no actualizaba el detalle a la cabecera.
Sin embargo con la opción 1 que comentas logramos la actualización, aunque, en nuestro caso la cabecera no se modifica, si notamos que si se modifica la cabecera esta no lo guardaba.
Con tu explicación, ya sabemos el motivo. Se que existe código en JS, que igual permite hacer ciertas funciones con los registros, como por ejemplo que guarde un registro y cree otro sin cerrar formulario,
¿Habra algo que mediante JS, pueda hacer lo que comento?
¿Duplicar o crear una factura con sus detalles y ese mismo proceso abra la ficha en edición completa?
Yo Digo que sí, aunque por ahora no lo se, ademas no se si esto sea para comentarlo en otro Hilo o tema.
Gracias nuevamente por tu aporte.
Hola fischerpro.
De momento olvídate por completo de Javascript, estos son temas muy básicos de programación y solo faltaría que no se pudiera hacer con comandos nativos. De lo contrario seríamos el hazmerreir de los programadores.
¿Qué quieres decir con “abrir un formulario en edición completa”?
Saludos
Paco Satué
Hola @pacosatu, tal vez es tonta mi pregunta, pero me refiero a que de acuerdo a lo que se planteo. Si usamos la opción modificar ficha seleccionada con formulario, funciona de manera completa cabecera y detalle siempre y cuando abra un ficha ya guardada. pero si hago un proceso en el cual genero una nueva ficha con cabecera y detalle y creo el evento de que una vez creada la edite mediante un formulario. No actualizara la cabecera si hago una modificación en detalle tal como lo explicaste.
De ahí mi pregunta. ¿Cual es la forma correcta de abrir una ficha que es generada mediante proceso y que una vez creada se pueda editar de manera completa tanto la cabecera como el detalle sin tener que terminar el proceso y buscar la ficha y abrirla para editarla?
En mi caso lo requiero al momento de duplicar una ficha y se que en en vErp trae alguna opción de ese tipo pero no me he fijado en su código igual y ahí puedo checar como lo hacen. Así que me daré como tarea mirar ese código y ver si me sirve o igual ver si realmente lo tienen.
Gracias nuevamente.
Hola fischerpro.
Vayamos por partes que creo hay conceptos todavía no muy claros.
Dices:
Si usamos la opción modificar ficha seleccionada con formulario, funciona de manera completa cabecera y detalle siempre y cuando abra un ficha ya guardada. pero si hago un proceso en el cual genero una nueva ficha con cabecera y detalle y creo el evento de que una vez creada la edite mediante un formulario. No actualizara la cabecera si hago una modificación en detalle tal como lo explicaste.
Estás diciendo lo mismo de 2 formas diferentes:
- por un lado modificar ficha seleccionada con formulario siempre requiere un ficha “ya guardada” y además la bloqueará y todo lo que hagas dentro del formulario quedará integrado en la misma transacción, incluyendo actualizaciones.
- por otro lado genero una nueva ficha con cabecera y detalle no tiene sentido en Fichas en memoria, ya que un Detalle no se puede crear si no se ha grabado previamente la cabecera. Hay técnicas de trabajar con tablas Cabecera/Detalle temporales y volcarlas a disco al finalizar el proceso.
La frase “No actualizará la cabecera si hago una modificación en detalle tal como lo explicaste” se refiere a que una incorrecta programación puede provocar esos errores. Veíamos el ejemplo en VERP_2 del manejador VTA_ALB_FAC (Facturar albarán de venta) del formulario VTA_ALB_G (Albarán de venta) que no funcionará cuando haya actualizaciones de VTA_ALB_G a VTA_FAC_G. Este es un problema de que la transacción que actualiza la Cabecera es otra diferente a la que tiene bloqueada dicha Cabecera que acaba de ser dada de Alta.
Ahora tu pregunta:
¿Cual es la forma correcta de abrir una ficha que es generada mediante proceso y que una vez creada se pueda editar de manera completa tanto la cabecera como el detalle sin tener que terminar el proceso y buscar la ficha y abrirla para editarla?
Pues una buena forma es precisamente esta: mediante proceso “independiente” creas la cabecera y detalle en disco devolviendo el ID de la Cabecera recién creada. En el manejador ejecutas un Cargar lista (ID) y editas de la forma habiltual tanto en modo Vista o pestaña como en formulario Modal. El proceso debe ser “independiente” para que obtengas una Ficha de Cabecera no Bloqueada.
¿Cómo creas o duplicas una nueva Ficha en un tabla con Velneo nativo?
Solo hay 2 maneras: con Alta de ficha y con Tubo de ficha. En ambos casos el subproceso devuelve la Ficha nueva en modo Solo lectura, por lo tanto siempre tendrás que hacer un Cargar lista (ID) para iniciar la edición de la Ficha nueva.
Espero haber aclarado algo.
Es un tema interesante este de las transacciones. bloqueos y actualizaciones en el vServer. La excesiva automatización (léase LifeIsSoft) de los procesos de Velneo y el poco feedback desde vServer, hace que muchas veces no entendamos bien qué está ocurriendo en el backend.
Parece que todo funciona bien hasta que llega la “riada” y lo arrasa todo.
Saludos
Paco Satué
Hola Paco, disculpa si sigo con esto por que quiero estar seguro de algo y la otra poder explicarme de manera correcta, que veo que no soy bueno para eso y me preocupa mucho, pero ya buscare ayuda para aprender a dar una buena explicación.
Retomando el punto, según lo que me dices y espero lo haya entendido bien es que si uso cargar lista de manera independiente y lo ejecuto debe poder hacer tanto la modificación de cabecera y detalle y actualizar todo sin ninguno problema de bloqueos.
Quiero mostrarte mi código tal cual lo tengo y no me funciona. ya sea que lo tenga en ese mismo manejador o lo ponga a parte siempre me bloqueara la cabecera y no me actualiza si modifico los detalles.
Ahí yo uso lo que tu dices cargar lista y filtro el id que se creo, para editarlo. pero como he dicho de esta forma pasa todo lo que tu ya has mencionado. Solo se puede modificar cabecera y no detalle y si hago lo que expuse puedo modificar detalle pero no cabecera.
Entonces la pregunta como debo llamar a ese formulario después de haber duplicado la factura y que al abrirlo funcione de manera correcta osea se pueda modificar cabecera y detalle y que se guarden ambos. a eso me refería con la palabra completa.
Investigue en el código de vERP y al duplicar un informe pasa tal cual el error de que no se puede modificar la cabecera pues al aceptar no guardara ese cambio. En otras palabras no se actualiza.
Dicho esto creo que el vERP presenta el formulario pero de nada sirve si no se puede actualizar solo es para saber que se creo darle guardar y volver abrir para ahora si poder modificarlo y editarlo.
Espero tus comentarios y gracias por aclarar mis dudas, ya que creo muchos se toparan con esto en el camino y tu aporte nos servirá bastante.
Saludos buen @pacosatu
Hola fischerpro.
No te preocupes, a veces es complicado explicar un problema por escrito. Lo mejor es dar el máximo de detalles posible y por supuesto, tal como has hecho ahora, acompañarlo con un código resumido con lo principal y no meter 200 líneas de código basura como hacen muchos.
Viendo tu código, en principio debería de funcionar, aunque veo 2 líneas incompatibles entre sí:
- El comando Añadir ficha a la salida solo funciona con Procesos
- El comando Interfaz: Cancelar solo es posible en Manejadores
Entonces tu código ¿Qué es, un Proceso o un Manejador?
Otro detalle es el Tubo de lista inducido: según la documentación las Actualizaciones al Maestro en 3P no funcionarán. Usa variables locales inducidas en su lugar.
Por lo demás, y suponiendo que no hay Transacción abierta previa, el primer Tubo de ficha abre Transacción y no se cierra hasta la última línea del proceso después de Modificar ficha con formulario. Por lo tanto todo debería ejecutarse correctamente, cabecera, detalles y actualizaciones.
Esto es la teoría. Ahora viene la cruda realidad del Prueba y Error.
Seguramente abrir la Cabecera y Detalle en una Transacción abierta provoca problemas con las
Actualizaciones.
Consúltalo urgentemente con Soporte porque sería un tema muy grave de Integridad de la Base de datos.
De momento tendrás que ejecutar los Tubos en un Proceso independiente (transacción independiente) que devuelva la Ficha duplicada ya sin bloquear y entonces ya puedes abrir la Ficha duplicada con Crear manejador de objeto y Disparar objeto para que no abra transacción.
Ya nos contarás.
Saludos
Paco Satué
Gracias Paco, haré todo tal cual lo comentas y ya comentare como me fue.
Saludos