{ ------------------------------------------------------------------------------- PROGRAMA : INPRRP034 OBJETIVO : Valorizacion de Inventario Metodo PEPS (Resumen y en Detalle) PROGRAMADOR : Tadeo A. Ferreras F. FECHA REALIZACION : Septiembre 20/ 1995 ------------------------------------------------------------------------------- } GLOBALS "inprgb000.4gl" DEFINE t_precio,valor,valor1,valor2,valor3,valor4,cantidad2,cantidad_t, cantidad1,total_valor,cant_total,cant_env,cant_env1 DECIMAL(20,4) DEFINE base1 DECIMAL(20,4) DEFINE fecha1,fecha2,fecha3,fecha4 DATE DEFINE s INTEGER DEFINE entrada ARRAY[4000] OF RECORD fecha DATE, cantidad DECIMAL(20,4), precio DECIMAL(20,4), senal CHAR(14) END RECORD DEFINE salida ARRAY[4000] OF RECORD fecha DATE, docu INTEGER, cantidad DECIMAL(20,4), marca CHAR(1) END RECORD ####### Definicion de variables a usar en el reporte ####### # Costo de la materia prima DEFINE reg_rep34 RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, fecha DATE, docu INTEGER, cantidad DECIMAL(20,4), descrip_esp CHAR(30), unidad_med CHAR(3), precio DECIMAL(20,4) END RECORD # Variables para asignarles los selects DEFINE selec8,selec9,selec4 CHAR(1000) # Bandera para utilizarla en los loops de busqueda DEFINE salir,salir1,salir2 CHAR(1) # Indices de busqueda de las informaciones DEFINE idx_1,idx_2,idx1,i,j,k INTEGER FUNCTION inprrp034() #WHENEVER ERROR CONTINUE OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 21 OPEN FORM infmrp034 FROM "infmrp034" DISPLAY FORM infmrp034 CALL pantalla() DISPLAY "inprrp034" AT 4,3 DISPLAY "Valorizacion de Inventario Metodo PEPS" AT 6,23 LET tipo_papel = 1 CALL msgrp000(tipo_papel) ########### Captura de valores para el criterio de busqueda ############ INPUT BY NAME fecha1,fecha2,decide AFTER FIELD fecha1 IF fecha1 IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha1 END IF IF fecha1 > TODAY THEN LET numero_msg = 189 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 IF fecha1 > TODAY THEN LET numero_msg = 189 CALL msg(numero_msg) NEXT FIELD fecha1 END IF IF fecha1 > fecha2 THEN LET numero_msg = 51 CALL msg(numero_msg) NEXT FIELD fecha1 END IF AFTER FIELD decide IF decide IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD decide END IF END INPUT ########### Facilidad para cancelar la variacioncon la tecla DELETE #### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF CONSTRUCT criterio ON a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec FROM cod_n,cod_grupo,cod_tipo,cod_sec IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF # Busqueda del inventario inicial de cada materia prima LET total_valor = 0 LET fecha3 = fecha1 LET selec4 = "SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,a.fecha,a.num_doc, ", " a.cantidad_2,b.descrip_esp,b.unidad_med ", "FROM intb00006 a, intb00001 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.fecha <= ?) AND (a.status_t IS NULL) AND ", criterio CLIPPED DISPLAY "<>" AT 17,14 ATTRIBUTE(REVERSE,BOLD) PREPARE comando4 FROM selec4 DECLARE stand SCROLL CURSOR FOR comando4 OPEN stand USING fecha2 START REPORT reporte_34 TO "C:\\archivo" DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>" AT 17,14 ATTRIBUTE (REVERSE) # Loop inicial de busqueda de las informaciones de la materia prima LET salir = "N" WHILE salir != "S" FETCH stand INTO reg_rep34.* IF STATUS = NOTFOUND THEN LET salir = "S" EXIT WHILE END IF IF int_flag THEN LET int_flag = FALSE LET numero_msg = 2 CALL msg(numero_msg) RETURN END IF IF reg_rep34.cantidad IS NULL THEN LET reg_rep34.cantidad = 0 END IF LET reg_rep34.precio = 0 IF reg_rep34.cantidad <= 0 AND reg_rep34.fecha <= fecha1 THEN LET reg_rep34.cantidad = 0 END IF IF reg_rep34.cantidad <> 0 THEN OUTPUT TO REPORT reporte_34(reg_rep34.*) END IF END WHILE FINISH REPORT reporte_34 CLEAR SCREEN RUN "type C:\\archivo > %USPRINT%" END FUNCTION # Rutina de Impresion de las informaciones REPORT reporte_34(x) # Variable para tomar las informaciones DEFINE x RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, fecha DATE, docu INTEGER, cantidad DECIMAL(20,4), descrip_esp CHAR(30), unidad_med CHAR(3), precio DECIMAL(20,4) END RECORD # Vaiables para la impresion de caracters ASCII DEFINE fech1,fech2 DATE, doble_on,doble_off,comp_on,comp_off,doce,normal CHAR(3), negrillas_on,negrillas_off CHAR(6), hora CHAR(5) OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 ORDER BY x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec,x.fecha 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 comp_on = ASCII 15 LET comp_off = ASCII 18 LET doce = ASCII 27, ASCII 77 LET normal = ASCII 27, ASCII 80 LET hora = time # Impresion de los encabezados LET lj = (117 - LENGTH(p_companias.nombre CLIPPED))/2 PRINT comp_on,negrillas_on PRINT COLUMN 1, "inprrp034", COLUMN lj, p_companias.nombre CLIPPED, COLUMN 110, "Pag. ",pageno using "###" PRINT COLUMN 35, " Sistema de Inventario de Materia Prima", COLUMN 110, today using "dd/mm/yyyy" PRINT COLUMN 35, " Valorizacion de Inventario Metodo PEPS", COLUMN 113, hora PRINT COLUMN 1,"Periodo: DEL ",fecha1 USING "dd/mm/yyyy", " AL ",fecha2 USING "dd/mm/yyyy"; IF decide = "D" THEN PRINT COLUMN 35, " Detallado " ELSE PRINT COLUMN 35, " Resumido " END IF PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------------------------", "-----------------" IF decide = "D" THEN PRINT COLUMN 21, "Entrada", COLUMN 31, "Fecha", COLUMN 45, "Precio", COLUMN 61, "Salida", COLUMN 69, "Fecha", COLUMN 79, "Docto.", COLUMN 96, "Balance", COLUMN 113, "Valor" ELSE PRINT COLUMN 1, "Material", COLUMN 96, "Balance", COLUMN 113, "Valor" END IF PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------------------------", "-----------------" PRINT negrillas_off BEFORE GROUP OF x.cod_sec ### Buscando inv. inicial LET t_precio = 0 LET cant_total = 0 SELECT SUM(a.cantidad_2) INTO cant_total FROM intb00006 a WHERE (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 <= fecha1) AND (a.status_t IS NULL) IF cant_total IS NULL THEN LET cant_total = 0 END IF LET base1 = 1 IF decide = "D" THEN PRINT COLUMN 1, negrillas_on PRINT COLUMN 1, "MATERIAL: ",x.cod_n USING "&","-", x.cod_grupo USING "&","-",x.cod_tipo USING "&&", "-",x.cod_sec USING "&&&"," ",x.descrip_esp," ", x.unidad_med, COLUMN 64, "Inventario Inicial ---> ",cant_total USING "###,###,###.##", negrillas_off END IF LET base1 = 1 LET t_precio = 0 LET idx = 0 LET idx1 = 0 ON EVERY ROW IF cant_total <= 0 AND x.fecha <= fecha1 THEN LET x.cantidad = 0 END IF IF x.cantidad > 0 THEN SELECT MAX(a.fecha) INTO fecha4 FROM cttb00013 a WHERE (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 <= x.fecha) AND (a.costo_lq > 0) AND (a.costo_lq IS NOT NULL) AND (a.status_t IS NULL) IF fecha4 IS NULL THEN LET fecha4 = x.fecha SELECT MIN(a.costo_lq) INTO x.precio FROM cttb00013 a WHERE (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.costo_lq IS NOT NULL) AND (a.costo_lq > 0) AND (a.status_t IS NULL) ELSE SELECT MIN(a.costo_lq) INTO x.precio FROM cttb00013 a WHERE (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.costo_lq IS NOT NULL) AND (a.costo_lq > 0) AND (a.fecha = fecha4) AND (a.status_t IS NULL) END IF IF x.precio IS NULL THEN LET x.precio = 0 END IF IF x.precio = 0 THEN LET x.precio = t_precio ELSE LET t_precio = x.precio END IF LET idx = idx + 1 IF x.fecha > fecha1 THEN LET entrada[idx].senal = " " LET entrada[idx].fecha = x.fecha LET entrada[idx].cantidad = x.cantidad LET entrada[idx].precio = x.precio ELSE IF cant_total > 0 THEN IF (cant_total - x.cantidad) > 0 THEN LET entrada[idx].senal = "*Inv. Inicial*" LET entrada[idx].fecha = x.fecha LET entrada[idx].cantidad = x.cantidad LET entrada[idx].precio = x.precio LET cant_total = cant_total - x.cantidad ELSE LET entrada[idx].senal = "*Inv. Inicial*" LET entrada[idx].fecha = x.fecha LET entrada[idx].cantidad = cant_total LET entrada[idx].precio = x.precio LET cant_total = 0 END IF END IF END IF END IF ### Buscando las salidas del rango de fecha IF x.cantidad < 0 AND x.fecha > fecha1 THEN LET idx1 = idx1 + 1 LET salida[idx1].fecha = x.fecha LET salida[idx1].docu = x.docu LET salida[idx1].cantidad = x.cantidad * -1 LET salida[idx1].marca = "a" END IF AFTER GROUP OF x.cod_sec LET t_precio = 0 LET balance = 0 LET fecha4 = fecha2 LET valor = 0 LET s = 0 FOR j = 1 TO idx IF entrada[j].cantidad > 0 THEN IF entrada[j].precio = 0 THEN LET entrada[j].precio = t_precio ELSE LET t_precio = entrada[j].precio END IF LET balance = balance + entrada[j].cantidad LET valor = valor + (entrada[j].cantidad * entrada[j].precio) IF valor IS NULL THEN LET valor = 0 END IF LET valor1= 0 IF decide = "D" THEN PRINT COLUMN 1, entrada[j].senal, COLUMN 16, entrada[j].cantidad USING "###,###,###.##", COLUMN 31, entrada[j].fecha USING "dd/mm/yyyy", COLUMN 41, entrada[j].precio USING "#,###,###.####"; END IF FOR k = 1 TO idx1 IF salida[k].marca = "a" THEN IF salida[k].cantidad IS NULL THEN LET salida[k].cantidad = 0 END IF IF cantidad2 IS NULL THEN LET cantidad2 = 0 END IF IF balance IS NULL THEN LET balance = 0 END IF IF (balance - salida[k].cantidad) < 0 THEN LET cantidad2 = balance LET salida[k].cantidad = salida[k].cantidad-cantidad2 ELSE LET cantidad2 = salida[k].cantidad LET salida[k].marca = "b" END IF LET valor2 = 0 LET fecha4 = salida[k].fecha ### Calculando la valorizacion del inventario LET balance = balance - cantidad2 LET valor = valor - (cantidad2 * entrada[j].precio) IF valor IS NULL THEN LET valor = 0 END IF IF balance = 0 THEN LET valor = 0 END IF LET valor1 = 11 IF decide = "D" THEN PRINT COLUMN 56, cantidad2 USING "###,###,###.##", COLUMN 71, salida[k].fecha USING "dd/mm/yyyy", COLUMN 80, salida[k].docu USING "&&&&&&&&", COLUMN 89, balance USING "###,###,###.##", COLUMN 104, valor USING "###,###,###.##" END IF IF balance <= 0 THEN EXIT FOR END IF END IF END FOR ## En caso de que no exista salida, sumariza las entradas IF decide = "D" THEN IF valor1 = 0 THEN PRINT COLUMN 89, balance USING "###,###,###.##", COLUMN 104, valor USING "###,###,###.##" END IF END IF END IF END FOR IF decide = "R" THEN LET cantidad1 = 0 LET valor1 = 0 LET j = idx LET idx = 0 FOR k = 1 TO j IF entrada[j-idx].cantidad IS NULL THEN LET entrada[j-idx].cantidad = 0 END IF IF entrada[j-idx].cantidad > 0 THEN IF cantidad1 < balance THEN IF (j-idx) = j THEN PRINT COLUMN 1,negrillas_on PRINT COLUMN 1,"MATERIAL: ",x.cod_n USING "&","-", x.cod_grupo USING "&","-", x.cod_tipo USING "&&","-", x.cod_sec USING "&&&"," ", x.descrip_esp," ",x.unidad_med, negrillas_off END IF IF (cantidad1+entrada[j-idx].cantidad) > balance THEN LET entrada[j-idx].cantidad = balance - cantidad1 END IF LET cantidad1 = cantidad1 + entrada[j-idx].cantidad LET valor1 = valor1 + (entrada[j-idx].cantidad * entrada[j-idx].precio) PRINT COLUMN 1, entrada[j-idx].senal, COLUMN 16, entrada[j-idx].cantidad USING "###,###,###.##", COLUMN 31, entrada[j-idx].fecha USING "dd/mm/yyyy", COLUMN 41, entrada[j-idx].precio USING "#,###,###.####", COLUMN 89, cantidad1 USING "###,###,###.##", COLUMN 104, valor1 USING "###,###,###.##" LET valor = valor1 LET idx = idx + 1 IF cantidad1 = balance THEN EXIT FOR END IF END IF END IF END FOR END IF IF total_valor IS NULL THEN LET total_valor = 0 END IF LET total_valor = total_valor + valor ON LAST ROW PRINT COLUMN 102, "--------------" PRINT COLUMN 80, "Total General --->", COLUMN 104, total_valor USING "###,###,###.##" PRINT comp_off END REPORT