Files
MBS/PROYECTOS/otrodir/alprmt006.4gl
T

2447 lines
90 KiB
Plaintext

{
-------------------------------------------------------------------------
PROGRAMA : ALPRMT006
OBJETIVO : Programa Captura Documento Movimiento:REPORTE ENTRADA
Nota: No utilice los PREPARE porque utilizaria todas las
tablas de los sistemas de inventarios.
PROGRAMADOR : Juan Fco. Soto (Johnny)
FECHA REALIZACION : Octubre 21,1993.
-------------------------------------------------------------------------
}
IMPORT util
SCHEMA smarmotech
GLOBALS
DEFINE cerrada CHAR(1) # Variable para actualizar el cierre de una orden
DEFINE total_cantidad,
porciento,
ordenada,
r_cantidad1,
r_cantidad,
mp_recibida,
is_recibida,
ip_recibida,
ir_recibida,
ih_recibida
DECIMAL(12, 3)
DEFINE
etiqueta CHAR(20),
selec, criterio, scodigo STRING,
opt CHAR(10),
recepTodas SMALLINT,
verdad1 BOOLEAN
DEFINE descrip_espa CHAR(100)
DEFINE fecha, p_fechas, fecha_c DATE
DEFINE ip_ultimo,
ir_ultimo,
ih_ultimo,
is_ultimo,
in_ultimo,
l,
bandera,
numero_msg
INTEGER
DEFINE documento DYNAMIC ARRAY OF INTEGER
DEFINE dia, idx, idx1, p_act, scr_l, cod_mov_ant SMALLINT
DEFINE primera, opc1, verdad, opc, estado_mov CHAR(1)
DEFINE unidad CHAR(4)
DEFINE inv1, inv2, inv3, inv4, inv5 CHAR(500)
DEFINE tipo1, tipo2, tipo3, tipo4, tipo5 CHAR(200)
DEFINE
tasa, precio_compra, recibida, f_cantidad, factor, cantidad, cantidad2
DECIMAL(12, 3),
descripcion_f CHAR(100),
nombre_m CHAR(20),
descrip CHAR(15),
USUARIOS, CLAVE, descripcion_bodega CHAR(50),
i, x2 INT,
xcod_mov SMALLINT,
xcantidad1, xcantidad2 DEC(12, 5)
DEFINE normal,
negrilla_on,
negrillas_of,
comp_on,
comp_off,
doce,
doble_on,
doble_off
CHAR(3)
DEFINE
cmd, imprime, copia CHAR(150),
archivo CHAR(80),
impresor, xcod_mov SMALLINT,
tmp_cantidad, num_doc_tmp DEC(12, 5)
DEFINE datos_gen RECORD
num_doc LIKE iptb00006.num_doc,
tipo CHAR(2),
orden_compra LIKE iptb00006.orden_compra,
cod_sp LIKE iptb00006.cod_sp,
cod_sp_sec LIKE iptb00006.cod_sp_sec,
conduce_no LIKE iptb00006.conduce_no,
tipo_recepcion_entrada INT,
num_cont VARCHAR(100),
fecha_recepcion_entrada DATE,
fact_no LIKE iptb00006.fact_no,
fecha LIKE iptb00006.fecha,
bodega LIKE iptb00006.bodega,
nom_sp LIKE cotb00001.nom_sp,
descrip_mov LIKE intb00005.descrip_mov
END RECORD
DEFINE
movi DYNAMIC ARRAY OF RECORD
cod_n LIKE iptb00006.cod_n,
cod_grupo LIKE iptb00006.cod_grupo,
cod_tipo LIKE iptb00006.cod_tipo,
cod_sec LIKE iptb00006.cod_sec,
cantidad_1 DECIMAL(12, 3),
cantidad_2 DECIMAL(12, 3),
cod_mov SMALLINT,
no_embarque CHAR(08),
pendiente DECIMAL(12, 3),
desglose CHAR(1),
descrip_esp VARCHAR(180)
END RECORD,
p_companias RECORD LIKE companias.*,
att DYNAMIC ARRAY OF RECORD
col1 STRING,
col2 STRING,
col3 STRING,
col4 STRING,
col5 STRING,
col6 STRING,
col7 STRING
END RECORD
DEFINE moviD RECORD
area, cod_n, cod_Grupo, cod_tipo, cod_sec, descripcion, observacion
STRING,
book VARCHAR(50),
tipos VARCHAR(50),
lado_1 DECIMAL(12, 5),
lado_2 DECIMAL(12, 5),
lado_3 DECIMAL(12, 5),
id_bodega, id_seccion1 INT,
d_seccion1 VARCHAR(50),
id_tramo1 INT,
d_tramo1 VARCHAR(50),
id_fila, id_pos INT,
id_producto VARCHAR(25),
tipo_material VARCHAR(30),
cantidad1, cantidad2, factor_conv DECIMAL(12, 5),
cod_mov INT,
control_transferencia_ubicaciones VARCHAR(2),
cod_mov_transferencia INT,
codigo STRING
END RECORD
DEFINE
movi10 DYNAMIC ARRAY OF RECORD
area, cod_n, cod_Grupo, cod_tipo, cod_sec INT,
descripcion, observacion STRING,
book VARCHAR(50),
tipos VARCHAR(50),
lado_1 DECIMAL(12, 5),
lado_2 DECIMAL(12, 5),
lado_3 DECIMAL(12, 5),
id_bodega, id_seccion1 INT,
d_seccion1 VARCHAR(50),
id_tramo1 INT,
d_tramo1 VARCHAR(50),
id_fila, id_pos INT,
id_producto VARCHAR(25),
tipo_material VARCHAR(30),
cantidad1, cantidad2, factor_conv DECIMAL(12, 5),
cod_mov INT,
de_seccion, de_tramo INT,
codigo STRING
END RECORD,
tmpnumero INT
DEFINE movi10Dest DYNAMIC ARRAY OF RECORD
area, cod_n, cod_Grupo, cod_tipo, cod_sec INT,
descripcion, observacion STRING,
book VARCHAR(50),
tipos VARCHAR(50),
lado_1 DECIMAL(12, 5),
lado_2 DECIMAL(12, 5),
lado_3 DECIMAL(12, 5),
id_bodega, id_seccion1 INT,
d_seccion1 VARCHAR(50),
id_tramo1 INT,
d_tramo1 VARCHAR(50),
id_fila, id_pos INT,
id_producto VARCHAR(25),
tipo_material VARCHAR(30),
cantidad1, cantidad2, factor_conv DECIMAL(12, 5),
cod_mov INT,
de_seccion, de_tramo INT,
codigo STRING
END RECORD
DEFINE kdatos DYNAMIC ARRAY OF RECORD
lado_2 DEC(8, 5),
lado_1 DEC(8, 5),
lado_3 DEC(8, 5),
cantidad FLOAT,
cantidad2 FLOAT,
tono VARCHAR(100),
calidad VARCHAR(100),
xobservacion VARCHAR(200),
id_producto CHAR(25),
seccion INT,
tramo INT
END RECORD
DEFINE container DECIMAL(12, 5)
END GLOBALS
MAIN
DEFINE fecha CHAR(8)
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL ARG_VAL(3) RETURNING impresor
CONNECT TO "smarmotech" USER usuarios USING clave
SELECT cod_seccion, cod_tramo, cod_fila, cod_pos, nombre
INTO moviD.id_seccion1,
moviD.id_tramo1,
moviD.id_fila,
moviD.id_pos,
p_companias.nombre
FROM companias
SELECT ISNULL(a.num_doc, 0)
INTO tmpnumero
FROM iptb00043 a
WHERE a.usuario = usuarios
IF tmpnumero = 0 THEN
LET tmpnumero = 1
INSERT INTO iptb00043(num_doc, usuario) VALUES(tmpnumero, usuarios)
ELSE
LET tmpnumero = tmpnumero + 1
UPDATE iptb00043
SET num_doc = tmpnumero, usuario = usuarios
WHERE usuario = usuarios
END IF
CLEAR SCREEN
OPTIONS ERROR LINE 24, FORM LINE 4, COMMENT LINE 22, PROMPT LINE 23
SELECT * INTO p_companias.* FROM companias
LET l = (80 - LENGTH(p_companias.nombre CLIPPED)) / 2
LET fecha = TODAY USING "dd/mm/yyyy"
OPEN FORM alfmmt006 FROM "alfmmt006"
DISPLAY FORM alfmmt006
MENU
ON ACTION nuevo
CALL inpcad006()
ON ACTION buscar
CALL inpcmf006()
ON ACTION salir
EXIT MENU
END MENU
END MAIN
FUNCTION inpcad006()
# WHENEVER ERROR CONTINUE
LET int_flag = FALSE
INITIALIZE datos_gen.* TO NULL
LET datos_gen.fecha = TODAY USING "dd/mm/yy"
LABEL otra_vez:
IF (OPC = "S" OR OPC = "s") OR opc IS NULL THEN
INITIALIZE datos_gen.* TO NULL
END IF
LET cerrada = "N"
LET total_cantidad = 0
LET is_ultimo = NULL
LET ir_ultimo = NULL
LET ip_ultimo = NULL
LET ih_ultimo = NULL
LET in_ultimo = NULL
DIALOG ATTRIBUTES(UNBUFFERED)
# Captura de informacion del reporte de entrada
INPUT BY NAME datos_gen.tipo,
datos_gen.orden_compra,
datos_gen.conduce_no,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fact_no,
datos_Gen.bodega,
datos_Gen.fecha,
recepTodas,
datos_gen.fecha_recepcion_entrada
ATTRIBUTE(WITHOUT DEFAULTS)
ON ACTION Procesar INFIELD recepTodas
NEXT FIELD cod_b
BEFORE INPUT
CALL bodegas('1')
CALL tipoorden()
SELECT a.bodega
INTO datos_gen.bodega
FROM seg0001 a
WHERE a.usuario = usuarios
LET datos_gen.fecha = TODAY
DISPLAY BY NAME datos_gen.bodega, datos_gen.fecha
LET is_ultimo = datos_gen.num_doc
LET ir_ultimo = datos_gen.num_doc
LET ip_ultimo = datos_gen.num_doc
LET ih_ultimo = datos_gen.num_doc
LET in_ultimo = datos_gen.num_doc
# PREPARACION INSTRUCCIONES PARA EL INSERT AL DESGLOSE
LET selec =
"INSERT INTO iptb00052 (cod_n,cod_grupo,cod_tipo,cod_Sec,tipo_material,cantidad_minima,us_crea,fech_crea,
cantidadorden,num_doc,cod_mov,fecha,bookmatch,tipos)
SELECT cod_n,cod_grupo,cod_tipo,cod_Sec,tipo_material,cantidad_minima,
us_crea,fech_crea,cantidadorden,?,cod_mov,fecha,bookmatch,tipos
FROM tmpdesglose_master
WHERE num_doc = ? AND cod_mov = ? AND us_crea = ? AND
cod_n = ? AND cod_grupo = ? AND
cod_tipo = ? AND cod_sec = ?
"
PREPARE inst1 FROM selec
LET selec =
"INSERT INTO iptb00050 (cod_n,cod_grupo,cod_tipo,cod_Sec,imagen,observacion,
lado_1,lado_2,lado_3,cantidad,
nombre_file,us_crea,fech_crea,id_producto,
cantidad2,cod_bodega,cod_seccion,cod_tramo,tono,calidad,num_doc,cod_mov)
SELECT cod_n,cod_grupo,cod_tipo,cod_Sec,imagen,observacion,
lado_1,lado_2,lado_3,cantidad,
nombre_file,us_crea,fech_crea,id_producto,
cantidad2,cod_bodega,cod_seccion,cod_tramo,tono,calidad,?,cod_mov
FROM tmpdesglose
WHERE num_doc = ? AND cod_mov = ? AND us_crea = ? AND
cod_n = ? AND cod_grupo = ? AND
cod_tipo = ? AND cod_sec = ?
"
PREPARE inst2 FROM selec
NEXT FIELD tipo
AFTER FIELD fecha
IF datos_gen.fecha IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fecha
END IF
IF datos_gen.fecha > TODAY THEN
LET numero_msg = 160
CALL msg(numero_msg)
NEXT FIELD fecha
END IF
LET p_fechas = datos_gen.fecha USING "ddmmyy"
SELECT MIN(fecha_corte)
INTO fecha_c
FROM prdtable
WHERE fecha_corte >= p_fechas
IF STATUS = NOTFOUND THEN
LET numero_msg = 58
CALL msg(numero_msg)
RETURN
END IF
LET dia = 0
SELECT MIN(dias_gracia)
INTO dia
FROM prdtable
WHERE fecha_corte = fecha_c
IF dia IS NULL THEN
LET dia = 0
END IF
SELECT a.usuario FROM seg0003 a WHERE a.usuario = USUARIOS
IF STATUS != NOTFOUND THEN
LET fecha_c = fecha_c + dia
END IF
{ LET datos_gen.bodega = 1
DISPLAY BY NAME datos_gen.bodega ATTRIBUTE (CYAN)
LET datos_gen.fecha = today
DISPLAY BY NAME datos_gen.fecha ATTRIBUTE (CYAN)}
IF fecha_c < TODAY THEN
LET numero_msg = 57
CALL msg(numero_msg)
NEXT FIELD fecha
END IF
AFTER FIELD bodega
IF datos_gen.bodega IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD bodega
END IF
LET descripcion_bodega = NULL
SELECT UNIQUE a.usuario, b.descripcion
INTO descripcion_bodega
FROM iptb00048 a, intb00009 b
WHERE a.bodega = datos_gen.bodega
AND a.usuario = usuarios
AND a.bodega = b.cod_bodega
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage(
"ERROR",
"USTED NO TIENE PERMISOS PARA UTILIZAR BODEGA",
"INFO")
END IF
AFTER FIELD orden_compra
# Verifica que la orden de compra este en el archivo y
# ademas obliga a que el usuario tenga que digitar este campo
IF datos_gen.orden_compra IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD orden_compra
ELSE
SELECT a.cod_sp, a.cod_sp_sec, a.cierre
INTO datos_gen.cod_sp, datos_gen.cod_sp_sec, cerrada
FROM cotb00014 a
WHERE a.tipo = datos_gen.tipo
AND a.num_oc = datos_gen.orden_compra
AND a.status_t IS NULL
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD tipo
END IF
SELECT UNIQUE nom_sp
INTO datos_gen.nom_sp
FROM cotb00001
WHERE cod_sp = datos_gen.cod_sp
AND cod_sp_sec = datos_gen.cod_sp_sec
AND status_t IS NULL
DISPLAY BY NAME datos_gen.nom_sp,
datos_gen.cod_sp,
datos_gen.cod_sp_sec
ATTRIBUTE(CYAN)
END IF
IF cerrada = "S" THEN
CALL fgl_winmessage(
"ERROR",
"ORDEN CERRADA, NO PUEDES RECIBIR MERCANCIAS",
"INFO")
NEXT FIELD orden_compra
END IF
IF cerrada IS NULL THEN
LET cerrada = "N"
END IF
AFTER FIELD fact_no
# Verifica que el numero de la factura no se repita con el mismo numero de
# documento.
IF datos_gen.conduce_no IS NULL
AND datos_gen.fact_no IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD conduce_no
END IF
IF datos_gen.conduce_no IS NOT NULL
AND datos_gen.fact_no IS NOT NULL THEN
LET numero_msg = 29
CALL msg(numero_msg)
NEXT FIELD conduce_no
END IF
AFTER INPUT
# Chequea que el conduce y la factura no este en blanco
IF datos_gen.conduce_no IS NULL
AND datos_gen.fact_no IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD conduce_no
END IF
# bodegas
IF datos_gen.bodega IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD bodega
END IF
LET descripcion_bodega = NULL
SELECT UNIQUE a.usuario
FROM iptb00048 a
WHERE a.bodega = datos_gen.bodega AND a.usuario = usuarios
IF STATUS = NOTFOUND THEN
CALL fgl_winmessage(
"ERROR",
"USTED NO TIENE PERMISOS PARA UTILIZAR BODEGA",
"INFO")
NEXT FIELD bodega
END IF
IF movi.getLength() <= 1 THEN
DECLARE locales CURSOR FOR
SELECT a.cod_n,
a.cod_grupo,
a.cod_tipo,
a.cod_sec,
a.cantidad,
'0',
a.cod_n,
" ",
a.cod_n,
b.desglose,
b.descrip_esp
FROM cotb00015 a
LEFT OUTER
JOIN iptb00002 b
ON 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
WHERE a.tipo = datos_gen.tipo
AND a.num_oc = datos_gen.orden_compra
ORDER BY 1, 2, 3, 4, 8
LET idx = 1
FOREACH locales INTO movi[idx].*
IF idx = 1 THEN
IF datos_gen.tipo = "01" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM intb00001
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
IF datos_gen.tipo = "02" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM iptb00002
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
IF datos_gen.tipo = "04" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM istb00002
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
LET descripcion_f =
descrip_espa CLIPPED, " ", unidad CLIPPED
DISPLAY BY NAME descripcion_f ATTRIBUTE(CYAN)
END IF
IF datos_gen.tipo = "01" THEN
SELECT SUM(a.cantidad_2)
INTO recibida
FROM intb00006 a
WHERE (a.orden_compra = datos_gen.orden_compra)
AND (a.cod_n = movi[idx].cod_n)
AND (a.cod_grupo = movi[idx].cod_grupo)
AND (a.cod_tipo = movi[idx].cod_tipo)
AND (a.cod_sec = movi[idx].cod_sec)
AND a.status_t IS NULL
LET movi[idx].cod_mov = 34
END IF
IF datos_gen.tipo = "02" THEN
SELECT SUM(a.cantidad_2)
INTO recibida
FROM iptb00006 a
WHERE (a.orden_compra = datos_gen.orden_compra)
AND (a.cod_n = movi[idx].cod_n)
AND (a.cod_grupo = movi[idx].cod_grupo)
AND (a.cod_tipo = movi[idx].cod_tipo)
AND (a.cod_sec = movi[idx].cod_sec)
AND a.status_t IS NULL
LET movi[idx].cod_mov = 10
SELECT a.status_mov
INTO estado_mov
FROM iptb00005 a
WHERE a.cod_mov = movi[idx].cod_mov
END IF
IF recibida IS NULL THEN
LET recibida = 0
END IF
# LET movi[idx].cod_mov = null
# LET movi[idx].cantidad_2 = null
LET movi[idx].pendiente =
movi[idx].cantidad_1 - recibida
LET idx = idx + 1
END FOREACH
END IF
DISPLAY "recepcion ", recepTodas
IF recepTodas = 1 THEN
FOR idx = 1 TO movi.getLength()
LET movi[idx].cantidad_2 = movi[idx].cantidad_1
IF datos_gen.tipo = "01" THEN
LET movi[idx].cod_mov = 34
LET xcod_mov = movi[idx].cod_mov
END IF
IF datos_gen.tipo = "02" THEN
LET movi[idx].cod_mov = 10
LET xcod_mov = movi[idx].cod_mov
LET movi10Dest[idx].area = 1
LET movi10Dest[idx].cod_n = movi[idx].cod_n
LET movi10Dest[idx].cod_grupo = movi[idx].cod_grupo
LET movi10Dest[idx].cod_tipo = movi[idx].cod_tipo
LET movi10Dest[idx].cod_Sec = movi[idx].cod_sec
LET movi10Dest[idx].cantidad1 = movi[idx].cantidad_1
LET movi10Dest[idx].cantidad2 = movi[idx].cantidad_2
LET movi10Dest[idx].cod_mov = movi[idx].cod_mov
LET movi10Dest[idx].id_bodega = datos_gen.bodega
LET movi10Dest[idx].id_seccion1 = moviD.id_seccion1
LET movi10Dest[idx].id_tramo1 = moviD.id_tramo1
LET movi10Dest[idx].id_fila = moviD.id_fila
LET movi10Dest[idx].id_pos = moviD.id_pos
END IF
END FOR
CALL salvarData() RETURNING numero_msg, verdad1
IF NOT verdad1 THEN
CALL msg(numero_msg)
NEXT FIELD orden_compra
END IF
# CALL verificaCodigo() RETURNING verdad1
EXIT DIALOG
END IF
END INPUT
# Si las informaciones estan correctas cuando se digite el proximo documento
# busca la orden especificada
# CAPTURA ARREGLO DE LOS CODIGOS DE MATERIA PRIMA
INPUT ARRAY movi FROM s_movi1.* ATTRIBUTE(WITHOUT DEFAULTS)
BEFORE INPUT
CALL DIALOG.setActionActive("delete", FALSE)
CALL dialog.setCellAttributes(att)
CALL verificaCodigo() RETURNING verdad1
BEFORE ROW
LET p_act = arr_curr()
LET scr_l = scr_line()
--ON ACTION test
--SET CONNECTION "SQL_C"
--CALL actExistencia(num_doc_tmp)
AFTER FIELD cod_Sec
IF movi[p_act].cantidad_1 IS NOT NULL
AND datos_gen.tipo = "02" THEN
SELECT a.factor_conv
INTO moviD.factor_conv
FROM iptb00001 a
WHERE a.cod_n = movi[p_act].cod_n
AND a.cod_grupo = movi[p_act].cod_grupo
AND a.cod_tipo = movi[p_act].cod_tipo
AND a.cod_sec = movi[p_act].cod_sec
LET moviD.cod_n = movi[p_act].cod_n
LET moviD.cod_grupo = movi[p_act].cod_grupo
LET moviD.cod_tipo = movi[p_act].cod_tipo
LET moviD.cod_sec = movi[p_act].cod_sec
# AREA FIJA 1: DEBE COINCIDIR CON EL AREA DEL MOVIMIENTO EN
# iptb00006/iptb00062 PARA QUE EL JSON DEL SP MATCHEE.
LET moviD.area = 1
LET moviD.descripcion = descripcion_f
LET moviD.id_bodega = datos_gen.bodega
LET moviD.cod_mov = movi[p_act].cod_mov
LET moviD.cantidad1 =
movi[p_act].cantidad_1 / moviD.factor_conv
#LET moviD.cantidad2 = movi[p_act].cantidad_2
LET scodigo =
1 USING "<<<",
"-",
movi[p_act].cod_n USING "<<<<",
"-",
movi[p_act].cod_grupo USING "<<<<<",
"-",
movi[p_act].cod_tipo USING "<<<<<<",
"-",
movi[p_act].cod_sec USING "<<<<<<",
"-"
LET idx = movi10Dest.search("codigo", scodigo)
#CALL movi10Dest.deleteElement(idx)
CALL insertaUbicacion(
moviD.*, tmpnumero)
RETURNING container,
movi[p_act].cantidad_2,
tmpnumero,
movi10
# SI EL USUARIO SALIO DE LA VENTANA DE UBICACION SIN GUARDAR
# (ESC/int_flag), movi10 REGRESA VACIO: NO CONTINUAR COMO SI
# EL ITEM TUVIERA UBICACION.
IF movi10.getLength() = 0 THEN
LET numero_msg = 1668
CALL msg(numero_msg)
NEXT FIELD cod_sec
END IF
# ELIMINAR LAS UBICACIONES ANTERIORES DE ESTE ITEM ANTES DE
# AGREGAR LAS NUEVAS, PARA NO DUPLICAR EN movi10Dest.
CALL eliminaUbicacionesItem(
movi[p_act].cod_n,
movi[p_act].cod_grupo,
movi[p_act].cod_tipo,
movi[p_act].cod_sec)
CALL adicionaArray()
LET att[p_act].col6 = 'green reverse'
END IF
AFTER FIELD cantidad_2
# Verifica que la cantidad recibida mas las que se han recibida de
# la orden no exceda de un 10% de la cantidad total de la orden
IF movi[p_act].cantidad_2 IS NOT NULL THEN
IF movi[p_act].cantidad_2 < 0 THEN
LET movi[p_act].cantidad_2 = 0
END IF
IF datos_gen.tipo = "01" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM intb00001
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
IF datos_gen.tipo = "02" THEN
CALL verificaCodigo() RETURNING verdad1
IF movi[p_act].desglose = 'S' THEN
LET xcod_mov = movi[p_act].cod_mov
CALL fotos(
movi[p_act].cod_n,
movi[p_act].cod_grupo,
movi[p_act].cod_tipo,
movi[p_act].cod_sec,
movi[p_act].descrip_esp,
USUARIOS,
TRUE,
movi[p_act].cantidad_2,
tmpnumero,
movid.cod_mov,
datos_gen.bodega,
estado_mov)
RETURNING xcantidad2, xcantidad1
IF xcantidad2 > 0 THEN
LET movi[p_act].cantidad_2 = xcantidad2
END IF
# IF xcantidad1 > 0 THEN
# LET movi[p_act].cantidad_1=xcantidad1
# END IF
IF movi[p_act].cantidad_2 <> xcantidad2 THEN
CALL msg(46)
NEXT FIELD cantidad_1
END IF
END IF
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM iptb00002
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
IF datos_gen.tipo = "04" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM istb00002
WHERE cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
END IF
LET descripcion_f =
descrip_espa CLIPPED, " ", unidad CLIPPED
LET recibida = 0
IF datos_gen.tipo = "01" THEN
SELECT SUM(cantidad_2)
INTO recibida
FROM intb00006
WHERE orden_compra = datos_gen.orden_compra
AND cod_n = movi[p_act].cod_n
AND cod_grupo = movi[p_act].cod_grupo
AND cod_tipo = movi[p_act].cod_tipo
AND cod_sec = movi[p_act].cod_sec
AND status_t IS NULL
END IF
IF datos_gen.tipo = "02" THEN
SELECT ISNULL(SUM(cantidad_2), 0)
INTO recibida
FROM iptb00006
WHERE orden_compra = datos_gen.orden_compra
AND cod_n = movi[p_act].cod_n
AND cod_grupo = movi[p_act].cod_grupo
AND cod_tipo = movi[p_act].cod_tipo
AND cod_sec = movi[p_act].cod_sec
AND status_t IS NULL
END IF
SELECT SUM(cantidad)
INTO ordenada
FROM cotb00015
WHERE num_oc = datos_gen.orden_compra
AND tipo = datos_gen.tipo
AND cod_n = movi[p_act].cod_n
AND cod_grupo = movi[p_act].cod_grupo
AND cod_tipo = movi[p_act].cod_tipo
AND cod_sec = movi[p_act].cod_sec
AND status_t IS NULL
IF recibida IS NULL THEN
LET recibida = 0
END IF
IF ordenada IS NULL THEN
LET ordenada = 0
END IF
LET porciento = ordenada * 0.10 --4.536
IF movi[p_act].cantidad_2 IS NOT NULL THEN
LET recibida = recibida + movi[p_act].cantidad_2
END IF
LET r_cantidad = ordenada + porciento
IF recibida > (movi[p_act].cantidad_1 * 1.10) THEN
DISPLAY "Recibida: ", recibida
DISPLAY "Cantidad devuelta?:",
(movi[p_act].cantidad_1 * 1.10)
LET numero_msg = 28
CALL msg(numero_msg)
NEXT FIELD cantidad_2
END IF
END IF
AFTER FIELD cod_mov
LET p_act = arr_curr()
IF movi[p_act].cantidad_2 IS NOT NULL THEN
IF movi[p_act].cod_mov IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD cod_mov
END IF
LET xcod_mov = movi[p_act].cod_mov
# Busqueda en la tabla movimientos de productos terminados
IF datos_gen.tipo = "01" THEN
LET etiqueta = "MATERIAS PRIMAS"
SELECT a.descrip_mov
INTO datos_gen.descrip_mov
FROM intb00005 a
WHERE a.cod_mov = movi[p_act].cod_mov
AND a.status_t IS NULL
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD cod_mov
END IF
END IF
IF datos_gen.tipo = "02" THEN
LET etiqueta = "PROD. TERMINADOS"
SELECT a.descrip_mov
INTO datos_gen.descrip_mov
FROM iptb00005 a
WHERE a.cod_mov = movi[p_act].cod_mov
AND a.status_t IS NULL
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD cod_mov
END IF
IF primera = "S" THEN
LET primera = "N"
# Mismo calculo que en salvarData: la secuencia se
# ancla al maximo real usado y NUNCA retrocede.
LET datos_gen.num_doc =
proximaSecuenciaIP(movi[p_act].cod_mov, datos_gen.bodega)
LET ip_ultimo = datos_gen.num_doc
LET documento[p_act] = datos_gen.num_doc
SELECT UNIQUE num_doc
FROM iptb00006
WHERE num_doc = datos_gen.num_doc
AND cod_mov = movi[p_act].cod_mov
AND bodega = datos_gen.bodega
IF STATUS != NOTFOUND THEN
LET numero_msg = 128
CALL msg(numero_msg)
RETURN
END IF
END IF
END IF
# Busqueda del ultimo numero del reporte de entrada de Producto Terminados
DISPLAY BY NAME datos_gen.num_doc, datos_gen.descrip_mov
ATTRIBUTE(CYAN)
END IF
ON ACTION guardar ATTRIBUTE(TEXT = "Salvar", IMAGE = "save")
CALL salvarData() RETURNING numero_msg, verdad1
IF NOT verdad1 THEN
CALL msg(numero_msg)
END IF
END INPUT
ON ACTION CANCEL ATTRIBUTE(TEXT = "Cancelar", IMAGE = "quick")
DELETE FROM tmpdesglose_master
WHERE num_Doc = tmpnumero
AND cod_mov = xcod_mov
AND us_crea = usuarios
DELETE FROM tmpdesglose
WHERE num_Doc = tmpnumero
AND cod_mov = xcod_mov
AND us_crea = usuarios
EXIT PROGRAM
END DIALOG
# Actualiza la tabla de ordenes para cerrarla si la variable cerrada = "S"
END FUNCTION
{
----------------------------------------------------------------------------
PROGRAMA : PRD
OBJETIVO : Controlar las operaciones que se hagan anterior a una fecha
de corte.
REALIZADO POR : Ing. Juan Fco. Soto.
FECHA : Noviembre 4, 1992.
---------------------------------------------------------------------------
}
FUNCTION prd(p_fechas)
DEFINE p_fechas CHAR(6)
DEFINE comp_fech, comp_fech1 DATE
DEFINE mes_control CHAR(2)
DEFINE mes_calc SMALLINT
DEFINE fecha_c CHAR(6)
DEFINE c_ano, a_ano CHAR(4)
LET a_ano = YEAR(p_fechas)
LET mes_control = MONTH(TODAY)
LET mes_calc = mes_control
IF mes_calc = 01 THEN
LET mes_calc = 13
LET a_ano = YEAR(TODAY - 32)
END IF
LET mes_calc = mes_calc - 2
IF mes_calc <= 0 THEN
LET mes_calc = 12
LET a_ano = YEAR(TODAY) - 1
END IF
LET c_ano = YEAR(TODAY)
{IF a_ano != c_ano THEN
LET numero_msg = 59
CALL msg(numero_msg)
LET bandera = 1
RETURN
END IF}
SELECT fecha_corte
INTO fecha_c
FROM prdtable
WHERE mes = mes_calc AND ano = a_ano
IF STATUS = NOTFOUND THEN
LET numero_msg = 58
CALL msg(numero_msg)
LET bandera = 1
END IF
LET comp_fech1 = fecha_c
LET comp_fech = p_fechas
{
IF comp_fech < comp_fech1 THEN
LET numero_msg = 57
CALL msg(numero_msg)
LET bandera = 1
END IF
}
END FUNCTION
{
Esta funcion se utiliza para desplegar mensajes de errores en todos
los sistemas de Ray-O-Vac Dominicana.
Esta funcion busca el mensaje deseado en la tabla "msgtable" y lo
despliega en la linea de mensajes
}
FUNCTION msg(numero_msg)
DEFINE numero_msg SMALLINT
DEFINE descripcion CHAR(60)
SELECT desc_msg INTO descripcion FROM msgtable WHERE cod_msg = numero_msg
IF STATUS = NOTFOUND THEN
LET numero_msg = 22
SELECT desc_msg
INTO descripcion
FROM msgtable
WHERE cod_msg = numero_msg
ERROR descripcion ATTRIBUTE(BOLD)
ELSE
ERROR descripcion ATTRIBUTE(BOLD)
LET numero_msg = 0
END IF
END FUNCTION
FUNCTION integridad()
IF sqlca.sqlcode < 0 THEN
LET numero_msg = sqlca.sqlcode
CALL msg(numero_msg)
DISPLAY numero_msg AT 23, 70
LET bandera = 1
SLEEP 2
RETURN
END IF
END FUNCTION
FUNCTION no_existe()
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
LET verdad = "S"
END IF
CALL integridad()
END FUNCTION
REPORT entrada_imp(x, z)
DEFINE x RECORD
num_doc LIKE iptb00006.num_doc,
tipo CHAR(2),
orden_compra LIKE iptb00006.orden_compra,
cod_sp LIKE iptb00006.cod_sp,
cod_sp_sec LIKE iptb00006.cod_sp_sec,
conduce_no LIKE iptb00006.conduce_no,
tipo_recepcion_entrada TINYINT,
num_cont INT,
fech_recep_carga DATE,
fact_no LIKE iptb00006.fact_no,
fecha LIKE iptb00006.fecha,
bodega LIKE iptb00006.bodega,
nom_sp LIKE cotb00001.nom_sp,
descrip_mov LIKE intb00005.descrip_mov
END RECORD
DEFINE z RECORD
cod_n LIKE iptb00006.cod_n,
cod_grupo LIKE iptb00006.cod_grupo,
cod_tipo LIKE iptb00006.cod_tipo,
cod_sec LIKE iptb00006.cod_sec,
cantidad_1 LIKE iptb00006.cantidad_1,
cantidad_2 LIKE iptb00006.cantidad_2,
cod_mov SMALLINT,
no_embarque CHAR(8),
pendiente DECIMAL(12, 3),
desglose CHAR(1),
descrip_esp VARCHAR(180)
END RECORD
DEFINE etiq, unidad CHAR(20)
DEFINE recibida1 DECIMAL(12, 3)
DEFINE l SMALLINT
DEFINE comp_on,
comp_off,
doce,
normal,
negras_of,
negras_on,
doble_on,
doble_of
CHAR(2)
OUTPUT
TOP MARGIN 0
BOTTOM MARGIN 0
LEFT MARGIN 0
FORMAT
#BEFORE GROUP OF doc
PAGE HEADER
LET comp_on = ASCII 15
LET comp_off = ASCII 18
LET negras_on = ASCII 27, ASCII 69
LET negras_of = ASCII 27, ASCII 70
LET doble_on = ASCII 14
LET doble_of = ASCII 20
LET normal = ASCII 27, ASCII 80
LET doce = ASCII 27, ASCII 77
PRINT normal
PRINT COLUMN 1,
negras_on,
doble_on,
comp_on,
COLUMN 1,
p_companias.nombre CLIPPED,
" RNC. ",
p_companias.rnc CLIPPED,
doble_of,
negras_of
PRINT COLUMN 58, "REPORTE DE ENTRADA"
LET etiq = etiqueta CLIPPED
LET l = (80 - LENGTH(etiq)) / 2
PRINT COLUMN 58, "No.", doble_on, datos_gen.num_doc USING "&&&&&&"
LET l = (80 - LENGTH(datos_gen.descrip_mov)) / 2
PRINT COLUMN l,
negras_on,
"(",
z.cod_mov USING "<<<",
")",
datos_gen.descrip_mov,
negras_of
PRINT comp_on
SELECT a.descripcion
INTO descripcion_bodega
FROM intb00009 a
WHERE a.cod_bodega = datos_gen.bodega
SKIP 1 LINE
PRINT COLUMN 1,
"Fecha : ",
datos_gen.fecha USING "dd/mm/yy",
COLUMN 49,
"Orden de Compra: ",
datos_gen.tipo,
"-",
datos_gen.orden_compra USING "&&&&&&"
PRINT COLUMN 1,
"Proveedor : ",
datos_gen.cod_sp USING "&&",
"-",
datos_gen.cod_sp_sec USING "&&&&",
" ",
datos_gen.nom_sp[1, 30]
PRINT COLUMN 1,
"Conduce : ",
datos_gen.conduce_no CLIPPED,
COLUMN 49,
"Factura : ",
datos_gen.fact_no CLIPPED
PRINT COLUMN 1,
"BODEGA : (",
datos_gen.bodega USING "<<<",
")",
descripcion_bodega
PRINT COLUMN 1,
"=====================================================",
"==========================="
PRINT COLUMN 1,
doce,
COLUMN 23,
"CANTIDAD",
COLUMN 38,
"CANTIDAD",
COLUMN 53,
"CANTIDAD"
PRINT COLUMN 1,
"CODIGO",
COLUMN 21,
"ORDENADA",
COLUMN 36,
"RECIBIDA",
COLUMN 51,
"PENDIENTE",
COLUMN 71,
"D E S C R I P C I O N"
PRINT COLUMN 36, "EN DOCUM.", COLUMN 51, "ORDEN", normal
PRINT COLUMN 1,
"=====================================================",
"==========================="
PRINT doce
ON EVERY ROW
LET recibida1 = 0
LET descrip_espa = " "
IF x.tipo = 1 THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM intb00001
WHERE cod_n = z.cod_n
AND cod_grupo = z.cod_grupo
AND cod_tipo = z.cod_tipo
AND cod_sec = z.cod_sec
END IF
IF x.tipo = 2 THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM iptb00002
WHERE cod_n = z.cod_n
AND cod_grupo = z.cod_grupo
AND cod_tipo = z.cod_tipo
AND cod_sec = z.cod_sec
END IF
LET descripcion_f = descrip_espa CLIPPED, " ", unidad CLIPPED
PRINT COLUMN 1,
z.cod_n USING "&&&&",
"-",
z.cod_grupo USING "&&&&",
"-",
z.cod_tipo USING "&&&&",
"-",
z.cod_sec USING "&&&&",
COLUMN 20,
z.cantidad_1 USING "##,###,###.###",
COLUMN 37,
z.cantidad_2 USING "##,###,###.###",
COLUMN 53,
z.pendiente - z.cantidad_2 USING "---,---.###",
descripcion_f CLIPPED
#--------------------------- DESGLOSE ------------------------------------------
# IMPRESION DESGLOSE
SELECT DISTINCT a.num_doc
FROM iptb00052 a
WHERE a.num_doc = datos_gen.num_doc AND a.cod_mov = z.cod_mov
IF STATUS <> NOTFOUND THEN
PRINT COLUMN 10,
"------------------------------------- DESGLOSE -----------------------------------"
DECLARE busca_desglose CURSOR FOR
SELECT a.lado_1,
a.lado_2,
a.lado_3,
a.cantidad,
a.cantidad2,
a.tono,
a.calidad,
b.descripcion,
c.descripcion
FROM iptb00050 a, intb00010 b, intb00043 c
WHERE a.cod_n = z.cod_n
AND a.cod_grupo = z.cod_grupo
AND a.cod_tipo = z.cod_tipo
AND a.cod_sec = z.cod_sec
AND a.num_doc = datos_gen.num_doc
AND a.cod_mov = z.cod_mov
AND a.cod_seccion = b.cod_seccion
AND a.cod_bodega = x.bodega
AND a.cod_bodega = b.cod_bodega
AND a.cod_seccion = b.cod_seccion
AND a.cod_tramo = c.cod_tramo
AND b.cod_seccion = c.cod_seccion
AND b.cod_bodega = c.cod_bodega
LET i = 1
FOREACH busca_desglose
INTO kdatos[i].lado_1,
kdatos[i].lado_2,
kdatos[i].lado_3,
kdatos[i].cantidad,
kdatos[i].cantidad2,
kdatos[i].tono,
kdatos[i].calidad
PRINT COLUMN 10,
kdatos[i].lado_1,
2 SPACES,
kdatos[i].lado_2,
2 SPACES,
kdatos[i].lado_3,
2 SPACES,
kdatos[i].cantidad,
2 SPACES,
kdatos[i].cantidad2,
2 SPACES,
kdatos[i].tono,
2 SPACES,
kdatos[i].calidad
END FOREACH
PRINT COLUMN 10,
"----------------------------------------------------------------------------------"
END IF
PAGE TRAILER
PRINT normal
PRINT COLUMN 1, "OBSERVACION :"
PRINT COLUMN 1,
"--------------------------------------------------------------------------"
PRINT
SKIP 3 LINE
PRINT normal
END REPORT
FUNCTION inpcmf006()
DEFINE query_item CHAR(500)
INPUT BY NAME datos_gen.tipo
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
IF datos_Gen.tipo IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo
END IF
EXIT INPUT
END INPUT
# El ON (columnas) y el FROM (campos del formulario) deben tener la MISMA
# cantidad y estar pareados 1:1. Cada campo del FROM debe existir en
# alfmmt006.4fd. Se excluyen: cod_mov (solo esta en el detalle s_movi1) y
# cod_sp/cod_sp_sec (NOENTRY en el formulario). Antes fallaba porque
# 'fecha_contenedor_guia' no existe y ON(8)/FROM(9) estaban desbalanceados.
CONSTRUCT criterio
ON
a.num_doc,
a.orden_compra,
a.conduce_no,
a.fact_no,
a.tipo_recepcion_entrada,
a.num_contenedor_guia
FROM
num_Doc,
orden_compra,
conduce_no,
fact_no,
tipo_recepcion_entrada,
num_cont
BEFORE CONSTRUCT
CALL bodegas('1')
CALL tipoorden()
AFTER CONSTRUCT
IF INT_FLAG THEN
CALL msg(2)
LET INT_FLAG = FALSE
RETURN
END IF
END CONSTRUCT
IF datos_gen.tipo = '01' THEN
LET selec =
"SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ",
" a.fact_no,CONVERT(CHAR(10),a.fecha,103),a.bodega,b.nom_sp, a.tipo_recepcion_entrada, ",
" a.num_contenedor_guia, a.fecha_recepcion_carga ",
" FROM intb00006 a,cotb00001 b ",
" WHERE a.cod_sp = b.cod_sp and a.cod_sp_Sec = b.cod_sp_Sec and ",
criterio CLIPPED,
" AND a.status_t is null "
END IF
IF datos_gen.tipo = "02" THEN
LET selec =
" SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ",
"a.fact_no,a.fecha,a.bodega,b.nom_sp, a.tipo_recepcion_entrada, ",
" a.num_contenedor_guia, a.fecha_recepcion_carga ",
" FROM iptb00006 a,cotb00001 b ",
" WHERE a.cod_sp = b.cod_sp and a.cod_Sp_sec = b.cod_sp_sec ",
" and ",
criterio CLIPPED,
" AND a.status_t IS NULL"
DISPLAY SELEC
END IF
IF datos_gen.tipo = "04" THEN
LET selec =
" SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ",
"a.fact_no,a.fecha,a.bodega,b.nom_sp a.tipo_recepcion_entrada, ",
" a.num_contenedor_guia, a.fecha_recepcion_carga ",
" FROM istb00006 a,cotb00001 b ",
" WHERE a.cod_sp = b.cod_sp and a.cod_Sp_sec = b.cod_sp_sec ",
" and ",
criterio CLIPPED,
" AND a.status_t IS NULL"
END IF
PREPARE comando FROM selec
DECLARE busca_reporte SCROLL CURSOR FOR comando
OPEN busca_reporte
FETCH FIRST busca_reporte
INTO datos_gen.num_doc,
datos_Gen.tipo,
datos_gen.orden_compra,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
datos_gen.conduce_no,
datos_gen.fact_no,
datos_gen.fecha,
datos_gen.bodega,
datos_gen.nom_sp,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
RETURN
END IF
DISPLAY BY NAME datos_gen.*
MENU "NAVEGACION"
COMMAND "SIGUIENTE"
FETCH NEXT busca_reporte
INTO datos_gen.num_doc,
datos_Gen.tipo,
datos_gen.orden_compra,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
datos_gen.conduce_no,
datos_gen.fact_no,
datos_gen.fecha,
datos_gen.bodega,
datos_gen.nom_sp,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
END IF
COMMAND "ANTERIOR"
FETCH PREVIOUS busca_reporte
INTO datos_gen.num_doc,
datos_Gen.tipo,
datos_gen.orden_compra,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
datos_gen.conduce_no,
datos_gen.fact_no,
datos_gen.fecha,
datos_gen.bodega,
datos_gen.nom_sp,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
END IF
COMMAND "PRIMERO"
FETCH FIRST busca_reporte
INTO datos_gen.num_doc,
datos_Gen.tipo,
datos_gen.orden_compra,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
datos_gen.conduce_no,
datos_gen.fact_no,
datos_gen.fecha,
datos_gen.bodega,
datos_gen.nom_sp,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
END IF
COMMAND "ULTIMO"
FETCH LAST busca_reporte
INTO datos_gen.num_doc,
datos_Gen.tipo,
datos_gen.orden_compra,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
datos_gen.conduce_no,
datos_gen.fact_no,
datos_gen.fecha,
datos_gen.bodega,
datos_gen.nom_sp,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
END IF
COMMAND "ITEMS"
CALL defecto(
usuarios, clave, impresor)
RETURNING imprime,
negrilla_on,
negrillas_of,
doble_on,
doble_off,
comp_on,
comp_off,
doce,
normal,
archivo,
copia
START REPORT entrada_imp TO archivo
IF datos_Gen.tipo = '01' THEN
LET query_item =
" SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cod_mov,a.cantidad_1,",
"a.cantidad_2 FROM intb00006 a ",
"WHERE a.tipo = ",
datos_gen.tipo,
" AND a.orden_compra = '",
datos_gen.orden_compra USING "&&&&&&",
"' AND",
" a.num_doc = '",
datos_gen.num_doc USING "&&&&&&",
"' ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec"
ELSE
LET query_item =
" SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cod_mov,a.cantidad_1,",
"a.cantidad_2 FROM iptb00006 a ",
"WHERE a.tipo = ",
datos_gen.tipo,
" AND a.orden_compra = '",
datos_gen.orden_compra USING "&&&&&&",
"' AND",
" a.num_doc = '",
datos_gen.num_doc USING "&&&&&&",
"' ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec"
END IF
PREPARE comandoi FROM query_item
DECLARE busca_item CURSOR FOR comandoi
LET idx = 1
FOREACH busca_item
INTO movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec,
movi[idx].cod_mov,
movi[idx].cantidad_1,
movi[idx].cantidad_2
OUTPUT TO REPORT entrada_imp(datos_Gen.*, movi[idx].*)
LET idx = idx + 1
END FOREACH
FINISH REPORT entrada_imp
IF idx = 1 THEN
LET numero_msg = 3
CALL msg(numero_msg)
EXIT MENU
END IF
CALL set_count(idx - 1)
DISPLAY ARRAY movi TO s_movi1.*
AFTER ROW
LET p_act = arr_curr()
IF datos_gen.tipo = "01" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM intb00001
WHERE cod_n = movi[p_act].cod_n
AND cod_grupo = movi[p_act].cod_grupo
AND cod_tipo = movi[p_act].cod_tipo
AND cod_sec = movi[p_act].cod_sec
SELECT a.descrip_mov
INTO datos_gen.descrip_mov
FROM intb00005 a
WHERE a.cod_mov = movi[p_act].cod_mov
AND a.status_t IS NULL
END IF
IF datos_gen.tipo = "02" THEN
SELECT unidad_med, descrip_esp
INTO unidad, descrip_espa
FROM iptb00002
WHERE cod_n = movi[p_act].cod_n
AND cod_grupo = movi[p_act].cod_grupo
AND cod_tipo = movi[p_act].cod_tipo
AND cod_sec = movi[p_act].cod_sec
SELECT a.descrip_mov
INTO datos_gen.descrip_mov
FROM iptb00005 a
WHERE a.cod_mov = movi[p_act].cod_mov
AND a.status_t IS NULL
END IF
LET descripcion_f =
descrip_espa CLIPPED, " ", unidad CLIPPED
DISPLAY BY NAME descripcion_f, datos_gen.descrip_mov
AFTER DISPLAY
EXIT DISPLAY
END DISPLAY
IF idx > 1 THEN
LET opt =
fgl_winquestion(
"Atencion",
"Desea Imprimir este Documento?",
"cancel",
"YES|NO|",
"question",
0)
IF opt = "YES" THEN
RUN imprime
END IF
END IF
COMMAND "RETORNAR"
EXIT MENU
END MENU
END FUNCTION
FUNCTION adicionaArray()
DEFINE x1, current_length INT
LET current_length = movi10Dest.getLength()
FOR x1 = 1 TO movi10.getLength()
IF movi10[x1].cantidad2 > 0 THEN
# IF movi10[idx].id_seccion1 IS NOT NULL THEN
LET current_length = current_length + 1
LET movi10Dest[current_length].* = movi10[x1].*
# END IF
END IF
END FOR
END FUNCTION
{ELIMINA DE movi10Dest TODAS LAS UBICACIONES DE UN ITEM. SE USA ANTES DE
adicionaArray() PARA QUE UNA RECAPTURA DE UBICACION NO DUPLIQUE FILAS.
EN ESTE PROGRAMA EL AREA ES SIEMPRE 1, POR LO QUE NO SE FILTRA POR AREA.}
FUNCTION eliminaUbicacionesItem(pcod_n, pcod_grupo, pcod_tipo, pcod_sec)
DEFINE pcod_n, pcod_grupo, pcod_tipo, pcod_sec, x INTEGER
FOR x = movi10Dest.getLength() TO 1 STEP -1
IF movi10Dest[x].cod_n = pcod_n
AND movi10Dest[x].cod_grupo = pcod_grupo
AND movi10Dest[x].cod_tipo = pcod_tipo
AND movi10Dest[x].cod_sec = pcod_sec THEN
CALL movi10Dest.deleteElement(x)
END IF
END FOR
END FUNCTION
FUNCTION addUbicacion()
DEFINE flag BOOLEAN
LET flag = TRUE
FOR x2 = 1 TO movi10Dest.getLength()
IF movi10Dest[x2].cantidad2 > 0 THEN
IF movi10Dest[x2].id_seccion1 IS NOT NULL
AND movi10Dest[x2].cod_n IS NOT NULL
AND movi10Dest[x2].cod_Grupo IS NOT NULL
AND movi10Dest[x2].cod_tipo IS NOT NULL
AND movi10Dest[x2].cod_sec THEN
INSERT INTO iptb00062(
num_Doc,
cod_mov,
bodega,
cod_seccion,
cod_tramo,
cod_fila,
cod_pos,
area,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cantidad,
cantidad2,
us_crea,
fech_crea)
VALUES(datos_gen.num_doc,
movi[x2].cod_mov,
datos_gen.bodega,
movi10Dest[x2].id_seccion1,
movi10Dest[x2].id_tramo1,
movi10Dest[x2].id_fila,
movi10Dest[x2].id_pos,
movi10Dest[x2].area,
movi10Dest[x2].cod_n,
movi10Dest[x2].cod_Grupo,
movi10Dest[x2].cod_tipo,
movi10Dest[x2].cod_sec,
movi10Dest[x2].cantidad1,
movi10Dest[x2].cantidad2,
usuarios,
getdate())
IF STATUS = NOTFOUND THEN
CALL msg(-1321)
LET flag = FALSE
END IF
END IF
END IF
END FOR
END FUNCTION
FUNCTION verificaCodigo()
DEFINE verdad BOOLEAN
LET verdad = FALSE
FOR i = 1 TO movi.getLength()
LET att[i].col6 = 'red reverse'
IF movi[i].cantidad_2 > 0 THEN
FOR idx1 = 1 TO movi10Dest.getLength()
IF movi10Dest[idx1].cod_n = movi[i].cod_n
AND movi10Dest[idx1].cod_grupo = movi[i].cod_grupo
AND movi10Dest[idx1].cod_tipo = movi[i].cod_tipo
AND movi10Dest[idx1].cod_sec = movi[i].cod_sec THEN
LET att[i].col6 = 'green reverse'
LET verdad = TRUE
# ELSE
# DISPLAY "codigos: ",idx1,"-",movi10Dest[idx1].cod_grupo,"-",movi10Dest[idx1].cod_sec," NO LO ENCONTRE"
# LET att[idx].col6 = 'red reverse'
# LET verdad = FALSE
END IF
END FOR
END IF
END FOR
RETURN verdad
END FUNCTION
FUNCTION verificarUbicacion()
FOR idx1 = 1 TO movi.getLength()
IF movi[idx1].cantidad_2 = 0 OR movi[idx1].cantidad_1 IS NULL THEN
DISPLAY "borre: ", movi10dest[idx1].descripcion
CALL movi10dest.deleteElement(idx1)
END IF
END FOR
END FUNCTION
FUNCTION salvarData()
DEFINE
jsonUbic DYNAMIC ARRAY OF RECORD
area, cod_n, cod_Grupo, cod_tipo, cod_sec INT,
id_bodega, id_seccion1 INT,
id_tramo1 INT,
id_fila, id_pos INT,
cantidad1, cantidad2 DECIMAL(12, 5)
END RECORD,
jsonMovi STRING,
procedimiento STRING,
updExtra STRING,
out_result INT,
cod_mensaje INT,
out_cantidad_item DECIMAL(18, 5),
out_cantidad_ubicacion DECIMAL(18, 5),
out_msg VARCHAR(1000),
idxU, idxJSON INT,
detalle_re CHAR(60),
cherror STRING,
areaFija SMALLINT,
pcontrol_dep CHAR(5),
controlaCosto CHAR(2),
nullInt INT,
nullChar CHAR(10),
nullDec DECIMAL(18, 5)
INITIALIZE nullInt TO NULL
INITIALIZE nullChar TO NULL
INITIALIZE nullDec TO NULL
LET areaFija = 1
LET pcontrol_dep = "NO"
# EL REPORTE DE ENTRADA RECEPCIONA ORDENES DE COMPRA: ES NORMAL QUE
# EXISTAN ITEMS SIN COSTO DEFINIDO TODAVIA, POR LO QUE EL SP NO DEBE
# RECHAZARLOS (PARAMETRO OPCIONAL @controla_costo = 'NO').
LET controlaCosto = "NO"
LET total_cantidad = 0
FOR idx = 1 TO movi.getLength()
IF movi[idx].cantidad_2 IS NOT NULL THEN
DISPLAY "EN GUARDAR_3: ", movi[idx].*
LET total_cantidad = movi[idx].cantidad_2 + total_cantidad
END IF
END FOR
LET recibida = 0
LET ordenada = 0
DISPLAY "TOTAL CANTIDAD: ", total_cantidad
CALL defecto(
usuarios, clave, impresor)
RETURNING imprime,
negrilla_on,
negrillas_of,
doble_on,
doble_off,
comp_on,
comp_off,
doce,
normal,
archivo,
copia
START REPORT entrada_imp TO archivo
# Busca la cantidad recibida de la orden especificada
IF datos_gen.tipo = "01" THEN
SELECT SUM(cantidad_2)
INTO ip_recibida
FROM intb00006
WHERE orden_compra = datos_gen.orden_compra
AND tipo = datos_gen.tipo
AND status_t IS NULL
END IF
IF datos_gen.tipo = "02" THEN
SELECT SUM(cantidad_2)
INTO ip_recibida
FROM iptb00006
WHERE orden_compra = datos_gen.orden_compra
AND tipo = datos_gen.tipo
AND status_t IS NULL
# SECUENCIA POR (cod_mov, bodega). Se ancla al maximo real usado en
# iptb00006 (fuente de verdad) para que NUNCA retroceda aunque la fila
# de iptb00007 quede en un valor menor. Ver FUNCTION proximaSecuenciaIP.
LET datos_gen.num_doc = proximaSecuenciaIP(xcod_mov, datos_gen.bodega)
SELECT a.num_doc
INTO ip_ultimo
FROM iptb00007 a
WHERE a.cod_mov = xcod_mov AND a.bodega = datos_gen.bodega
IF status = NOTFOUND THEN
INSERT INTO iptb00007(
num_doc, cod_mov, bodega, us_crea, fech_crea)
VALUES(datos_gen.num_doc,
xcod_mov,
datos_gen.bodega,
usuarios,
GETDATE())
ELSE
# Guarda anti-retroceso: solo se actualiza si el nuevo numero es
# mayor al almacenado, para no pisar la secuencia hacia atras.
UPDATE iptb00007
SET num_doc = datos_gen.num_doc
WHERE cod_mov = xcod_mov AND bodega = datos_gen.bodega
AND num_doc < datos_gen.num_doc
END IF
END IF
IF datos_gen.tipo = "04" THEN
SELECT SUM(cantidad_2)
INTO ip_recibida
FROM istb00006
WHERE orden_compra = datos_gen.orden_compra
AND tipo = datos_gen.tipo
AND status_t IS NULL
END IF
LET recibida = ip_recibida
# Busca la cantidad ordenada de la orden especificada
SELECT SUM(a.cantidad)
INTO ordenada
FROM cotb00015 a
WHERE a.num_oc = datos_gen.orden_compra
AND a.tipo = datos_gen.tipo
AND a.status_t IS NULL
IF recibida IS NULL THEN
LET recibida = 0
END IF
IF ordenada IS NULL THEN
LET ordenada = 0
END IF
# Calculo de los porcentaje limites de las ordenes
LET porciento = ordenada * 0.10
LET recibida = recibida + total_cantidad
LET r_cantidad = ordenada # - porciento
LET r_cantidad1 = ordenada #+ porciento
# Si la cantidad recibida producto de la sumatoria y subtracion del 10%
# es mayor o igual a la cantidad recibida y menor o igual a la cantidad de
# la orden cierra la orden
IF recibida >= r_cantidad AND recibida <= r_cantidad1 THEN
LET cerrada = "S"
END IF
LET primera = "S"
# PREPARACION SP DE INVENTARIO (iptb00006 + iptb00062 EN UNA SOLA
# OPERACION VALIDADA) PARA PRODUCTOS TERMINADOS (TIPO 02).
LET procedimiento =
"EXEC sp_insert_inventario ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"
PREPARE smt_re FROM procedimiento
# EL SP NO MANEJA LAS COLUMNAS PROPIAS DE LA RECEPCION DE COMPRAS:
# SE COMPLEMENTAN CON UN UPDATE SOBRE LA FILA RECIEN INSERTADA.
LET updExtra =
"UPDATE iptb00006 SET orden_compra = ?, tipo = ?, ",
"fact_no = ?, ",
"tipo_recepcion_entrada = ?, num_contenedor_guia = ?, ",
"fecha_recepcion_carga = ? ",
"WHERE num_doc = ? AND cod_mov = ? AND bodega = ? ",
"AND cod_n = ? AND cod_grupo = ? AND cod_tipo = ? AND cod_sec = ? ",
"AND us_crea = ? AND status_t IS NULL"
PREPARE updcompra FROM updExtra
LET detalle_re =
"REPORTE DE ENTRADA OC ", datos_gen.orden_compra USING "<<<<<<&"
BEGIN WORK
IF datos_gen.tipo = "01" THEN
SELECT UNIQUE a.num_doc
INTO in_ultimo
FROM intb00023 a
WHERE a.cod_mov = xcod_mov AND bodega = datos_gen.bodega
IF STATUS = NOTFOUND THEN
LET datos_gen.num_doc = 1
INSERT INTO intb00023(
num_doc, cod_mov, us_crea, fech_crea, bodega)
VALUES(datos_gen.num_doc,
xcod_mov,
usuarios,
GETDATE(),
datos_gen.bodega)
END IF
LET in_ultimo = in_ultimo + 1
LET datos_gen.num_doc = in_ultimo
DISPLAY BY NAME datos_gen.num_doc
SELECT UNIQUE num_doc
FROM intb00006
WHERE num_doc = datos_gen.num_doc AND cod_mov = xcod_mov
IF STATUS != NOTFOUND THEN
LET numero_msg = 128
RETURN numero_msg, FALSE
END IF
TRY
UPDATE intb00023
SET num_doc = DATOS_GEN.num_doc
WHERE cod_mov = xcod_mov
CATCH
RETURN 1663, FALSE
END TRY
END IF
FOR idx = 1 TO movi.getLength()
IF movi[idx].cantidad_2 IS NOT NULL AND movi[idx].cantidad_2 > 0 THEN
IF datos_gen.tipo = "04" THEN
INSERT INTO istb00006(
num_doc,
fecha,
fact_no,
conduce_no,
orden_compra,
tipo,
cod_sp,
cod_sp_sec,
cod_mov,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cantidad_1,
cantidad_2,
bodega,
tipo_recepcion_entrada,
num_contenedor_guia,
fecha_recepcion_carga,
us_crea,
fech_crea)
VALUES(datos_gen.num_doc,
datos_gen.fecha,
datos_gen.fact_no,
datos_gen.conduce_no,
datos_gen.orden_compra,
datos_gen.tipo,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
movi[idx].cod_mov,
movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec,
movi[idx].cantidad_1,
movi[idx].cantidad_2,
datos_gen.bodega,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada,
usuarios,
GETDATE())
END IF
# Actualizacion de las tablas de Productos terminados
IF datos_gen.tipo = "02" THEN
DISPLAY "EN GUARDAR_4: ", movi[idx].*
{=========================================================
ARMAR EL JSON CON LAS UBICACIONES DEL ITEM DESDE
movi10Dest (CAPTURADAS EN insertaUbicacion O GENERADAS
POR LA RECEPCION TOTAL). EL SP INSERTA iptb00006 E
iptb00062 EN LA MISMA EJECUCION Y VALIDA CANTIDADES.
=========================================================}
CALL jsonUbic.clear()
LET idxJSON = 0
FOR idxU = 1 TO movi10Dest.getLength()
IF movi10Dest[idxU].cod_n = movi[idx].cod_n
AND movi10Dest[idxU].cod_grupo = movi[idx].cod_grupo
AND movi10Dest[idxU].cod_tipo = movi[idx].cod_tipo
AND movi10Dest[idxU].cod_sec = movi[idx].cod_sec
AND movi10Dest[idxU].cantidad2 > 0 THEN
LET idxJSON = idxJSON + 1
LET jsonUbic[idxJSON].area = 1
LET jsonUbic[idxJSON].cod_n = movi10Dest[idxU].cod_n
LET jsonUbic[idxJSON].cod_Grupo =
movi10Dest[idxU].cod_grupo
LET jsonUbic[idxJSON].cod_tipo =
movi10Dest[idxU].cod_tipo
LET jsonUbic[idxJSON].cod_sec = movi10Dest[idxU].cod_sec
LET jsonUbic[idxJSON].id_bodega = datos_gen.bodega
LET jsonUbic[idxJSON].id_seccion1 =
movi10Dest[idxU].id_seccion1
LET jsonUbic[idxJSON].id_tramo1 =
movi10Dest[idxU].id_tramo1
LET jsonUbic[idxJSON].id_fila = movi10Dest[idxU].id_fila
LET jsonUbic[idxJSON].id_pos = movi10Dest[idxU].id_pos
LET jsonUbic[idxJSON].cantidad1 =
movi10Dest[idxU].cantidad1
LET jsonUbic[idxJSON].cantidad2 =
movi10Dest[idxU].cantidad2
END IF
END FOR
IF idxJSON = 0 THEN
DISPLAY "SIN UBICACION PARA ITEM: ",
movi[idx].cod_n,
"-",
movi[idx].cod_grupo,
"-",
movi[idx].cod_tipo,
"-",
movi[idx].cod_sec
ROLLBACK WORK
LET numero_msg = 1668
RETURN numero_msg, FALSE
END IF
LET jsonMovi = util.JSON.stringify(jsonUbic)
DISPLAY "JSON ITEM: ", jsonMovi
INITIALIZE out_result TO NULL
INITIALIZE cod_mensaje TO NULL
INITIALIZE out_msg TO NULL
EXECUTE smt_re
USING nullInt IN, # num_oc: NULL, LA ORDEN DE COMPRA
# NO ES ORDEN DE PRODUCCION (prtb00013);
# SE GRABA EN orden_compra VIA updcompra
movi[idx].cod_n IN,
movi[idx].cod_grupo IN,
movi[idx].cod_tipo IN,
movi[idx].cod_sec IN,
areaFija IN, # area
movi[idx].cantidad_1 IN,
movi[idx].cantidad_2 IN,
movi[idx].cod_mov IN,
datos_gen.num_doc IN, # num_doc YA GENERADO ARRIBA
tmpnumero IN,
nullInt IN, # entrada
datos_gen.fecha IN,
datos_gen.conduce_no IN,
datos_gen.cod_sp IN,
datos_gen.cod_sp_sec IN,
nullInt IN, # codtransp
nullInt IN, # sectransp
nullChar IN, # placa
detalle_re IN, # detalle
datos_gen.bodega IN,
cerrada IN, # pcerrada
usuarios IN,
nullInt IN, # numreq
nullChar IN, # codigobloque
nullInt IN, # secvend
nullChar IN, # direccion
nullInt IN, # bodega_d
nullInt IN, # num_doc_retrabajo
nullChar IN, # aplicaDev
nullInt IN, # departamento
pcontrol_dep IN, # pcontrol_depto
nullInt IN, # factura (numerico); el fact_no
# alfanumerico se graba en iptb00006.fact_no via updcompra
nullInt IN, # numero_doc
nullDec IN, # costo (EL SP LO BUSCA)
nullInt IN, # cod_mov_transferencia
nullInt IN, # num_doc_transferencia
nullInt IN, # bodega_procedencia
jsonMovi IN,
out_result OUT,
cod_mensaje OUT,
out_cantidad_item OUT,
out_cantidad_ubicacion OUT,
out_msg OUT,
controlaCosto IN # @controla_costo = 'NO'
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror =
"Error SQL sp_insert_inventario ",
SQLCA.sqlerrd[2],
SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN 16, FALSE
END IF
IF out_result <> 0 THEN
DISPLAY "============================================"
DISPLAY "ERROR sp_insert_inventario (REPORTE ENTRADA)"
DISPLAY "ITEM: ",
movi[idx].cod_n,
"-",
movi[idx].cod_grupo,
"-",
movi[idx].cod_tipo,
"-",
movi[idx].cod_sec
DISPLAY "DOCUMENTO: ",
datos_gen.num_doc,
" MOVIMIENTO: ",
movi[idx].cod_mov,
" BODEGA: ",
datos_gen.bodega
DISPLAY "COD_MENSAJE: ", cod_mensaje
DISPLAY "OUT_MSG: ", out_msg
DISPLAY "JSON: ", jsonMovi
DISPLAY "============================================"
ROLLBACK WORK
LET cherror =
"ITEM ",
movi[idx].cod_n USING "<<<&",
"-",
movi[idx].cod_grupo USING "<<<<&",
"-",
movi[idx].cod_tipo USING "<<<<&",
"-",
movi[idx].cod_sec USING "<<<<&",
": ",
out_msg CLIPPED
CALL fgl_winmessage("ERROR", cherror, "stop")
IF cod_mensaje IS NULL THEN
LET cod_mensaje = 16
END IF
RETURN cod_mensaje, FALSE
END IF
# COMPLEMENTO: COLUMNAS DE LA RECEPCION DE COMPRAS QUE
# EL SP NO MANEJA (orden_compra, tipo, recepcion, etc.)
EXECUTE updcompra
USING datos_gen.orden_compra,
datos_gen.tipo,
datos_gen.fact_no,
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada,
datos_gen.num_doc,
movi[idx].cod_mov,
datos_gen.bodega,
movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec,
usuarios
IF STATUS < 0 THEN
ROLLBACK WORK
LET cherror =
"Error actualizando datos de compra ",
SQLCA.sqlerrd[2],
SQLERRMESSAGE
CALL fgl_winmessage("ERROR", cherror, "stop")
RETURN 16, FALSE
END IF
LET xcod_mov = movi[idx].cod_mov
IF movi[idx].desglose = 'S' THEN
# TRANSACCIONES DESGLOSE DE LOS PRODUCTOS
EXECUTE inst1
USING datos_Gen.num_doc,
tmpnumero,
xcod_mov,
usuarios,
movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec
EXECUTE inst2
USING datos_Gen.num_doc,
tmpnumero,
xcod_mov,
usuarios,
movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec
DELETE FROM tmpdesglose_master
WHERE num_Doc = tmpnumero
AND cod_mov = xcod_mov
AND cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
DELETE FROM tmpdesglose
WHERE num_Doc = tmpnumero
AND cod_mov = xcod_mov
AND cod_n = movi[idx].cod_n
AND cod_grupo = movi[idx].cod_grupo
AND cod_tipo = movi[idx].cod_tipo
AND cod_sec = movi[idx].cod_sec
#----------------------------------------------------------------------------------
END IF
END IF
IF datos_gen.tipo = "01" THEN
INSERT INTO intb00006(
num_doc,
fecha,
fact_no,
conduce_no,
orden_compra,
tipo,
cod_sp,
cod_sp_sec,
cod_mov,
cod_n,
cod_grupo,
cod_tipo,
cod_sec,
cantidad_1,
cantidad_2,
bodega,
us_crea,
fech_crea,
tipo_recepcion_entrada,
num_contenedor_guia,
fecha_recepcion_carga)
VALUES(datos_gen.num_doc,
datos_gen.fecha,
datos_gen.fact_no,
datos_gen.conduce_no,
datos_gen.orden_compra,
datos_gen.tipo,
datos_gen.cod_sp,
datos_gen.cod_sp_sec,
movi[idx].cod_mov,
movi[idx].cod_n,
movi[idx].cod_grupo,
movi[idx].cod_tipo,
movi[idx].cod_sec,
movi[idx].cantidad_1,
movi[idx].cantidad_2,
datos_gen.bodega,
USUARIOS,
GETDATE(),
datos_gen.tipo_recepcion_entrada,
datos_gen.num_cont,
datos_gen.fecha_recepcion_entrada)
END IF
OUTPUT TO REPORT entrada_imp(datos_Gen.*, movi[idx].*)
END IF
END FOR
{LAS UBICACIONES (iptb00062) LAS INSERTA sp_insert_inventario JUNTO
CON iptb00006; YA NO SE USA addUbicacion() PARA EL TIPO 02.}
COMMIT WORK
FINISH REPORT entrada_imp
RUN imprime
IF cerrada = "S" THEN
UPDATE cotb00014
SET cierre = cerrada
WHERE num_oc = datos_gen.orden_compra AND tipo = datos_gen.tipo
END IF
CALL movi.clear()
CALL movi10Dest.clear()
LET numero_msg = 1
RETURN numero_msg, TRUE
END FUNCTION
{
-------------------------------------------------------------------------
FUNCION : tipoorden() (LOCAL a alprmt006)
OBJETIVO : Llenar el combobox "tipo_recepcion_entrada" con los tipos de
recepcion definidos en la tabla tipo_recepcion_entrada.
NOTA : Se define LOCAL en este programa (no en la libreria compartida)
porque la tipoorden() de la libreria llena otro combo
(formonly.tipo, tipo de orden) y es usada por otros programas.
-------------------------------------------------------------------------
}
FUNCTION tipoorden()
DEFINE
ketiquetas SMALLINT,
detiquetas CHAR(30),
crecepcion ui.ComboBox
LET crecepcion = ui.combobox.forname("formonly.tipo_recepcion_entrada")
CALL crecepcion.clear()
DECLARE brecepcion CURSOR FOR
SELECT a.cod_recepcion, a.descrip_recepcion
FROM tipo_recepcion_entrada a
ORDER BY a.cod_recepcion
FOREACH brecepcion INTO ketiquetas, detiquetas
CALL crecepcion.additem(ketiquetas, detiquetas)
END FOREACH
END FUNCTION
{
-------------------------------------------------------------------------
FUNCION : proximaSecuenciaIP(pcod_mov, pbodega)
OBJETIVO : Devuelve el proximo num_doc para un movimiento de productos
terminados (tabla iptb00007), respetando que la secuencia es
por (cod_mov, bodega).
CLAVE : La secuencia se ancla al MAXIMO REAL ya usado en iptb00006
(fuente de verdad). Si por cualquier motivo la fila de
iptb00007 quedo en un valor MENOR (corrupcion / retroceso),
se reconcilia hacia arriba, de modo que el numero devuelto
NUNCA retrocede ni choca con un documento existente.
-------------------------------------------------------------------------
}
FUNCTION proximaSecuenciaIP(pcod_mov, pbodega)
DEFINE pcod_mov INT
DEFINE pbodega INT
DEFINE v_ult INT # valor guardado en el contador iptb00007
DEFINE v_real INT # maximo num_doc realmente usado en iptb00006
LET v_ult = NULL
SELECT a.num_doc
INTO v_ult
FROM iptb00007 a
WHERE a.cod_mov = pcod_mov AND a.bodega = pbodega
IF v_ult IS NULL THEN
LET v_ult = 0
END IF
SELECT ISNULL(MAX(num_doc), 0)
INTO v_real
FROM iptb00006
WHERE cod_mov = pcod_mov AND bodega = pbodega
IF v_real IS NULL THEN
LET v_real = 0
END IF
# La secuencia nunca puede ser menor que el maximo real ya emitido.
IF v_ult < v_real THEN
LET v_ult = v_real
END IF
RETURN v_ult + 1
END FUNCTION