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 <noreply@anthropic.com>
This commit is contained in:
2026-10-22 16:51:42 -04:00
co-authored by Claude Sonnet 5.5
parent 75d81bdfc7
commit 6dac9550c1
+69 -3
View File
@@ -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()