Files
MBS/PROYECTO/ipdir/ubicacionDH.4gl
T
jpegueroandClaude Sonnet 5 b6085d4140 Mueve ipdir (Productos Terminados) de PROYECTOS a PROYECTO
Instruccion de Johnny: todos los directorios de fuentes de inventario
deben migrarse de la carpeta temporal PROYECTOS a la carpeta real
PROYECTO, ya que PROYECTOS sera eliminada.

Se elimino tambien un archivo suelto sin relacion llamado "ipdir"
que existia en PROYECTO (del commit inicial) y bloqueaba el nombre
de la carpeta.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 09:29:01 -04:00

761 lines
22 KiB
Plaintext

GLOBALS "ipprgb000.4gl"
DEFINE record1 DYNAMIC ARRAY OF RECORD
id_seccion INT,
Desc_seccion STRING,
id_tramo INT,
Desc_tramo STRING,
id_fila INT,
Desc_fila STRING,
id_posicion INT,
Desc_posicion STRING,
unidades DECIMAL(12, 5),
cantidad DECIMAL(12, 5),
INDEX INT
END RECORD
DEFINE record2 DYNAMIC ARRAY OF RECORD
seccion INT,
tramo INT,
fila INT,
posicion INT,
unidades DECIMAL(12, 5),
cantidad DECIMAL(12, 5),
INDEX INT
END RECORD
DEFINE Disponible RECORD
ExOnTable DECIMAL(12, 5), --Existencia en la iptb00062
ExOnDisplay DECIMAL(12, 5), --Existencia dinamica en el programa
UNITS DECIMAL(12, 5),
existence DECIMAL(12, 5)
END RECORD
DEFINE
exitFlag BOOLEAN,
numero_msg, TABULAR INT
DEFINE detalle VARCHAR(255)
FUNCTION InsertaUbicacionDH(prod1, ubicacion)
DEFINE bodegaCont, i INT --BodegaContainer--
DEFINE producto, ubicacion STRING
DEFINE factor, container DECIMAL(12, 5)
DEFINE prod1 RECORD
estado VARCHAR(20),
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descrip_esp CHAR(180),
unidad_med LIKE iptb00002.unidad_med,
bodega CHAR(50),
existencia DECIMAL(12, 5),
cantidad_ordenes DEC(12, 5),
disponible DEC(12, 5),
reservado DEC(12, 5),
transito DEC(12, 5),
valorOrden DEC(12, 5),
parent_id, child_id VARCHAR(20)
END RECORD
LET INT_FLAG = TRUE
LET exitFlag = FALSE
LET TABULAR = 0
CALL record1.clear()
CALL record2.clear()
CALL BuscarData(prod1.*, ubicacion) RETURNING factor, bodegaCont, producto
OPEN WINDOW w1 WITH FORM "ipfmmt006"
DISPLAY BY NAME producto
CALL init_seccion(bodegaCont)
DIALOG ATTRIBUTE(UNBUFFERED)
DISPLAY ARRAY record1 TO record_left.*
END DISPLAY
INPUT BY NAME detalle
END INPUT
INPUT ARRAY record2 FROM record_right.* ATTRIBUTES(WITHOUT DEFAULTS,AUTO APPEND = FALSE)
ON CHANGE seccion
CALL init_tramo(bodegaCont, record2[arr_curr()].seccion)
ON CHANGE tramo
CALL init_fila(
bodegaCont,
record2[arr_curr()].seccion,
record2[arr_curr()].tramo)
ON CHANGE fila
CALL init_posicion(
bodegaCont,
record2[arr_curr()].seccion,
record2[arr_curr()].tramo,
record2[arr_curr()].fila)
ON CHANGE unidades1
LET record2[arr_curr()].cantidad =
record2[arr_curr()].unidades * factor
LET INT_FLAG = FALSE
END INPUT
ON ACTION right1
CALL right1(DIALOG)
ON ACTION ACCEPT ATTRIBUTES(TEXT = "Guardar")
LET container = record2[arr_curr()].unidades * factor
DISPLAY factor
DISPLAY container
DISPLAY record2[arr_curr()].cantidad
IF record2[arr_curr()].cantidad = container THEN
CALL InsertFunction(prod1.*, bodegaCont) RETURNING INT_FLAG
ELSE
CALL fgl_winmessage(
"INFO",
"DEBES TABULAR LAS UNIDADES ANTES DE GUARDAR",
"INFO")
LET INT_FLAG = FALSE
END IF
IF INT_FLAG THEN
CALL record1.clear()
CALL record2.clear()
CALL BuscarData(
prod1.*, ubicacion)
RETURNING factor, bodegaCont, producto
{ CALL DefaultLocations(
prod1.existencia,
factor,
prod1.cod_n,
prod1.cod_grupo,
prod1.cod_tipo,
prod1.cod_sec,
bodegaCont)}
END IF
ON ACTION Salir ATTRIBUTES(TEXT = "Salir")
EXIT DIALOG
END DIALOG
CLOSE WINDOW w1
RETURN exitFlag
END FUNCTION
FUNCTION BuscarData(prod1, ubicacion) --Buscar las informaciones necesarias
DEFINE prod1 RECORD
estado VARCHAR(20),
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descrip_esp CHAR(180),
unidad_med LIKE iptb00002.unidad_med,
bodega CHAR(50),
existencia DECIMAL(12, 5),
cantidad_ordenes DEC(12, 5),
disponible DEC(12, 5),
reservado DEC(12, 5),
transito DEC(12, 5),
valorOrden DEC(12, 5),
parent_id, child_id VARCHAR(20)
END RECORD
DEFINE
producto, ubicacion, query STRING,
factor DECIMAL(12, 5),
bodegaCont, i INT
DEFINE
tok base.StringTokenizer,
SplittedLocation DYNAMIC ARRAY OF STRING
SELECT factor_conv
INTO factor
FROM iptb00001
WHERE cod_n = prod1.cod_n
AND cod_grupo = prod1.cod_grupo
AND cod_tipo = prod1.cod_tipo
AND cod_sec = prod1.cod_sec
AND status_t IS NULL
LET producto =
prod1.descrip_esp CLIPPED,
" | " CLIPPED,
prod1.cod_n CLIPPED,
prod1.cod_grupo CLIPPED,
prod1.cod_tipo CLIPPED,
prod1.cod_sec CLIPPED
SELECT DISTINCT a.cod_bodega
INTO bodegaCont
FROM intb00009 a INNER JOIN iptb00006 b ON a.cod_bodega = b.bodega
WHERE b.cod_n = prod1.cod_n
AND b.cod_grupo = prod1.cod_grupo
AND b.cod_tipo = prod1.cod_tipo
AND b.cod_sec = prod1.cod_sec
AND a.descripcion = prod1.bodega
LET idx = 1
--LET disponible.ExOnTable = 0
LET i = 1
IF ubicacion IS NOT NULL THEN
LET tok = base.StringTokenizer.create(ubicacion, "|")
WHILE tok.hasMoreTokens()
LET SplittedLocation[i] = tok.nextToken().trim() CLIPPED
LET i = i + 1
END WHILE
END IF
LET query =
"SELECT cod_seccion,
cod_tramo,
cod_fila,
cod_pos,
SUM(cantidad),
SUM(cantidad2)
FROM iptb00062
WHERE cod_n = "
|| prod1.cod_n
|| "
AND cod_grupo = "
|| prod1.cod_grupo
|| "
AND cod_tipo = "
|| prod1.cod_tipo
|| "
AND cod_sec = "
|| prod1.cod_sec
|| "
AND bodega = "
|| bodegaCont
|| "
AND status_t is null"
IF splittedLocation.getLength() > 0 THEN
CASE splittedLocation.getLength()
WHEN 2
LET query = query, " AND cod_seccion = ", SplittedLocation[2]
--DISPLAY query
EXIT CASE
WHEN 3
LET query =
query,
" AND cod_seccion = ",
SplittedLocation[2],
" and cod_tramo = ",
SplittedLocation[3]
--DISPLAY query
EXIT CASE
WHEN 4
LET query =
query,
" AND cod_seccion = "
|| SplittedLocation[2]
|| " and cod_tramo = "
|| SplittedLocation[3]
|| " and cod_fila = "
|| SplittedLocation[4]
--DISPLAY query
EXIT CASE
WHEN 5
LET query =
query,
" AND cod_seccion = "
|| SplittedLocation[2]
|| " and cod_tramo = "
|| SplittedLocation[3]
|| " and cod_fila = "
|| SplittedLocation[4]
|| " and cod_pos = "
|| SplittedLocation[5]
--DISPLAY query
EXIT CASE
OTHERWISE
DISPLAY "ERROR QUERY UBICACIÓN"
EXIT CASE
END CASE
END IF
LET query =
query || " GROUP BY cod_seccion, cod_tramo, cod_fila, cod_pos
HAVING SUM(cantidad2) <> 0"
PREPARE result FROM query
DECLARE buscar CURSOR FOR result
FOREACH buscar
INTO record1[idx].id_seccion,
record1[idx].id_tramo,
record1[idx].id_fila,
record1[idx].id_posicion,
record1[idx].unidades,
record1[idx].cantidad
-- LET Disponible.ExOnTable = Disponible.ExOnTable + record1[idx].cantidad
LET record1[idx].INDEX = idx
SELECT a.descripcion, b.descripcion, c.titulo, d.titulo
INTO record1[idx].Desc_seccion,
record1[idx].Desc_tramo,
record1[idx].Desc_fila,
record1[idx].Desc_posicion
FROM intb00010 a
INNER
JOIN intb00043 b
ON a.cod_seccion = b.cod_seccion
AND a.cod_bodega = b.cod_bodega
INNER
JOIN intb00045 c
ON c.cod_seccion = b.cod_seccion
AND c.cod_tramo = b.cod_tramo
AND c.cod_bodega = b.cod_bodega
INNER
JOIN intb00046 d
ON d.cod_seccion = c.cod_seccion
AND d.cod_tramo = c.cod_tramo
AND d.cod_fila = c.cod_fila
AND d.cod_bodega = c.cod_bodega
WHERE a.cod_bodega = bodegaCont
AND a.cod_seccion = record1[idx].id_seccion
AND b.cod_tramo = record1[idx].id_tramo
AND c.cod_fila = record1[idx].id_fila
AND d.cod_pos = record1[idx].id_posicion
LET idx = idx + 1
END FOREACH
RETURN factor, bodegaCont, producto
END FUNCTION
FUNCTION right1(d) --funcion para pasar los datos de izquierda a derecha
DEFINE d, myd ui.Dialog
DEFINE idx, lastRight INT
LET myd = d
LET idx = d.getCurrentRow("record_left")
IF idx < 1 THEN
RETURN
END IF
IF record1[idx].cantidad > 0 THEN
LET lastRight = record2.getLength() + 1
CALL myd.appendRow("record_right")
LET record2[lastRight].unidades = record1[idx].unidades
LET record2[lastRight].cantidad = record1[idx].cantidad
LET record2[lastRight].index = record1[idx].index
--d.getCurrentRow("record_left")
--CALL record1.deleteElement(idx)
CALL d.setCurrentRow("record_right", lastRight)
ELSE
CALL fgl_winmessage(
"INFO",
"EXISTENCIA NEGATIVA EN ESTA UBICACION, NO PUEDE REALIZAR TRANSACCION",
"INFO")
END IF
END FUNCTION
FUNCTION InsertFunction(prod1, bodegaCont)
DEFINE prod1 RECORD
estado VARCHAR(20),
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
descrip_esp CHAR(180),
unidad_med LIKE iptb00002.unidad_med,
bodega CHAR(50),
existencia DECIMAL(12, 5),
cantidad_ordenes DEC(12, 5),
disponible DEC(12, 5),
reservado DEC(12, 5),
transito DEC(12, 5),
valorOrden DEC(12, 5),
parent_id, child_id VARCHAR(20)
END RECORD
DEFINE
i, j, bodegaCont, numDoc_Entrada, numDoc_Salida INT,
flag BOOLEAN,
inspector, All_Units, All_Existence DECIMAL(12, 5)
LET flag = TRUE
LET inspector = 0.0
LET all_units = 0
LET all_existence = 0
LET numero_msg = 1
IF record2.getLength() = 0 THEN
LET flag = FALSE
CALL msg(16)
RETURN flag
ELSE
FOR i = 1 TO record2.getLength()
IF record2[i].seccion IS NULL
OR record2[i].tramo IS NULL
OR record2[i].fila IS NULL
OR record2[i].posicion IS NULL
OR record2[i].unidades IS NULL
OR record2[i].cantidad IS NULL THEN
CALL msg(16)
LET flag = FALSE
RETURN flag
END IF
END FOR
END IF
FOR i = 1 TO record1.getLength()
FOR j = 1 TO record2.getLength()
IF record1[i].INDEX = record2[j].INDEX THEN
LET inspector = inspector + record2[j].cantidad
END IF
END FOR
IF inspector > record1[i].cantidad THEN
CALL fgl_winmessage(
'EXISTENCIA DE SALIDA EXCEDE EXISTENCIA ORIGINAL',
'Existe una transferencia de salida que excede la existencia de origen',
NULL)
LET flag = FALSE
RETURN flag
ELSE
LET inspector = 0.0
END IF
END FOR
IF flag THEN
LET exitFlag = TRUE
SELECT num_doc
INTO numDoc_Salida
FROM iptb00007
WHERE cod_mov = 101 AND bodega = bodegaCont
IF STATUS = NOTFOUND THEN
INSERT INTO iptb00007 VALUES(0, 101, NULL, usuarios, CURRENT YEAR TO FRACTION,
NULL, NULL, bodegaCont)
LET NumDoc_Salida = 1
ELSE
LET numDoc_Salida = numDoc_Salida + 1
END IF
SELECT num_doc
INTO numDoc_Entrada
FROM iptb00007
WHERE cod_mov = 100 AND bodega = bodegaCont
IF STATUS = NOTFOUND THEN
INSERT INTO iptb00007 VALUES(0, 100, NULL, usuarios, CURRENT YEAR TO FRACTION,
NULL, NULL, bodegaCont)
LET numDoc_Entrada = 1
ELSE
LET numDoc_Entrada = numDoc_Entrada + 1
END IF
FOR i = 1 TO record2.getLength()
LET ALL_units = ALL_units + record2[i].unidades
LET ALL_existence = ALL_existence + record2[i].cantidad
BEGIN WORK
DISPLAY "CICLO ", i
TRY
INSERT INTO iptb00062(
num_doc,
area,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cod_mov,
bodega,
cod_seccion,
cod_tramo,
cod_fila,
cod_pos,
cantidad,
cantidad2,
status_t,
us_crea,
fech_crea)
VALUES(numDoc_Salida,
1,
prod1.cod_n,
prod1.cod_grupo,
prod1.cod_tipo,
prod1.cod_sec,
101,
bodegaCont,
record1[record2[i].index].id_seccion,
record1[record2[i].index].id_tramo,
record1[record2[i].index].id_fila,
record1[record2[i].index].id_posicion,
record2[i].unidades * (-1),
record2[i].cantidad * (-1),
NULL,
usuarios,
CURRENT YEAR TO FRACTION)
DISPLAY "primer insert a la 62"
UPDATE iptb00007
SET num_doc = numDoc_Salida, us_mod = usuarios, fech_mod = CURRENT YEAR TO FRACTION
WHERE cod_mov = 101 AND bodega = bodegaCont
DISPLAY "update al 07"
INSERT INTO iptb00062(
num_doc,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cod_mov,
bodega,
cod_seccion,
cod_tramo,
cod_fila,
cod_pos,
cantidad,
cantidad2,
status_t,
us_crea,
fech_crea)
VALUES(numDoc_Entrada,
prod1.cod_n,
prod1.cod_grupo,
prod1.cod_tipo,
prod1.cod_sec,
100,
bodegaCont,
record2[i].seccion,
record2[i].tramo,
record2[i].fila,
record2[i].posicion,
record2[i].unidades,
record2[i].cantidad,
NULL,
usuarios,
CURRENT YEAR TO FRACTION)
DISPLAY "segundo insert a la 62"
UPDATE iptb00007
SET num_doc = numDoc_Entrada, us_mod = usuarios, fech_mod = CURRENT YEAR TO FRACTION
WHERE cod_mov = 100 AND bodega = bodegaCont
DISPLAY "segundo update a la 07"
IF i = record2.getLength() THEN
INSERT INTO iptb00006(
cod_cia,
num_doc,
fecha,
cod_mov,
detalle,
area,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cantidad_1,
cantidad_2,
bodega,
status_t,
us_crea,
fech_crea)
VALUES(1,
numDoc_Salida,
CURRENT YEAR TO FRACTION,
101,
detalle, --detalle
1, --area
prod1.cod_n,
prod1.cod_grupo,
prod1.cod_tipo,
prod1.cod_sec,
all_units,
all_existence * (-1),
bodegaCont,
NULL,
usuarios,
CURRENT YEAR TO FRACTION)
DISPLAY "insert a la 06"
INSERT INTO iptb00006(
cod_cia,
num_doc,
fecha,
cod_mov,
detalle,
area,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cantidad_1,
cantidad_2,
bodega,
status_t,
us_crea,
fech_crea,
num_Doc_transferencia,
cod_mov_transferencia)
VALUES(1,
numDoc_Entrada,
CURRENT YEAR TO FRACTION,
100,
detalle, --detalle
1, --area
prod1.cod_n,
prod1.cod_grupo,
prod1.cod_tipo,
prod1.cod_sec,
all_units,
all_existence,
bodegaCont,
NULL,
usuarios,
CURRENT YEAR TO FRACTION,
numDoc_Salida,
101)
DISPLAY "otro insert a la 06"
END IF
COMMIT WORK
CATCH
ROLLBACK WORK
LET numero_msg = 1663
END TRY
END FOR
CALL msg(numero_msg)
END IF
-- END IF
RETURN flag
END FUNCTION
{FUNCTION DefaultLocations(
existencia DECIMAL(12, 5),
factor DECIMAL(12, 5),
cod_n1 INT,
cod_grupo1 INT,
cod_tipo1 INT,
cod_sec1 INT,
bodegaCont INT)
DEFINE unidad_actual, existencia_actual DECIMAL(12, 5)
INITIALIZE unidad_actual, existencia_actual TO NULL
SELECT SUM(cantidad), SUM(cantidad2)
INTO unidad_actual, existencia_actual
FROM iptb00062
WHERE cod_mov = 101
AND cod_n = cod_n1
AND cod_grupo = cod_grupo1
AND cod_tipo = cod_tipo1
AND cod_sec = cod_sec1
AND cod_seccion = 0
AND cod_tramo = 0
AND cod_fila = 0
AND cod_pos = 0
AND bodega = bodegaCont
LET record1[1].id_seccion = 0
LET record1[1].Desc_seccion = "SECCION 0"
LET record1[1].id_tramo = 0
LET record1[1].Desc_tramo = "FILA 0"
LET record1[1].id_fila = 0
LET record1[1].Desc_fila = "FILA #"
LET record1[1].id_posicion = 0
LET record1[1].Desc_posicion = "POSICION 0"
LET record1[1].INDEX = 1
IF unidad_actual IS NOT NULL AND existencia_actual IS NOT NULL THEN
LET record1[1].cantidad = existencia + existencia_actual
LET record1[1].unidades = (existencia / factor) + unidad_actual
ELSE
LET record1[1].cantidad = existencia
LET record1[1].unidades = existencia / factor
END IF
END FUNCTION}