Power Builder - PROBLEMA DE USUARIOS

 
Vista:

PROBLEMA DE USUARIOS

Publicado por Iván Salazar (101 intervenciones) el 24/11/2006 12:48:43
Saludos

La presente es para exponerles mi siguiente caso:

La Base de Datos es ORACLE

Cuando dos usuarios en este caso están accesando a la misma ventana, esta tiene un evento de grabar los datos en la tabla, el cual la clave se asigna automáticamente.

Esta clave se asigna cuando el usuario pulsa el botón de guardar, todo Ok, se guarda el row y asigna el código ejecutando un SELECT que ubica el MAX() del código. Ahora bien, el otro usuario cuando guarda le da el mismo valor que el del usuario anterior el cual ya guardo los datos y por ende la BD muestra el mensaje de UNIQUE CONSTRAINT , o sea, valor duplicado.

¿Que estaría pasando por qué no ejecuta el SELECT que ubica el valor máximo en la tabla cuando otro usuario ya haya insertado una ROW, hay que agragarle una función especifica de PB?
¿Hay algo en las propiedades del DW que me falta o como deberían estar las propiedades?

Les acoto algo que estoy ejecutando las sentencias de commit; rollback; según el caso del Update() para evitar que permanezcan los bloqueos en la BD y que la transacción no este abierta.

Anexo copio el SELECT

String ls_cod
Long ll_cod

SELECT NVL(MAX(substr("PRESUPUESTOS"."COD_PRESUPUESTO",12,9 )),'0') as cod_presupuesto
INTO :ls_cod
FROM "PRESUPUESTOS"
WHERE ( "PRESUPUESTOS"."COD_INSTITUCION" = :ai_institucion ) AND
( "PRESUPUESTOS"."COD_SEDE" = :ai_sede ) AND
( "PRESUPUESTOS"."COD_AREA" = :as_area ) AND
( "PRESUPUESTOS"."COD_PROYECTO" = :as_proyecto ) AND
( "PRESUPUESTOS"."COD_OBRA" = :as_obra ) AND
( "PRESUPUESTOS"."COD_CLASEOBRA" = :ai_claseobra ) USING gtr_sybase ;

if isnull(ls_cod) then Return 1

ll_cod=Long(ls_cod)
ll_cod ++

Return ll_cod

Sin mas a que agregar y agradecido por tuda su atención
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:PROBLEMA DE USUARIOS

Publicado por Milson Cardona (613 intervenciones) el 25/11/2006 00:27:41
Un saludo especial desde Colombia

amigom lo que te esta sucediendo es lo que comunmente llamo "acceso concurrente a los datos", es decir que 2 o mas usuarios den click al mismo tiempo en el boton guardar, los 2 toman el mismo MAX(), oconsecutivo que es la clave primaria, pero solo graba el que primero aciente los datos en la base de datos con el COMMIT... al otro le rebota el error de clave duplicada...

como me dices que trabajas en ORACLE puedes resolver el problema de varias formas...

la mejor es que actualices el campo CODIGO con un trigger en la tabla, en dicho trigger haces el SELECT MAX() y luego pasas el datos al :NEW.CODIGO,

Si puedes utilizar una secuencia que reemplace al SELECT MAX(), será mucho mejor. todo tiene sus pro y sus contras..

otra solucion es que utilices la clausula FOR UPDATE en el SELECT MAX() que esta utilizando, esto hará que el primer usuario que haga la consulta, bloquea la tabla para consultas hasta que haga el COMMIT, o el ROLLBACK, esto asegura que el segundo espere y coja el consecutivo correctamente. como es en el SCRIPT de guardar no creo que halla mucho problema, y el bloqueo será de milisegundo o a lo sumo de pocos segundos.


espero que esto te de una idea de como resolver el problema...
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:PROBLEMA DE USUARIOS

Publicado por carlos (8 intervenciones) el 28/11/2006 22:21:41
Tambien puedes crear una secuencia de oracle y que sea la propia base de datos la que te de el código que le corresponde a cada registro.

En oracle puedes hacer un "CREATE SEQUENCE", cuando quieras insertar un nuevo registro en la tabla, lo que se debe hacer es pedir a oracle el siguiente valor de la secuencia "NEXTVAL" y te proporcionará un codigo unico que nunca se repetira, al ser la propia base de datos oracle la que te proporciona el número.

Si miras la ayuda de oracle podrás ver las sintaxis correcta.

Saludos.
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