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