{ ------------------------------------------------------------------------------- PROGRAMA : CTPRRP001 OBJETIVO : Analisis en Variacion en Consumo de Materiales (Acumulado hasta el mes requerido) PROGRAMADOR : Juan F. Soto FECHA REALIZACION : Mayo 30, 1994 ------------------------------------------------------------------------------- } 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 datos 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, 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 ctprrp001() #WHENEVER ERROR CONTINUE OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 OPEN FORM ctfmrp001 FROM "ctfmrp001" DISPLAY FORM ctfmrp001 CALL pantalla() DISPLAY "ctprrp001" AT 4,3 DISPLAY "Analisis Variacion Consumo" 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 ana_varia1 TO "C:\\archivo" 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 datos.cod_n = maestra.cod_n LET datos.cod_grupo = maestra.cod_grupo LET datos.cod_tipo = maestra.cod_tipo LET datos.cod_sec = maestra.cod_sec LET datos.descrip_esp = maestra.descrip_esp LET datos.unidad_med = maestra.unidad_med LET datos.mat_proceso = 0 LET datos.inv_inicial = 0 LET datos.inv_final = 0 LET datos.cons_real = 0 LET datos.cons_std = 0 LET datos.cant_env = 0 LET datos.costo = 0 LET inicial1.cantidad = 0 LET cantidad_t = 0 CALL calcula_sm12() IF cantidad_t is null THEN LET cantidad_t = 0 END IF LET datos.cant_env1 = cantidad_t LET cantidad_t = 0 CALL calcula_sm() IF cantidad_t is null THEN LET cantidad_t = 0 END IF LET datos.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 datos.cod_n = inicial.cod_n AND datos.cod_grupo = inicial.cod_grupo AND datos.cod_tipo = inicial.cod_tipo AND datos.cod_sec = inicial.cod_sec THEN LET datos.inv_inicial = inicial.cantidad LET salir1 = "S" LET idx_1 = 1 EXIT WHILE END IF END WHILE IF datos.inv_inicial IS NULL THEN LET datos.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 datos.cod_n = final.cod_n AND datos.cod_grupo = final.cod_grupo AND datos.cod_tipo = final.cod_tipo AND datos.cod_sec = final.cod_sec THEN LET datos.inv_final = final.cantidad LET salir2 = "S" LET idx_2 = 1 EXIT WHILE END IF END WHILE IF datos.inv_final IS NULL THEN LET datos.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 datos.cod_n = proceso.cod_n AND datos.cod_grupo = proceso.cod_grupo AND datos.cod_tipo = proceso.cod_tipo AND datos.cod_sec = proceso.cod_sec THEN LET datos.mat_proceso = proceso.cantidad LET salir3 = "S" LET idx_3 = 1 EXIT WHILE END IF END WHILE IF datos.mat_proceso IS NULL THEN LET datos.mat_proceso = 0 END IF LET datos.cons_real = (datos.inv_inicial + (datos.mat_proceso*-1)) - (datos.inv_final + datos.cant_env) IF datos.cons_real IS NULL THEN LET datos.cons_real = 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 datos.cons_std = estandard.cantidad LET salir4 = "S" LET idx_4 = 1 EXIT WHILE END IF END WHILE IF datos.cons_std IS NULL THEN LET datos.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 datos.costo = costos1.costo LET salir6 = "S" LET idx_6 = 1 EXIT WHILE END IF END WHILE IF datos.costo IS NULL THEN LET datos.costo = 0 END IF OUTPUT TO REPORT ana_varia1(datos.*,mes1_1,mes1_2) END WHILE FINISH REPORT ana_varia1 CLEAR SCREEN RUN "type C:\\archivo > %USPRINT%" END FUNCTION # Rutina de Impresion de las informaciones REPORT ana_varia1(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) # 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_real,val_std,t_val_real,t_val_std,porc,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 # Impresion de los encabezados LET l = (162 - LENGTH(p_compania.nombre CLIPPED))/2 PRINT comp_off,negrillas_on PRINT COLUMN 1, "ctprrp001", COLUMN l, p_compania.nombre CLIPPED, COLUMN 120, "Pag. ",pageno using "###" LET l = (162 - LENGTH("Sistema de Costos"))/2 PRINT COLUMN l, "Sistema de Costos", COLUMN 120, today using "dd/mm/yy" LET l = (162 - LENGTH("Analisis Variacion Consumo Materia Prima"))/2 PRINT COLUMN l, "Analisis Variacion Consumo Materia Prima", COLUMN 123, 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,"Inventario", COLUMN 57, "Inventario", COLUMN 71,"Materiales", COLUMN 85,"Inventario", COLUMN 98,"Inventario", COLUMN 125,"C O N S U M O", COLUMN 183,"V a r i a c i o n" PRINT COLUMN 1, "Material", COLUMN 46, "Inicial", COLUMN 57, "Inicial", COLUMN 71, "A Proceso", COLUMN 85, "Final", COLUMN 98, "Semi-Elab.", COLUMN 115, "----------------------------------------------------------", COLUMN 175, "Cantidad", COLUMN 191, "%", COLUMN 198, "Costo ", COLUMN 215, "Valor" PRINT COLUMN 46, fech1 using "dd/mm/yy", COLUMN 57, "Semi-Elab.", COLUMN 71, fech2 using "dd/mm/yy", COLUMN 98,"Final ", COLUMN 116, "Real", COLUMN 131, "Valor", COLUMN 144, "Standard", COLUMN 162, "Valor" PRINT COLUMN 1, "--------------------------------------------------------", "--------------------------------------------------------", "----------------------------------------------------------", "--------------------------------------------------" ,negrillas_off ON EVERY ROW # Calculo de la variacion en el consumo # Esto es el consumo real menos la cantidad estandard LET x.cons_real = (x.inv_inicial + x.cant_env1 + x.mat_proceso) - (x.inv_final + x.cant_env) LET var = x.cons_real - x.cons_std IF var IS NULL THEN LET var = 0 END IF # Porciento de la variacion del material LET porc = 0 IF x.cons_real != 0 THEN LET porc = (var/x.cons_real) * 100 END IF # Calculo para valorizar la variacion IF t_val_real is null THEN LET t_val_real = 0 END IF IF t_val_std is null THEN LET t_val_std = 0 END IF IF x.cons_real IS NULL THEN LET x.cons_real = 0 END IF IF x.costo IS NULL THEN LET x.costo = 0 END IF LET valor = 0 LET valor = x.costo * var IF t_valor IS NULL THEN LET t_valor = 0 END IF LET val_real = x.cons_real * x.costo LET val_std = x.cons_std * x.costo LET t_val_real = t_val_real + val_real LET t_val_std = t_val_std + val_std LET t_valor = t_valor + valor #------------------------------------------------------------------------------ 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.inv_inicial USING "###,###.##", COLUMN 56, x.cant_env1 USING "###,###.###", COLUMN 69, x.mat_proceso USING "##,###,###.##", COLUMN 83, x.inv_final USING "###,###.###", COLUMN 95, x.cant_env USING "###,###.##", COLUMN 106, x.cons_real USING "(((,(((,((#.##)", COLUMN 122, val_real USING "(((,(((,((#.##)", COLUMN 138, x.cons_std USING "###,###,###.##", COLUMN 153, val_std USING "###,###,###.##", COLUMN 168, var USING "-,---,---,--#.##", COLUMN 185, porc USING "---,--&.&&", COLUMN 196, x.costo USING "#,##&.###", COLUMN 206, valor USING "----,---,--&.##" # Impresion de la totalizacion del valor standard ON LAST ROW PRINT negrillas_on PRINT COLUMN 119, "----------------", COLUMN 150, "----------------", COLUMN 205, "----------------" PRINT COLUMN 119, t_val_real using "((,(((,(((,((#.##)", COLUMN 150, t_val_std using "#,###,###,###.##", COLUMN 205, t_valor using "----,---,--&.##" LET t_val_real = 0 LET t_val_std = 0 LET t_valor = 0 # ACTUALIZA LA TABLA CTTB00039 CONTENIENDO LAS INFORMACIONES PARA # EL HISTORIAL DE VARIACION EN CONSUMO DELETE FROM cttb00039 WHERE ano = ano1 AND mes = mes1 INSERT INTO cttb00039 VALUES (ano1,mes1,t_valor,current) PRINT negrillas_off,comp_off END REPORT FUNCTION calcula_sm() 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 = datos.cod_n and a.cod_grupo = datos.cod_grupo and a.cod_tipo = datos.cod_tipo and a.cod_sec = datos.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 FUNCTION calcula_sm12() DEFINE prod RECORD cod_prod SMALLINT, cantidad DECIMAL(12,2) END RECORD, factor,cantidad_f DECIMAL(8,5), cantidad_i DECIMAL(12,3) display datos.cod_tipo," ",datos.cod_sec," ",mes2," ",p_ano1 at 19,1 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 = datos.cod_n and a.cod_grupo = datos.cod_grupo and a.cod_tipo = datos.cod_tipo and a.cod_sec = datos.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