Files
MBS/PROYECTOS/indir/inprrp043.4gl
T

604 lines
22 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : INPRRP035
OBJETIVO : Valorizacion de Inventario Metodo UEPS
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_rep35 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 inprrp035()
#WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM infmrp035 FROM "infmrp034"
DISPLAY FORM infmrp035
CALL pantalla()
DISPLAY "inprrp035" AT 4,3
DISPLAY "Valorizacion de Inventario Metodo UEPS" 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 intb00116 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 ",
" b.status_t IS NULL AND ",
criterio CLIPPED
DISPLAY "<<Buscando Informacion... Espere por Favor.>>" AT 17,14
ATTRIBUTE(REVERSE,BOLD)
PREPARE comando4 FROM selec4
DECLARE stand SCROLL CURSOR FOR comando4
OPEN stand USING fecha2
START REPORT reporte_35 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_rep35.*
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_rep35.cantidad IS NULL THEN
LET reg_rep35.cantidad = 0
END IF
LET reg_rep35.precio = 0
IF reg_rep35.cantidad <= 0 AND reg_rep35.fecha <= fecha1 THEN
LET reg_rep35.cantidad = 0
END IF
IF reg_rep35.cantidad <> 0 THEN
OUTPUT TO REPORT reporte_35(reg_rep35.*)
END IF
END WHILE
FINISH REPORT reporte_35
CLEAR SCREEN
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
# Rutina de Impresion de las informaciones
REPORT reporte_35(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),cantidad11,cantidad_inicial,
balance_finalf,cantidad12,cantidad13,balance_final DECIMAL(12,2),
imp_ini CHAR(1)
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 DESC
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 doce = ASCII 030
LET hora = time
# Impresion de los encabezados
LET lj = (117 - LENGTH(p_companias.nombre CLIPPED))/2
PRINT comp_on,negrillas_on
PRINT COLUMN 1, "inprrp035",
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 UEPS",
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
LET imp_ini = "N"
SELECT SUM(a.cantidad_2) INTO cant_total FROM intb00116 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)
IF entrada[j-idx].senal = "*Inv. Inicial*" THEN
IF imp_ini = "N" THEN
SELECT SUM(a.cantidad_2)
INTO balance_final FROM intb00116 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 <= fecha2) AND
(a.status_t IS NULL)
IF balance_final IS NULL THEN
LET balance_final = 0
END IF
DECLARE busca4 CURSOR FOR
SELECT a.balance,a.costo,a.fecha FROM intb00010 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_ini = fecha1
ORDER BY 3
LET cantidad11 = 0
LET valor1 = 0
LET balance_finalf = 0
LET cantidad12 = 0
FOREACH busca4 INTO x.cantidad,x.precio,x.fecha
LET cantidad11 = balance_final - x.cantidad
IF cantidad11 >= 0 THEN
LET imp_ini = "S"
LET valor1 =
(x.cantidad * x.precio) + valor1
LET cantidad12 = cantidad12 + x.cantidad
PRINT COLUMN 1, entrada[j-idx].senal,
COLUMN 16, x.cantidad
USING "###,###,###.##",
COLUMN 31, x.fecha USING "dd/mm/yyyy",
COLUMN 41, x.precio
USING "#,###,###.####",
COLUMN 89, cantidad12
USING "###,###,###.##",
COLUMN 104, valor1
USING "###,###,###.##"
LET balance_final = cantidad11
ELSE
LET imp_ini = "S"
LET cantidad12 = cantidad12 + balance_final
LET valor1 =
(balance_final* x.precio) + valor1
PRINT COLUMN 1, entrada[j-idx].senal,
COLUMN 16, balance_final
USING "###,###,###.##",
COLUMN 31, x.fecha USING "dd/mm/yyyy",
COLUMN 41, x.precio
USING "#,###,###.####",
COLUMN 89, cantidad12
USING "###,###,###.##",
COLUMN 104, valor1
USING "###,###,###.##"
EXIT FOREACH
END IF
END FOREACH
LET valor = valor1
END IF
END IF
IF entrada[j-idx].senal != "*Inv. Inicial*" THEN
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
END IF
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