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}