GeneXus - Maestro Detalle

 
Vista:

Maestro Detalle

Publicado por Alberto (3 intervenciones) el 07/04/2006 19:57:07
Tengo un aplicativo desarrollado con Genexus 7.0 y en una de sus transacciones que es maestro detalle para generar Vales, estoy generando automáticamente el número del vale, el asunto es que cuando el usuario llena el ancabezado del vale y pasa a llenar los detalles, se graba el encabezado del vale y si el usuario decide no terminar la transacción, ya se ha generado y guardado el número del vale, luego cuando intenta generar otro vale se genera un error porque el número de vale que intenta generar ya existe, en ultimas lo que necesito es que no quede guardado el encabeezado cuando se pasa del encabezado a los detalles y que tanto el encabezado como los detalles del vale se guarden solo cuando el usuario pulsa el boton "Confirmar"
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Maestro Detalle

Publicado por PabloF (275 intervenciones) el 07/04/2006 21:01:14
Mira Alberto,

yo hace bastante pase por la situacion en la que vos estas y no fue facil solucionarlo. Por de pronto lo que deberias hacer (para cualquier generacion de comprobantes) es tener dos bases de datos, una definitiva en el disco del servidor y otra con los temporales en cada disco de las terminales que usan el sistema.

La operatoria seria la siguiente: que cada usuario, al cargar el vale, lo cargue en una transaccion TVALE y TVALE1 para los renglones. Esas dos tablas estarian ubicado en una base con todas las tablas temporales EJ: PUESTO.MDB

Cada vez que el usuario cargue un VALE deberia, primero leer de alguna tabla comun PARAMETROS el numero de vale. Que cargue el encabezado, los renglones..... y al terminar y dar Confirmar usar un procedimiento que pase lo que esta en TVALE y TVALE1 a las tablas definitivas VALE y VALE1.

En caso de que el usuario se arrepienta de la carga.... que cierre el form, no nos molesta, pues lo que escribio esta en una tabla temporal que sera inicializada la proxima vez que cargue un vale.

Quizas es algo molesto para ti modificar tu modelo, pero es la mejor solucion que pude encontrar a este problema. Si te interesa te puedo dar mas consejos al respecto.

Saludos
PabloF desde Cordoba
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Maestro Detalle

Publicado por PabloF (5 intervenciones) el 07/04/2006 21:10:34
Sino otra solucion, menos elegante, es que hagas un procedimiento que borre el encabezado.

Pone el START de VALE una &Bandera= 0 y solo en el boton CONFIRMAR pone &BAndera = 1.

Entonces en el evento EXIT de VALE pones el procedimiento que chequea si se esta saliendo sin confirmar, entonces llama al procedimiento que borra encabezados, pasandole el nro del vale a borrar:

IF &BANDERA = 0
...........CALL(PBORENC,NROVALE)
ENDIF

PROCEDURE BORENC
PARMS(&NROVALE)

FOR EACH
WHERE NROVALE = &NROVALE
............DELETE
ENDFOR

Prefiero la anterior, pero esta tambien te sirve.
Saludos PF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Maestro Detalle

Publicado por Alberto (3 intervenciones) el 07/04/2006 23:53:52
Las dos soluciones estan interesantes, yo lo tenía solucionado temporalmene con una rutina parecida a la segunda que planteas, que tampoco es muy elegante y que el usuario lanza a voluntad cuando esto ocurra
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Maestro Detalle

Publicado por Esteban (5 intervenciones) el 08/04/2006 04:54:01
Hola Alberto, mirá yo tengo algo similar a una facturación. Lo que puedo decirte es que si tu sistema es multiusuario y los vales lo imprimirá mas de una persona, te conviene darle el N° una vez que cargues todos los datos (cabezera e items); para ello escribí la regla siguiente:

call(PSumaIdent ,Numero ,&numero ) IF after(Agecod ) .AND. &mode = 'INS' ;
&mensa11 = 'Movimiento :' + (str(&numero ) ) ;
msg(&mensa11 ) IF after(trn ) .AND. &Mode = 'INS' ;

Donde: Numero(es automatico); la variable para traer el nuevo (&numero); Agecord último campo de referencia para dar la orden de grabado con after (trn);
y por último muestras el N° si lo quieres mostrar.
La ventaja de esta forma es que al trabajar multiusuario no habrá duplicación de Números claves.

================================================================
La otra forma sería iniciar la carga con el N° automático (creo que es lo que tu haces). Yo lo solucioné de la siguiente manera: Armé un work Panel con la consulta de todo los (vales junto a los detalles grabados), creé un Boton cuyo evento sería:

Event 'ALTA'
call(PSumaIdent , &Numero ) (procedimiento de suma del N° automático)
&MueIden=0
call(Transacción , &Numero , &Usuario, 'INS')
EndEvent

Event 'modificar'
call(Transacción, Numero , usuario, 'UPD')
EndEvent

*********** y el Evento para evitar grabar datos en caso de abortar ***********

Event exit
return
call(PRestaNro , Numero )
EndEvent

//****************************************************************************************/****************************** procedimientos ****************************************/
parm(&Regconta ,&s1 ) ;

For Each RegIden ( procedimiento para sumar el N° automático)
where RegIden = 1
&RegConta = RegConta + 1
RegConta = &RegConta
&s1=RegConta
Endfor

/**********************************/

parm(&MueIden ) ;

&Ban = '0' (procedimiento para restar el n° automático)
For Each Numero
where Numero = &numero
&Ban = '1'
Endfor

If &Ban = '0'
For each RegIden
where RegIden = 1
If RegConta = &Mueiden
RegConta = RegConta - 1
Endif
EndFor
Endif

***************************************************************************************
lógicamente que para que funcionen los sumadores y restadores, debes crear
una tabla (transacción) compuesta :

Regiden -- numerico ( 1 )
Regconta numerico ( 9 ) o el tamaño que quieras.

El regconta será el que te irá generando los numeros. A, y de la segunda forma (empezando con el n° automático de entrada NO te sirve para trabajo multiusuario. Espero haberte ayudado y no confundigo. Suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar