Files
MBS/PROYECTO/indir/inprrp034.4gl
T
jpeguero efdf8953dd Reorganiza MATERIA PRIMA a PROYECTO y avanza inprmt002/005/013/046
- Mueve todo el contenido de PROYECTOS/indir y varias funciones
  compartidas de PROYECTOS/otrodir hacia PROYECTO, siguiendo
  instruccion de Johnny (PROYECTOS se va a eliminar).
- inprmt002: agrega campo Desglose faltante, corrige typo "eLiminar".
- inprmt005: agrega formulario y 3 campos faltantes (Consumo,
  Requiere Autorizacion, Requisiciones), corrige typo "eLiminar".
- inprmt013: agrega formulario, titulo, corrige typo "eLiminar".
- inprmt046: agrega formulario y varias funciones/dependencias
  faltantes (cincodmov, clasf_bloque, medidas, defecto,
  buscaEmp, consultaTransportista, busca_departamento);
  corrige nombres de campo desalineados con el codigo
  (depto_a, bodega) y los convierte a ComboBox donde el
  codigo lo requiere.
- Corrige dependencia faltante de FORMULARIOS_IN a la libreria
  Database (bloqueaba todo el modulo de MATERIA PRIMA).
2026-08-26 13:31:09 -04:00

531 lines
18 KiB
Plaintext

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