{ ------------------------------------------------------------------------------ PROGRAMA : IPPRCS006 OBJETIVO : Programa Consulta Balances - Producto Terminado. PROGRAMADOR : JUAN FCO SOTO FECHA REALIZACION : AGOSTO 1997 DIRECTOR PROYECTO : JOSE ALFREDO PAULINO ALEJO ------------------------------------------------------------------------------ } GLOBALS "ipprgb000.4gl" DEFINE csmov1 DYNAMIC ARRAY OF RECORD descrip_mov1 VARCHAR(100), num_doc CHAR(11), num_oc INT, num_compra INT, fecha_2 LIKE iptb00006.fecha, cantidad float, entrada float, salida float, bodega1 CHAR(50), balance FLOAT, parent_id, child_id STRING END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" USER usuarios USING clave SELECT * INTO p_companias.* FROM companias CALL ipprcs006() END MAIN FUNCTION ipprcs006() DEFINE fecha1 char(8) DEFINE hora1 char(5) DEFINE flag BOOLEAN LET fecha1 = today using "dd/mm/yyy" LET hora1 = time LET int_flag = false LET bandera = 0 #WHENEVER ERROR CONTINUE CLEAR SCREEN OPTIONS ERROR LINE 24, FORM LINE 4, COMMENT LINE 22, PROMPT LINE 23 DISPLAY fecha1 AT 1,70 ATTRIBUTE (BLUE) DISPLAY hora1 AT 2,73 ATTRIBUTE (BLUE) OPEN FORM ipfmcs006 FROM "ipfmcs006" DISPLAY FORM ipfmcs006 CALL ui.Interface.LoadStyles("mbsStyle") INITIALIZE datos_gen.* TO NULL CALL csmov1.clear() LABEL volver: INPUT BY NAME historico,datos_cons.cod_n,datos_cons.cod_grupo,datos_Cons.cod_tipo, datos_cons.cod_sec,datos_cons.fech_in,datos_cons.fech_fi BEFORE INPUT CALL csmov1.clear() BEFORE FIELD fech_in LET datos_cons.fech_in = today using "dd/mm/yyyy" DISPLAY BY NAME datos_cons.fech_in BEFORE FIELD fech_fi LET datos_cons.fech_fi = today using "dd/mm/yyyy" DISPLAY BY NAME datos_cons.fech_fi AFTER FIELD cod_grupo IF datos_cons.cod_grupo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_grupo END IF AFTER FIELD cod_tipo IF datos_cons.cod_tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_tipo END IF AFTER FIELD cod_sec IF datos_cons.cod_n is not null and datos_cons.cod_grupo is not null and datos_cons.cod_tipo is not null and datos_cons.cod_sec is not null THEN IF historico = 'N' THEN LET selec = " SELECT descrip_esp,unidad_med ", " FROM iptb00002 ", " WHERE cod_n = ? and ", " cod_grupo = ? and ", " cod_tipo = ? and ", " cod_sec = ? and ", " status_t is null " ELSE LET selec = " SELECT descrip_esp,unidad_med ", " FROM historicomtech.dbo.iptb00002 ", " WHERE cod_n = ? and ", " cod_grupo = ? and ", " cod_tipo = ? and ", " cod_sec = ? and ", " status_t is null " END IF PREPARE cmdbusca FROM selec EXECUTE cmdbusca INTO descripcion,articulos.unidad_med USING datos_cons.cod_n,datos_cons.cod_grupo, datos_cons.cod_tipo,datos_cons.cod_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) CLEAR FORM NEXT FIELD cod_n END IF LET descripcion = descripcion CLIPPED," " DISPLAY BY NAME descripcion,articulos.unidad_med END IF AFTER FIELD fech_in IF datos_cons.fech_in IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fech_in END IF AFTER FIELD fech_fi IF datos_cons.fech_fi IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fech_fi END IF IF datos_cons.fech_in > datos_cons.fech_fi THEN LET numero_msg = 36 CALL msg(numero_msg) NEXT FIELD fech_in END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false CLEAR SCREEN RETURN END IF EXIT INPUT END INPUT CONSTRUCT criterio ON a.bodega FROM bodega BEFORE CONSTRUCT LET k1 = '1' CALL bodegas(k1) AFTER CONSTRUCT EXIT CONSTRUCT END CONSTRUCT LET balance = 0 DISPLAY "Buscando Informacion... Espere Por Favor" AT 24,2 ATTRIBUTE (BLUE) IF historico = 'N' THEN LET selec = "SELECT SUM(a.cantidad_2) FROM iptb00006 a ", " WHERE a.cod_n =? and a.cod_grupo = ? AND ", " a.cod_tipo = ? and a.cod_sec = ? and ",criterio CLIPPED, " and a.fecha < ? and a.status_t is null " ELSE LET selec = "SELECT SUM(a.cantidad_2) FROM historicomtech.dbo.iptb00006 a ", " WHERE a.cod_n =? and a.cod_grupo = ? AND ", " a.cod_tipo = ? and a.cod_sec = ? and ",criterio CLIPPED, " AND a.fecha < ? and a.status_t is null " END IF PREPARE cmdbalance FROM selec EXECUTE cmdbalance INTO balance USING datos_cons.cod_n,datos_cons.cod_grupo, datos_cons.cod_tipo,datos_cons.cod_sec, datos_cons.fech_in IF balance IS NULL THEN LET balance = 0 END IF DISPLAY balance TO balance_ini IF historico = 'N' THEN LET selec = "SELECT '('+cast(c.cod_mov as char(3))+')'+RTRIM(c.descrip_mov), a.num_doc,a.num_oc,a.orden_compra,a.fecha,", "SUM(a.cantidad_2),'0','0','('+cast(b.cod_bodega as char(1))+')'+RTRIM(b.descripcion) FROM iptb00006 a,intb00009 b,iptb00005 c ", "WHERE a.cod_n = ? and a.cod_grupo=? and ", " a.cod_tipo =? and a.cod_sec=? and ", " a.status_t is null and a.fecha between ? and ? and ", " a.cod_mov = c.cod_mov and ", " a.bodega = b.cod_bodega and ",criterio CLIPPED, " GROUP BY a.num_doc,a.fecha,a.orden_compra,a.num_oc,c.cod_mov,c.descrip_mov,b.cod_bodega,b.descripcion ", " ORDER BY a.fecha,a.num_doc " ELSE LET selec = "SELECT '('+cast(c.cod_mov as char(3))+')'+RTRIM(c.descrip_mov), a.num_doc,a.num_oc,a.orden_compra,a.fecha,", "SUM(a.cantidad_2),'0','0','('+cast(b.cod_bodega as char(1))+')'+RTRIM(b.descripcion) FROM historicomtech.dbo.iptb00006 a,historicomtech.dbo.intb00009 b,iptb00005 c ", "WHERE a.cod_n = ? and a.cod_grupo=? and ", " a.cod_tipo =? and a.cod_sec=? and ", " a.status_t is null and a.fecha between ? and ? and ", " a.cod_mov = c.cod_mov and ", " a.bodega = b.cod_bodega and ",criterio CLIPPED, " GROUP BY a.num_doc,a.fecha,a.orden_compra,c.cod_mov,c.descrip_mov,b.cod_bodega,b.descripcion ", " ORDER BY a.fecha,a.num_doc " END IF PREPARE cmdtrx FROM selec DECLARE jhonn_1 CURSOR FOR cmdtrx OPEN jhonn_1 USING datos_cons.cod_n,datos_cons.cod_grupo, datos_cons.cod_tipo,datos_cons.cod_sec, datos_cons.fech_in, datos_cons.fech_fi LET idx = 1 FOREACH jhonn_1 INTO csmov1[idx].* IF STATUS = NOTFOUND THEN EXIT FOREACH RETURN END IF LET flag = FALSE LET balance = balance + csmov1[idx].cantidad # LET csmov1[idx].num_oc = csmov.num_oc # LET csmov1[idx].num_compra = csmov.num_compra # LET csmov1[idx].fecha_2 = csmov.fecha_1 # LET csmov1[idx].balance = balance USING "-,---,---.###" # LET csmov1[idx].num_doc = "(",csmov.cod_mov using "&&",")"," ", # csmov.num_doc USING "&&&&&&" # LET csmov1[idx].bodega1 = csmov.bodega IF csmov1[idx].cantidad < 0 THEN LET csmov1[idx].entrada = null LET csmov1[idx].salida = csmov1[idx].cantidad ELSE LET csmov1[idx].salida = null LET csmov1[idx].entrada = csmov1[idx].cantidad END IF LET csmov1[idx].balance = balance CALL LlenarHijos() RETURNING flag IF flag != TRUE THEN LET idx = idx + 1 ELSE END IF END FOREACH LET balance = 0 CALL set_count(idx - 1) DISPLAY ARRAY csmov1 TO s_csmov.* CALL csmov1.clear() CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false CLEAR SCREEN RETURN END IF CLEAR FORM DISPLAY " " AT 13,6 DISPLAY " " AT 13,60 GOTO volver END FUNCTION FUNCTION llenarHijos() DEFINE MirrorLocation DYNAMIC ARRAY OF RECORD seccion STRING, cod_seccion INT, existenciaSec DECIMAL(12, 5), tramo STRING, cod_tramo INT, existenciaTram DECIMAL(12, 5), fila STRING, cod_fila INT, existenciaFil DECIMAL(12, 5), posicion STRING, cod_pos INT, existenciaPos DECIMAL(12, 5) END RECORD DEFINE Container DYNAMIC ARRAY OF RECORD seccion STRING, cod_seccion INT, existenciaSec DECIMAL(12, 5), tramo STRING, cod_tramo INT, existenciaTram DECIMAL(12, 5), fila STRING, cod_fila INT, existenciaFil DECIMAL(12, 5), posicion STRING, cod_pos INT, existenciaPos DECIMAL(12, 5) END RECORD DEFINE checking, i,z, bodegaCont INT DEFINE counterSec, counterTram, counterFil, counterPos INT DEFINE NextTree, NextTree2, index2 BOOLEAN CONSTANT firstID = 1 DEFINE tok base.StringTokenizer, SplittedMov, SplittedBodega DYNAMIC ARRAY OF STRING LET counterSec = 2 LET counterTram = 1 LET counterFil = 1 LET counterPos = 1 LET nextTree = FALSE LET nextTree2 = FALSE LET index2 = FALSE INITIALIZE checking, i, z, bodegaCont TO NULL LET i = 1 LET tok = base.StringTokenizer.create(csmov1[idx].descrip_mov1, "()") WHILE tok.hasMoreTokens() LET SplittedMov[i] = tok.nextToken().trim() CLIPPED LET i = i + 1 END WHILE LET i = 1 LET tok = base.StringTokenizer.create(csmov1[idx].bodega1, "()") WHILE tok.hasMoreTokens() LET SplittedBodega[i] = tok.nextToken().trim() CLIPPED LET i = i + 1 END WHILE #SELECT DISTINCT a.cod_bodega # INTO bodegaCont # FROM intb00009 a INNER JOIN iptb00006 b ON a.cod_bodega = b.bodega # WHERE a.descripcion = "'"|| SplittedBodega[2] ||"'" SELECT COUNT(*) INTO checking FROM iptb00062 WHERE (cod_mov = SplittedMov[1] AND num_doc = csmov1[idx].num_doc AND cod_n = datos_cons.cod_n AND cod_grupo = datos_cons.cod_grupo AND cod_tipo = datos_cons.cod_tipo AND cod_sec = datos_cons.cod_sec) AND status_t IS NULL IF checking > 0 THEN LET index2 = TRUE LET csmov1[idx].parent_id = NULL LET csmov1[idx].child_id = FirstID DECLARE query CURSOR FOR SELECT RTRIM(a.descripcion) AS seccion, a.cod_seccion as cod_seccion, (SELECT SUM(cantidad2) FROM iptb00062 WHERE (cod_mov = t.cod_mov and num_doc = t.num_doc and cod_n = t.cod_n and cod_grupo = t.cod_grupo and cod_tipo = t.cod_tipo and cod_sec = t.cod_sec AND bodega = t.bodega) AND (cod_seccion = t.cod_seccion)) AS suma_cantidad2_seccion, RTRIM(b.descripcion) AS tramo, b.cod_tramo as cod_tramo, (SELECT SUM(cantidad2) FROM iptb00062 WHERE (cod_mov = t.cod_mov and num_doc = t.num_doc and cod_n = t.cod_n and cod_grupo = t.cod_grupo and cod_tipo = t.cod_tipo and cod_sec = t.cod_sec AND bodega = t.bodega) AND (cod_seccion = t.cod_seccion AND cod_tramo = t.cod_tramo)) AS suma_cantidad2_tramo, RTRIM(c.titulo) AS fila, c.cod_fila as cod_fila, (SELECT SUM(cantidad2) FROM iptb00062 WHERE (cod_mov = t.cod_mov and num_doc = t.num_doc and cod_n = t.cod_n and cod_grupo = t.cod_grupo and cod_tipo = t.cod_tipo and cod_sec = t.cod_sec AND bodega = t.bodega) AND (cod_seccion = t.cod_seccion AND cod_tramo = t.cod_tramo AND cod_fila = t.cod_fila)) AS suma_cantidad2_fila, RTRIM(d.titulo) AS posicion, d.cod_pos as cod_pos, (SELECT SUM(cantidad2) FROM iptb00062 WHERE (cod_mov = t.cod_mov and num_doc = t.num_doc and cod_n = t.cod_n and cod_grupo = t.cod_grupo and cod_tipo = t.cod_tipo and cod_sec = t.cod_sec AND bodega = t.bodega) AND (cod_seccion = t.cod_seccion AND cod_tramo = t.cod_tramo AND cod_fila = t.cod_fila AND cod_pos = t.cod_pos)) AS suma_cantidad2_pos FROM iptb00062 t INNER JOIN intb00010 a ON t.bodega = a.cod_bodega AND t.cod_seccion = a.cod_seccion INNER JOIN intb00043 b ON t.bodega = b.cod_bodega AND t.cod_seccion = b.cod_seccion AND t.cod_tramo = b.cod_tramo INNER JOIN intb00045 c ON t.bodega = c.cod_bodega AND t.cod_seccion = c.cod_seccion AND t.cod_tramo = c.cod_tramo AND t.cod_fila = c.cod_fila INNER JOIN intb00046 d ON t.bodega = d.cod_bodega AND t.cod_seccion = d.cod_seccion AND t.cod_tramo = d.cod_tramo AND t.cod_fila = d.cod_fila AND t.cod_pos = d.cod_pos WHERE ( t.cod_mov = SplittedMov[1] AND t.num_doc = csmov1[idx].num_doc AND t.cod_n = datos_cons.cod_n AND t.cod_grupo = datos_cons.cod_grupo AND t.cod_tipo = datos_cons.cod_tipo AND t.cod_sec = datos_cons.cod_sec) AND t.status_t IS NULL GROUP BY t.cod_seccion, t.cod_tramo, t.cod_fila, t.cod_pos, a.cod_seccion, a.descripcion, b.cod_tramo, b.descripcion, c.cod_fila, c.titulo, d.cod_pos, d.titulo, t.bodega, t.cod_n, t.cod_grupo, t.cod_tipo, t.cod_sec, t.cod_mov, t.num_doc ORDER BY t.cod_seccion, t.cod_tramo, t.cod_fila, t.cod_pos; LET i = 2 LET z = 1 INITIALIZE MirrorLocation TO NULL FOREACH query INTO Container[z].* IF container[z].existenciaSec != 0 AND container[z].existenciaTram != 0 AND container[z].existenciaFil != 0 AND container[z].existenciaPos != 0 THEN LET MirrorLocation[i] = Container[z] LET i = i + 1 END IF LET z = z + 1 END FOREACH LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " UBICACIONES " LET csmov1[idx].parent_id = firstID LET csmov1[idx].child_id = firstID ||"."||firstID LET idx = idx + 1 LET i = 2 WHILE i <= mirrorLocation.getLength() IF mirrorLocation[i].seccion = mirrorLocation[i - 1].seccion THEN IF mirrorLocation[i].tramo = mirrorLocation[i - 1].tramo THEN IF mirrorLocation[i].fila = mirrorLocation[i - 1].fila THEN IF mirrorLocation[i].posicion = mirrorLocation[i - 1].posicion THEN DISPLAY "nothing happened" --se supone que gracias al --query esto nunca saldrá ELSE LET counterPos = counterPos + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].posicion, " || Cantidad:", mirrorLocation[i].existenciaPos LET csmov1[idx].parent_id = firstID || "." || counterSec || "." || counterTram || "." || counterFil LET csmov1[idx].child_id = firstID || "." || counterSec || "." || counterTram || "." || counterFil || "." || counterPos LET NextTree = TRUE END IF ELSE IF nextTree = TRUE THEN LET counterPos = 1 LET nextTree = FALSE END IF LET counterFil = counterFil + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].fila, " || Cantidad:", mirrorLocation[i].existenciaFil LET csmov1[idx].parent_id = firstID ||"." || counterSec || "." || counterTram LET csmov1[idx].child_id = firstID ||"." || counterSec || "." || counterTram || "." || counterFil LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].posicion, " || Cantidad:", mirrorLocation[i].existenciapos LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || counterPos LET nextTree2 = TRUE END IF ELSE IF nextTree2 THEN LET counterPos = 1 LET counterFil = 1 LET nextTree2 = FALSE END IF LET counterTram = counterTram + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].tramo, " || Cantidad:", mirrorLocation[i].existenciatram LET csmov1[idx].parent_id = firstID || "." || counterSec LET csmov1[idx].child_id = firstID || "." || counterSec || "." || counterTram LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].fila, " || Cantidad:", mirrorLocation[i].existenciafil LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || counterFil LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].posicion, " || Cantidad:", mirrorLocation[i].existenciapos LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || counterPos END IF ELSE LET counterSec = counterSec + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].seccion, " || Cantidad:", mirrorLocation[i].existenciaSec LET csmov1[idx].parent_id = firstID LET csmov1[idx].child_id = firstID || "." || counterSec LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].tramo, " || Cantidad:", mirrorLocation[i].existenciatram LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || firstID LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].fila, " || Cantidad:", mirrorLocation[i].existenciaFil LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || firstID LET idx = idx + 1 LET csmov1[idx].descrip_mov1 = " ", mirrorLocation[i].posicion, " || Cantidad:", mirrorLocation[i].existenciaPos LET csmov1[idx].parent_id = csmov1[idx - 1].child_id LET csmov1[idx].child_id = csmov1[idx - 1].child_id || "." || firstID LET counterTram = 1 LET counterFil = 1 LET counterPos = 1 END IF LET idx = idx + 1 LET i = i + 1 END WHILE END IF RETURN index2 END FUNCTION