Relación entre tablas descripción


([N4] Ramon Denuc) #1

Hola Foro,

Ha ver como lo explico para que se me entienda.

Ejemplo: Tengo una tabla de ARTICULOS con los campos ID, REF, DESCRIPCIÓN que esta relacionada con LINEAS DE PEDIDOS, en el momento de hacer un pedido de un articulo tengo que insertar la REF en la linea para que me salga la Descripción que tiene ese articulo, pero, y aquí esta mí duda.

Cuando al insertar la REF en la linea de pedidos siempre te sale la descripción que anteriormente ya se ha insertado en la Tabla de ARTICULOS, y si por aquellas, desde las lineas de Pedidos quiero cambiar o llamar de otra forma la descripción nunca me deja cambiar, supongo por la relación existente, lo digo, porque lo que escribo me lo vuelve a dejar como en articulo esta escrito.

Como puedo hacer para que me deje cambiar la descripción a mis necesidades y deje esa linea como yo quiera, claro esta que ese articulo seguirá igual la próxima vez que lo necesite.

Otra cosa puede ser que yo programe mal alguna cosa, y por eso no me deja cambiar el texto sin que me lo vuelva a escribir como esta en artículos.

Muchísimas gracias por vuestros sabios consejos.


([N1] vgegeo) #2

El campo DESCRIPCION de la LINEA DE PEDIDOS, debe tener como contenido inicial, la descripcion del maestro articulos, para que cuando elijas la REF, por defecto coja la descripcion de la tabla ARTICULOS, de esta formas, si escribes la descripcion manual despues de haber elegido la REF, guardara en la tabla LINEA DE PEDIDOS lo que hayas escrito.

Saludos


([N2] AyudaVelneo) #3

Hola Ramón:

Tendrás que crear un campo en la tabla líneas de pedidos llamado por ejemplo “Descripción”. A este nuevo campo le pones como contenido inicial el campo Descripción del artículo.

Este nuevo campo es el que luego pones tanto en los formularios como en las rejillas. Si una vez introducido el artículo en la línea, quieres cambiar la descripción, editas el campo y lo modificas.

Un saludo


([N1] vgegeo) #4

Si estas hablando en ejecucion, en el formulario de LINEAS DE PEDIDO, revisa si la edicion la tienes sobre la DESCRIPCION del MAESTRO ARTICULO, o si la tienes sobre el CAMPO DESCRIPCION de LINEAS DE PEDIDO.


([N4] Ramon Denuc) #5

Me encanta lo mucho que estoy aprendiendo yo sólito a programar en Velneo, pero mucho más me gusta, cuando las personas ayudan a otras personas.

Cosa que no dudare en hacer cuando tenga un poco de nivel en esto de programar en Velneo.

Muchísimas gracias, chicos.


([N3] pacosatu) #6

Hola RamonD.

Te propongo otra solución un poco más compleja pero te puede servir como un buen ejercicio para ver las posibilidades de la BBDD de Velneo.

Ahora tienes 2 tablas: ARTS(ID, REF, DESC) y PED_LINS(ID, ARTS, CANT, …)

