diff --git a/PROYECTO/ccdir/ccprmt003.4gl b/PROYECTO/ccdir/ccprmt003.4gl index 3a50555..7b3b9de 100644 --- a/PROYECTO/ccdir/ccprmt003.4gl +++ b/PROYECTO/ccdir/ccprmt003.4gl @@ -2758,11 +2758,11 @@ REPORT cctb01b( END REPORT FUNCTION verifica_orden() - LET tieneorden = TRUE - SELECT a.num_oc + DEFINE cuantas INT + # COUNT(*) en vez de SELECT num_oc: con ordenes duplicadas daba -284 + LET cuantas = 0 + SELECT COUNT(*) INTO cuantas FROM prtb00012 a WHERE a.cotizacion_no = recibo_nc.num_orden AND a.status_T IS NULL - IF STATUS = NOTFOUND THEN - LET tieneorden = FALSE - END IF + LET tieneorden = (cuantas > 0) END FUNCTION diff --git a/PROYECTO/vedir/veconvierteorden.4gl b/PROYECTO/vedir/veconvierteorden.4gl index 3e9a5f4..4a77aab 100644 --- a/PROYECTO/vedir/veconvierteorden.4gl +++ b/PROYECTO/vedir/veconvierteorden.4gl @@ -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 diff --git a/WEBSERVICES/veconvierteorden.4gl b/WEBSERVICES/veconvierteorden.4gl index 7eff0f2..e460b96 100644 --- a/WEBSERVICES/veconvierteorden.4gl +++ b/WEBSERVICES/veconvierteorden.4gl @@ -139,6 +139,17 @@ BEGIN WORK us_crea = xusuario, fech_crea = GETDATE() SELECT num_oc INTO ult_numero FROM prtb00020 + # RE-VALIDACION YA CON EL BLOQUEO DE prtb00020: evita dos ordenes para la + # misma cotizacion si dos usuarios convierten a la vez (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 + LET pmensaje_error = + SFMT("La cotizacion %1 ya tiene orden, no puede crear otra.", xcotizacion_no) + ROLLBACK WORK + RETURN 0,FALSE + END IF # AUTOCORRECCION: si el contador quedo por detras de prtb00012, salta al siguiente libre LET existe_oc = 0 SELECT COUNT(*) INTO existe_oc FROM prtb00012 WHERE num_oc = ult_numero