anonymous Log in
Search
Recents:
v3.0
gx-l
PK con Fecha de Validez
27/01/20 15:24

gxchecar

Replies: 13

Buen Día Foro ¡
En mi compañía estamos evaluando comprar Genexus para mejorar la atención a
nuestros usuarios.
Estuve evaluando y me di con un problema de nuestro modelo de datos que no
sé cómo plasmarlo en Genexus
En mi trabajo, nuestro sistema core tiene, en la mayoría de las tablas de
nuestro *modelo de datos*, el campo “*Fecha de Validez*”. Ese campo es
actualizado *manualmente* e indica desde cuando es VALIDO ese registro.
Este campo forma parte de la PK (ID y FechaValidez), pero para acceder al
registro SOLO se accede por la ID y (internamente) se busca el mayor valor
del campo “*FechaValidez**”* que sea menor a la fecha del día.
Es decir, para Obtener UN registro o grupo de registros se le pasa como
parámetro una fecha de proceso o de comparación ( Fecha del Día, etc.) y se
devuelve el registro que tenga la mayor fecha y que sea menor a la fecha de
proceso.
Ej: En la BD
Tabla de Clientes
Id
(PK)
*FechaValidez *(PK) Nombre Código X
1 15-Nov-2001 Juan 100
1 24-May-2018 Juan 101
1 20-Ago-2021 Juan 101
2 13-Ene-2001 Pedro 200
2 17-Jun-2010 Pedro 201
2 22-Ene-2017 Pedro 202
2 12-Set-2022 Pedro 202
3 23-Ago-2009 Matías 300
Si deseo obtener el ID “1”, “2” o “3”, para el día de hoy (*24-Ene-2020*),
me tiene que devolver el registro sombreado en amarillo
El SELECT para obtener el registro que se usa internamente es el
siguiente: (Este es el estándar para todas las tablas de nuestro modelo de
datos)
SELECT codigoX
FROM CLIENTES C
WHERE id = 1 AND *FechaValidez* = (SELECT MAX( *FechaValidez* )
FROM CLIENTES Max
WHERE Max.id = 1 AND Max.*FechaValidez* <=
SYSDATE)
Mi pregunta es:
¿ Cómo hago en GX para replicar esta misma forma de trabajo?, …como debo
crear los TRN o reglas ,etc. para que obtener el mismo comportamiento??
Espero haberme hecho entender.
Cordialmente,
--
Carlos Cevallos Castro
-----------------------------------------
Para Suscribirse/Desuscribirse:
http://www.gxtechnical.com/cgi-bin/hforum.exe?2,3,30,1
Por consultas owner-gx-l@gxtech.com.uy
Replies

orlando.fallas

27/01/20 15:40
Buenos días No lo he probado pero podría hacerlo de esta forma. Para no repetirlo por todo lado se puede hacer un dataselector. for each Clientes where ClientesId = 1 where ClientesFechaValidez = Max( ClientesFechaValidez, ClientesId = 1 and ClientesFechaValidez <= now() ) ... endfor El lun., 27 ene. 2020 a las 9:25, Carlos Cevallos Castro (< carlos.cevallos.castro@gmail.com>)

gxchecar

27/01/20 16:04
Gracias Orlando por tu respuesta! Y ese sería la forma de configurar todo mi modelo de datos? De igual forma lo podría usar con los patterns? Lo decía porque en Gx cuando se crea las transacciones y se configura la PK (ID y FechaValidez) los patterns crea automáticamente los WP con la llave idéntica a la PK y no se donde personalizar la búsqueda del registro como lo hace el sistema en mi trabajo El El lun, 27 de ene. de 2020 a la(s) 10:41, Orlando Fallas Rios < orlando.fallas@mtss.go.cr>

Jorge Berta

27/01/20 15:48
Si te entendí bien quieres obtener el CodigoX para el ID=1 para la mayor FechaValidez, creo que sería algo así donde el valor buscado lo almacenas en la variable &CodigoX (podes implementarlo como procedure o data selector) For Each Clientes_C Order by Id (FechaValidez) Where Id = 1 &CodigoX = CodigoX Exit EndFor Saludos Jorge

federicomdelvalle

27/01/20 16:17
Buen día Carlos, por lo que entendí, sería algo así: for each Clientes order by Id (FechaValidez) where Id = 1 where FechaValidez <= &today /* codigo */ exit endfor Por lo que preguntas de los patrones, podes crear los filtros para las búsquedas. Saludos. El lun., 27 de ene. de 2020 a la(s) 13:04, Carlos Cevallos Castro ( carlos.cevallos.castro@gmail.com)

gxchecar

27/01/20 16:30
Muchas Gracias Federico !! Gx infiere la búsqueda de los valores del registro conforme a la PK (ID y FechaValidez) ...pero el modelo de datos de mi empresa lo toma SOLO por el ID y evalúa la mayor FechaValidez según sea la fecha del día o de proceso. El “for each” que escribiste me serviría para configurar todos los accesos o hay otra forma de indicarle a Gx que infiera los resultados de las búsquedas a las transacciones? ... es decir, personalizar la forma como gx infiere? El El lun, 27 de ene. de 2020 a la(s) 11:17, Federico Del Valle < federicomdelvalle@gmail.com>

Google

