Files
MBS/PROYECTO/codir/coprrp011.4gl
T

1708 lines
67 KiB
Plaintext

{
------------------------------------------------------------------
PROGRAMA : COPRRP011
OBJETIVO : Reporte Resumido de Proyecciones
PROGRAMADOR : Lic. Abner Montalvo Z.
FECHA REALIZACION : Septiembre 19, 1992.
------------------------------------------------------------------
}
DATABASE marmotech
GLOBALS
DEFINE criterio CHAR(1000)
DEFINE parar,salir,salir1,salir_m CHAR(1),
formulario,linea_mensaje CHAR(80)
DEFINE meses_py SMALLINT,
fecha_inicial_py DATE,
fecha_final_py DATE,
fecha_final CHAR(6)
DEFINE mes_ini SMALLINT,
mes_fin SMALLINT,
mes1 SMALLINT,
mes2 SMALLINT,
mes3 SMALLINT,
posicion SMALLINT,
posicion1 SMALLINT,
posicion2 SMALLINT,
mes_proceso SMALLINT,
ano_fin CHAR(4),
dia_ini SMALLINT,
rango_p CHAR(4),
total_registros SMALLINT
DEFINE mes_agot1 CHAR(13),
mes_agot2 CHAR(13),
mes_reorden CHAR(13),
primera_vez1 CHAR(1),
primera_vez2 CHAR(1),
cantidad1,acum_mvtos,acum_parcial DECIMAL(13,4),
cantidad2 DECIMAL(13,4),
fecha1 DATE,
fecha2 DATE,
descrip3 CHAR(30),
tipo_material CHAR(11),
unidad CHAR(3)
DEFINE balances RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
balan_corte DECIMAL(13,4)
END RECORD
DEFINE mat_primas RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT
END RECORD
DEFINE sustituto RECORD
cod_n_s SMALLINT,
cod_grupo_s SMALLINT,
cod_tipo_s SMALLINT,
cod_sec_s SMALLINT,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT
END RECORD
DEFINE balan_ini DECIMAL(13,4),
balan_ini_sin_oc DECIMAL(13,4),
balan_fin DECIMAL(13,4)
# DEFINE mvtos RECORD
# cod_mov SMALLINT,
# status_mov CHAR(1),
# cantidad_1 DECIMAL(13,4),
# cantidad_2 DECIMAL(13,4)
# END RECORD
DEFINE cantidad_usada DECIMAL(13,4),
cantidad_producir DECIMAL(13,4),
consumo_mes DECIMAL(13,4),
monto_orden DECIMAL(13,4),
cantidad_orden DECIMAL(13,4),
balance_inicial_periodo DECIMAL(13,4),
consumo_periodo DECIMAL(13,4),
ordenes_periodo DECIMAL(13,4),
balance_final_periodo DECIMAL(13,4)
DEFINE consumos RECORD
meses SMALLINT,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
consumo_mes DECIMAL(13,4)
END RECORD
DEFINE s_sustituto RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cod_n_s SMALLINT,
cod_grupo_s SMALLINT,
cod_tipo_s SMALLINT,
cod_sec_s SMALLINT,
mes SMALLINT,
num_orden SMALLINT,
fecha_entrega DATE,
cantidad DECIMAL(13,4),
cantidad_r DECIMAL(13,4),
precio DECIMAL(13,4),
base DECIMAL(13,4)
END RECORD
DEFINE p_equivale RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cod_n_e SMALLINT,
cod_grupo_e SMALLINT,
cod_tipo_e SMALLINT,
cod_sec_e SMALLINT,
mes SMALLINT,
num_orden SMALLINT,
fecha_entrega DATE,
cantidad DECIMAL(13,4),
cantidad_r DECIMAL(13,4),
precio DECIMAL(13,4),
base DECIMAL(13,4)
END RECORD
DEFINE ordenesss RECORD
cod_n_se SMALLINT,
cod_grupo_se SMALLINT,
cod_tipo_se SMALLINT,
cod_sec_se SMALLINT,
mes SMALLINT,
num_orden SMALLINT,
fecha_entrega DATE,
cantidad DECIMAL(13,4),
cantidad_r DECIMAL(13,4),
precio DECIMAL(13,4),
base DECIMAL(13,4)
END RECORD
DEFINE mvtos_mp RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
num_orden SMALLINT,
fecha_mov DATE,
cantidad DECIMAL(13,4)
END RECORD
DEFINE pb RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cantidad DECIMAL(13,4),
precio DECIMAL(13,4),
base DECIMAL(13,4)
END RECORD
DEFINE mes_busca CHAR(2),
idx_c,idx,idx_b,idx_or,idx_e,idx_s SMALLINT,
numero_msg SMALLINT,
limpia_linea CHAR(79)
DEFINE bi ARRAY[100] OF RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cod_n_se SMALLINT,
cod_grupo_se SMALLINT,
cod_tipo_se SMALLINT,
cod_sec_se SMALLINT,
tipo CHAR(1),
balan_ini DECIMAL (13,4)
END RECORD
DEFINE oc ARRAY[100] OF RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
cod_n_se SMALLINT,
cod_grupo_se SMALLINT,
cod_tipo_se SMALLINT,
cod_sec_se SMALLINT,
mes SMALLINT,
num_orden SMALLINT,
fecha_ent DATE,
cantidad DECIMAL (13,4),
precio DECIMAL (13,4),
impuesto DECIMAL (13,4) ,
bandera CHAR(1)
END RECORD
DEFINE bm ARRAY[100] OF RECORD
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_tipo SMALLINT,
cod_sec SMALLINT,
mes SMALLINT,
balan_ini DECIMAL (13,4),
consumo_mes DECIMAL (13,4),
balan_fin DECIMAL (13,4),
agot1 CHAR (15),
agot2 CHAR (15),
pto_reorden CHAR (15)
END RECORD
DEFINE a, b, c, d, j, tipo_papel SMALLINT
DEFINE calc_agot_sin_oc CHAR(1),
calc_agot_con_oc, encontre CHAR(1),
cant_orden_mes DECIMAL (13,4),
agot_sin_oc DECIMAL (13,4),
agot_con_oc DECIMAL (13,4),
fecha_agot_sin_oc CHAR(15),
fecha_agot_con_oc CHAR(15),
nombre_mes , materia_prima CHAR(10),
total_precio,consumo_dia, meses_llegada, mes_decimal DECIMAL (10,2),
fletes, otros_gastos, cf, cif, gravamenes,
porc_rc, porc1, porc_grav, impuesto, porc_precio, precio_mp,
cf_mp, g_seguro, recibido, cantidad_imp DECIMAL (13,4),
dia_agotar, cdll, dias_llegada, mes_entero,
porc_total_rc, porc_total_grav,idx_10, idx_11 SMALLINT,
mes_pedido INTEGER,
pto_reorden CHAR(15)
DEFINE select_cons,select_mp,select_bal,select_orden,select_equi,select_s,
select_sust,select_e, select_princ CHAR(1500)
END GLOBALS
FUNCTION coprrp011()
CLEAR SCREEN
OPTIONS
FORM LINE 9,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM coprrp011 FROM "cofmrp011"
DISPLAY FORM coprrp011
CALL pantalla()
DISPLAY "coprrp011" AT 4,3
DISPLAY "Resumen de Proyecciones" AT 6,28
LET tipo_papel = 2
CALL msgrp000(tipo_papel)
CALL copcrp011()
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
FUNCTION copcrp011()
LET int_flag = FALSE
INPUT BY NAME meses_py,
fecha_inicial_py
AFTER FIELD meses_py
IF meses_py IS NULL OR
meses_py = 0 THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD meses_py
END IF
AFTER FIELD fecha_inicial_py
IF fecha_inicial_py IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fecha_inicial_py
END IF
LET mes_fin = MONTH(fecha_inicial_py)
LET ano_fin = YEAR(fecha_inicial_py)
FOR idx = 1 TO meses_py
LET mes_fin = mes_fin + 1
IF mes_fin > 12 THEN
LET mes_fin = 1
LET ano_fin = ano_fin + 1
END IF
END FOR
LET dia_ini = DAY(fecha_inicial_py)
LET mes_ini = MONTH(fecha_inicial_py)
IF dia_ini > 15 THEN
LET mes2 = mes_fin
LET mes_fin = mes_fin + 1
IF mes_fin > 12 THEN
LET mes_fin = 1
END IF
END IF
LET rango_p = MONTH(fecha_inicial_py) using "&&",
mes_fin using "&&"
IF dia_ini > 15 THEN
LET mes_fin = mes2
LET mes2 = 0
END IF
LET fecha_final = DAY(fecha_inicial_py) using "&&",
mes_fin using "&&",
ano_fin[3,4] using "&&"
LET fecha_final_py = fecha_final
LET total_registros = null
SELECT count(*) INTO total_registros FROM cotb00026
WHERE rango_plan = rango_p AND
fecha_ini = fecha_inicial_py AND
status_t is NULL
IF total_registros = 0 OR
total_registros IS NULL THEN
LET numero_msg = 48
CALL msg(numero_msg)
NEXT FIELD meses_py
END IF
AFTER INPUT
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
EXIT INPUT
LET dia_ini = DAY(fecha_inicial_py)
LET mes_ini = MONTH(fecha_inicial_py)
LET mes_fin = MONTH(fecha_inicial_py) + meses_py
IF dia_ini > 15 THEN
LET mes2 = mes_fin
LET mes_fin = mes_fin + 1
IF mes_fin > 12 THEN
LET mes_fin = 1
END IF
END IF
LET rango_p = MONTH(fecha_inicial_py) using "&&",
mes_fin using "&&"
IF dia_ini > 15 THEN
LET mes_fin = mes2
LET mes2 = 0
END IF
LET total_registros = null
SELECT count(*) INTO total_registros FROM cotb00026
WHERE rango_plan = rango_p AND
fecha_ini = fecha_inicial_py AND
status_t is NULL
IF total_registros = 0 OR
total_registros IS NULL THEN
LET numero_msg = 48
CALL msg(numero_msg)
NEXT FIELD meses_py
END IF
END INPUT
CONSTRUCT criterio ON x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_Sec
FROM cod_n,cod_grupo,cod_tipo,cod_sec
LET total_registros = 0
LET limpia_linea = " ",
" ",
" ",
" "
DISPLAY limpia_linea AT 15,1
DISPLAY limpia_linea AT 16,1
DISPLAY limpia_linea AT 18,1
DISPLAY " Realizando Calculos para el Plan de Produccion "
AT 15,16 ATTRIBUTE (REVERSE, YELLOW)
DISPLAY " Por Favor, Espere ... "
AT 16,28 ATTRIBUTE (REVERSE, YELLOW)
# Funcion que actualiza las cantidades parciales con lo recibido
# CALL cofurp001()
START REPORT proyeccion2 TO "C:\\archivo"
LET a = 0
LET b = 0
LET c = 0
LET select_princ = "SELECT x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec, ",
"x.orden_compra,x.fecha,x.cantidad_2 ",
"FROM intb00006 x ",
"WHERE x.status_t is null and ",
"x.orden_compra is not null and ",
"x.cantidad_2 > 0 and ",
"x.fecha between ? and ? and ",
criterio clipped,
" ORDER BY 1,2,3,4,5,6 "
DISPLAY "Estoy buscando los movimientos de los materiales" AT 18,15
PREPARE busca_princ FROM select_princ
DECLARE mvtos_mater SCROLL CURSOR FOR busca_princ
OPEN mvtos_mater USING fecha_inicial_py, fecha_final_py
LET select_e =
"SELECT s.cod_n,s.cod_grupo,s.cod_tipo,s.cod_sec, ",
"s.cod_n_e, s.cod_grupo_e, s.cod_tipo_e, ",
"s.cod_sec_e ",
" FROM intb00004 s, intb00002 x ",
"WHERE s.status_t IS NULL AND ",
"s.cod_n_e = x.cod_n AND ",
"s.cod_grupo_e = x.cod_grupo AND ",
"s.cod_tipo_e = x.cod_tipo AND ",
"s.cod_sec_e = x.cod_sec AND ",
"s.status_t IS NULL AND ",
"x.status_t IS NULL ",
" ORDER BY 1,2,3,4"
DISPLAY "Estoy buscando las materias primas p_equivalentes" AT 18,15
PREPARE busca_p_equivale FROM select_e
DECLARE material_equiv SCROLL CURSOR FOR busca_p_equivale
OPEN material_equiv
LET select_s =
"SELECT o.cod_n,o.cod_grupo,o.cod_tipo,o.cod_sec, ",
"o.cod_n_s, o.cod_grupo_s, o.cod_tipo_s, ",
"o.cod_sec_s ",
"FROM intb00003 o, intb00002 x ",
"WHERE o.status_t IS NULL AND ",
"o.cod_n_s = x.cod_n AND ",
"o.cod_grupo_s = x.cod_grupo AND ",
"o.cod_tipo_s = x.cod_tipo AND ",
"o.cod_sec_s = x.cod_sec AND ",
"o.status_t IS NULL AND ",
"x.status_t IS NULL ",
" ORDER BY 1,2,3,4 "
DISPLAY "Estoy buscando todas la materias primas sustitutas" AT 18,15
PREPARE busca_todos_s FROM select_s
DECLARE material_sust SCROLL CURSOR FOR busca_todos_s
OPEN material_sust
LET select_cons =
"SELECT MONTH(x.fecha_ini),a4.cod_n_mp,a4.cod_grupo_mp, ",
" a4.cod_tipo_mp, ",
"a4.cod_sec_mp,",
" sum(a4.cantidad * x.cantidad / c4.base_medida) ",
" FROM catb00001 a4, cotb00026 x, catb00002 c4 ",
"WHERE a4.cod_n_pt = x.cod_n AND ",
"a4.cod_grupo_pt = x.cod_grupo AND ",
"a4.cod_tipo_pt = x.cod_tipo AND ",
"a4.cod_sec_pt = x.cod_sec AND ",
"a4.num_formula = c4.num_formula AND ",
"c4.uso = 'S' AND ",
"x.rango_plan = ? ",
" GROUP BY 1,2,3,4,5 ",
"ORDER BY 2,3,4,5,1 "
DISPLAY "Estoy buscando el consumo de las materias primas principales"
AT 18,10
PREPARE prep_consumo FROM select_cons
DECLARE busca_cons SCROLL CURSOR FOR prep_consumo
OPEN busca_cons USING rango_p
LET select_sust =
"SELECT UNIQUE d2.cod_n,d2.cod_grupo,d2.cod_tipo, ",
"d2.cod_sec,a2.cod_n, a2.cod_grupo, ",
"a2.cod_tipo, a2.cod_sec, ",
"MONTH(c2.fecha_ini), a2.num_oc, ",
"a2.fech_ent, a2.cantidad, ",
"a2.cantidad_r, x.precio, e2.base ",
"FROM cotb00025 a2, cotb00015 x, cotb00026 c2, ",
"intb00003 d2, intb00002 e2, cotb00014 f2 ",
"WHERE a2.cod_n = x.cod_n AND ",
"a2.cod_grupo = x.cod_grupo AND ",
"a2.cod_tipo = x.cod_tipo AND ",
"a2.cod_sec = x.cod_sec AND ",
"a2.cod_n = d2.cod_n_s AND ",
"a2.cod_grupo = d2.cod_grupo_s AND ",
"a2.cod_tipo = d2.cod_tipo_s AND ",
"a2.cod_sec = d2.cod_sec_s AND ",
"e2.cod_n = a2.cod_n AND ",
"e2.cod_grupo = a2.cod_grupo AND ",
"e2.cod_tipo = a2.cod_tipo AND ",
"e2.cod_sec = a2.cod_sec AND ",
"a2.num_req = x.num_req AND ",
"a2.num_oc = x.num_oc AND ",
"x.num_oc = f2.num_oc AND ",
"d2.status_t IS NULL AND ",
"c2.rango_plan = ? AND ",
"f2.cierre = 'N' AND ",
"a2.fech_ent between c2.fecha_ini AND ",
"c2.fecha_fin ",
" ORDER BY 1,2,3,4,10,11 "
DISPLAY " Estoy buscando las ordenes de compras de los sustitutos "
AT 18,10
PREPARE busca_sustituto FROM select_sust
DECLARE ordenes_sust SCROLL CURSOR FOR busca_sustituto
OPEN ordenes_sust USING rango_p
LET select_equi =
"SELECT UNIQUE d3.cod_n,d3.cod_grupo, ",
"d3.cod_tipo,d3.cod_sec,",
"a3.cod_n, a3.cod_grupo, ",
"a3.cod_tipo, a3.cod_sec, ",
"MONTH(c3.fecha_ini), a3.num_oc, ",
"a3.fech_ent, a3.cantidad, ",
"a3.cantidad_r, x.precio, e3.base ",
"FROM cotb00025 a3, cotb00015 x, cotb00026 c3, ",
"intb00004 d3, intb00002 e3, cotb00014 f3 ",
"WHERE a3.cod_n = x.cod_n AND ",
"a3.cod_grupo = x.cod_grupo AND ",
"a3.cod_tipo = x.cod_tipo AND ",
"a3.cod_sec = x.cod_sec AND ",
"a3.cod_n = d3.cod_n_e AND ",
"a3.cod_grupo = d3.cod_grupo_e AND ",
"a3.cod_tipo = d3.cod_tipo_e AND ",
"a3.cod_sec = d3.cod_sec_e AND ",
"e3.cod_n = a3.cod_n AND ",
"e3.cod_grupo = a3.cod_grupo AND ",
"e3.cod_tipo = a3.cod_tipo AND ",
"e3.cod_sec = a3.cod_sec AND ",
"a3.num_req = x.num_req AND ",
"a3.num_oc = x.num_oc AND ",
"x.num_oc = f3.num_oc AND ",
"c3.rango_plan = ? AND ",
"f3.cierre = 'N' AND ",
"d3.status_t IS NULL AND ",
"a3.fech_ent between c3.fecha_ini AND ",
"c3.fecha_fin ",
"ORDER BY 1,2,3,4,10,11 "
DISPLAY " Estoy buscando las ordenes de compras de los p_equivalentes "
AT 18,10
PREPARE p_equivalentes FROM select_equi
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
DECLARE ordenes_equiv SCROLL CURSOR FOR p_equivalentes
OPEN ordenes_equiv USING rango_p
# Busca los Balances de las Materias Primas
LET select_bal =
"SELECT x.cod_n,x.cod_grupo,x.cod_tipo,x.cod_sec,SUM(x.cantidad_2) ",
"FROM intb00006 x ",
"WHERE ",criterio clipped,
" AND x.fecha < ? AND ",
"x.status_t IS NULL ",
" GROUP BY 1,2,3,4 ",
" ORDER BY 1,2,3,4 "
DISPLAY "Estoy buscando los balances iniciales de las materias primas"
AT 18,10
PREPARE busca_balan FROM select_bal
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
DECLARE balan_prima SCROLL CURSOR FOR busca_balan
OPEN balan_prima USING fecha_inicial_py
# Busca las Ordenes de cada material con su fecha de entregas parciales
LET select_orden =
"SELECT UNIQUE x.cod_n, x.cod_grupo, ",
"x.cod_tipo, x.cod_sec, ",
"MONTH(c1.fecha_ini), a1.num_oc, ",
"a1.fech_ent, a1.cantidad, a1.cantidad_r, ",
"x.precio, e1.base ",
"FROM cotb00025 a1, cotb00015 x, cotb00026 c1,",
"intb00002 e1, cotb00014 f1 ",
"WHERE a1.cod_n = x.cod_n AND ",
"a1.cod_grupo = x.cod_grupo AND ",
"a1.cod_tipo = x.cod_tipo AND ",
"a1.cod_sec = x.cod_sec AND ",
"e1.cod_n = a1.cod_n AND ",
"e1.cod_grupo = a1.cod_grupo AND ",
"e1.cod_tipo = a1.cod_tipo AND ",
"e1.cod_sec = a1.cod_sec AND ",
"a1.num_req = x.num_req AND ",
"a1.num_oc = x.num_oc AND ",
"x.num_oc = f1.num_oc AND ",
"f1.cierre = 'N' AND ",
"c1.rango_plan = ? AND ",
"a1.fech_ent between c1.fecha_ini AND ",
" c1.fecha_fin ",
" ORDER BY 1,2,3,4,6,7 "
DISPLAY "Estoy buscando las ordenes de las materias primas principales"
AT 18,10
PREPARE busca_ordenes FROM select_orden
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
DECLARE ordenes_material SCROLL CURSOR FOR busca_ordenes
OPEN ordenes_material USING rango_p
# Busca el Material Principal y le calcula el balance inicial a la fecha
LET select_mp = "SELECT UNIQUE x.cod_n, x.cod_grupo,",
"x.cod_tipo, x.cod_sec ",
"FROM intb00002 x, catb00001 y ",
"WHERE ",criterio clipped,
" AND x.cod_n = y.cod_n_mp AND ",
"x.cod_grupo = y.cod_grupo_mp AND ",
"x.cod_tipo = y.cod_tipo_mp AND ",
"x.cod_sec = y.cod_sec_mp AND ",
"x.status_t IS NULL AND ",
"y.status_t IS NULL ",
"ORDER BY 1, 2, 3, 4 "
DISPLAY " Estoy buscando las materias primas principales "
AT 18,10
PREPARE busca_mat_prima FROM select_mp
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
DECLARE material CURSOR FOR busca_mat_prima
OPEN material
LET idx_c = 1
LET idx_e = 1
LET idx_s = 1
LET idx_or = 1
LET idx_b = 1
LET idx_10 = 1
DISPLAY " "
AT 18,10
WHILE status != NOTFOUND
FETCH material INTO mat_primas.*
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
IF status = NOTFOUND THEN
EXIT WHILE
END IF
DISPLAY mat_primas.cod_n at 18,25
DISPLAY mat_primas.cod_grupo at 18,35
DISPLAY mat_primas.cod_tipo using "&&" at 18,45
DISPLAY mat_primas.cod_sec using "&&&" at 18,55
LET b = b + 1
LET balances.balan_corte = 0
LET mes_ini = MONTH(fecha_inicial_py)
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_b balan_prima INTO balances.*
IF status = notfound THEN
LET salir = "S"
LET idx_b = 1
EXIT WHILE
END IF
LET idx_b = idx_b + 1
IF balances.cod_n = mat_primas.cod_n AND
balances.cod_grupo = mat_primas.cod_grupo AND
balances.cod_tipo = mat_primas.cod_tipo AND
balances.cod_sec = mat_primas.cod_sec THEN
LET salir = "S"
END IF
IF salir = "S" THEN
LET idx_b = 1
EXIT WHILE
END IF
END WHILE
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET bi[b].cod_n = mat_primas.cod_n
LET bi[b].cod_grupo = mat_primas.cod_grupo
LET bi[b].cod_tipo = mat_primas.cod_tipo
LET bi[b].cod_sec = mat_primas.cod_sec
LET bi[b].cod_n_se = 0
LET bi[b].cod_grupo_se = 0
LET bi[b].cod_tipo_se = 0
LET bi[b].cod_sec_se = 0
LET bi[b].tipo = "P"
LET bi[b].balan_ini = balances.balan_corte
LET balan_ini = balances.balan_corte
# Busca materiales sustitutos del material y le calcula el balance inicial
# a la fecha
LET salir1 = "N"
WHILE salir1 != "S"
FETCH ABSOLUTE idx_s material_sust INTO sustituto.*
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
IF status = NOTFOUND THEN
LET idx_s = 1
LET salir1 = "S"
EXIT WHILE
END IF
LET idx_s = idx_s + 1
IF sustituto.cod_n_s = mat_primas.cod_n AND
sustituto.cod_grupo_s = mat_primas.cod_grupo AND
sustituto.cod_tipo_s = mat_primas.cod_tipo AND
sustituto.cod_sec_s = mat_primas.cod_sec THEN
LET salir1 = "S"
LET balances.balan_corte = 0
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_b balan_prima INTO balances.*
IF status = notfound THEN
LET idx_b = 1
LET salir = "S"
EXIT WHILE
END IF
LET idx_b = idx_b + 1
IF balances.cod_n = sustituto.cod_n AND
balances.cod_grupo = sustituto.cod_grupo AND
balances.cod_tipo = sustituto.cod_tipo AND
balances.cod_sec = sustituto.cod_sec THEN
LET salir = "S"
END IF
IF salir = "S" THEN
LET idx_b = 1
EXIT WHILE
END IF
END WHILE
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET b = b + 1
LET bi[b].cod_n = mat_primas.cod_n
LET bi[b].cod_grupo = mat_primas.cod_grupo
LET bi[b].cod_tipo = mat_primas.cod_tipo
LET bi[b].cod_sec = mat_primas.cod_sec
LET bi[b].cod_n_se = sustituto.cod_n
LET bi[b].cod_grupo_se = sustituto.cod_grupo
LET bi[b].cod_tipo_se = sustituto.cod_tipo
LET bi[b].cod_sec_se = sustituto.cod_sec
LET bi[b].tipo = "S"
LET bi[b].balan_ini = balances.balan_corte
LET balan_ini = balan_ini + balances.balan_corte
END IF
IF salir1 = "S" THEN
LET idx_s = 1
EXIT WHILE
END IF
END WHILE
# Busca materiales p_equivalentes del material y le calcula el balance inicial
# a la fecha
LET salir1 = "N"
WHILE salir1 != "S"
FETCH ABSOLUTE idx_e material_equiv INTO sustituto.*
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
IF status = NOTFOUND THEN
LET idx_e = 1
LET salir1 = "S"
EXIT WHILE
END IF
LET idx_e = idx_e + 1
IF sustituto.cod_n_s = mat_primas.cod_n AND
sustituto.cod_grupo_s = mat_primas.cod_grupo AND
sustituto.cod_tipo_s = mat_primas.cod_tipo AND
sustituto.cod_sec_s = mat_primas.cod_sec THEN
LET salir1 = "S"
LET balances.balan_corte = 0
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_b balan_prima INTO balances.*
IF status = notfound THEN
LET idx_b = 1
LET salir = "S"
EXIT WHILE
END IF
LET idx_b = idx_b + 1
IF balances.cod_n = sustituto.cod_n AND
balances.cod_grupo = sustituto.cod_grupo AND
balances.cod_tipo = sustituto.cod_tipo AND
balances.cod_sec = sustituto.cod_sec THEN
LET salir = "S"
END IF
IF salir = "S" THEN
LET idx_b = 1
EXIT WHILE
END IF
END WHILE
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET b = b + 1
LET bi[b].cod_n = mat_primas.cod_n
LET bi[b].cod_grupo = mat_primas.cod_grupo
LET bi[b].cod_tipo = mat_primas.cod_tipo
LET bi[b].cod_sec = mat_primas.cod_sec
LET bi[b].cod_n_se = sustituto.cod_n
LET bi[b].cod_grupo_se = sustituto.cod_grupo
LET bi[b].cod_tipo_se = sustituto.cod_tipo
LET bi[b].cod_sec_se = sustituto.cod_sec
LET bi[b].tipo = "E"
LET bi[b].balan_ini = balances.balan_corte
LET balan_ini = balan_ini + balances.balan_corte
END IF
IF salir1 = "S" THEN
LET idx_e = 1
LET salir1 = "S"
EXIT WHILE
END IF
END WHILE
LET balan_ini_sin_oc = balan_ini
LET calc_agot_sin_oc = "N"
LET calc_agot_con_oc = "N"
# Busca las Ordenes de Compras para el mes "d" de la materia prima
FOR d = 1 TO meses_py
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
SELECT UNIQUE fecha_ini, fecha_fin INTO fecha1, fecha2
FROM cotb00026
WHERE rango_plan = rango_p AND
MONTH(fecha_ini) = mes_ini
LET cant_orden_mes = 0
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_or ordenes_material INTO ordenesss.*
IF status = notfound THEN
LET idx_or = 1
LET salir = "N"
EXIT WHILE
END IF
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET idx_or = idx_or + 1
IF ordenesss.cod_n_se = mat_primas.cod_n AND
ordenesss.cod_grupo_se = mat_primas.cod_grupo AND
ordenesss.cod_tipo_se = mat_primas.cod_tipo AND
ordenesss.cod_sec_se = mat_primas.cod_sec AND
ordenesss.mes = mes_ini THEN
LET cantidad_imp = ordenesss.cantidad - ordenesss.cantidad_r
IF cantidad_imp <= 0 THEN
LET ordenesss.cantidad = 0
END IF
IF cantidad_imp > 0 THEN
LET ordenesss.cantidad = cantidad_imp
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = 0
LET oc[a].cod_grupo_se = 0
LET oc[a].cod_tipo_se = 0
LET oc[a].cod_sec_se = 0
LET oc[a].mes = mes_ini
LET oc[a].num_orden = ordenesss.num_orden
LET oc[a].fecha_ent = ordenesss.fecha_entrega
LET oc[a].cantidad = ordenesss.cantidad
LET oc[a].precio = cf_mp
LET oc[a].impuesto = precio_mp
LET oc[a].bandera = "O"
LET cant_orden_mes = cant_orden_mes + ordenesss.cantidad
END IF
END IF
END WHILE
# Busca los reportes de entradas del mes para el material principal
LET salir = "N"
LET idx_10 = 1
WHILE salir != "S"
FETCH ABSOLUTE idx_10 mvtos_mater INTO mvtos_mp.*
IF STATUS = NOTFOUND THEN
LET idx_10 = 1
LET salir = "N"
EXIT WHILE
END IF
LET idx_10 = idx_10 + 1
IF mat_primas.cod_n = mvtos_mp.cod_n AND
mat_primas.cod_grupo = mvtos_mp.cod_grupo AND
mat_primas.cod_tipo = mvtos_mp.cod_tipo AND
mat_primas.cod_sec = mvtos_mp.cod_sec AND
mvtos_mp.fecha_mov >= fecha1 AND
mvtos_mp.fecha_mov < fecha2 THEN
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = 0
LET oc[a].cod_grupo_se = 0
LET oc[a].cod_tipo_se = 0
LET oc[a].cod_sec_se = 0
LET oc[a].mes = mes_ini
LET oc[a].num_orden = mvtos_mp.num_orden
LET oc[a].fecha_ent = mvtos_mp.fecha_mov
LET oc[a].cantidad = mvtos_mp.cantidad
LET oc[a].precio = null
LET oc[a].impuesto = null
LET oc[a].bandera = "M"
LET cant_orden_mes = cant_orden_mes + mvtos_mp.cantidad
END IF
END WHILE
# Calcula el consumo en el mes "d" de la materia prima
LET consumo_mes = 0
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_c busca_cons INTO consumos.*
IF status = notfound THEN
LET idx_c = 1
LET salir = "N"
EXIT WHILE
END IF
LET idx_c = idx_c + 1
IF consumos.meses = mes_ini AND
consumos.cod_n = mat_primas.cod_n AND
consumos.cod_grupo = mat_primas.cod_grupo AND
consumos.cod_tipo = mat_primas.cod_tipo AND
consumos.cod_sec = mat_primas.cod_sec THEN
LET consumo_mes = consumos.consumo_mes
LET salir = "S"
ELSE
LET consumo_mes = 0
END IF
IF salir = "S" THEN
LET idx_c = 1
EXIT WHILE
END IF
END WHILE
# Busca las ordenes de compras de los sustitutos para el mes "d"
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_s ordenes_sust INTO s_sustituto.*
IF status = NOTFOUND THEN
LET idx_s = 1
LET salir = "N"
EXIT WHILE
END IF
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET idx_s = idx_s + 1
IF s_sustituto.cod_n = mat_primas.cod_n AND
s_sustituto.cod_grupo = mat_primas.cod_grupo AND
s_sustituto.cod_tipo = mat_primas.cod_tipo AND
s_sustituto.cod_sec = mat_primas.cod_sec AND
s_sustituto.mes = mes_ini THEN
LET cantidad_imp = s_sustituto.cantidad - s_sustituto.cantidad_r
IF cantidad_imp <= 0 THEN
LET s_sustituto.cantidad = 0
END IF
IF cantidad_imp > 0 THEN
LET s_sustituto.cantidad = cantidad_imp
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = s_sustituto.cod_n_s
LET oc[a].cod_grupo_se = s_sustituto.cod_grupo_s
LET oc[a].cod_tipo_se = s_sustituto.cod_tipo_s
LET oc[a].cod_sec_se = s_sustituto.cod_sec_s
LET oc[a].mes = mes_ini
LET oc[a].num_orden = s_sustituto.num_orden
LET oc[a].fecha_ent = s_sustituto.fecha_entrega
LET oc[a].cantidad = s_sustituto.cantidad
LET oc[a].precio = cf_mp
LET oc[a].impuesto = precio_mp
LET oc[a].bandera = "O"
LET cant_orden_mes = cant_orden_mes + s_sustituto.cantidad
END IF
END IF
END WHILE
# Busca los reportes de entradas del mes para los sustitutos :
LET idx_11 = 1
LET salir_m = "N"
WHILE salir_m != "S"
FETCH ABSOLUTE idx_11 material_sust INTO sustituto.*
IF status = NOTFOUND THEN
LET idx_11 = 1
LET salir_m = "N"
EXIT WHILE
END IF
LET idx_11 = idx_11 + 1
IF sustituto.cod_n_s = mat_primas.cod_n AND
sustituto.cod_grupo_s = mat_primas.cod_grupo AND
sustituto.cod_tipo_s = mat_primas.cod_tipo AND
sustituto.cod_sec_s = mat_primas.cod_sec THEN
LET salir = "N"
LET idx_10 = 1
WHILE salir != "S"
FETCH ABSOLUTE idx_10 mvtos_mater INTO mvtos_mp.*
IF STATUS = NOTFOUND THEN
LET idx_10 = 1
LET salir = "N"
EXIT WHILE
END IF
LET idx_10 = idx_10 + 1
IF sustituto.cod_n = mvtos_mp.cod_n AND
sustituto.cod_grupo = mvtos_mp.cod_grupo AND
sustituto.cod_tipo = mvtos_mp.cod_tipo AND
sustituto.cod_sec = mvtos_mp.cod_sec AND
(mvtos_mp.fecha_mov >= fecha1 AND
mvtos_mp.fecha_mov < fecha2) THEN
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = sustituto.cod_n
LET oc[a].cod_grupo_se = sustituto.cod_grupo
LET oc[a].cod_tipo_se = sustituto.cod_tipo
LET oc[a].cod_sec_se = sustituto.cod_sec
LET oc[a].mes = mes_ini
LET oc[a].num_orden = mvtos_mp.num_orden
LET oc[a].fecha_ent = mvtos_mp.fecha_mov
LET oc[a].cantidad = mvtos_mp.cantidad
LET oc[a].precio = null
LET oc[a].impuesto = null
LET oc[a].bandera = "M"
LET cant_orden_mes = cant_orden_mes + mvtos_mp.cantidad
END IF
END WHILE
END IF
END WHILE
# Busca las ordenes de compras de los p_equivalentes para el mes "d"
LET salir = "N"
WHILE salir != "S"
FETCH ABSOLUTE idx_e ordenes_equiv INTO p_equivale.*
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
IF status = NOTFOUND THEN
LET idx_e = 1
LET salir = "S"
EXIT WHILE
END IF
LET idx_e = idx_e + 1
IF p_equivale.cod_n = mat_primas.cod_n AND
p_equivale.cod_grupo = mat_primas.cod_grupo AND
p_equivale.cod_tipo = mat_primas.cod_tipo AND
p_equivale.cod_sec = mat_primas.cod_sec AND
p_equivale.mes = mes_ini THEN
LET cantidad_imp = p_equivale.cantidad - p_equivale.cantidad_r
IF cantidad_imp <= 0 THEN
LET p_equivale.cantidad = 0
END IF
IF cantidad_imp > 0 THEN
LET p_equivale.cantidad = cantidad_imp
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = p_equivale.cod_n_e
LET oc[a].cod_grupo_se = p_equivale.cod_grupo_e
LET oc[a].cod_tipo_se = p_equivale.cod_tipo_e
LET oc[a].cod_sec_se = p_equivale.cod_sec_e
LET oc[a].mes = mes_ini
LET oc[a].num_orden = p_equivale.num_orden
LET oc[a].fecha_ent = p_equivale.fecha_entrega
LET oc[a].cantidad = p_equivale.cantidad
LET oc[a].precio = cf_mp
LET oc[a].impuesto = precio_mp
LET oc[a].bandera = "O"
LET cant_orden_mes = cant_orden_mes + p_equivale.cantidad
END IF
END IF
END WHILE
# Busca los reportes de entradas del mes de los p_equivalentes
LET idx_11 = 1
LET salir_m = "N"
WHILE salir_m != "S"
FETCH ABSOLUTE idx_11 material_equiv INTO sustituto.*
IF status = NOTFOUND THEN
LET idx_11 = 1
LET salir_m = "N"
EXIT WHILE
END IF
LET idx_11 = idx_11 + 1
IF sustituto.cod_n_s = mat_primas.cod_n AND
sustituto.cod_grupo_s = mat_primas.cod_grupo AND
sustituto.cod_tipo_s = mat_primas.cod_tipo AND
sustituto.cod_sec_s = mat_primas.cod_sec THEN
LET salir = "N"
LET idx_10 = 1
WHILE salir != "S"
FETCH ABSOLUTE idx_10 mvtos_mater INTO mvtos_mp.*
IF STATUS = NOTFOUND THEN
LET idx_10 = 1
LET salir = "N"
EXIT WHILE
END IF
LET idx_10 = idx_10 + 1
IF sustituto.cod_n = mvtos_mp.cod_n AND
sustituto.cod_grupo = mvtos_mp.cod_grupo AND
sustituto.cod_tipo = mvtos_mp.cod_tipo AND
sustituto.cod_sec = mvtos_mp.cod_sec AND
(mvtos_mp.fecha_mov >= fecha1 AND
mvtos_mp.fecha_mov < fecha2) THEN
LET a = a + 1
LET oc[a].cod_n = mat_primas.cod_n
LET oc[a].cod_grupo = mat_primas.cod_grupo
LET oc[a].cod_tipo = mat_primas.cod_tipo
LET oc[a].cod_sec = mat_primas.cod_sec
LET oc[a].cod_n_se = sustituto.cod_n
LET oc[a].cod_grupo_se = sustituto.cod_grupo
LET oc[a].cod_tipo_se = sustituto.cod_tipo
LET oc[a].cod_sec_se = sustituto.cod_sec
LET oc[a].mes = mes_ini
LET oc[a].num_orden = mvtos_mp.num_orden
LET oc[a].fecha_ent = mvtos_mp.fecha_mov
LET oc[a].cantidad = mvtos_mp.cantidad
LET oc[a].precio = null
LET oc[a].impuesto = null
LET oc[a].bandera = "M"
LET cant_orden_mes = cant_orden_mes + mvtos_mp.cantidad
END IF
END WHILE
END IF
END WHILE
# Calcula el balance final de la materia prima para el mes "d"
LET balan_fin = balan_ini - consumo_mes + cant_orden_mes
LET fecha_agot_sin_oc = NULL
LET fecha_agot_con_oc = NULL
LET pto_reorden = NULL
# Determina si hay o no agotamiento, sin tomar en cuenta la ordenes de compras
IF calc_agot_sin_oc = "N" THEN
LET agot_sin_oc = balan_ini_sin_oc - consumo_mes
IF agot_sin_oc = 0 THEN
LET mes_proceso = mes_ini
IF dia_ini > 15 THEN
LET mes_ini = mes_ini + 1
IF mes_ini > 12 THEN
LET mes_ini = 1
END IF
END IF
SELECT descrip INTO nombre_mes FROM mestable
WHERE mes = mes_ini
LET mes_ini = mes_proceso
IF mes_ini = 2 THEN
LET fecha_agot_sin_oc = "28 ",nombre_mes
ELSE
LET fecha_agot_sin_oc = "30 ",nombre_mes
END IF
END IF
IF agot_sin_oc < 0 THEN
LET consumo_dia = consumo_mes / 30
LET meses_llegada = balan_ini_sin_oc / consumo_dia
CALL redondear()
LET dia_agotar = meses_llegada
IF dia_agotar < 0 THEN
LET dia_agotar = dia_agotar * -1
END IF
IF dia_agotar = 0 THEN
LET dia_agotar = 30
END IF
LET mes_proceso = mes_ini
IF dia_ini > 15 THEN
LET mes_ini = mes_ini + 1
IF mes_ini > 12 THEN
LET mes_ini = 1
END IF
END IF
SELECT descrip INTO nombre_mes FROM mestable
WHERE mes = mes_ini
LET mes_ini = mes_proceso
IF dia_agotar > 28 AND mes_ini = 2 THEN
LET dia_agotar = 28
END IF
LET fecha_agot_sin_oc = dia_agotar using "&&"," ",nombre_mes
END IF
END IF
# Determina si hay o no agotamiento, tomando en cuenta la ordenes de compras
IF calc_agot_con_oc = "N" THEN
LET agot_con_oc = balan_ini - consumo_mes + cant_orden_mes
IF agot_con_oc = 0 THEN
LET mes_proceso = mes_ini
IF dia_ini > 15 THEN
LET mes_ini = mes_ini + 1
IF mes_ini > 12 THEN
LET mes_ini = 1
END IF
END IF
SELECT descrip INTO nombre_mes FROM mestable
WHERE mes = mes_ini
LET mes_ini = mes_proceso
IF mes_ini = 2 THEN
LET fecha_agot_con_oc = "28 ",nombre_mes
ELSE
LET fecha_agot_con_oc = "30 ",nombre_mes
END IF
END IF
IF agot_con_oc < 0 THEN
LET consumo_dia = consumo_mes / 30
LET meses_llegada = balan_ini / consumo_dia
CALL redondear()
LET dia_agotar = meses_llegada
IF dia_agotar < 0 THEN
LET dia_agotar = dia_agotar * -1
END IF
IF dia_agotar = 0 THEN
LET dia_agotar = 30
END IF
LET mes_proceso = mes_ini
IF dia_ini > 15 THEN
LET mes_ini = mes_ini + 1
IF mes_ini > 12 THEN
LET mes_ini = 1
END IF
END IF
SELECT descrip INTO nombre_mes FROM mestable
WHERE mes = mes_ini
LET mes_ini = mes_proceso
IF dia_agotar > 28 AND mes_ini = 2 THEN
LET dia_agotar = 28
END IF
LET fecha_agot_con_oc = dia_agotar using "&&"," ",nombre_mes
END IF
IF agot_con_oc <= 0 THEN
LET cdll = 0
SELECT dia_llegada INTO cdll FROM intb00002
WHERE cod_n = mat_primas.cod_n AND
cod_grupo = mat_primas.cod_grupo AND
cod_tipo = mat_primas.cod_tipo AND
cod_sec = mat_primas.cod_sec AND
status_t IS NULL
IF cdll = 0 OR cdll IS NULL THEN
CALL parada()
RETURN
END IF
LET dias_llegada = cdll - dia_agotar
LET meses_llegada = dias_llegada / 30
IF dia_agotar <= 15 THEN
LET meses_llegada = meses_llegada + 1
END IF
CALL redondear()
CALL resta_meses()
SELECT descrip INTO nombre_mes FROM mestable
WHERE mes = mes_pedido
LET pto_reorden = dia_agotar using "&&"," ",nombre_mes
END IF
END IF
IF agot_sin_oc <= 0 THEN
IF calc_agot_sin_oc = "N" THEN
LET calc_agot_sin_oc = "S"
ELSE
LET fecha_agot_sin_oc = NULL
END IF
END IF
IF agot_con_oc <= 0 THEN
IF calc_agot_con_oc = "N" THEN
LET calc_agot_con_oc = "S"
ELSE
LET fecha_agot_con_oc = NULL
LET pto_reorden = NULL
END IF
END IF
LET c = c + 1
LET bm[c].cod_n = mat_primas.cod_n
LET bm[c].cod_grupo = mat_primas.cod_grupo
LET bm[c].cod_tipo = mat_primas.cod_tipo
LET bm[c].cod_sec = mat_primas.cod_sec
LET bm[c].mes = mes_ini
LET bm[c].balan_ini = balan_ini
LET bm[c].consumo_mes = consumo_mes
LET bm[c].balan_fin = balan_fin
LET bm[c].agot1 = fecha_agot_sin_oc
LET bm[c].agot2 = fecha_agot_con_oc
LET bm[c].pto_reorden = pto_reorden
LET mes_ini = mes_ini + 1
IF mes_ini = 13 THEN
LET mes_ini = 1
END IF
LET balan_ini = balan_fin
# Calcula el balance final sin considerar las ordenes de compras
LET balan_ini_sin_oc = balan_ini_sin_oc - consumo_mes
END FOR
LET a = 0
LET b = 0
LET c = 0
LET d = 0
OUTPUT TO REPORT proyeccion2()
END WHILE
FINISH REPORT proyeccion2
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
REPORT proyeccion2()
DEFINE comprimido_12_on,
comprimido_12_off,
negrillas_on,
negrillas_off,
comprimido_on,
comprimido_off,
doble_on,
doble_off CHAR(2)
OUTPUT
LEFT MARGIN 0
TOP MARGIN 1
BOTTOM MARGIN 3
FORMAT
PAGE HEADER
LET negrillas_on = ASCII 27, ASCII 71
LET negrillas_off = ASCII 27, ASCII 72
LET doble_on = ASCII 14
LET doble_off = ASCII 20
LET comprimido_on = ASCII 15
LET comprimido_off = ASCII 18
LET comprimido_12_on = ASCII 27, ASCII 77
LET comprimido_12_off = ASCII 27, ASCII 80
LET comprimido_12_on = ASCII 27, ASCII 77
LET comprimido_12_off = ASCII 27, ASCII 80
LET l = (163 - LENGTH(p_companias.nombre CLIPPED))/2
PRINT COLUMN 1, comprimido_on, negrillas_on
PRINT COLUMN 1, "coprrp011",
COLUMN l, p_companias.nombre CLIPPED,
COLUMN 156, "Pag. ", pageno using "###"
PRINT COLUMN 76, "SISTEMA DE COMPRAS",
COLUMN 156, today using "dd/mm/yy"
PRINT COLUMN 73, "RESUMEN DE PROYECCIONES"
PRINT COLUMN 72, "Del ",
COLUMN 76, fecha_inicial_py using "dd/mmm/yy",
COLUMN 84, " Al ",
COLUMN 88, fecha_final_py using "dd/mmm/yy",
COLUMN 156, time
SKIP 2 LINES
PRINT COLUMN 1, "-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------"
PRINT COLUMN 43, "UNIDAD",
COLUMN 68, "BALANCE",
COLUMN 81, "ORDENES",
COLUMN 95, "CONSUMO",
COLUMN 109, "BALANCE",
COLUMN 119, "FECHA AGOTA-",
COLUMN 135, "FECHA AGOTA-",
COLUMN 150, "FECHA"
PRINT COLUMN 14, "MATERIAL",
COLUMN 43, "MEDIDA",
COLUMN 51, "TIPO",
COLUMN 68, "INICIAL",
COLUMN 81, "PERIODO",
COLUMN 95, "PERIODO",
COLUMN 110, "FINAL",
COLUMN 119, "MIENTO SIN OC",
COLUMN 135, "MIENTO CON OC",
COLUMN 150, "REORDEN"
PRINT COLUMN 1, "-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------", negrillas_off
LET a = 0
LET b = 0
LET c = 0
LET d = 0
ON EVERY ROW
LET balance_inicial_periodo = 0
FOR c = 1 TO 100
IF bi[c].cod_n = 0 OR
bi[c].cod_n IS NULL THEN
EXIT FOR
END IF
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
LET consumo_periodo = 0
LET ordenes_periodo = 0
INITIALIZE descrip3, unidad, mes_agot1, mes_agot2,
mes_reorden, balance_final_periodo TO NULL
IF bi[c].tipo = "P" THEN
CALL buscar_datos_bm()
CALL buscar_ordenes()
LET bi[c].cod_n_se = bi[c].cod_n
LET bi[c].cod_grupo_se = bi[c].cod_grupo
LET bi[c].cod_tipo_se = bi[c].cod_tipo
LET bi[c].cod_sec_se = bi[c].cod_sec
LET balance_final_periodo = bm[meses_py].balan_fin
ELSE
INITIALIZE consumo_periodo, ordenes_periodo TO NULL
END IF
SELECT descrip_esp, unidad_med INTO descrip3, unidad
FROM intb00001
WHERE cod_n = bi[c].cod_n_se AND
cod_grupo = bi[c].cod_grupo_se AND
cod_tipo = bi[c].cod_tipo_se AND
cod_sec = bi[c].cod_sec_se AND
status_t IS NULL
IF bi[c].tipo = "P" OR
bi[c].tipo IS NULL THEN
LET tipo_material = "Principal "
ELSE
IF bi[c].tipo = "S" THEN
LET tipo_material = "Sustituto "
ELSE
IF bi[c].tipo = "E" THEN
LET tipo_material = "Equivalente"
END IF
END IF
END IF
PRINT COLUMN 2, bi[c].cod_n_se using "&",
COLUMN 3, "-",
COLUMN 4, bi[c].cod_grupo_se using "&",
COLUMN 5, "-",
COLUMN 6, bi[c].cod_tipo_se using "&&",
COLUMN 8, "-",
COLUMN 9, bi[c].cod_sec_se using "&&&",
COLUMN 13, descrip3,
COLUMN 45, unidad,
COLUMN 50, tipo_material,
COLUMN 62, bi[c].balan_ini using "---,---,--&.&&",
COLUMN 76, ordenes_periodo using "---,---,--&.&&",
COLUMN 90, consumo_periodo using "---,---,--&.&&",
COLUMN 104, balance_final_periodo
using "---,---,--&.&&",
COLUMN 119, mes_agot1,
COLUMN 135, mes_agot2,
COLUMN 150, mes_reorden
END FOR
PRINT COLUMN 1, "-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------------------",
"-----------------------"
SKIP 1 LINES
FOR d = 1 TO 100
IF ( bi[d].tipo = " " OR bi[d].tipo IS NULL ) AND
( oc[d].mes = 0 OR oc[d].mes IS NULL ) AND
( bm[d].mes = 0 OR bm[d].mes IS NULL ) THEN
EXIT FOR
END IF
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
INITIALIZE bi[d].cod_n,
bi[d].cod_grupo,
bi[d].cod_tipo,
bi[d].cod_sec,
bi[d].cod_n_se,
bi[d].cod_grupo_se,
bi[d].cod_tipo_se,
bi[d].cod_sec_se,
bi[d].tipo,
bi[d].balan_ini,
oc[d].cod_n,
oc[d].cod_grupo,
oc[d].cod_tipo,
oc[d].cod_sec,
oc[d].cod_n_se,
oc[d].cod_grupo_se,
oc[d].cod_tipo_se,
oc[d].cod_sec_se,
oc[d].mes,
oc[d].num_orden,
oc[d].fecha_ent,
oc[d].cantidad,
oc[d].precio,
oc[d].impuesto,
bm[d].cod_n,
bm[d].cod_grupo,
bm[d].cod_tipo,
bm[d].cod_sec,
bm[d].mes,
bm[d].balan_ini,
bm[d].consumo_mes,
bm[d].balan_fin,
bm[d].agot1,
bm[d].agot2,
bm[d].pto_reorden TO NULL
END FOR
LET a = 0
LET b = 0
LET c = 0
LET d = 0
END REPORT
FUNCTION buscar_datos_bm()
# Esta funcion busca el mes de agotamiento sin y con ordenes de compra y el
# mes de reorden del material principal y ademas calcula el consumo del periodo
# de la materia prima principal
FOR d = 1 TO meses_py
IF bm[d].agot1 IS NOT NULL THEN
LET mes_agot1 = bm[d].agot1
END IF
IF bm[d].agot2 IS NOT NULL THEN
LET mes_agot2 = bm[d].agot2
END IF
IF bm[d].pto_reorden IS NOT NULL THEN
LET mes_reorden = bm[d].pto_reorden
END IF
LET consumo_periodo = consumo_periodo + bm[d].consumo_mes
END FOR
LET d = 0
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
FUNCTION buscar_ordenes()
FOR j = 1 TO 100
IF oc[j].cod_n IS NULL OR
oc[j].cod_n = 0 THEN
EXIT FOR
END IF
LET ordenes_periodo = ordenes_periodo + oc[j].cantidad
END FOR
RUN "type C:\\archivo > %USPRINT%" END FUNCTION