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

402 lines
15 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : COPRRP018
OBJETIVO : Ordenes de compras pendientes con las llegadas del
material a planta por orden.
PROGRAMADOR : Ing. Juan F. Soto
FECHA REALIZACION : Noviembre, 1997.
DIRECTOR PROYECTO : JOSE ALFREDO PAULINO ALEJO
-------------------------------------------------------------------------------
}
GLOBALS "coprgb000.4gl"
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL coprrp018()
END MAIN
FUNCTION coprrp018()
DEFINE p_ordenes RECORD LIKE cotb00014.*,
movimientos RECORD LIKE iptb00006.*,
k_ordenes RECORD LIKE cotb00015.*,
orden SMALLINT
DEFINE p_num_oc INTEGER,
codigo CHAR(25),
salir CHAR(1)
DEFINE registros RECORD
cod_n LIKE cotb00025.cod_n,
cod_grupo LIKE cotb00025.cod_grupo,
cod_tipo LIKE cotb00025.cod_grupo,
cod_sec LIKE cotb00025.cod_grupo,
fecha_entrega DATE,
fecha_embarque DATE,
fecha DATE,
cantidad_o LIKE cotb00025.cantidad,
cantidad_r LIKE iptb00006.cantidad_2,
cod_sp LIKE cotb00014.cod_sp,
cod_sp_sec LIKE cotb00014.cod_sp,
tipo LIKE cotb00014.tipo,
fecha_p DATE
END RECORD
#WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM cofmrp018 FROM "cofmrp018"
DISPLAY FORM cofmrp018
# CALL pantalla()
DISPLAY "coprrp018" AT 4,3
DISPLAY "Ordenes de Compras Con Entradas" AT 6,24
# Desplega en la pantalla el tipo de papel que se debe utilizar para el reporte
LET tipo_papel = 1
CALL msgrp000(tipo_papel)
# Captura del rango de fecha para la impresion del reporte
INPUT BY NAME rango.*
BEFORE FIELD fech_fi
LET rango.fech_fi = TODAY
DISPLAY BY NAME rango.fech_fi
AFTER FIELD fech_in
IF rango.fech_in is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fech_in
END IF
AFTER FIELD fech_fi
IF rango.fech_fi is null THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fech_fi
END IF
AFTER INPUT
# Control interrupcion del programa
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
EXIT INPUT
END INPUT
# Hace un criterio de seleccion de las informaciones que el usuario
# quiera, los campos que se pueden listar son :
# tipo de la orden, numero de la orden, codigo del material
CONSTRUCT criterio ON a.num_oc,a.tipo,b.cod_sp,b.cod_sp_sec,a.cod_n,a.cod_grupo,
a.cod_tipo,a.cod_sec
FROM num_oc,tipo,cod_sp,cod_sp_sec,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
CALL seleccionarsalida() RETURNING r_output
CALL configureoutput(r_output) RETURNING HANDLER
START REPORT ordenar1 TO XML HANDLER HANDLER
# Busca Las Ordenes de Compras
LET selec =
"SELECT CONVERT(CHAR(10),b.fech_oc,103),b.tipo,b.num_oc,b.cod_sp,b.cod_sp_Sec,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cantidad,a.precio FROM cotb00014 b,cotb00015 a ",
"WHERE b.status_t is null AND b.cierre = 'N' AND ",
" (b.fech_oc BETWEEN ? AND ? ) AND (b.num_oc = a.num_oc AND ",
" b.tipo = a.tipo) AND ( ",criterio clipped," ) "
DISPLAY "<< Buscando Ordenes De Compras... Espere Por Favor >> " AT 17,14
PREPARE comando FROM selec
DECLARE busca CURSOR FOR comando
OPEN busca USING rango.fech_in,rango.fech_fi
DISPLAY " " AT 17,14
LET salir = "S"
WHILE salir != "N"
FETCH busca INTO p_ordenes.fech_oc,p_ordenes.tipo,p_ordenes.num_oc,p_ordenes.cod_sp,p_ordenes.cod_sp_sec,k_ordenes.cod_n,
k_ordenes.cod_grupo,k_ordenes.cod_tipo,k_ordenes.cod_sec,k_ordenes.cantidad,k_ordenes.precio
IF STATUS = NOTFOUND THEN
LET salir = "S"
EXIT WHILE
END IF
LET registros.cod_sp = p_ordenes.cod_sp
LET registros.cod_sp_sec = p_ordenes.cod_sp_sec
LET registros.fecha_p = p_ordenes.fech_oc
LET registros.cod_n = k_ordenes.cod_n
LET registros.cod_grupo = k_ordenes.cod_grupo
LET registros.cod_tipo = k_ordenes.cod_tipo
LET registros.cod_sec = k_ordenes.cod_sec
LET p_num_oc = p_ordenes.num_oc
LET registros.tipo = p_ordenes.tipo
LET registros.cantidad_o = k_ordenes.cantidad
LET codigo = NULL
LET codigo = registros.cod_n USING "&&&&&",registros.cod_grupo USING "&&&&&",
registros.cod_tipo USING "&&&&&",registros.cod_sec USING "&&&&&"
LET orden = 1
OUTPUT TO REPORT ordenar1(orden,p_num_oc,codigo,registros.*)
DISPLAY "<< Buscando Reportes De Entrada.. Espere Por Favor >> " AT 17,14
IF p_ordenes.tipo = "01" THEN
LET selec1 =
"SELECT CONVERT(char(10),a.fecha,103),a.cantidad_2,a.tipo FROM intb00006 a ",
"WHERE a.orden_compra = '",p_ordenes.num_oc," '"," AND a.tipo = '",
p_ordenes.tipo," '"," AND (a.cod_n = '",k_ordenes.cod_n," '",
" AND a.cod_grupo = '",k_ordenes.cod_grupo," '"," AND a.cod_tipo = '",
k_ordenes.cod_tipo," '"," AND a.cod_sec = '",k_ordenes.cod_sec," '",
" ) AND a.status_t is null "
END IF
IF p_ordenes.tipo = "02" THEN
LET selec1 =
"SELECT CONVERT(char(10),a.fecha,103),a.cantidad_2,a.tipo FROM iptb00006 a ",
"WHERE a.orden_compra = '",p_ordenes.num_oc," '"," AND a.tipo = '",
p_ordenes.tipo," '"," AND (a.cod_n = '",k_ordenes.cod_n," '",
" AND a.cod_grupo = '",k_ordenes.cod_grupo," '"," AND a.cod_tipo = '",
k_ordenes.cod_tipo," '"," AND a.cod_sec = '",k_ordenes.cod_sec," '",
" ) AND a.status_t is null "
END IF
IF p_ordenes.tipo = "03" THEN
LET selec1 =
"SELECT CONVERT(char(10),a.fecha,103),a.cantidad_2,a.tipo FROM irtb00006 a ",
"WHERE a.orden_compra = '",p_ordenes.num_oc," '"," AND a.tipo = '",
p_ordenes.tipo," '"," AND (a.cod_n = '",k_ordenes.cod_n," '",
" AND a.cod_grupo = '",k_ordenes.cod_grupo," '"," AND a.cod_tipo = '",
k_ordenes.cod_tipo," '"," AND a.cod_sec = '",k_ordenes.cod_sec," '",
" ) AND a.status_t is null "
END IF
IF p_ordenes.tipo = "04" THEN
LET selec1 =
"SELECT CONVERT(char(10),a.fecha,103),a.cantidad_2,a.tipo FROM istb00006 a ",
"WHERE a.orden_compra = '",p_ordenes.num_oc," '"," AND a.tipo = '",
p_ordenes.tipo," '"," AND (a.cod_n = '",k_ordenes.cod_n," '",
" AND a.cod_grupo = '",k_ordenes.cod_grupo," '"," AND a.cod_tipo = '",
k_ordenes.cod_tipo," '"," AND a.cod_sec = '",k_ordenes.cod_sec," '",
" ) AND a.status_t is null "
END IF
PREPARE comando2 FROM selec1
DECLARE busca2 CURSOR FOR comando2
FOREACH busca2 INTO movimientos.fecha,movimientos.cantidad_2,movimientos.tipo
LET p_num_oc = p_ordenes.num_oc
LET registros.cod_n = k_ordenes.cod_n
LET registros.cod_grupo = k_ordenes.cod_grupo
LET registros.cod_tipo = k_ordenes.cod_tipo
LET registros.cod_sec = k_ordenes.cod_sec
LET registros.fecha = movimientos.fecha
LET registros.cantidad_r = movimientos.cantidad_2
LET registros.tipo = movimientos.tipo
LET orden = 2
IF registros.cantidad_r IS NOT NULL THEN
OUTPUT TO REPORT ordenar1(orden,p_num_oc,codigo,registros.*)
END IF
END FOREACH
END WHILE
FINISH REPORT ordenar1
#RUN "type C:\\archivo > %USPRINT%"
END FUNCTION
# Rutina para la impresion de las ordenes
REPORT ordenar1(x_ord,x_num_oc,x_codigo,x)
DEFINE x RECORD
cod_n LIKE cotb00025.cod_n,
cod_grupo LIKE cotb00025.cod_grupo,
cod_tipo LIKE cotb00025.cod_grupo,
cod_sec LIKE cotb00025.cod_grupo,
fecha_entrega DATE,
fecha_embarque DATE,
fecha DATE,
cantidad_o LIKE cotb00025.cantidad,
cantidad_r LIKE iptb00006.cantidad_2,
cod_sp LIKE cotb00014.cod_sp,
cod_sp_sec LIKE cotb00014.cod_sp,
tipo LIKE cotb00014.tipo,
fecha_p DATE
END RECORD
DEFINE x_num_oc INTEGER,
x_codigo CHAR(25),
x_ord SMALLINT
# Bandera para la impresion del codigo una sola vez
DEFINE bandera CHAR(1)
DEFINE descrip CHAR(10)
DEFINE varia CHAR(12)
DEFINE total_rec,total_ord DECIMAL(14,3)
DEFINE doble_on CHAR(2)
DEFINE doble_off CHAR(2)
DEFINE negrillas_on CHAR(2)
DEFINE negrillas_off CHAR(2)
DEFINE comp_on CHAR(2)
DEFINE comp_off CHAR(2)
DEFINE doce CHAR(2)
DEFINE normal CHAR(2)
DEFINE hora CHAR(5),
descrip1,descripcion,nom_supli CHAR(30),
unidad CHAR(4)
OUTPUT
TOP MARGIN 0
LEFT MARGIN 0
BOTTOM MARGIN 2
PAGE LENGTH 100
ORDER BY x_num_oc,x_codigo,x_ord
FORMAT
PAGE HEADER
# Asignacion de los caracters ASCII para imprimir en las diferentes
# opciones
{ 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
LET l = (143 - LENGTH(p_companias.nombre CLIPPED))/2
# Encabezados del reporte con nombre de compania
PRINT COLUMN 1, comp_on,negrillas_on
PRINT COLUMN 1, "coprrp018",
COLUMN l, p_companias.nombre CLIPPED,
COLUMN 136, "Pag. ",pageno using "###"
PRINT COLUMN 49, " Sistema de Compras",
COLUMN 136, today using "dd/mm/yy"
PRINT COLUMN 49, " Ordenes de Compras Pendientes ",
COLUMN 139, hora
PRINT COLUMN 1, "Desde ",rango.fech_in using "dd/mm/yy",
" Hasta ",rango.fech_fi using "dd/mm/yy"
PRINT negrillas_off
BEFORE GROUP OF x_num_oc
# Validacion de la variable DESCRIP para imprimir la etiqueta que clasifica
# las ordenes
IF x.tipo = "01" THEN
LET descrip = "MAT. PRIMA"
END IF
IF x.tipo = "02" THEN
LET descrip = "PROD. TERM."
END IF
IF x.tipo = "03" THEN
LET descrip = "MISCELANEAS"
END IF
# Busqueda del nombre del suplidor e impresion del suplidor
SELECT a.nom_sp INTO nom_supli FROM cotb00001 a
WHERE a.cod_sp = x.cod_sp and a.cod_sp_sec = x.cod_sp_sec
PRINT
"------------------------------------------------------------------------------",
"--------------------------------------------------"
PRINT COLUMN 1, negrillas_on,
COLUMN 3, "Orden No.: ",x_num_oc using "######",
COLUMN 22, "Tipo: ",x.tipo,
COLUMN 20, "Suplidor: ",x.cod_sp USING "<<","-"," ",
COLUMN 31, x.cod_sp_sec USING "<<<<"," ",
COLUMN 35, nom_supli ," ",
COLUMN 66, "Fecha Pedido: ",x.fecha_p USING "dd/mm/yyyy",
negrillas_off
PRINT
"------------------------------------------------------------------------------",
"--------------------------------------------------"
#-----------------------------------------------------------------------
PRINT COLUMN 8, "Codigo",
COLUMN 20, "Descripcion",
COLUMN 87, "Ordenada",
COLUMN 104, "Recibida",
COLUMN 116, "Diferencia"
PRINT
"------------------------------------------------------------------------------",
"--------------------------------------------------"
# Aqui se controla por medio a una bandera si el codigo va a imprimirse una
# sola vez o varias veces
BEFORE GROUP OF x_codigo
LET total_ord = 0
LET total_rec = 0
SKIP 1 LINE
LET descripcion = NULL
LET unidad = NULL
IF x.tipo = "01" THEN
SELECT a.descrip_esp,a.unidad_med INTO descripcion,unidad
FROM intb00001 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
END IF
IF x.tipo = "02" THEN
SELECT a.descrip_esp,a.unidad_med INTO descripcion,unidad
FROM iptb00002 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
END IF
IF x.tipo = "03" THEN
SELECT a.descrip_esp,a.unidad_med INTO descripcion,unidad
FROM irtb00002 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
END IF
IF x.tipo = "04" THEN
SELECT a.descrip_esp,a.unidad_med INTO descripcion,unidad
FROM istb00002 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
END IF
PRINT COLUMN 8, x.cod_n USING "&&&&&","-",
x.cod_grupo USING "&&&&&","-",
x.cod_tipo USING "&&&&&","-",
x.cod_sec USING "&&&&&",
" ",descripcion CLIPPED," ",nombre_m CLIPPED," ",
descrip1 CLIPPED," ",unidad;
ON EVERY ROW
IF x_ord = 1 THEN
IF total_ord IS NULL THEN
LET total_ord = 0
END IF
PRINT COLUMN 79, x.cantidad_o USING "###,###,###.##"
LET total_ord = total_ord + x.cantidad_o
END IF
IF x_ord = 2 THEN
IF total_rec IS NULL THEN
LET total_rec = 0
END IF
PRINT COLUMN 55, x.fecha using "dd/mm/yyyy",
COLUMN 98, x.cantidad_r using "###,###,###.##"
LET total_rec = total_rec + x.cantidad_r
END IF
# Totaliza la cantidad pendiente de la orden
AFTER GROUP OF x_codigo
PRINT COLUMN 81,"--------------",
COLUMN 98,"--------------"
PRINT COLUMN 79,total_ord using "###,###,###.##",
COLUMN 98, total_rec using "###,###,###.##",
COLUMN 103, negrillas_on, total_ord - total_rec
USING "((((,(((,(((.##)",negrillas_off
ON LAST ROW
PRINT comp_off
END REPORT