JSOTO veconvierteorden/ccprmt003: evita ordenes duplicadas por cotizacion
Dos usuarios convirtiendo la misma cotizacion a la vez creaban dos ordenes (cot 340001 -> 262237 y 262238, ticket 12234). La validacion "cotizacion tiene orden" corria antes del BEGIN WORK; el segundo usuario la pasaba, esperaba el bloqueo de prtb00020 y al liberarse insertaba otra orden. - vedir/veconvierteorden: re-valida dentro de la transaccion, ya con el bloqueo de prtb00020. - WEBSERVICES/veconvierteorden: misma re-validacion (no tenia ninguna). - ccdir/ccprmt003 verifica_orden(): COUNT(*) en vez de SELECT num_oc, que daba -284 con ordenes duplicadas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -126,6 +126,18 @@ FUNCTION convierteorden(
|
||||
UPDATE prtb00020
|
||||
SET num_oc = ISNULL(num_oc, 0) + 1, us_crea = xusuario, fech_crea = GETDATE()
|
||||
SELECT num_oc INTO ult_numero FROM prtb00020
|
||||
# RE-VALIDACION YA CON EL BLOQUEO DE prtb00020: la validacion del inicio
|
||||
# corre fuera de la transaccion; si otro usuario estaba convirtiendo la
|
||||
# misma cotizacion, aqui ya vemos su orden confirmada (cot 340001, 20/10/2026)
|
||||
LET existe_oc = 0
|
||||
SELECT COUNT(*) INTO existe_oc FROM prtb00012
|
||||
WHERE cotizacion_no = xcotizacion_no AND status_t IS NULL
|
||||
IF existe_oc > 0 THEN
|
||||
ROLLBACK WORK
|
||||
CALL fgl_winmessage(
|
||||
"ERROR", "COTIZACION TIENE ORDEN, NO PUEDE CREAR ORDEN", "STOP")
|
||||
RETURN 0, FALSE
|
||||
END IF
|
||||
# AUTOCORRECCION: si el contador quedo por detras de prtb00012
|
||||
# (otro programa creo ordenes sin avanzarlo), salta al siguiente libre
|
||||
LET existe_oc = 0
|
||||
|
||||
Reference in New Issue
Block a user