Files
MBS/PROYECTOS/ipdir/ipprrp013.4gl
T

503 lines
17 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : INPRRP013
OBJETIVO : REPORTE DIAS DE INVENTARIOS
PROGRAMADOR : Ing. Juan Francisco Soto
FECHA REALIZACION : Agosto 19, 1992
MODIFICADO POR : Ing. Juan Fco. Soto
FECHA ULT. MODIFICA : Julio 19, 1993.
DESCRIPCION : Agregar Columna Costo Standard para cantidades mayores a
una cantidad de dias especificada.
-------------------------------------------------------------------------------
}
GLOBALS "ipprgb000.4gl"
DEFINE sale CHAR(1)
DEFINE p_ano CHAR(4)
DEFINE fecha2 DATE
DEFINE dias1 SMALLINT,
m_meses SMALLINT,
conmes,valor1 DECIMAL(12,2)
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL ipprrp013()
END MAIN
FUNCTION ipprrp013()
# Variable que toma el valor de los dias que se va a valorar el reporte
DEFINE c_dias INTEGER
# Variables varias para el control de busqueda de las informaciones
DEFINE selec1,select_bal string
# Record para el consumo de los materiales
DEFINE consume RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
existe DECIMAL(14,2)
END RECORD
# Record para la impresion del reporte, estas variables se validan con el
# select que esta en la variable selec
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 iptb00002.unidad_med,
consumo LIKE iptb00006.cantidad_2,
grupo CHAR(30),
tipo CHAR(30),
categoria CHAR(30),
fecha date,
existe DEC(12,4),
valor DECIMAL(12,4),
costo DECIMAL(12,4),
dias INTEGER,
pcodigo char(25),
cantidad_orden,pcantidadConduce,transito,existencia,reservado,disponible DEC(12,2)
END RECORD
DEFINE handler om.SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings()
r_filename STRING, -- filename of Report Design Document including .4rp extension
r_output STRING, -- output format option
preview INTEGER -- TRUE/FALSE, to set preview option
# WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM ipfmrp013 FROM "ipfmrp013"
DISPLAY FORM ipfmrp013
#CALL pantalla()
DISPLAY "ipprrp013" AT 4,3 ATTRIBUTE(RED)
DISPLAY "Dias de Inventarios" AT 6,33 ATTRIBUTE(BLACK)
LET tipo_papel = 2
CALL msgrp000(tipo_papel)
INPUT BY NAME fecha1,fecha2,c_dias,m_meses
AFTER FIELD c_dias
IF c_dias is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD c_dias
END IF
AFTER FIELD fecha1
IF fecha1 IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fecha1
END IF
AFTER FIELD fecha2
IF fecha2 IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fecha2
END IF
AFTER FIELD m_meses
IF m_meses IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD m_meses
END IF
END INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
LET dias1 = fecha2 - fecha1
LET dias1 = dias1 + 1
DISPLAY BY NAME dias1
SELECT MAX(a.ano) INTO p_ano
FROM prdtable a
WHERE a.fecha_corte <= fecha2
#LET p_ano = "2001"
#LET p_ano1 = "2002"
#LET p_ano = year(fecha2)
CONSTRUCT criterio ON x.cod_categoria,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec
FROM cod_cat,cod_n,cod_grupo,cod_tipo,cod_sec
BEFORE CONSTRUCT
CALL categorias()
AFTER CONSTRUCT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
EXIT CONSTRUCT
END CONSTRUCT
DELETE FROM tmpipprrp013
# CREACION TABLA TEMPORAL
LET select_bal =
{ "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.descrip_esp,a.unidad_med,SUM(b.cantidad_2),",
"d.descripcion,f.descripcion ",
"FROM ",
"iptb00034 x INNER JOIN
iptb00035 x1 ON x.cod_categoria = x1.cod_cat RIGHT OUTER JOIN",
" iptb00002 a LEFT OUTER JOIN iptb00006 b ON 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.cod_mov in (30,31,55,56,40) ",
" AND CONVERT(DATE,b.fecha,103) between ? AND ? ",
",iptb00029 d,iptb00024 f",
" WHERE ",
criterio CLIPPED,
" AND a.cod_grupo = d.cod_grupo and",
" a.cod_tipo = f.cod_tipo and",
" b.status_t IS NULL AND ",
" a.status_t is null ",
" GROUP BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.descrip_esp,",
" f.descripcion,d.descripcion,a.unidad_med ",
"ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec"
106-1818
}
" SELECT a.cod_n, a.cod_grupo, a.cod_tipo, a.cod_sec, a.descrip_esp, a.unidad_med, ISNULL(SUM(b.cantidad_2),0), d.descripcion, f.descripcion,x.descripcion
FROM iptb00034 x INNER JOIN
iptb00035 x1 ON x.cod_categoria = x1.cod_cat RIGHT OUTER JOIN
iptb00002 AS a LEFT OUTER JOIN
iptb00006 AS b ON 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.cod_mov IN (30, 31, 55, 56, 40) AND b.fecha BETWEEN
? AND ? INNER JOIN
iptb00029 AS d ON a.cod_grupo = d.cod_grupo INNER JOIN
iptb00024 AS f ON a.cod_tipo = f.cod_tipo ON x1.cod_n = a.cod_n
WHERE ", criterio CLIPPED, " and (b.status_t IS NULL) AND (a.status_t IS NULL)
GROUP BY a.cod_n, a.cod_grupo, a.cod_tipo, a.cod_sec, a.descrip_esp, f.descripcion, d.descripcion, a.unidad_med,x.descripcion
ORDER BY a.cod_n, a.cod_grupo, a.cod_tipo, a.cod_sec"
PREPARE comando2 FROM select_bal
DECLARE accion CURSOR FOR comando2
OPEN accion USING fecha1,fecha2
# Busqueda de los costos de los materiales
LET selec1 =
"SELECT max(a.mes_ini),max(a.mes_fin),a.cod_n,a.cod_grupo,a.cod_tipo,",
" a.cod_sec,SUM(a.material+a.labor+a.gastos) ",
"FROM ",
" iptb00034 x INNER JOIN iptb00035 x1 ON x.cod_categoria = x1.cod_cat RIGHT OUTER JOIN ",
"iptb00004 a ON a.cod_n = x1.cod_n ",
"WHERE ",
" a.ano = ? AND ", criterio CLIPPED,
"GROUP BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec"
DISPLAY "<< Estoy Buscando Costos... Espere >>"
AT 19,14 ATTRIBUTE (REVERSE,BOLD)
PREPARE comando FROM selec1
DECLARE busca3 SCROLL CURSOR FOR comando
OPEN busca3 USING p_ano
{
LET select_bal =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,ISNULL(sum(a.cantidad_2),0) ",
"FROM ",
" iptb00034 x LEFT OUTER JOIN iptb00035 x1 ON x.cod_categoria = x1.cod_cat RIGHT OUTER JOIN ",
"iptb00006 a ON a.cod_n = x1.cod_n WHERE ",
" a.status_t is null and a.fecha <= ? AND ",criterio CLIPPED,
" GROUP BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec"
DISPLAY "<< Estoy Buscando Balances Iniciales >>"
AT 19,14 ATTRIBUTE (REVERSE,BOLD)
PREPARE busca_balan FROM select_bal
DECLARE consu SCROLL CURSOR FOR busca_balan
OPEN consu USING fecha2
}
LET r_filename = "ipprrp013.4rp"
LET idx = 1
FOREACH accion INTO estadis.*
LET estadis.pcodigo = estadis.cod_n USING "&&&&","-",
estadis.cod_grupo using "&&&&","-",
estadis.cod_tipo using "&&&&","-",
estadis.cod_sec using "&&&&&&"
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
LET estadis.consumo = 0
LET estadis.existe = 0
# Busca el consumo de los materiales
LET sale = "N"
RETURN
END IF
IF idx =1 THEN
iF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
CALL seleccionarSalida() RETURNING r_output
LET preview=1
CALL fgl_report_selectDevice(r_output) -- changing default
CALL fgl_report_selectPreview(preview) -- changing default
LET handler = fgl_report_commitCurrentSettings() -- commit changes
ELSE
EXIT PROGRAM
END IF
--run the report
IF handler IS NOT NULL THEN -- report engine was configured ok
START REPORT estadistica TO XML HANDLER HANDLER
ELSE
EXIT FOREACH
END IF
END IF
{LET sale = "N"
WHILE sale != "S"
FETCH consu INTO consume.*
IF status = notfound THEN
LET sale = "S"
LET STATUS = 0
EXIT WHILE
END IF
IF consume.cod_n = estadis.cod_n AND
consume.cod_grupo = estadis.cod_grupo AND
consume.cod_Tipo = estadis.cod_tipo AND
consume.cod_sec = estadis.cod_sec THEN
LET estadis.existe = consume.existe
LET sale = "S"
EXIT WHILE
END IF
END WHILE
}
# Busqueda del costo del material
# Se multiplica por -1 por que el movimiento 36 es negativo
IF estadis.consumo < 0 THEN
LET estadis.consumo = estadis.consumo * -1
END IF
CALL disponibles(estadis.cod_n,estadis.cod_grupo,estadis.cod_tipo,estadis.cod_sec,fecha2)
RETURNING estadis.cantidad_orden,estadis.pcantidadConduce,estadis.transito,estadis.existencia,estadis.reservado,
valororden
LET estadis.existe = estadis.existencia
# Calculo para los dias de produccion
IF estadis.existe > 0 THEN
LET estadis.cantidad_orden = estadis.cantidad_orden - estadis.pcantidadConduce
LET estadis.disponible=estadis.existe -estadis.cantidad_orden - estadis.reservado
LET estadis.dias = (estadis.existe / estadis.consumo) * dias1
ELSE
LET estadis.dias =0
END IF
IF estadis.disponible <= 0 THEN
CONTINUE FOREACH
END IF
IF estadis.dias < 0 THEN
LET estadis.dias = 0
END IF
# Calculo para el exedente de la existencia apartir de los dias de exeso
# especificado
LET estadis.valor = 0
IF estadis.dias >= c_dias THEN
IF estadis.dias > 0 THEN
LET valor1 = (estadis.existe * c_dias)/estadis.dias
LET estadis.valor = (estadis.existe - valor1) * estadis.costo
ELSE
LET estadis.valor = 0
END IF
END IF
# Costo STD
LET estadis.costo=0
SELECT AVG(a.material+a.labor+a.gastos) INTO estadis.costo FROM iptb00004 a
WHERE a.ano = YEAR(TODAY) AND a.mes_fin = 12
AND a.cod_n = estadis.cod_n AND a.cod_grupo = estadis.cod_grupo AND a.cod_tipo = estadis.cod_tipo AND
a.cod_sec = estadis.cod_sec
AND a.status_t IS NULL
DISPLAY "DATA DESPUES ",estadis.existe
IF estadis.existe > 0 THEN
OUTPUT TO REPORT estadistica(estadis.*,dias1,c_dias)
END IF
LET idx = idx +1
LET estadis.consumo = 0
LET estadis.existe = 0
END FOREACH
IF idx = 1 THEN
CALL fgl_winmessage("INFO","NO EXISTEN INFORMACIONES CON ESTOS PARAMETROS","INFO")
ELSE
FINISH REPORT estadistica
END IF
#RUN imprime
CLEAR SCREEN
END FUNCTION
REPORT estadistica(x,dias2,c_dias)
DEFINE x 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 iptb00002.unidad_med,
consumo LIKE iptb00006.cantidad_1,
grupo CHAR(30),
tipo CHAR(30),
categoria CHAR(30),
fecha date,
existe DEC(12,4),
valor DECIMAL(12,3),
costo DECIMAL(12,4),
dias INTEGER,
pcodigo char(25),
cantidad_orden,pcantidadConduce,transito,existencia,reservado,disponible DEC(12,2)
END RECORD,
cantidad_rec,cantidad_or,tcantidad DEC(12,4),
fecha_v,fecha_oc DATE
DEFINE c_dias SMALLINT,
dias_oc INTEGER
DEFINE m_total DECIMAL(10,2)
DEFINE dias2 SMALLINT
DEFINE hora CHAR(5)
DEFINE t_total,t_valor DECIMAL(12,2),
chorden STRING,
porden INTEGER,
fecha DATE,
pcosto dec(12,4),
total_registros smallint,
total_grupo smallint,
nombre CHAR(50),
xsuplidor VARCHAR(100)
FORMAT
FIRST PAGE HEADER
LET hora = time
LET fecha = today
LET total_registros = 0
LET tcantidad = 0
LET fecha_v = NULL
LET fecha_oc = NULL
BEFORE GROUP OF x.cod_grupo
let total_grupo = 0
BEFORE GROUP OF x.cod_tipo
LET hora = time
SELECT a.* INTO p_companias.* FROM companias a WHERE a.cod_comp = 1
LET lj = (120 - LENGTH(p_companias.nombre CLIPPED))/2
ON EVERY ROW
LET total_registros = total_registros +1
LET total_grupo = total_grupo +1
LET nombre_ant = nombre
# BUSCA ULTIMA FECHA DE COMPRA Y VENTA DEL PRODUCTO
LET fecha_v = NULL
SELECT convert(char(10),MAX(a.fecha_factura),103) INTO fecha_v
FROM vetb00003 d,vetb00002 a
WHERE d.factura = a.factura AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND
a.status_t is NULL
LET fecha_oc = NULL
SELECT ISNULL(convert(char(10),MAX(a.fech_oc),103)," ") INTO fecha_oc
FROM cotb00015 d,cotb00014 a
WHERE d.num_oc = a.num_oc AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND
d.status_t is NULL
LET tcantidad =0
SELECT SUM(d.cantidad) INTO tcantidad
FROM cotb00015 d,cotb00014 a
WHERE d.num_oc = a.num_oc AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND
a.fech_oc = fecha_oc AND
d.status_t is NULL
LET xsuplidor =null
SELECT MAX(c.nom_sp) INTO xsuplidor
FROM cotb00015 d,cotb00014 a,cotb00001 c
WHERE d.num_oc = a.num_oc AND
d.cod_n=x.cod_n AND d.cod_grupo=x.cod_grupo AND
d.cod_tipo = x.cod_tipo AND d.cod_sec = x.cod_sec AND
a.fech_oc = fecha_oc AND
a.cod_sp = c.cod_sp AND
a.cod_sp_sec = c.cod_sp_sec AND
d.status_t is NULL
LET conmes = 0
IF t_total IS NULL THEN
LET t_total = 0
END IF
IF t_valor is null THEN
LET t_valor = 0
END IF
{ COLOQUE LA BUSQUEDA DE LA ORDEN PARA SUSTITUIR EL QUERY POR LA ULTIMA CANTIDAD COMPRADA
DECLARE busca_oc CURSOR FOR
SELECT a.num_oc,a.cantidad FROM cotb00015 a, cotb00014 b
WHERE a.num_oc = b.num_oc AND
a.cod_n = x.cod_n AND
a.cod_grupo = x.cod_grupo AND
a.cod_tipo = x.cod_tipo AND
a.cod_sec = x.cod_sec AND
b.cierre = "N" AND
b.status_T IS NULL
LET chorden = NULL
LET tcantidad = 0
FOREACH busca_oc INTO porden,cantidad_rec
IF cantidad_rec IS NULL THEN
LET cantidad_rec = 0
END IF
LET tcantidad = tcantidad + cantidad_Rec
LET chorden = porden using "<<<<<<",", ",chorden CLIPPED
END FOREACH
}
LET m_total = x.existe * x.costo
LET cantidad_or = tcantidad + x.existe
IF x.consumo > 0 THEN
LET dias_oc = (cantidad_or/x.consumo) * dias1
END IF
LET conmes = x.consumo / m_meses
PRINTX x.*,fecha,hora,fecha1,fecha2,fecha_oc,chorden,tcantidad,
p_companias.*,pcosto,total_registros,total_grupo,fecha_v
INSERT INTO tmpipprrp013 VALUES (fecha1,fecha2,x.categoria,xsuplidor,x.grupo,x.pcodigo,x.descrip_esp,x.existe,x.disponible,x.cantidad_orden,
x.dias,x.consumo,fecha_oc,x.costo,fecha_v)
END REPORT