Tablas maestro detalle y boton cancelar


([N2] eric pap) #1

Hola que tal. Tengo una consulta (supongo que ya esta respondida, pero no la encontré).

He notado que al crear un par de tablas maestro detalle, el comportamiento por defecto de Velneo, es que una vez que entro el el formulario de alta y agrego la primera linea (a un pedido por ejemplo), automáticamente se genera y se confirma una transacción que crea el encabezado (aun no guarde el objeto). Y lo que es peor, si cierro la ficha con cancelar (el usuario esperaria que no se halla modificado nada aún) me queda el encabezado guardado sin detalle. Es esto correcto?

Normalmente en otros lenguajes yo manejaría todos los datos en memoria (encabezado y lineas) y solo al darle a guardar, actualizaría los datos encapsulados en una única transacción que envuelva tanto el encabezado como las lineas asegurando la integridad de datos.

Es evidente que debo hacer el proceso de guardado manualmente. Como se haría esto a grandes rasgos en Velneo? Con tablas en memoria en lugar de disco? Y en que plano se podría hacer (1ero, 2do, 3ro)?

Gracias!


([N3] pacosatu) #2

Hola eric pap.

No te preocupes, muchos nos llevábamos las manos a la cabeza cuando veíamos eso en los seminarios de iniciación y como tal cosa. Por supuesto ese comportamiento solo tiene sentido en los cursos y no es aplicable en la vida real.

Varias cuestiones:

  • Velneo siempre trabaja con Fichas reales en disco (confirmadas) y mantiene una conexión con ellas.
  • Cuando das de alta una Línea, Velneo necesita el #ID del Maestro, por eso lo “da de Alta” previamente de forma automática y silenciosa, algo que despista al comienzo. Esto solo se produce en el contexto del Formulario, Velneo induce a la Línea el ID del Maestro y si no existe, lo crea.
  • Si quieres englobar todo en una sola Transacción debes activar el Estilo “Bloqueo Duro” del Formulario, aunque esto debe usarse con precaución cuando las Altas de Líneas afectan a otras tablas mediante Actualizaciones.
  • Lo más lógico y esperable es que diseñes la Aplicación de tal manera que el Usuario deba confirmar la Cabecera antes de dejarle añadir Líneas.
  • Usar tablas temporales es otra solución, pero con Velneo el traspaso de datos entre tablas es un infierno, ya que necesitamos crear variables locales intermedias. Existen los Tubos de Ficha/Lista, que harían el trabajo muy sencillo, pero están de momento muy dejados de lado por el equipo de desarrollo y es una verdadera lástima.

Lo anterior es aplicable a los formularios en modo Vista (pestaña) donde no se abre transacción global (es bloque blando) y todas las altas se realizan en el servidor con transacciones individuales y automáticas.

Si quieres realmente controlar la transacción global del Maestro-Detalle, ejecuta el formulario desde un proceso o manejador con Disparar objeto y observa en el vAdmin cómo el Alta del Maestro y de las Líneas se engloban en una sola Transacción (se activa el Bloqueo Duro automáticamente). Incluye un Botón con el comando <Deshacer controlado> en lugar de <Cancelar> para poder deshacer todas las operaciones.

Velneo tiene muchos automatismos que tendrás que aprender a controlarlos. Eso sí, siempre con mucho Prueba y Error porque lo de la documentación y la ayuda contextual dejan mucho que desear.

Saludos
Paco Satué


([N4] mdelgado) #3

Hola,

Este tema es una de las cosas más “mosqueantes” que encontré en Velneo. Lo que yo hago es lo siguiente:

  1. En el formulario maestro/detalle creo 2 variables booleanas: bAlta y bAceptar
  2. En el post-Iniciado del form asigno bAlta= #ID=0
  3. En el botón Aceptar del form asigno bAceptar=1
  4. En el OnHide del form compruebo IF bAlta & !bAceptar & #ID>0 entonces Cargar lista por #ID y luego Recorrer lista eliminando.

([N2] Mgalvezh) #4

Hola, el verdadero problema es el número de factura en un contexto multiusuario, se salta y te quedan huecos, cuando borras las cabeceras al cancelar, para mi lo mejor es tablas temporales y si el usuario guarda, pues pasar a las tablas ‘guenas’, eso si esperemos que alguna vez podamos tener dos registros en memoria al mismo tiempo, sin tener que copiar campos uno a uno, o se arreglen los tubos.

Saludos.
Miguel.


([N2] eric pap) #5

Gracias a todos por sus comentarios. Efectivamente en soporte lo que me recomiendan es hacer un proceso al borrar que elimine los plurales y la cabecera. Funciona ok, pero como dice Mgalvezh, te deja el hueco en la numeración. Lo de trabajar con tablas en memoria parece lo mas lógico: Que los datos solo se vuelquen a disco cuando el usuario da aceptar. Ahora la pregunta es: tendria que crear entonces 2 tablas de cabecera y dos de detalle en mi proyecto de datos, una en memoria y otra en disco? En ese caso como paso los registros de las tablas en memoria a las de disco? tengo que mapear los campos a mano? a que te refieres con que “arreglen los tubos”?
Gracias


([N2] jorge) #6

Hola Eric,

Yo lo que hago es algo parecido a lo que hace mdelgado, pero con algún añadido

Yo asigno el número de documento en función de la serie y este número se asigna mediante una función como Contenido inicial del campo.

Dentro de la tabla de presupuestos, pedidos, albaranes y facturas tengo el campo SERIE y el campo SERIE_TEMP.

En el formulario maestro/detalle el control en el que recojo la serie lo asigno a SERIE_TEMP, así cuando se da de alta el registro aun no me asigna Nº de documento.

Como ha dicho ante mdelgado (con alguna modificación):

  1. En el formulario maestro/detalle creo 3 variables booleanas: bAlta, bAceptar y bCancelar
  2. En el post-Iniciado del form asigno bAlta= #ID=0
  3. En el botón Aceptar del form asigno bAceptar=1 y además Modficiar campo SERIE, SERIE_TEMP (para que como he aceptado el formulario me asigne a SERIE el valor que tiene SERIE_TEMP y así se genere el número de documento de la serie correcta)
  4. En el botón Cancelar del form asigno bCancelar=1
  5. En el OnHide del form compruebo IF bAlta & !bAceptar & bCancelar & #ID>0 entonces Cargar lista por #ID y luego Recorrer lista eliminando.

De esta manera no me hace falta usar tablas temporales.

Espero que te sirva