Files
MBS/PROYECTO/ctdir/ctprrp029.4gl
T

626 lines
18 KiB
Plaintext

{
-------------------------------------------------------------------------------
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