From b5bf9e2b2606dabe1ad9a2a489b610467b9f9b48 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 22 Oct 2026 16:04:21 -0400 Subject: [PATCH] ipprmt020: avisa (sin bloquear) cuando un item se repite en el detalle al guardar Nueva funcion itemRepetido(): misma area, clase, grupo, tipo y medida entre las lineas con cantidad. Si hay repetido pregunta si desea continuar; NO vuelve a la edicion (CONTINUE DIALOG), YES guarda como antes. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/ipdir/ipprmt020.4gl | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/PROYECTO/ipdir/ipprmt020.4gl b/PROYECTO/ipdir/ipprmt020.4gl index c7a2711..7839aec 100644 --- a/PROYECTO/ipdir/ipprmt020.4gl +++ b/PROYECTO/ipdir/ipprmt020.4gl @@ -20,6 +20,8 @@ DEFINE Toemail, emailadd, retorne STRING +DEFINE descRepetido, respuesta STRING + DEFINE d_tipos, mensaje, @@ -492,6 +494,22 @@ FUNCTION entradas() DISPLAY arr_iptb58[idx].cantidad TO sdetalle[scr_l].cantidad END IF ON ACTION guardar ATTRIBUTE(TEXT = opcion, IMAGE = "save") + # Aviso (no bloqueo) si un item se repite en el detalle + LET descRepetido = itemRepetido() + IF descRepetido IS NOT NULL THEN + LET respuesta = + fgl_winquestion( + "Item repetido", + "El item " || descRepetido CLIPPED + || " esta repetido en el detalle. Desea continuar?", + "NO", + "YES|NO", + "QUESTION", + 0) + IF respuesta != "YES" THEN + CONTINUE DIALOG + END IF + END IF IF p_iptb57.bodega IS NOT NULL THEN LET nombreBodega = ui.ComboBox.forName('formonly.bodega') @@ -751,6 +769,34 @@ FUNCTION entradas() END DIALOG END FUNCTION +# Devuelve la descripcion del primer item repetido (misma area, clase, grupo, +# tipo y medida) entre las lineas con cantidad; NULL si no hay repetidos. +FUNCTION itemRepetido() + DEFINE i, j INT + DEFINE texto STRING + + FOR i = 1 TO arr_iptb58.getLength() + IF arr_iptb58[i].cantidad IS NOT NULL THEN + FOR j = i + 1 TO arr_iptb58.getLength() + IF arr_iptb58[j].cantidad IS NOT NULL + AND arr_iptb58[j].area = arr_iptb58[i].area + AND arr_iptb58[j].cod_n = arr_iptb58[i].cod_n + AND arr_iptb58[j].cod_grupo = arr_iptb58[i].cod_grupo + AND arr_iptb58[j].cod_tipo = arr_iptb58[i].cod_tipo + AND arr_iptb58[j].cod_sec = arr_iptb58[i].cod_sec THEN + LET texto = arr_iptb58[i].cod_n USING "&&&&", "-", + arr_iptb58[i].cod_grupo USING "&&&&", "-", + arr_iptb58[i].cod_tipo USING "&&&&", "-", + arr_iptb58[i].cod_sec USING "&&&&&&", + " ", arr_iptb58[i].descripcion CLIPPED + RETURN texto + END IF + END FOR + END IF + END FOR + RETURN NULL +END FUNCTION + FUNCTION anular() DEFINE respuesta STRING