Files
MBS/PROYECTOS/irdir/irprrp003.4gl
T

313 lines
11 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : IRPRRP003
OBJETIVO : REPORTE DE MOVIMIENTOS APARTIR DE UN RANGO DE FECHA.
EL REPORTE SE PUEDE LISTAR TANTO PARA UN CODIGO COMO
PARA UN RANGO DE CODIGO O TODOS LOS CODIGOS
PROGRAMADOR : Ing. Juan Fco. Soto
FECHA REALIZACION : Marzo 1, 1993.
-------------------------------------------------------------------------------
}
GLOBALS "irprgb000.4gl"
MAIN
DEFER INTERRUPT
CALL STARTLOG("irprrp03.log")
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL ARG_VAL(3) RETURNING impresor
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL irprrp03()
END MAIN
FUNCTION irprrp03()
# Estas variables son tando de control de indice de busqueda como de control de
# cambio de codigo y termino de loops
DEFINE idx_b SMALLINT
DEFINE cambio,salir,salir1 CHAR(1)
# Variable que contiene los movimientos del rango para cada codigo
DEFINE transacc RECORD
cod_n LIKE irtb00006.cod_n,
cod_grupo LIKE irtb00006.cod_grupo,
cod_tipo LIKE irtb00006.cod_tipo,
cod_sec LIKE irtb00006.cod_sec,
descrip_esp LIKE intb00001.descrip_esp,
unidad_med LIKE intb00001.unidad_med,
num_doc LIKE irtb00006.num_doc,
fecha CHAR(10),
cantidad_2 LIKE irtb00006.cantidad_2,
cod_mov LIKE irtb00006.cod_mov,
descrip_mov LIKE irtb00005.descrip_mov,
codigo CHAR(7),
balance_in DECIMAL(12,2)
END RECORD
# Variable control de validacion de cambio de codigo
DEFINE codigo_ant RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT
END RECORD
# Variable para los balances iniciales de todos los codigos
DEFINE balances RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
balance LIKE irtb00006.cantidad_2
END RECORD
# Variable para el select de los balances iniciales
DEFINE select_balan CHAR(1000)
# WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 9,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM irfmrp03 FROM "irfmrp003"
DISPLAY FORM irfmrp03
# Rutina para mensaje de papel en la pantalla
LET tipo_papel = 1
CALL msgrp000(tipo_papel)
LET int_flag = false
# Captura de rango de fecha
INPUT BY NAME datos_cons.fech_in,datos_cons.fech_fi
# Control interrupcion del programa
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
CLEAR SCREEN
RETURN
END IF
# Control para imprimir los movimientos pertenecientes a un codigo o
# movimientos para varios codigos
CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec
FROM cod_n,cod_grupo,cod_tipo,cod_sec
# Concatenacion para la configuracion del select de busqueda de los balances
# Iniciales
LET selec =
"SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,b.descrip_esp,b.unidad_med, ",
" a.num_doc,CONVERT(CHAR(10),a.fecha,103),a.cantidad_2,a.cod_mov,c.descrip_mov,'1' ",
"FROM irtb00006 a, irtb00002 b, irtb00005 c ",
"WHERE ",criterio clipped," AND 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 c.cod_mov=a.cod_mov ",
"AND b.status_t is NULL AND CONVERT(CHAR(10),a.fecha,103) between '", datos_cons.fech_in USING 'dd/mm/yyyy', "' and '",datos_cons.fech_fi USING 'dd/mm/yyyy', "' AND a.status_t IS NULL ",
"ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.fecha"
# Abrir el archivo del spool para la impresion
DISPLAY "<< Estoy Buscando los Movimientos >>"
AT 17,14 ATTRIBUTE (REVERSE,BOLD)
DISPLAY selec
PREPARE busca FROM selec
DECLARE accion CURSOR FOR busca
OPEN accion
LET selec1 =
"SELECT COUNT(*) FROM irtb00006 a, irtb00002 b, irtb00005 c ",
"WHERE ",criterio clipped," AND 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 c.cod_mov=a.cod_mov ",
"AND b.status_t is NULL AND a.fecha between '", datos_cons.fech_in USING 'mm/dd/yyyy', "' and '",datos_cons.fech_fi USING 'mm/dd/yyyy', "' AND a.status_t IS NULL "
PREPARE comando1 FROM selec1
DECLARE busca1 CURSOR FOR comando1
OPEN busca1
FETCH busca1 INTO regi
LET p_param = "S"
{ CALL defecto(usuarios,clave,impresor) RETURNING imprime,negrilla_on,negrillas_of,
doble_on,doble_off,comp_on,comp_off,
doce,normal,archivo,copia
}
CALL seleccionarsalida() RETURNING r_output
CALL configureoutput(r_output) RETURNING HANDLER
START REPORT reporte3 TO XML HANDLER handler
DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>"
AT 17,14 ATTRIBUTE (REVERSE,BOLD)
# Loop para la busqueda de los movimientos de los codigos especificados
FOREACH accion INTO transacc.*
CALL termometro(regi,p_param)
LET p_param = "N"
LET transacc.codigo = transacc.cod_n USING "&",
transacc.cod_grupo USING "&",
transacc.cod_tipo USING "&&",
transacc.cod_sec USING "&&&"
LET transacc.balance_in = 0
IF transacc.balance_in IS NULL THEN
LET transacc.balance_in = 0
END IF
DISPLAY "ESTOY ENVIANDO "
OUTPUT TO REPORT reporte3(transacc.*)
END FOREACH
FINISH REPORT reporte3
#RUN imprime
END FUNCTION
# Rutina generadora del reporte
REPORT reporte3(x)
# Record para validacion de los valores de la funcion matriz
DEFINE x RECORD
cod_n LIKE irtb00006.cod_n,
cod_grupo LIKE irtb00006.cod_grupo,
cod_tipo LIKE irtb00006.cod_tipo,
cod_sec LIKE irtb00006.cod_sec,
descrip_esp LIKE intb00001.descrip_esp,
unidad_med LIKE intb00001.unidad_med,
num_doc LIKE irtb00006.num_doc,
fecha CHAR(10),
cantidad_2 LIKE irtb00006.cantidad_2,
cod_mov LIKE irtb00006.cod_mov,
descrip_mov LIKE irtb00005.descrip_mov,
codigo CHAR(7),
balance_in DECIMAL(12,2)
END RECORD
# Variables para control de nombre y caracteres ASCII
DEFINE doble_on CHAR(2),
doble_off CHAR(2),
negrillas_on CHAR(2),
negrillas_off CHAR(2),
comprimido_on CHAR(2),
comprimido_off,doce CHAR(3),
hora CHAR(5),
# Calculo para el reporte
canti DECIMAL(12,2),
entrada,salida DECIMAL(12,2)
OUTPUT
LEFT MARGIN 0
ORDER BY x.codigo
FORMAT
PAGE HEADER
# Validacion de los caracteres ASCII
{ LET doble_on = ASCII 14
LET doble_off = ASCII 20
LET negrillas_on = ASCII 27, ASCII 69
LET negrillas_off = ASCII 27, ASCII 70
LET comprimido_on = ASCII 15
LET comprimido_off = ASCII 18
LET doce = ASCII 27, ASCII 77}
LET hora = time
# Impresion del encabezado de la compania y demas letreros
PRINT COLUMN 1, ASCII 27,ASCII 80
PRINT COLUMN 1, "irprrp003",
COLUMN 17, p_companias.nombre,
COLUMN 75, "Pag. ",pageno using "###"
PRINT COLUMN 17, " Sistema de Inventario de Repuestos ",
COLUMN 75, today using "dd/mm/yyyy"
PRINT COLUMN 17, " Movimientos de Repuestos ",
COLUMN 78, hora
SKIP 2 LINES
#--------------------------------------------------------------------------
# Encabezados de detalles
PRINT COLUMN 1, "Desde ",datos_cons.fech_in using "dd/mm/yyyy",
COLUMN 18, "Hasta ",datos_cons.fech_fi using "dd/mm/yyyy"
PRINT doce,comprimido_on
PRINT COLUMN 1, "--------------------------------------------------",
"--------------------------------------------------",
"--------------------------------------------------",
"---------------"
PRINT COLUMN 124, "C a n t i d a d"
PRINT COLUMN 1, "Codigo ",
COLUMN 15, "Descripcion",
COLUMN 45, "Unidad",
COLUMN 52, "Documento",
COLUMN 63, "fecha",
COLUMN 74, "Movimiento",
COLUMN 121, "Entrada",
COLUMN 136, "Salida",
COLUMN 159, "Balance"
PRINT COLUMN 1, "--------------------------------------------------",
"--------------------------------------------------",
"--------------------------------------------------",
"---------------"
# Control para la impresion del codigo del repuesto una sola vez
BEFORE GROUP OF x.codigo
SKIP 1 LINE
LET x.balance_in = 0
LET canti = 0
SELECT SUM(a.cantidad_2) INTO x.balance_in FROM irtb00006 a
WHERE a.status_t IS NULL 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 a.fecha < datos_cons.fech_in
IF x.balance_in is null THEN
LET x.balance_in = 0
END IF
PRINT COLUMN 1, x.cod_n USING "&","-",
COLUMN 3, x.cod_grupo USING "&","-",
COLUMN 5, x.cod_tipo USING "&&","-",
COLUMN 8, x.cod_sec USING "&&&",
COLUMN 15, x.descrip_esp,
COLUMN 45, x.unidad_med,
COLUMN 132, "Inicial ---> ",
x.balance_in using "---,---,---.##"
LET canti = x.balance_in
# Impresion de los movimientos con sus respctivas descripcion y
# cantidades afectadas
ON EVERY ROW
# Control para impresion del balance inicial una sola vez
# IF primera = "S" THEN
#----------------------------------------------------------------------------
LET canti = canti + x.cantidad_2
IF x.cantidad_2 > 0 THEN
LET salida = null
LET entrada = x.cantidad_2
ELSE
LET entrada = null
LET salida = x.cantidad_2
END IF
PRINT COLUMN 53, x.num_doc USING "&&&&&&",
COLUMN 63, x.fecha ,
COLUMN 74, x.descrip_mov,
COLUMN 111, entrada USING "---,---,---.##",
COLUMN 127, salida USING "---,---,---.##",
COLUMN 152, canti using "---,---,---.##"
ON LAST ROW
PRINT comprimido_off
END REPORT