From 6dac9550c1d018d6c6c51b68f6daa57c86a3f0c2 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Thu, 22 Oct 2026 16:51:42 -0400 Subject: [PATCH] ipprmt020: avisa del item repetido al escribirlo/buscarlo (al dar Tab) y aviso mas compacto Si el item ya esta en otra linea, muestra un aviso corto, limpia la fila y regresa a Clase. Se mantiene el chequeo al guardar como respaldo. Co-Authored-By: Claude Sonnet 5.5 --- PROYECTO/ipdir/ipprmt020.4gl | 72 ++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/PROYECTO/ipdir/ipprmt020.4gl b/PROYECTO/ipdir/ipprmt020.4gl index 81ac103..b4da779 100644 --- a/PROYECTO/ipdir/ipprmt020.4gl +++ b/PROYECTO/ipdir/ipprmt020.4gl @@ -422,6 +422,11 @@ FUNCTION entradas() arr_iptb58[idx].cod_sec, arr_iptb58[idx].descripcion CALL producto() + IF repetidoEnOtraFila(idx) THEN + CALL avisoRepetido(idx) + CALL limpiaItem(idx) + NEXT FIELD cod_n + END IF IF tienedespiece THEN LET dcodn = arr_iptb58[idx].cod_n LET dcodgrupo = arr_iptb58[idx].cod_grupo @@ -457,6 +462,11 @@ FUNCTION entradas() CALL msg(3) NEXT FIELD cod_sec END IF + IF repetidoEnOtraFila(idx) THEN + CALL avisoRepetido(idx) + CALL limpiaItem(idx) + NEXT FIELD cod_n + END IF IF tienedespiece THEN LET dcodn = arr_iptb58[idx].cod_n LET dcodgrupo = arr_iptb58[idx].cod_grupo @@ -498,9 +508,9 @@ FUNCTION entradas() LET descRepetido = itemRepetido() IF descRepetido IS NOT NULL THEN CALL fgl_winmessage( - "ERROR", - "El item " || descRepetido CLIPPED - || " esta repetido en el detalle. Deje una sola linea por item.", + "Item repetido", + "No se puede repetir el item: +" || descRepetido CLIPPED, "stop") CONTINUE DIALOG END IF @@ -763,6 +773,62 @@ FUNCTION entradas() END DIALOG END FUNCTION +# TRUE si el item de la fila p ya esta en otra fila del detalle. +FUNCTION repetidoEnOtraFila(p) + DEFINE p, j INT + + IF arr_iptb58[p].cod_sec IS NULL THEN + RETURN FALSE + END IF + FOR j = 1 TO arr_iptb58.getLength() + IF j != p AND arr_iptb58[j].cod_sec IS NOT NULL + AND arr_iptb58[j].cod_n = arr_iptb58[p].cod_n + AND arr_iptb58[j].cod_grupo = arr_iptb58[p].cod_grupo + AND arr_iptb58[j].cod_tipo = arr_iptb58[p].cod_tipo + AND arr_iptb58[j].cod_sec = arr_iptb58[p].cod_sec THEN + RETURN TRUE + END IF + END FOR + RETURN FALSE +END FUNCTION + +# Aviso corto de item repetido (codigo y descripcion recortada). +FUNCTION avisoRepetido(p) + DEFINE p INT + DEFINE texto, desc STRING + + LET desc = arr_iptb58[p].descripcion CLIPPED + IF desc.getLength() > 35 THEN + LET desc = desc.subString(1, 35) + END IF + LET texto = arr_iptb58[p].cod_n USING "&&&&", "-", + arr_iptb58[p].cod_grupo USING "&&&&", "-", + arr_iptb58[p].cod_tipo USING "&&&&", "-", + arr_iptb58[p].cod_sec USING "&&&&&&" + CALL fgl_winmessage( + "Item repetido", + "Este item ya esta en el detalle: +" || texto || " +" + || desc, + "stop") +END FUNCTION + +# Deja la fila p sin item para volver a escribirlo. +FUNCTION limpiaItem(p) + DEFINE p INT + + LET arr_iptb58[p].cod_n = NULL + LET arr_iptb58[p].cod_grupo = NULL + LET arr_iptb58[p].cod_tipo = NULL + LET arr_iptb58[p].cod_sec = NULL + LET arr_iptb58[p].descripcion = NULL + LET arr_iptb58[p].unidad_med = NULL + LET arr_iptb58[p].factor_conv = NULL + LET arr_iptb58[p].cantidad_1 = NULL + LET arr_iptb58[p].cantidad = NULL +END FUNCTION + # Devuelve la descripcion del primer item repetido (misma clase, grupo, tipo y # medida, sin importar el area) entre las lineas con cantidad; NULL si no hay. FUNCTION itemRepetido()