{ ------------------------------------------------------------------------------- PROGRAMA : IPPRCS007 OBJETIVO : CONSULTA DIAS DE PRODUCCION PROGRAMADOR : Tadeo A. Ferreras F. FECHA REALIZACION : Octubre 29, 1992. ------------------------------------------------------------------------------- } GLOBALS "ipprgb000.4gl" DEFINE hora CHAR(5) DEFINE segunda,encontre_mov,retorna,salir,salir1,continua,encontre,primera, p_desplega,situacion CHAR(1) DEFINE l,i,e,imp_idx,dias2,dias1,idx_b,idx_c,idx_o, idx_kl,orden_act,dia_orden,idx_o1,idx_o2,idx_f,idx1 SMALLINT DEFINE doc_ant INTEGER DEFINE dia_orden1,dias,d DECIMAL(8,2) DEFINE t_pendiente,pendiente,t_recibe,t_remanente,remanente,cantidad, existencia1,consumo,t_cantidad DECIMAL (12,2) DEFINE selec6,selec5,selec1,select_con,select_bal , selec10 CHAR(1000) DEFINE arr_pend ARRAY [30] OF RECORD num_doc INTEGER, ordenada CHAR(14), recibida CHAR(14), cantidad CHAR(14), fecha_llegada DATE END RECORD DEFINE fechas_pend1 RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, num_oc INTEGER, cantidad DECIMAL (10,2), fecha DATE END RECORD DEFINE fechas_pend RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, num_oc INTEGER, cantidad DECIMAL (10,2), fech_ent DATE END RECORD DEFINE p_materiales RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descrip_esp CHAR(30), unidad_med CHAR(3), dia_llegada LIKE iptb00002.dia_llegada END RECORD DEFINE consumos RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, balances LIKE iptb00006.cantidad_2 END RECORD DEFINE cant_movi RECORD cod_n LIKE intb00001.cod_n, cod_grupo LIKE intb00001.cod_grupo, cod_tipo LIKE intb00001.cod_tipo, cod_sec LIKE intb00001.cod_sec, num_oc INTEGER, existe1 DECIMAL (12,2), fecha1 DATE END RECORD DEFINE balances RECORD cod_n LIKE intb00001.cod_n, cod_grupo LIKE intb00001.cod_grupo, cod_tipo LIKE intb00001.cod_tipo, cod_sec LIKE intb00001.cod_sec, existe1 DECIMAL (12,2) END RECORD DEFINE estadis RECORD cod_n LIKE intb00001.cod_n, cod_grupo LIKE intb00001.cod_grupo, cod_tipo LIKE intb00001.cod_tipo, cod_sec LIKE intb00001.cod_sec, descrip_esp LIKE intb00001.descrip_esp, unidad_med LIKE intb00001.unidad_med, dia_llegada LIKE iptb00002.dia_llegada, existe1 CHAR(14), consumo1 CHAR(13), dias_orden CHAR(4) END RECORD DEFINE datos_cons1 RECORD fech_in DATE, fech_fi DATE END RECORD FUNCTION ipprcs007() #WHENEVER ERROR CONTINUE OPTIONS FORM LINE 6, ERROR LINE 23, COMMENT LINE 22 DISPLAY " " AT 23,1 OPEN WINDOW fechas AT 13,6 WITH FORM "ipfmcs017" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, MESSAGE LINE LAST) INPUT BY NAME datos_cons1.fech_in,datos_cons1.fech_fi AFTER FIELD fech_in IF datos_cons1.fech_in IS NULL THEN Select min(fecha) INTO datos_cons1.fech_in FROM iptb00006 WHERE cod_mov = 99 DISPLAY BY NAME datos_cons1.fech_in END IF AFTER FIELD fech_fi IF datos_cons1.fech_fi IS NULL THEN LET datos_cons1.fech_fi = today DISPLAY BY NAME datos_cons1.fech_fi END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT INPUT END IF IF datos_cons1.fech_in IS NOT NULL AND datos_cons1.fech_fi IS NULL THEN LET numero_msg = 64 CALL msg(numero_msg) NEXT FIELD fech_in END IF IF datos_cons1.fech_in IS NULL AND datos_cons1.fech_fi IS NOT NULL THEN LET numero_msg = 64 CALL msg(numero_msg) NEXT FIELD fech_in END IF LET dias1 = datos_cons1.fech_fi - datos_cons1.fech_in LET dias1 = dias1 + 1 DISPLAY BY NAME dias1 SLEEP 2 EXIT INPUT END INPUT IF int_flag THEN LET int_flag = FALSE CLOSE WINDOW fechas RETURN END IF CLOSE WINDOW fechas CLEAR SCREEN LET retorna = null OPEN FORM ipfmcs007 FROM "ipfmcs007" DISPLAY FORM ipfmcs007 DISPLAY "ipprcs007" AT 3,3 DISPLAY "E L E C T R O D O M E S T I C O S J U V I A R" AT 3,19 ATTRIBUTE (REVERSE,BOLD) DISPLAY "Dias de Inventario en Prod. Terminados" AT 4,23 ATTRIBUTE (BOLD) CONSTRUCT criterio ON b.cod_n,b.cod_grupo, b.cod_tipo,b.cod_sec FROM cod_n,cod_grupo,cod_tipo,cod_sec IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF LABEL vuelve: DISPLAY BY NAME datos_cons1.* ATTRIBUTE (BLUE) # Query de los materiales con su descripcion y datos generales MESSAGE " Espere Por Favor" ATTRIBUTE (BOLD) # Query Para Cantidades Llegadas por Movimientos LET selec6 = "SELECT b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,b.orden_compra, ", " sum(b.cantidad_2) ", "FROM iptb00006 b ", "WHERE b.status_t is null AND b.orden_compra is not null AND ", criterio CLIPPED," GROUP BY 1,2,3,4,5 ORDER BY 1,2,3,4,5 " PREPARE busca_movi FROM selec6 DECLARE movi_orden SCROLL CURSOR FOR busca_movi OPEN movi_orden # Query Para Las Fechas de Entregas LET selec10 = "SELECT b.cod_n,b.cod_grupo,b.cod_tipo,b.cod_sec,b.num_oc,", " sum(b.cantidad),a.fech_oc ", "FROM cotb00015 b,cotb00014 a ", "WHERE a.tipo = b.tipo and a.num_oc = b.num_oc and ", " a.cierre = 'N' and b.status_t is null AND ", criterio CLIPPED," GROUP BY 1,2,3,4,5,7 ORDER BY 1,2,3,4,5" PREPARE busca_fechas FROM selec10 DECLARE fechas SCROLL CURSOR FOR busca_fechas OPEN fechas LET selec = "select a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp,", " a.unidad_med,b.dia_llegada ", "FROM intb00001 a,iptb00002 b ", "WHERE ",criterio clipped," and a.cod_n = b.cod_n and ", " a.cod_grupo=b.cod_grupo and a.cod_tipo=b.cod_tipo and ", " a.cod_sec = b.cod_sec and b.status_t is null ", "ORDER BY 1,2,3,4 " PREPARE busca_mat FROM selec DECLARE material SCROLL CURSOR FOR busca_mat OPEN material LET idx_b = 1 LET idx_c = 1 LET idx = 1 LET consumo = 0 LET dias = 0 FETCH FIRST material INTO p_materiales.* IF status < 0 THEN CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF LET estadis.descrip_esp = p_materiales.descrip_esp LET estadis.unidad_med = p_materiales.unidad_med LET estadis.cod_n = p_materiales.cod_n LET estadis.cod_grupo = p_materiales.cod_grupo LET estadis.cod_tipo = p_materiales.cod_tipo LET estadis.cod_sec = p_materiales.cod_sec LET estadis.dia_llegada = p_materiales.dia_llegada LET consumo = 0 SELECT sum(b.cantidad_2) INTO consumo FROM iptb00006 b WHERE b.status_t is null and b.cod_mov IN(30,31) AND b.fecha between datos_cons1.fech_in and datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF consumo IS NULL THEN LET consumo = 0 END IF LET estadis.consumo1 = consumo SELECT sum(b.cantidad_2) INTO estadis.existe1 FROM iptb00006 b WHERE b.status_t is null and b.fecha <= datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF estadis.existe1 IS NULL THEN LET estadis.existe1 = 0 END IF CALL busqueda() MENU "OPCION" COMMAND "Siguiente" "Para Ver Siguiente Registro Cumple Condicion o Presione < O > Para Ver Ordenes" LET idx_b = 1 LET idx_c = 1 LET idx = 1 FETCH NEXT material INTO p_materiales.* IF status = notfound THEN LET numero_msg = 4 CALL msg(numero_msg) END IF IF status < 0 THEN CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF LET estadis.descrip_esp = p_materiales.descrip_esp LET estadis.unidad_med = p_materiales.unidad_med LET estadis.cod_n = p_materiales.cod_n LET estadis.cod_grupo = p_materiales.cod_grupo LET estadis.cod_tipo = p_materiales.cod_tipo LET estadis.cod_sec = p_materiales.cod_sec LET estadis.dia_llegada = p_materiales.dia_llegada LET consumo = 0 SELECT sum(b.cantidad_2) INTO consumo FROM iptb00006 b WHERE b.status_t is null and b.cod_mov IN(30,31) AND b.fecha between datos_cons1.fech_in and datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF consumo IS NULL THEN LET consumo = 0 END IF LET estadis.consumo1 = consumo SELECT sum(b.cantidad_2) INTO estadis.existe1 FROM iptb00006 b WHERE b.status_t is null and b.fecha <= datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF estadis.existe1 IS NULL THEN LET estadis.existe1 = 0 END IF CALL busqueda() COMMAND "Anterior" "Para Ver Anterior Registro Cumple Condicion o Presione < O > Para Ver Ordenes" LET idx_b = 1 LET idx_c = 1 LET idx = 1 FETCH PREVIOUS material INTO p_materiales.* IF status = notfound THEN LET numero_msg = 5 CALL msg(numero_msg) END IF IF status < 0 THEN CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF LET estadis.descrip_esp = p_materiales.descrip_esp LET estadis.unidad_med = p_materiales.unidad_med LET estadis.cod_n = p_materiales.cod_n LET estadis.cod_grupo = p_materiales.cod_grupo LET estadis.cod_tipo = p_materiales.cod_tipo LET estadis.cod_sec = p_materiales.cod_sec LET estadis.dia_llegada = p_materiales.dia_llegada LET consumo = 0 SELECT sum(b.cantidad_2) INTO consumo FROM iptb00006 b WHERE b.status_t is null and b.cod_mov IN(30,31) AND b.fecha between datos_cons1.fech_in and datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF consumo IS NULL THEN LET consumo = 0 END IF LET estadis.consumo1 = consumo SELECT sum(b.cantidad_2) INTO estadis.existe1 FROM iptb00006 b WHERE b.status_t is null and b.fecha <= datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF estadis.existe1 IS NULL THEN LET estadis.existe1 = 0 END IF CALL busqueda() COMMAND "Primero" "Para Ver Primero Registro Cumple Condicion o Presione < O > Para Ver Ordenes" LET idx_b = 1 LET idx_c = 1 LET idx = 1 FETCH FIRST material INTO p_materiales.* IF status = notfound THEN LET numero_msg = 5 CALL msg(numero_msg) END IF IF status < 0 THEN CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF LET estadis.descrip_esp = p_materiales.descrip_esp LET estadis.unidad_med = p_materiales.unidad_med LET estadis.cod_n = p_materiales.cod_n LET estadis.cod_grupo = p_materiales.cod_grupo LET estadis.cod_tipo = p_materiales.cod_tipo LET estadis.cod_sec = p_materiales.cod_sec LET estadis.dia_llegada = p_materiales.dia_llegada LET consumo = 0 SELECT sum(b.cantidad_2) INTO consumo FROM iptb00006 b WHERE b.status_t is null and b.cod_mov IN(30,31) AND b.fecha between datos_cons1.fech_in and datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF consumo IS NULL THEN LET consumo = 0 END IF LET estadis.consumo1 = consumo SELECT sum(b.cantidad_2) INTO estadis.existe1 FROM iptb00006 b WHERE b.status_t is null and b.fecha <= datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF estadis.existe1 IS NULL THEN LET estadis.existe1 = 0 END IF CALL busqueda() COMMAND "Ultimo" "Para Ver Ultimo Registro Cumple Condicion o Presione < O > Para Ver Ordenes" LET idx_b = 1 LET idx_c = 1 LET idx = 1 FETCH LAST material INTO p_materiales.* IF status = notfound THEN LET numero_msg = 4 CALL msg(numero_msg) END IF IF status < 0 THEN CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF LET estadis.descrip_esp = p_materiales.descrip_esp LET estadis.unidad_med = p_materiales.unidad_med LET estadis.cod_n = p_materiales.cod_n LET estadis.cod_grupo = p_materiales.cod_grupo LET estadis.cod_tipo = p_materiales.cod_tipo LET estadis.cod_sec = p_materiales.cod_sec LET estadis.dia_llegada = p_materiales.dia_llegada LET consumo = 0 SELECT sum(b.cantidad_2) INTO consumo FROM iptb00006 b WHERE b.status_t is null and b.cod_mov IN(30,31) AND b.fecha between datos_cons1.fech_in and datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF consumo IS NULL THEN LET consumo = 0 END IF LET estadis.consumo1 = consumo SELECT sum(b.cantidad_2) INTO estadis.existe1 FROM iptb00006 b WHERE b.status_t is null and b.fecha <= datos_cons1.fech_fi AND b.cod_n = estadis.cod_n AND b.cod_grupo = estadis.cod_grupo AND b.cod_tipo = estadis.cod_tipo AND b.cod_sec = estadis.cod_sec IF estadis.existe1 IS NULL THEN LET estadis.existe1 = 0 END IF CALL busqueda() COMMAND "Ordenes" DISPLAY "Buscando Informacion... Espere Por Favor" AT 23,1 ATTRIBUTE (BOLD) LET p_desplega = "S" CALL busca_orden() COMMAND "Retornar" LET retorna = "S" EXIT MENU END MENU CLEAR FORM #GOTO vuelve END FUNCTION FUNCTION busqueda() DISPLAY " " AT 23,1 ATTRIBUTE (BOLD) LET primera = "S" LET salir = "N" LET existencia1 = 0 LET estadis.dias_orden = 0 using "&&&" LET t_pendiente = 0 LET pendiente = 0 LET t_recibe = 0 # Calculo Para los dias de produccion sin orden LET existencia1 = estadis.existe1 LET consumo = estadis.consumo1 IF consumo < 0 THEN LET consumo = consumo * -1 END IF IF consumo > 0 THEN LET dias = (existencia1 / consumo) ELSE LET dias = 0 END IF LET estadis.consumo1 = consumo IF existencia1 <= 0 THEN LET dias = 0 END IF LET dias = dias * dias1 LET dias = dias using "#####&" LET dias2 = dias using "#####&" DISPLAY BY NAME estadis.*,dias2 ATTRIBUTE (BLUE) END FUNCTION FUNCTION busca_orden() LET cantidad = 0 LET encontre = "N" LET idx = 1 LET idx_o = 1 LET primera = "N" LET idx_f = 1 LET remanente = 0 LET t_remanente = 0 LET doc_ant = 0 LET encontre_mov = "N" LET situacion = "N" LET t_recibe = 0 # Loop Para Buscar Las Fechas de Entrega de cada Orden Por Material LET salir = "N" WHILE salir != "S" FETCH ABSOLUTE idx_f fechas INTO fechas_pend.* IF status = notfound THEN LET idx_f = 1 EXIT WHILE END IF LET idx_f = idx_f + 1 LET remanente = 0 LET encontre_mov = "N" IF estadis.cod_n = fechas_pend.cod_n AND estadis.cod_grupo = fechas_pend.cod_grupo AND estadis.cod_tipo = fechas_pend.cod_tipo AND estadis.cod_sec = fechas_pend.cod_sec THEN IF fechas_pend.num_oc != doc_ant THEN LET doc_ant = fechas_pend.num_oc LET cantidad = 0 END IF LET cantidad = fechas_pend.cantidad + cantidad LET remanente = cantidad LET idx_kl = idx_f FETCH ABSOLUTE idx_kl fechas INTO fechas_pend1.* IF status = notfound THEN GOTO salta1 END IF IF fechas_pend1.num_oc = fechas_pend.num_oc THEN GOTO salta END IF LABEL salta1: LET t_recibe = 0 LET encontre = "S" LET salir = "N" WHILE salir != "S" FETCH ABSOLUTE idx_o movi_orden INTO cant_movi.* IF status = notfound THEN LET idx_o = 1 EXIT WHILE END IF LET idx_o = idx_o + 1 LET encontre_mov = "N" IF cant_movi.cod_n = fechas_pend.cod_n AND cant_movi.cod_grupo = fechas_pend.cod_grupo AND cant_movi.cod_tipo = fechas_pend.cod_tipo AND cant_movi.cod_sec = fechas_pend.cod_sec AND cant_movi.num_oc = fechas_pend.num_oc THEN LET remanente = cantidad - cant_movi.existe1 LET t_recibe = cant_movi.existe1 LET primera = "S" LET encontre_mov = "S" LET idx_o = 1 EXIT WHILE END IF END WHILE LABEL salta: LET t_remanente = remanente + t_remanente LET arr_pend[idx].num_doc = fechas_pend.num_oc LET arr_pend[idx].ordenada = fechas_pend.cantidad using "##,###,###.##" LET arr_pend[idx].recibida = t_recibe using "##,###,###.##" LET arr_pend[idx].cantidad = t_remanente + fechas_pend.cantidad - t_recibe using "---,---,---.##" LET arr_pend[idx].fecha_llegada = fechas_pend.fech_ent LET idx = idx + 1 END IF END WHILE DISPLAY " " AT 23,1 # Calculo para los dias de produccion con ordenes IF consumo > 0 THEN IF t_remanente > 0 THEN LET dia_orden1 = ((existencia1 + t_remanente) / consumo) ELSE LET dia_orden1 = (existencia1/consumo) END IF LET dia_orden1 = dia_orden1 * dias1 LET dia_orden = dia_orden1 using "####" LET estadis.dias_orden = dia_orden using "####" ELSE LET estadis.dias_orden = 0 END IF DISPLAY dias at 3,1 attribute (bold) DISPLAY dias1 at 4,1 attribute (bold) DISPLAY BY NAME estadis.dias_orden # CALL set_count(idx - 1) LET idx = idx - 1 # DISPLAY ARRAY arr_pend TO sp1.* ATTRIBUTE (BOLD) DISPLAY " " AT 23,40 LET t_cantidad = 0 FOR idx1 = 1 TO idx IF arr_pend[idx1].ordenada IS NULL THEN LET arr_pend[idx1].ordenada = 0 END IF IF arr_pend[idx1].recibida IS NULL THEN LET arr_pend[idx1].recibida = null END IF LET t_cantidad = t_cantidad + (arr_pend[idx1].ordenada - arr_pend[idx1].recibida) LET arr_pend[idx1].cantidad = t_cantidad #DISPLAY arr_pend[idx1].num_doc to sp1[idx1].num_oc #DISPLAY arr_pend[idx1].ordenada to sp1[idx1].ordenada #DISPLAY arr_pend[idx1].cantidad to sp1[idx1].cantidad #DISPLAY arr_pend[idx1].recibida to sp1[idx1].recibida #DISPLAY arr_pend[idx1].fecha_llegada to sp1[idx1].fecha_llegada END FOR LET idx = idx + 1 CALL set_count(idx - 1) DISPLAY ARRAY arr_pend TO sp1.* ATTRIBUTE (BOLD) IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF FOR idx = 1 to idx1 LET arr_pend[idx].num_doc = null LET arr_pend[idx].cantidad = null LET arr_pend[idx].fecha_llegada = null LET arr_pend[idx].ordenada = null LET arr_pend[idx].recibida = null DISPLAY arr_pend[idx].num_doc to sp1[idx].num_oc DISPLAY arr_pend[idx].ordenada to sp1[idx].ordenada DISPLAY arr_pend[idx].cantidad to sp1[idx].cantidad DISPLAY arr_pend[idx].recibida to sp1[idx].recibida DISPLAY arr_pend[idx].fecha_llegada to sp1[idx].fecha_llegada END FOR END FUNCTION