{ ------------------------------------------------------------------------------- PROGRAMA : CTPRRP033 OBJETIVO : Desperdicio de Materiales (Mensual) PROGRAMADOR : Juan F. Soto FECHA REALIZACION : Noviembre 16, 1995 ------------------------------------------------------------------------------- } GLOBALS "ctprgb000.4gl" DEFINE cantidad_t,cant_env,cant_env1 DECIMAL(12,2) DEFINE ini_fecha CHAR(8) ####### Definicion de variables a usar en el reporte ####### # Costo de la materia prima DEFINE maestra RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descrip_esp CHAR(30), unidad_med CHAR(3) END RECORD DEFINE costos1 RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, costo DECIMAL(12,4) END RECORD # Material consumido por los semi-elaborados para sumar al inventario # final DEFINE estandard RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, cantidad DECIMAL(12,2) END RECORD # Inventario inicial DEFINE inicial RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, cantidad DECIMAL(12,2) END RECORD DEFINE inicial1 RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, cantidad DECIMAL(12,2) END RECORD DEFINE final1 RECORD cod_prod SMALLINT, cantidad DECIMAL(12,2) END RECORD # Inventario Final DEFINE final RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, cantidad DECIMAL(12,2) END RECORD # Cantidad de materia prima utilizada en la produccion, codigo 36 de # movimientos DEFINE proceso RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, cantidad DECIMAL(12,2) END RECORD DEFINE cantidad DECIMAL(12,2) # Este es el record que se validara para imprimir todas la materia prima # Variables para asignarles los selects DEFINE selec1,selec2,selec3,selec4,selec5,selec6,selec7,selec8, selecj,seleck CHAR(1000) # Bandera para utilizarla en los loops de busqueda DEFINE salirj,salirk,salir,salir1,salir2,salir3,salir4,salir6,salir5 CHAR(1) # Variables de entrada del reporte DEFINE fecha_ini,fecha_fin DATE, cod_n,cod_grupo,cod_tipo,cod_sec SMALLINT, # Indices de busqueda de las informaciones idx_1,idx_2,idx_3,idx_4,idx_6,idx_7,idx_e,idx_d,idx_c,idx_b,idx_a, i,j INTEGER # Variables que determinaran el inventario inicial y el inventario final # El mes1 buscara el inventario inicial, mes_fin buscara el final. DEFINE mes_fin SMALLINT DEFINE mes1_1,mes1_2,mes2_1,mes2_2 DATE DEFINE mes1,ano1 SMALLINT # Variable para buscar el costo del ano DEFINE p_ano CHAR(4) FUNCTION ctprrp033() #WHENEVER ERROR CONTINUE OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 OPEN FORM ctfmrp033 FROM "ctfmrp033" DISPLAY FORM ctfmrp033 CALL pantalla() DISPLAY "ctprrp033" AT 4,3 DISPLAY "Desperdicios de Materiales" AT 6,27 LET tipo_papel = 2 CALL msgrp000(tipo_papel) LET p_ano = year(today) USING "&&&&" LET p_ano1= year(today) USING "&&&&" ########### Captura de valores para el criterio de busqueda ############ INPUT BY NAME ano1,mes1 AFTER FIELD ano1 IF ano1 IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD ano1 END IF AFTER FIELD mes1 IF mes1 IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD mes1 END IF LET p_ano = ano1 USING "&&&&" LET mes2 = mes1 - 1 LET p_ano1 = ano1 USING "&&&&" IF mes1 = 1 THEN LET mes2 = 12 LET p_ano1 = ano1 - 1 USING "&&&&" END IF SELECT fecha_inicio,fecha_corte INTO mes1_1,mes1_2 FROM prdtable WHERE mes = mes1 AND ano = p_ano IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD mes END IF END INPUT ########### Facilidad para cancelar la variacioncon la tecla DELETE #### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.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 # Busqueda del consumo standard del material, esto es # La multiplicacion de las cantidades que ha entrado a almacen de pilas # por el movimiento 20 del inventario de productos terminados por las cantidades # que contienen las formulas LET selec4 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,SUM((b.cantidad/1000)* ", " c.cantidad_2) ", "FROM iptb00006 c, catb00001 b,intb00001 a ", "WHERE b.cod_n_pt = c.cod_n AND b.cod_grupo_pt = c.cod_grupo AND ", " b.cod_tipo_pt = c.cod_tipo AND b.cod_sec_pt = c.cod_sec AND ", " b.cod_n_mp = a.cod_n AND b.cod_grupo_mp = a.cod_grupo AND ", " b.cod_tipo_mp = a.cod_tipo AND b.cod_sec_mp = a.cod_sec AND ", " c.cod_mov=20 AND c.fecha BETWEEN ? AND ? AND c.status_t IS NULL AND ", " b.status_t IS NULL AND ",criterio CLIPPED, " GROUP BY 1,2,3,4 ORDER BY 1,2,3,4 " DISPLAY "<>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando4 FROM selec4 DECLARE stand SCROLL CURSOR FOR comando4 OPEN stand USING mes1_1,mes1_2 LET selec8 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.descrip_esp, ", " a.unidad_med FROM intb00001 a,intb00002 b ", "WHERE 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 ", " a.status_t is null and b.status_t is null and ", criterio CLIPPED, " ORDER BY 1,2,3,4 " DISPLAY "Buscando Materiales ... Espere Por Favor" AT 17,14 ATTRIBUTE(BOLD) LET selec11 = "SELECT COUNT(*) ", "FROM intb00001 a,intb00002 b ", "WHERE 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 ", criterio CLIPPED PREPARE comando10 FROM selec11 DECLARE busca10 CURSOR FOR comando10 OPEN busca10 FETCH busca10 INTO regi PREPARE comando FROM selec8 DECLARE busca_ma CURSOR FOR comando OPEN busca_ma # busqueda de la sumatoria del consumo del material que sale del almacen LET selec1 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,sum(a.cantidad_2)*-1 ", "FROM intb00006 a ", "WHERE a.fecha BETWEEN ? AND ? AND a.cod_mov = 36 AND ", " a.status_t is null AND ",criterio CLIPPED, " GROUP BY 1,2,3,4 ORDER BY 1,2,3,4" DISPLAY "<< Materiales en Proceso ... Espere Por Favor. >>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando8 FROM selec1 DECLARE proces SCROLL CURSOR FOR comando8 OPEN proces USING mes1_1,mes1_2 LET selec2 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.cantidad) ", "FROM cttb00015 a ", "WHERE a.ano = ? AND a.mes = ? AND a.status_t is null AND ", criterio CLIPPED," GROUP BY 1,2,3,4 ORDER BY 1,2,3,4" DISPLAY " " AT 17,14 DISPLAY "<< Buscando Inv. Inicial ... Espere Por Favor. >>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando1 FROM selec2 DECLARE inicio SCROLL CURSOR FOR comando1 OPEN inicio USING p_ano1,mes2 # Busqueda del inventario final de la materia prima apartir del mes inicial # y el ano LET selec3 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.cantidad) ", "FROM cttb00015 a ", "WHERE a.mes = ? AND a.ano = ? AND a.status_t IS NULL AND ", criterio CLIPPED,"GROUP BY 1,2,3,4 ORDER BY 1,2,3,4" DISPLAY " " AT 17,14 DISPLAY "<< Buscando Inv. final ... Espere Por Favor. >>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando2 FROM selec3 DECLARE fin SCROLL CURSOR FOR comando2 OPEN fin USING mes1,ano1 # Busqueda del costo standard para cada material LET selec5 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,MAX(a.costo_st) ", "FROM intb00013 a ", "WHERE a.ano = ? and a.status_t is null AND a.mes_fin = 12 AND ", criterio CLIPPED," GROUP BY 1,2,3,4 ORDER BY 1,2,3,4" DISPLAY " " AT 17,14 DISPLAY "<< Buscando Costos Std ... Espere Por Favor. >>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando5 FROM selec5 DECLARE cost SCROLL CURSOR FOR comando5 OPEN cost USING ano1 DISPLAY " " AT 17,14 START REPORT desperdicio TO PIPE "lp -dcentral" DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" AT 17,14 ATTRIBUTE (REVERSE) # Loop inicial de busqueda de las informaciones de la materia prima LET p_param = "S" LET salir = "N" WHILE salir != "S" FETCH busca_ma INTO maestra.* IF STATUS = NOTFOUND THEN LET salir = "S" EXIT WHILE END IF CALL termometro(regi,p_param) LET p_param = "N" IF int_flag THEN LET int_flag = FALSE LET numero_msg = 2 CALL msg(numero_msg) RETURN END IF LET datos1.cod_n = maestra.cod_n LET datos1.cod_grupo = maestra.cod_grupo LET datos1.cod_tipo = maestra.cod_tipo LET datos1.cod_sec = maestra.cod_sec LET datos1.descrip_esp = maestra.descrip_esp LET datos1.unidad_med = maestra.unidad_med LET datos1.mat_proceso = 0 LET datos1.inv_inicial = 0 LET datos1.cons_real = 0 LET datos1.cons_std = 0 LET datos1.costo = 0 LET inicial1.cantidad = 0 LET cantidad_t = 0 CALL calcula_sm13() IF cantidad_t is null THEN LET cantidad_t = 0 END IF LET datos1.cant_env1 = cantidad_t LET cantidad_t = 0 CALL calcula_sm3() IF cantidad_t is null THEN LET cantidad_t = 0 END IF LET datos1.cant_env = cantidad_t LET salir1 = "N" LET idx_1 = 1 WHILE salir1 != "S" FETCH ABSOLUTE idx_1 inicio INTO inicial.* IF STATUS = NOTFOUND THEN LET salir1 = "S" LET idx_1 = 1 EXIT WHILE END IF LET idx_1 = idx_1 + 1 IF datos1.cod_n = inicial.cod_n AND datos1.cod_grupo = inicial.cod_grupo AND datos1.cod_tipo = inicial.cod_tipo AND datos1.cod_sec = inicial.cod_sec THEN LET datos1.inv_inicial = inicial.cantidad LET salir1 = "S" LET idx_1 = 1 EXIT WHILE END IF END WHILE IF datos1.inv_inicial IS NULL THEN LET datos1.inv_inicial = 0 END IF LET salir2 = "N" LET status = 0 LET idx_2 = 1 WHILE salir2 != "S" FETCH ABSOLUTE idx_2 fin INTO final.* IF STATUS = NOTFOUND THEN LET salir2 = "S" LET idx_2 = 1 EXIT WHILE END IF LET idx_2 = idx_2 + 1 IF datos1.cod_n = final.cod_n AND datos1.cod_grupo = final.cod_grupo AND datos1.cod_tipo = final.cod_tipo AND datos1.cod_sec = final.cod_sec THEN LET datos1.inv_final = final.cantidad LET salir2 = "S" LET idx_2 = 1 EXIT WHILE END IF END WHILE IF datos1.inv_final IS NULL THEN LET datos1.inv_final = 0 END IF LET salir3 = "N" LET idx_3 = 1 WHILE salir3 != "S" FETCH ABSOLUTE idx_3 proces INTO proceso.* IF STATUS = NOTFOUND THEN LET salir3 = "S" LET idx_3 = 1 EXIT WHILE END IF LET idx_3 = idx_3 + 1 IF datos1.cod_n = proceso.cod_n AND datos1.cod_grupo = proceso.cod_grupo AND datos1.cod_tipo = proceso.cod_tipo AND datos1.cod_sec = proceso.cod_sec THEN LET datos1.mat_proceso = proceso.cantidad LET salir3 = "S" LET idx_3 = 1 EXIT WHILE END IF END WHILE IF datos1.mat_proceso IS NULL THEN LET datos1.mat_proceso = 0 END IF LET salir4 = "N" LET idx_4 = 1 # Loop para la busqueda del consumo Estandard WHILE salir4 != "S" FETCH ABSOLUTE idx_4 stand INTO estandard.* IF STATUS = NOTFOUND THEN LET salir4 = "S" LET idx_4 = 1 EXIT WHILE END IF LET idx_4 = idx_4 + 1 IF maestra.cod_n = estandard.cod_n AND maestra.cod_grupo = estandard.cod_grupo AND maestra.cod_tipo = estandard.cod_tipo AND maestra.cod_sec = estandard.cod_sec THEN LET datos1.cons_std = estandard.cantidad LET salir4 = "S" LET idx_4 = 1 EXIT WHILE END IF END WHILE IF datos1.cons_std IS NULL THEN LET datos1.cons_std = 0 END IF LET salir6 = "N" LET idx_6 = 1 WHILE salir6 != "S" FETCH ABSOLUTE idx_6 cost INTO costos1.* IF STATUS = NOTFOUND THEN LET salir6 = "S" LET idx_6 = 1 EXIT WHILE END IF LET idx_6 = idx_6 + 1 IF maestra.cod_n = costos1.cod_n AND maestra.cod_grupo = costos1.cod_grupo AND maestra.cod_tipo = costos1.cod_tipo AND maestra.cod_sec = costos1.cod_sec THEN LET datos1.costo = costos1.costo LET salir6 = "S" LET idx_6 = 1 EXIT WHILE END IF END WHILE IF datos1.costo IS NULL THEN LET datos1.costo = 0 END IF OUTPUT TO REPORT desperdicio(datos1.*,mes1_1,mes1_2) END WHILE FINISH REPORT desperdicio CLEAR SCREEN RUN "type C:\\archivo > %USPRINT%" END FUNCTION # Rutina de Impresion de las informaciones REPORT desperdicio(x,fech1,fech2) # Variable para tomar las informaciones DEFINE x RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descrip_esp CHAR(30), unidad_med CHAR(3), inv_inicial DECIMAL(12,2), inv_final DECIMAL(12,2), mat_proceso DECIMAL(12,2), cons_real DECIMAL(12,2), cons_std DECIMAL(12,2), cant_env DECIMAL(12,2), cant_env1 DECIMAL(12,2), costo DECIMAL(12,2) END RECORD, stand DECIMAL(12,2), cons_proc DECIMAL(12,2), cons_real DECIMAL(12,2), var DECIMAL(12,2), var1 DECIMAL(5,2), descrip_esp CHAR(30), unidad_med CHAR(20), in_ini DECIMAL(12,2), in_fin DECIMAL(12,2), desp DECIMAL(12,2) # Vaiables para la impresion de caracters ASCII DEFINE fech1,fech2 DATE DEFINE doble_on CHAR(3) DEFINE doble_off CHAR(3) DEFINE negrillas_on CHAR(6) DEFINE negrillas_off CHAR(6) DEFINE comp_on CHAR(3) DEFINE comp_off CHAR(2) DEFINE doce CHAR(3) DEFINE normal CHAR(3) DEFINE hora CHAR(5) # Variables para diferentes calculos que se especificaran mas adelante DEFINE val_desp,t_val_desp,valor,t_valor, total_p,total_m DECIMAL(12,2) # Variables para el nombre de los meses DEFINE nom_mes1,nom_mes2 CHAR(12) OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 FORMAT PAGE HEADER # Validacion de los caracteres ascii LET doble_on = ASCII 001 LET doble_off = ASCII 002 LET negrillas_on = ASCII 27, ASCII 098 LET negrillas_off = ASCII 27, ASCII 099 LET comp_on = ASCII 31 LET comp_off = ASCII 029 LET doce = ASCII 030 LET normal = ASCII 029 LET hora = time LET l = (90 - LENGTH(p_compania.nombre CLIPPED)) / 2 # Impresion de los encabezados PRINT comp_off,negrillas_on PRINT COLUMN 1, "ctprrp033", COLUMN l, p_compania.nombre CLIPPED, COLUMN 80, "Pag. ", pageno using "###" LET l = (90 - LENGTH("Sistema de Costos")) / 2 PRINT COLUMN l, "Sistema de Costos", COLUMN 80, today using "dd/mm/yy" LET l = (90 - LENGTH("DESPERDICIOS DE MATERIALES")) / 2 PRINT COLUMN l, "DESPERDICIOS DE MATERIALES", COLUMN 80, hora PRINT COLUMN 1,comp_on,negrillas_on PRINT COLUMN 1,"Periodo: ",fech1 USING "dd/mm/yy", " AL ",fech2 USING "dd/mm/yy" PRINT COLUMN 1, "---------------------------------------------------------", "---------------------------------------------------------", "-----------------------------------------------------------" PRINT COLUMN 46, "Materiales", COLUMN 58,"Inventario", COLUMN 70, "Inventario" PRINT COLUMN 1, "Material", COLUMN 46, "A Proceso", COLUMN 58, "Inicial", COLUMN 70, "Final", COLUMN 87, "Cantidad", COLUMN 97, "Desperdicio", COLUMN 114, "Costo", COLUMN 130, "Valor" PRINT COLUMN 58, fech1 using "dd/mm/yy", COLUMN 87, "Standard" PRINT COLUMN 1, "--------------------------------------------------------", "--------------------------------------------------------", "----------------------------------------------------------" ,negrillas_off ON EVERY ROW # Calculo para valorizar la variacion IF t_val_desp is null THEN LET t_val_desp = 0 END IF IF x.costo IS NULL THEN LET x.costo = 0 END IF IF x.mat_proceso < 0 THEN LET x.mat_proceso = x.mat_proceso * -1 END IF #------------------------------------------------------------------------------ # Calculo del desperdicio del material y Valorizacion LET x.inv_final = x.inv_final + x.cant_env LET x.inv_inicial = x.inv_inicial + x.cant_env1 LET desp = x.mat_proceso + x.inv_inicial - x.inv_inicial - x.cons_std LET val_desp = desp * x.costo LET t_val_desp = t_val_desp + val_desp PRINT COLUMN 1, x.cod_n using "&",x.cod_grupo USING "&", x.cod_tipo USING "&&",x.cod_sec USING "&&&"," ", x.descrip_esp," ", x.unidad_med, COLUMN 43, x.mat_proceso USING "##,###,###.##", COLUMN 57, x.inv_inicial USING "###,###.##", COLUMN 69, x.inv_final USING "###,###.###", COLUMN 82, x.cons_std USING "(((,(((,((#.##)", COLUMN 96, desp USING "(((,(((,(##.##)", COLUMN 110, x.costo USING "##,###.##", COLUMN 121, val_desp USING "###,###,###.##" # Impresion de la totalizacion del valor standard ON LAST ROW PRINT negrillas_on PRINT COLUMN 121, "----------------" PRINT COLUMN 118, t_val_desp using "#,###,###,###.##" LET t_val_desp = 0 LET t_valor = 0 PRINT negrillas_off,comp_off END REPORT FUNCTION calcula_sm13() DEFINE prod RECORD cod_prod SMALLINT, cantidad DECIMAL(12,2) END RECORD, factor,cantidad_f DECIMAL(8,5), cantidad_i DECIMAL(12,3) DECLARE busca1 CURSOR FOR SELECT unique a.cod_prod,a.cant_prop,(a.cant_prop * b.cantidad) * 1000 FROM cttb00022 a,cttb00014 b WHERE a.cod_n = datos1.cod_n and a.cod_grupo = datos1.cod_grupo and a.cod_tipo = datos1.cod_tipo and a.cod_sec = datos1.cod_sec and a.cod_prod = b.cod_prod and b.mes = mes2 and b.ano = p_ano1 and a.status_t is null FOREACH busca1 INTO prod.*,cantidad_i IF prod.cantidad is null THEN LET prod.cantidad = 0 END IF LET cantidad_t = cantidad_t + cantidad_i END FOREACH RUN "type C:\\archivo > %USPRINT%" END FUNCTION FUNCTION calcula_sm3() DEFINE prod RECORD cod_prod SMALLINT, cantidad DECIMAL(12,2) END RECORD, factor,cantidad_f DECIMAL(8,5), cantidad_i DECIMAL(12,3) DECLARE busca CURSOR FOR SELECT unique a.cod_prod,a.cant_prop,(a.cant_prop*b.cantidad)*1000 FROM cttb00022 a,cttb00014 b WHERE a.cod_n = datos1.cod_n and a.cod_grupo = datos1.cod_grupo and a.cod_tipo = datos1.cod_tipo and a.cod_sec = datos1.cod_sec and a.cod_prod = b.cod_prod and b.mes = mes1 and b.ano = ano1 and a.status_t is null FOREACH busca INTO prod.*,cantidad_i IF prod.cantidad is null THEN LET prod.cantidad = 0 END IF LET cantidad_t = cantidad_t + cantidad_i END FOREACH RUN "type C:\\archivo > %USPRINT%" END FUNCTION