Necesitas tener la posibilidad de sobreescribir la DESC del artículo en cada línea del pedido PED_LIN. Haz lo siguiente:

  • Crea una tabla de extensión de PED_LINS con nombre PED_LINS_EXT en la que habrá un campo DESC_OPC con la descripción opcional. En la tabla PED_LINS aparecerá un puntero Virtual EXTENSION_PED_LINS_EXT, ese es el enlace 1-1 entre la Línea de Pedido y su posible DESC_OPC.

  • Añade un nuevo campo a la tabla PED_LINS llamado DESC de tipo “Fórmula alfabética” cuya fórmula será:


    choose(isEmpty(#EXTENSION_PED_LINS_EXT.DESC_OPC), #ARTS.DESC, #EXTENSION_PED_LINS_EXT.DESC_OPC)

    Como ves le estás diciendo que coja la Descripción Opcional si está rellenada.
    Este campo fórmula es dinámico, es decir, se calcula en tiempo de ejecución, no ocupa espacio en la tabla y es rapidísimo.

Con esto consigues 3 cosas: no duplicar la descripción del artículo en cada línea ahorrando espacio, la descripción de la línea está siempre sincronizada con la de la tabla de artículos y la tabla PED_LINS_EXT solo tendrá registros para aquellas líneas con Descripción opcional. Todo muy optimizado que a veces los Megas son caros.

Esta técnica también la puedes aplicar en los Pedidos donde tienes una dirección de entrega opcional a la prefijada por el Cliente.

Ya tienes para una buena práctica.

Saludos
Paco Satué


([N4] Ramon Denuc) #7

Sensacional idea Paco.

Esta tarde tengo faena, entre las varias cosas que me habéis explicado, haré las diferentes pruebas, y os diré con que opción he decido cerrar este tema.

De verdad y con todo mi corazón, muchas gracias por vuestra ayuda.

Sois mejores que la documentación existe sobre Velneo, que en muchos, pero en muchos temas, es muy escasa y sobre todo con casi ningún simple ejemplo orientativo.

Saludos


([N2] AyudaVelneo) #8

Hola:

Solo hay un peeeeeeerooooooooo al planteamiento del “maestro” Paco:

Si pones ese campo como fórmula, es cierto que no ocupa espacio en disco, te estará penalizando en las rejillas donde incrustes ese campo. Al ser un campo fórmula Velneo tiene que recalcular la fórmula por cada “pintado” de registros.

Un saludo


([N3] pacosatu) #9

Hola Vila.

No creo que un simple choose() entre 2 campos enlazados ralentize el interface por mucho Cloud que tengamos. Otra cosa que la fórmula tuviera cálculos de agregación o algo más complejo.

Siempre tendremos la Caché automática de Velneo para evitar los retardos y para los pedidos estamos hablando de consultas pequeñas, a no ser que sean pedidos de miles de líneas.

Te pongo un ejemplo:
¿Qué es más rápido en una columna de la rejilla de líneas de pedido PED_LINS?

  • Poner #ARTS.DESC
  • Poner #DESC que es un campo fórmula choose(1,#ARTS.DESC,"")

Yo creo que la segunda opción será una millonésima parte más lenta, de lo contrario devuelvo VELNEO.

Saludos
Paco Satué


([N2] Mgalvezh) #10

Me encantan los debates, jeje, Paco creo que la comparativa debe ser:

¿Qué es más rápido en una columna de la rejilla de líneas de pedido PED_LINS?

  • Poner #ARTS.DESC (esto no cabe, ya que tenemos la descripción en la misma tabla seria simplemente esta la comparativa:

  • Poner #DESC

  • Poner #DESC que es un campo fórmula choose(1,#ARTS.DESC,”")

aunque estamos desnormalizando, claro.

Saludos.
Miguel.


([N2] AyudaVelneo) #11

Hola:

Estoy convencido de que la fórmula es mas lenta.

En todo caso, lo suyo (para este ejemplo) sería poner un campo en la tabla de líneas de tipo alfa 256 (por ejemplo) con un contenido inicial (y que ese contenido inicial fuese la fórmula que dice Paco).

Así además si en un futuro quieres poner un texto libre, también podrías.

Un saludo


([N2] ramiro) #12

Vila tiene razón, pero no…

Las fórmulas SON más lentas, pero la penalización que suponían en las primeras versiones (que era insufrible) ha pasado a la historia.

Yo no uso fórmulas, yo abUSO de las fórmulas. Por eso conozco bien la penalización que suponen. La solución planteada por Paco, además de correcta (la más correcta, añadiría) no supondrá carga alguna (que podamos apreciar) incluso con decenas de miles de registros en una rejilla.

Saludos. Ramiro


([N1] percyleoncio) #13

Me sirve de mucho lo expuesto aquí, asi de esta forma me parece excelente, pues nunca usaba fórmulas. Gracias a todos por compartir sus conocimientos.


([N1] wikan) #14

Me gustan estos hilos dónde se debato estructuras y rendimiento.

Aporte una pequeña duda, me gusta la forma de @seh.
Ahora pregunto, si la descripción es una campo objeto->texto y sí, usando una fórmula para mostrar el #articulo.descripcion o #descripcion, según si se ha rellenado o no.

Al ser un campo objeto, este va a otro fichero, por lo que no engorda la tabla de lineas y sigues manteniendo la misma funcionalidad.

¿Es correcto esto?

Saludos


([N2] ramiro) #15

Ya comente que, en mi opinion, la opcion de Paco era la mas correcta. Grabar en un campo objeto texto tiene numerosas desventajas:
. Ocupa mas espacio
. Acceso mas lento
. Menos control (gobiernas el enlace al contenedor?)
. Mas fragil (un fichero contenedor se corrompe mas facil y se recupera mas dificil)

Yo solo lo consideraria si el texto fuera intrinsecamente de longitud muy variable y aun en esos casos me lo pensaria mucho… y casi seguro que optaria por otras soluciones

Saludos. Ramiro


([N3] pacosatu) #16

Hola.

Podríamos dejar el debate de las fórmulas en lo de siempre, que depende de lo que tenga que calcular la fórmula cada vez que se consulta ese campo y sí vamos a mostrar el campo fórmula en una rejilla con muchos registros.

Saludos
Paco