{ ------------------------------------------------------------------------------- PROGRAMA : CTPRRP029 OBJETIVO : Historial de precios reales Producto Terminado PROGRAMADOR : Tadeo A. Ferreras FECHA : Julio 18, 1995. ------------------------------------------------------------------------------- } GLOBALS "ctprgb000.4gl" ###### Definicion de variables a usar en la generacion del reporte ###### DEFINE p_porciento,porciento DECIMAL(8,3) DEFINE selec6,selec5,selec2,selec1 CHAR(1000) DEFINE impresion,ventas CHAR(1) DEFINE anos CHAR(4) DEFINE labor,t_cantidad DECIMAL(12,3) DEFINE ano2,ano1,mes1,mes3,idx_1,idx_2 INTEGER DEFINE salir,salir1,salir2 CHAR(1) DEFINE fecha1,fecha2,fecha3,fecha4 DATE DEFINE codgp SMALLINT DEFINE tmes INTEGER FUNCTION ctprrp029() DEFINE histo1 RECORD ventas CHAR(1), mes2 SMALLINT, nomenclatura LIKE iptb00002.nomenclatura, costo_lq DECIMAL(12,4) END RECORD DEFINE histo RECORD ventas CHAR(1), mes2 SMALLINT, nomenclatura LIKE iptb00002.nomenclatura, costo_lq DECIMAL(12,4) END RECORD OPTIONS ERROR LINE 24, FORM LINE 8 ######## Abriendo el formulario para digitar criterio de busqueda #### OPEN FORM ctfmrp029 FROM "ctfmrp029" DISPLAY FORM ctfmrp029 CALL pantalla() DISPLAY "ctprrp029" AT 4,3 DISPLAY "Historial de Costos Reales Productos Terminados" AT 6,16 LET tipo_papel = 1 CALL msgrp000(tipo_papel) ##### Captura de informacion para criterio de busqueda ####### CONSTRUCT criterio ON a.cod_n,a.ventas FROM cod_n,ventas IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF INPUT BY NAME ano1,mes1,p_porciento,impresion AFTER FIELD impresion IF impresion = "S" THEN IF mes1 < 3 THEN LET numero_msg = 359 CALL msg(numero_msg) LET impresion = "N" END IF END IF 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 IF mes1 > 12 THEN LET numero_msg = 51 CALL msg(numero_msg) NEXT FIELD mes1 END IF SELECT fecha_inicio INTO fecha1 FROM prdtable WHERE ano = ano1 AND mes = 1 SELECT fecha_corte INTO fecha2 FROM prdtable WHERE ano = ano1 AND mes = mes1 LET p_fechas = fecha2 using "ddmmyy" { CALL prd() IF bandera = 1 THEN LET bandera = 0 NEXT FIELD mes1 END IF } AFTER FIELD p_porciento IF p_porciento IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD p_porciento END IF AFTER INPUT LET p_fechas = fecha2 using "ddmmyy" { CALL prd() IF bandera = 1 THEN LET bandera = 0 NEXT FIELD mes1 END IF } END INPUT ###### Facicilidad para cancelar el reporte (OPcional) ############ IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF ###### Selecionando informacion a imprimir ############ DELETE FROM cttb00002 WHERE ano = ano1 DELETE FROM cttb00002 WHERE ano = ano1-1 LET selec5 = "SELECT a.ventas,c.mes,b.nomenclatura,AVG(a.costo_lq) ", "FROM cttb00036 a,iptb00002 b,prdtable c ", "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 a.fecha_lq BETWEEN c.fecha_inicio AND ", " c.fecha_corte < ? AND c.ano = ? AND c.mes <= ? AND ", criterio CLIPPED," GROUP BY 1,2,3" DISPLAY "<< Buscando Informacion ... Espere Por Favor. >>" AT 19,14 ATTRIBUTE (REVERSE,BOLD) PREPARE comando4 FROM selec5 DECLARE busca4 CURSOR FOR comando4 OPEN busca4 USING fecha2,ano1,mes1 LET selec6 = "SELECT a.ventas,c.mes,b.nomenclatura,AVG(a.costo_lq) ", "FROM cttb00036 a,iptb00002 b,prdtable c ", "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 a.fecha_lq BETWEEN c.fecha_inicio AND ", " c.ano = ?-1 AND c.mes <= 12 AND ", criterio CLIPPED," GROUP BY 1,2,3" PREPARE comando6 FROM selec6 DECLARE busca6 CURSOR FOR comando6 OPEN busca6 USING ano1 START REPORT histori_pt TO "C:\\archivo" DISPLAY "<< >>" AT 19,14 DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" AT 19,14 ATTRIBUTE(REVERSE) ##### Creando el loop de busqueda ########### WHILE status != NOTFOUND FETCH busca4 INTO histo.* IF status = notfound THEN EXIT WHILE END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF OUTPUT TO REPORT histori_pt(histo.*) END WHILE LET STATUS = 0 # Busqueda para el ano anterior WHILE status != NOTFOUND FETCH busca6 INTO histo1.* IF status = notfound THEN EXIT WHILE END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF LET ano2 = ano1 -1 display ano2,histo.* at 18,1 INSERT INTO cttb00002 (ano,venta,mes,nomenclatura,costo, us_crea,fech_crea) VALUES (ano2,histo1.*,user,current) END WHILE FINISH REPORT histori_pt # Impresion de los trimestres LET STATUS = 0 LET impresion = UPSHIFT(impresion) IF impresion = "S" THEN LET selec5 = "SELECT a.ventas,c.mes,b.nomenclatura,AVG(a.costo_lq) ", "FROM cttb00036 a,iptb00002 b,prdtable c ", "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 a.fecha_lq BETWEEN c.fecha_inicio AND ", " c.fecha_corte AND c.ano = ? AND c.mes <= ? AND ", criterio CLIPPED," GROUP BY 1,2,3", " ORDER BY 1,3,2" DISPLAY "<< Buscando Informacion ... Espere Por Favor. >>" AT 19,14 ATTRIBUTE (REVERSE,BOLD) PREPARE comando5 FROM selec5 DECLARE busca5 CURSOR FOR comando5 OPEN busca5 USING ano1,mes1 # Borra tabla temporal que contiene los costos por nomenclatura START REPORT trimestre TO PIPE "lp -dcentral" WHILE status != NOTFOUND FETCH busca5 INTO histo.* IF status = notfound THEN EXIT WHILE END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF # Inserta los costos para los trimestres INSERT INTO cttb00002 (ano,venta,mes,nomenclatura,costo, us_crea,fech_crea) VALUES (ano1,histo.*,user,current) OUTPUT TO REPORT trimestre(histo.*) END WHILE FINISH REPORT trimestre END IF RUN "type C:\\archivo > %USPRINT%" END FUNCTION ####### Creando el formato para la salida de informacion ######### REPORT histori_pt(x) DEFINE x RECORD ventas CHAR(1), mes2 INTEGER, nomenclatura LIKE iptb00002.nomenclatura, costo_lq DECIMAL(12,4) END RECORD, converti CHAR(1) DEFINE promedio DECIMAL(8,3) DEFINE costo_st DECIMAL(12,4) #DEFINE mes ARRAY[7] OF SMALLINT DEFINE fecha3,fecha4,fecha5 DATE DEFINE i INTEGER DEFINE labor,gasto,labor1,gasto1 DECIMAL(12,2) DEFINE cantidad1 ARRAY[200] OF DECIMAL(12,3) DEFINE cantidad2 ARRAY[200] OF DECIMAL(12,3) DEFINE unidad,descrp1,nomb,nombre CHAR(15) DEFINE descr CHAR(20) DEFINE total,total2,total3,total4,total5,total6,total7,total8,total9 DECIMAL(13,8) DEFINE fact_hombre,cod_grupo,hora_hombre,valor_real,factor_conv DECIMAL(13,8) DEFINE total1 INTEGER DEFINE comp_on,normal,negrillas_on,negrillas_off CHAR(3) OUTPUT LEFT MARGIN 0 ORDER BY x.ventas,x.nomenclatura,x.mes2 FORMAT PAGE HEADER LET comp_on = ASCII 15 LET normal = ASCII 27,ASCII 80 LET negrillas_on = ASCII 27, ASCII 69 LET negrillas_off = ASCII 27, ASCII 70 LET l = (200 - LENGTH(p_compania.nombre CLIPPED))/2 PRINT COLUMN 1, comp_on,negrillas_on PRINT COLUMN 1, "ctprrp029", COLUMN l, p_compania.nombre CLIPPED, COLUMN 206, "Pag. ",pageno using "###" LET l = (200 - LENGTH("Sistema de Costos"))/2 PRINT COLUMN l, "Sistema de Costos", COLUMN 206, today using "dd/mm/yy" LET l = (200 - LENGTH("Historial de Costos Reales Productos Terminados"))/2 PRINT COLUMN l, "Historial de Costos Reales Productos Terminados", COLUMN 206, time PRINT COLUMN 94, "DEl ",fecha1 USING "dd/mm/yy", " Al ", fecha2 USING "dd/mm/yy" PRINT COLUMN 94, "Porcentaje Mayor a ",p_porciento using "###.##" PRINT negrillas_off PRINT COLUMN 1, "----------------------------------------------------------------------------", "----------------------------------------------------------------------------", "------------------------------------------------------------------" PRINT COLUMN 1, "Nomenclatura", COLUMN 30, "|", COLUMN 35, "Costo" PRINT COLUMN 35, "Standard"; LET i = 44 LET fecha5 = fecha1 ###### Loop para impresion en forma tabular ######## FOR idx = 1 to 12 LET mes3 = month(fecha5) PRINT COLUMN i," ",fecha5 USING "mmm/yy","|"; LET fecha5 = fecha5 + 31 LET i = i + 10 END FOR LET i = i + 5 + 6 PRINT COLUMN i-7, "Promedio", COLUMN i+3, "Variacion %" PRINT COLUMN 1, "----------------------------------------------------------------------------", "----------------------------------------------------------------------------", "------------------------------------------------------------------" BEFORE GROUP OF x.ventas IF x.ventas = 1 THEN PRINT COLUMN 1, "LOCALES" ELSE PRINT COLUMN 1, "EXPORTACION" END IF BEFORE GROUP OF x.nomenclatura LET costo_st = 0 LET promedio = 0 SELECT a.costo_st INTO costo_st FROM cttb00038 a WHERE a.nomenclatura matches x.nomenclatura and a.ventas = x.ventas and a.ano = ano1 IF STATUS = NOTFOUND THEN SELECT MAX(a.material+a.labor+a.gastos) INTO costo_st FROM iptb00004 a,iptb00002 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.ano = ano1 and a.status_t is null AND a.ventas = x.ventas AND b.nomenclatura=x.nomenclatura END IF IF costo_st IS NULL THEN LET costo_st = 0 END IF AFTER GROUP OF x.mes2 LET idx = x.mes2 LET cantidad1[idx] = 0 LET cantidad1[idx] = x.costo_lq IF cantidad1[idx] IS NULL THEN LET cantidad1[idx] = 0 END IF AFTER GROUP OF x.nomenclatura LET promedio = GROUP AVG(x.costo_lq) IF promedio > 0 THEN LET porciento = ((promedio - costo_st)/promedio)*100 ELSE LET porciento = 0 END IF IF porciento < 0 THEN LET porciento = porciento * -1 END IF IF porciento >= p_porciento THEN PRINT COLUMN 1, x.nomenclatura CLIPPED, COLUMN 30, "|", COLUMN 32, costo_st using "#,###.#####","|"; LET i = 44 FOR idx = 1 TO 12 IF cantidad1[idx] IS NULL THEN LET cantidad1[idx] = 0 END IF PRINT COLUMN i,cantidad1[idx] USING "#,##&.&&&", "|"; LET i = i + 9 LET cantidad1[idx] = 0 END FOR PRINT COLUMN i,promedio using "##,###.#####", COLUMN i+14,promedio - costo_st using "((,(((.####)", COLUMN i+26+2, porciento using "###.##" END IF AFTER GROUP OF x.ventas PRINT COLUMN 1, "============================================================================", "============================================================================", "==================================================================" ON LAST ROW PRINT COLUMN 1,negrillas_off,normal END REPORT REPORT trimestre(x) DEFINE x RECORD ventas CHAR(1), mes2 INTEGER, nomenclatura LIKE iptb00002.nomenclatura, costo_lq DECIMAL(12,4) END RECORD, prom_anterior,psuma,suma,p_costo_st DECIMAL(12,4), trimestre1,trimestre2,trimestre3,trimestre4, ppromedio,promedio DECIMAL(8,3), cuenta_p,cuenta_mes SMALLINT, nomen CHAR(10), mes2 SMALLINT DEFINE comp_on,normal,negrillas_on,negrillas_off CHAR(3) OUTPUT LEFT MARGIN 2 ORDER BY x.ventas,x.nomenclatura,x.mes2 FORMAT PAGE HEADER PRINT COLUMN 1, "ctprrp029", COLUMN 42, " R A Y . O . V A C D O M I N I C A N A, S. A.", COLUMN 120, "Pag. ",pageno using "###" PRINT COLUMN 42, " Sistema de Costos", COLUMN 120, today using "dd/mm/yy" PRINT COLUMN 42, " Historial de Costos Reales Por Trimestre ", COLUMN 120, time PRINT COLUMN 54, "DEl ",fecha1 USING "dd/mm/yy", " Al ", fecha2 USING "dd/mm/yy" SKIP 1 LINE PRINT COLUMN 15, "COSTO", COLUMN 90, "PROMEDIO", COLUMN 110, "PROMEDIO" PRINT COLUMN 15, "STANDARD", COLUMN 30,"1er TRIMESTRE", COLUMN 45, "2do TRIMESTRE", COLUMN 60, "3er TRIMESTRE", COLUMN 75, "4To. TRIMESTRE", COLUMN 90, YEAR(fecha2), COLUMN 110, YEAR(fecha2) - 1 PRINT COLUMN 15, "========", COLUMN 30,"=============", COLUMN 45, "=============", COLUMN 60, "=============", COLUMN 75, "==============", COLUMN 90, "==============", COLUMN 110, "==============" PRINT COLUMN 1, "Nomenclatura" SKIP 1 LINE BEFORE GROUP OF x.ventas IF x.ventas = 1 THEN PRINT COLUMN 1,"LOCALES" SKIP 1 LINE ELSE SKIP 1 LINE PRINT COLUMN 1,"EXPORTACION" SKIP 1 LINE END IF BEFORE GROUP OF x.nomenclatura LET trimestre1 = 0 LET trimestre2 = 0 LET trimestre3 = 0 LET trimestre4 = 0 LET nomen = x.nomenclatura clipped IF psuma IS NULL THEN LET psuma = 0 END IF IF cuenta_p IS NULL THEN LET cuenta_p = 0 END IF # Busca el promedio del ano anterior por nomenclatura SELECT AVG(a.costo) INTO prom_anterior FROM cttb00002 a WHERE a.ano = ano1-1 AND a.nomenclatura matches nomen and a.venta = x.ventas #--------------------------------------------------------------------------- SELECT AVG(a.costo) INTO trimestre1 FROM cttb00002 a WHERE a.ano = ano1 AND a.mes <= 3 AND a.nomenclatura matches nomen and a.venta = x.ventas IF trimestre1 IS NOT NULL THEN LET cuenta_p = cuenta_p + 1 LET psuma = psuma + trimestre1 END IF IF mes1 > 3 or mes1 <= 6 THEN LET mes2 = 6 IF mes1 < 6 THEN LET mes2 = mes1 END IF SELECT AVG(a.costo) INTO trimestre2 FROM cttb00002 a WHERE a.ano = ano1 AND a.mes between 4 and mes2 AND a.nomenclatura matches nomen and a.venta = x.ventas IF trimestre2 IS NOT NULL THEN LET cuenta_p = cuenta_p + 1 LET psuma = psuma + trimestre2 END IF END IF IF mes1 > 6 or mes1 <= 9 THEN LET mes2 = 9 IF mes1 < 9 THEN LET mes2 = mes1 END IF SELECT AVG(a.costo) INTO trimestre3 FROM cttb00002 a WHERE a.ano = ano1 AND a.mes between 7 and mes2 AND a.nomenclatura matches nomen and a.venta = x.ventas IF trimestre3 IS NOT NULL THEN LET cuenta_p = cuenta_p + 1 LET psuma = psuma + trimestre3 END IF END IF IF mes1 > 9 or mes1 <= 12 THEN LET mes2 = 12 IF mes1 < 12 THEN LET mes2 = mes1 END IF SELECT AVG(a.costo) INTO trimestre4 FROM cttb00002 a WHERE a.ano = ano1 AND a.mes between 10 and mes2 AND a.nomenclatura matches nomen and a.venta = x.ventas IF trimestre4 IS NOT NULL THEN LET cuenta_p = cuenta_p + 1 LET psuma = psuma + trimestre4 END IF END IF LET promedio = 0 LET suma = 0 LET cuenta_mes = 0 LET p_costo_st = 0 IF psuma is null THEN LET psuma = 0 END IF SELECT a.costo_st INTO p_costo_st FROM cttb00038 a WHERE a.nomenclatura matches x.nomenclatura and a.ventas = x.ventas and a.ano = ano1 IF p_costo_st IS NULL THEN LET p_costo_st = 0 END IF PRINT COLUMN 1, nomen, COLUMN 15, p_costo_st using "##.&&&"; AFTER GROUP OF x.nomenclatura IF psuma > 0 THEN LET ppromedio = psuma/cuenta_p END IF PRINT COLUMN 30, trimestre1 using "##.&&&", COLUMN 45, trimestre2 using "##.&&&", COLUMN 60, trimestre3 using "##.&&&", COLUMN 75, trimestre4 using "##.&&&", COLUMN 90, ppromedio using "##.&&&", COLUMN 110, prom_anterior using "##.&&&" LET psuma = 0 LET cuenta_p = 0 ON LAST ROW PRINT COLUMN 1,negrillas_off,normal END REPORT