27/01/20 18:36
Buenas tardes, Cuando se opta por una herramienta de desarrollo Casi nunca se juzga si la herramienta podría o no Replicar el modelo de dato de la compañía, Simplemente se asume que la herramienta lo puede hacer, En este sentido, Genexus no es la diferencia. Podrías tener el modelo que quieras trabajando Con el ide directamente, ahora bien los pattern son otra cosa, No digo que te obligue a desviar mucho el camino, Pero te exige ciertas atenciones que de entrada Un programador experto podría verlos. En tu caso, si bien explicaste lo que quieres hacer, No dijiste “porque lo quieres hacer así”, Ya que desde mi punto de vista, podrías Perfectamente tener un campo Autonumerico y nada más, Lo demás Campos los podrías ir almacenando de Acuerdo al criterio que más te apetezca, Y en este punto es donde se juzga el: PARA QUE. Resumiendo, Genexus puede asimilar tu modelo de datos, Y también lo puede mejorar si a si se lo permites, Tendrías que invertir un poco más de tiempo si eres nuevo, Y no tanto si tienes experiencia. Saludos, Alberto Sent from my iPhone > On Jan 27, 2020, at 1:30 PM, Carlos Cevallos Castro

gxchecar

27/01/20 20:30
Gracias Alberto por responder! El sistema es heredado de la matriz en europa y soporta la operativa de las empresas en varios países en el mundo. Es un sistema grande y lo que deseamos (para una filial) es acomodar esa funcionalidad del modelo de datos en Gx El El lun, 27 de ene. de 2020 a la(s) 13:36, Alberto Fernandez < gxbeto@gmail.com>

leandro79337933

28/01/20 13:09
Hola Carlos, muy buenos días! No tengo a mano mis libros de bases de datos, pero creo que ese modelo de datos no respeta la tercera forma normal. GeneXus es una herramienta que modela los datos según esa forma, por lo que en principio, estaríamos complicados. Se me ocurren algunas opciones, dentro de GX con procedures o incluso data providers. Y por fuera de GX armando vistas y luego creando los data views correspondientes dentro de GX. En GeneXus 16 hay un tipo de transacción nueva que se denomina "dinámica", no he tenido tiempo de investigarla pero la idea es poder armar una "vista" de una tabla física dentro de GeneXus. Quizás pueda ser útil. Sinceramente, es un modelo de datos medio "extraño", me imagino que los JOINs con el resto de las tablas se las traen... pero bueno, es una herencia... Slds On Mon, Jan 27, 2020 at 5:31 PM Carlos Cevallos Castro < carlos.cevallos.castro@gmail.com>

Enrique Almeida

28/01/20 14:35
El modelo que planteas es el habitual en las bases de datos que necesitan soporte temporal (temporal databases, no confundir con base de datos temporaria). Con Genexus puede implementarse , y se puede programar los casos aunque no es todo lo elegante que seria deseable. Para un conjunto limitados de atributos, podes usar la función find() y atributos formula para recuperar aquellos registros que estén vigentes, por ejemplo para buscar el precio de un producto en la lista de precios ,correspondiente a la fecha de la venta. Se que en genexus están estudiando el escenario de bases de datos temporales y bitemporales, pero desconozco su grado de avance. Seria notable contar con soporte nativo para estos casos, donde se le puede decir que un atributo o rango es el que maneja la vigencia. Co transacciones dinámicas creo que se puede implementar, pero debería probarlo. Enrique El lun., 27 de enero de 2020 12:25, Carlos Cevallos Castro < carlos.cevallos.castro@gmail.com>

gxchecar

28/01/20 17:21
Muchas Gracias Leandro por tu respuesta! ...voy a investigar las transacciones dinámicas. El El mar, 28 de ene. de 2020 a la(s) 08:10, Leandro Minatel < leandro@minatel.com.ar>

gxchecar

28/01/20 17:32
Hola Enrique! Excelente aporte! Voy a investigar el tema de Base de Datos Temporal y Bitemporales. Veré hacer pruebas con find() y las transacciones dinámicas Gracias El El mar, 28 de ene. de 2020 a la(s) 09:36, Enrique Almeida < ealmeida@concepto.com.uy>

mmvarios

30/01/20 16:55
Hola Carlos, no se si te entendí bien, pero capaz que algo así te podria andar: *Clientes*: ClienteId * ClienteNombre ClientePrdFechaValido - Formula -> Max( ProductoFechaValidez, ProductoFechaValidez< servernow() ,, ProductoFechaValidez ) ClientePrdCodigoValido Formula -> Max( ProductoFechaValidez, ProductoFechaValidez< servernow() ,, ProductoCodigo ) ( ProductoFechaValidez * ProductoCodigo ) Tal vez te sirva. Salu2 . El mar., 28 ene. 2020 a las 14:33, Carlos Cevallos Castro (< carlos.cevallos.castro@gmail.com>)

gxchecar

31/01/20 02:21
Muchas Gracias, Marco y a todos por responder ! Voy a investigar el material de las transacciones dinamicas que me pueden ayudar a resolver el proyecto. https://wiki.genexus.com/commwiki/servlet/wiki?36732,Dynamic+Transactions+that+receive+parameters, Cordialmente, El jue., 30 ene. 2020 a las 11:55, Marcos ()


Back to gx-l