1749 lines
66 KiB
Plaintext
1749 lines
66 KiB
Plaintext
{
|
|
PROGRAMA : prprmt023
|
|
OBJETIVO : Orden de Produccion
|
|
PROGRAMADOR : ING. ELVIS GARC�A
|
|
FECHA : 01/11/2025
|
|
}
|
|
|
|
IMPORT util
|
|
IMPORT FGL fgldialog
|
|
|
|
SCHEMA smarmotech
|
|
|
|
DEFINE usuarios, clave STRING
|
|
DEFINE pcompanias RECORD LIKE companias.*
|
|
|
|
DEFINE search RECORD
|
|
orden_produccion INT,
|
|
orden_pedido INT,
|
|
fecha DATE,
|
|
tipo_cliente INT,
|
|
sec_cliente INT,
|
|
nombre STRING,
|
|
sec_vend INT,
|
|
nombre_vend STRING,
|
|
bodega INT,
|
|
cotizacion_no INT
|
|
END RECORD
|
|
|
|
DEFINE productos DYNAMIC ARRAY OF RECORD
|
|
cod_n INT,
|
|
cod_grupo INT,
|
|
cod_tipo INT,
|
|
cod_sec INT,
|
|
descrip STRING,
|
|
cantidad NUMERIC(12,5)
|
|
END RECORD
|
|
|
|
DEFINE productos_cantidades DYNAMIC ARRAY OF RECORD --para las cantidades restantes
|
|
cod_n INT,
|
|
cod_grupo INT,
|
|
cod_tipo INT,
|
|
cod_sec INT,
|
|
descrip STRING,
|
|
cantidad NUMERIC(12,5)
|
|
END RECORD
|
|
|
|
DEFINE FechasEstados_array DYNAMIC ARRAY OF RECORD
|
|
orden_produccion INT,
|
|
cod_n INT,
|
|
cod_grupo INT,
|
|
cod_tipo INT,
|
|
cod_sec INT,
|
|
cantidad_detalle NUMERIC(12,5),
|
|
fecha_prometida DATE,
|
|
depto_asignado INT,
|
|
estatus INT,
|
|
fecha_entregado DATE,
|
|
comentario VARCHAR(200),
|
|
secuencia INT
|
|
END RECORD
|
|
|
|
DEFINE respuesta RECORD
|
|
tipo_c INT,
|
|
sec_c INT,
|
|
orden_pedido INT
|
|
END RECORD
|
|
|
|
|
|
DEFINE
|
|
numero_msg INT,
|
|
criterio STRING,
|
|
fecha_ordenPedido DATE
|
|
|
|
MAIN
|
|
DEFER INTERRUPT
|
|
CALL ARG_VAL(1) RETURNING usuarios
|
|
CALL ARG_VAL(2) RETURNING clave
|
|
|
|
CONNECT TO "smarmotech" USER usuarios USING clave
|
|
SELECT * INTO pcompanias.* FROM companias
|
|
|
|
CALL prprmt023()
|
|
END MAIN
|
|
|
|
FUNCTION prprmt023()
|
|
|
|
OPEN WINDOW w1 WITH FORM "prfmmt023"
|
|
CALL fgl_settitle("Ordenes de Produccion")
|
|
|
|
MENU "OPCIONES"
|
|
COMMAND "Adicionar"
|
|
CLEAR FORM
|
|
CALL add_registro()
|
|
COMMAND "Consultar"
|
|
CLEAR FORM
|
|
CALL search_registro()
|
|
COMMAND "Salir"
|
|
EXIT MENU
|
|
END MENU
|
|
|
|
CLOSE WINDOW w1
|
|
|
|
END FUNCTION
|
|
|
|
-------------------NUEVO REGISTRO--------------------
|
|
|
|
FUNCTION add_registro()
|
|
|
|
INITIALIZE search.* TO NULL
|
|
|
|
INPUT BY NAME search.orden_pedido, search.fecha
|
|
ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS)
|
|
|
|
ON ACTION buscaClientes
|
|
CALL OrdenPedido_cliente()
|
|
|
|
IF respuesta.orden_pedido IS NOT NULL THEN
|
|
LET search.orden_pedido = respuesta.orden_pedido
|
|
NEXT FIELD orden_pedido
|
|
END IF
|
|
|
|
AFTER FIELD orden_pedido
|
|
|
|
IF search.orden_pedido IS NOT NULL THEN
|
|
|
|
SELECT a.tipo_cliente,
|
|
a.sec_cliente,
|
|
b.nombre,
|
|
a.sec_vend,
|
|
c.nombre,
|
|
a.bodega,
|
|
a.cotizacion_no,
|
|
a.fecha_oc
|
|
INTO search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no,
|
|
fecha_ordenPedido
|
|
FROM prtb00012 a
|
|
INNER
|
|
JOIN vetb00004 b
|
|
ON a.tipo_cliente = b.tipo_cliente
|
|
AND a.sec_cliente = b.sec_cliente
|
|
INNER
|
|
JOIN seg0000 c
|
|
ON a.sec_vend = c.sec_vend
|
|
WHERE a.status_t IS NULL
|
|
AND a.num_oc = search.orden_pedido
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
LET numero_msg = 3
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD orden_pedido
|
|
END IF
|
|
|
|
LET search.fecha = TODAY
|
|
|
|
DISPLAY BY NAME search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.cotizacion_no
|
|
|
|
END IF
|
|
|
|
AFTER INPUT
|
|
|
|
ON ACTION ACCEPT ATTRIBUTES(TEXT = "Aceptar")
|
|
|
|
IF search.orden_pedido IS NOT NULL AND search.cotizacion_no IS NULL THEN
|
|
LET numero_msg = 1678
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD orden_pedido
|
|
END IF
|
|
|
|
IF search.fecha < fecha_ordenPedido THEN
|
|
LET numero_msg = 1682
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD fecha
|
|
END IF
|
|
|
|
IF search.orden_pedido IS NOT NULL AND search.cotizacion_no IS NOT NULL THEN
|
|
CALL buscar_productos(search.orden_pedido, 1)
|
|
|
|
IF productos[1].cod_n IS NULL THEN
|
|
LET numero_msg = 1679
|
|
CALL msg(numero_msg)
|
|
CLEAR FORM
|
|
NEXT FIELD orden_pedido
|
|
ELSE
|
|
CALL chequear_cantidades()
|
|
|
|
IF productos[1].cod_n IS NULL THEN
|
|
LET numero_msg = 1681
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD orden_pedido
|
|
ELSE
|
|
CALL dialog.setFieldActive("orden_pedido", FALSE)
|
|
CALL dialog.setFieldActive("fecha", FALSE)
|
|
CALL cargar_productos(1)
|
|
ACCEPT INPUT
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
CALL dialog.setFieldActive("orden_pedido", FALSE)
|
|
CALL dialog.setFieldActive("fecha", FALSE)
|
|
CALL cargar_productos_sinOrden()
|
|
ACCEPT INPUT
|
|
|
|
END IF
|
|
|
|
|
|
# END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES(TEXT = "Salir")
|
|
CALL dialog.setFieldActive("orden_pedido", TRUE)
|
|
CALL dialog.setFieldActive("fecha", TRUE)
|
|
EXIT INPUT
|
|
|
|
END INPUT
|
|
END FUNCTION
|
|
|
|
-------------------BUSCAR PRODUCTOS CON PRODUCCION--------------------
|
|
|
|
FUNCTION buscar_productos(orden_pedido INT, caso INT)
|
|
|
|
DEFINE
|
|
idx INT, query STRING, answer NUMERIC(12, 5)
|
|
|
|
INITIALIZE productos TO NULL
|
|
|
|
IF caso = 1 THEN
|
|
|
|
DECLARE buscar CURSOR FOR
|
|
SELECT a.cod_n,
|
|
a.cod_grupo,
|
|
a.cod_tipo,
|
|
a.cod_sec,
|
|
b.descrip_esp,
|
|
a.cantidad
|
|
FROM prtb00013 a
|
|
INNER
|
|
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.num_oc = orden_pedido AND b.es_produccion = 1
|
|
|
|
LET idx = 1
|
|
|
|
FOREACH buscar INTO productos[idx].*
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
IF idx = 1 THEN
|
|
CALL productos.clear()
|
|
END IF
|
|
|
|
ELSE
|
|
|
|
DECLARE buscar2 CURSOR FOR
|
|
SELECT a.cod_n,
|
|
a.cod_grupo,
|
|
a.cod_tipo,
|
|
a.cod_sec,
|
|
a.descrip,
|
|
a.cantidad
|
|
FROM prtb00039 a
|
|
WHERE a.orden_produccion = search.orden_produccion
|
|
|
|
LET idx = 1
|
|
|
|
FOREACH buscar2 INTO productos[idx].*
|
|
LET productos_cantidades[idx].* = productos[idx].*
|
|
|
|
LET query = "SELECT a.cantidad - SUM(c.cantidad) FROM prtb00013 a INNER JOIN prtb00038 b on a.num_oc = b.orden_pedido
|
|
INNER JOIN prtb00039 c on b.orden_produccion = c.orden_produccion
|
|
WHERE b.orden_pedido = ? and a.cod_n = c.cod_n and a.cod_grupo = c.cod_grupo and a.cod_tipo = c.cod_tipo
|
|
AND a.cod_sec = c.cod_sec AND
|
|
c.cod_n = ? AND
|
|
c.cod_grupo = ? AND
|
|
c.cod_tipo = ? AND
|
|
c.cod_sec = ? AND
|
|
B.status_t IS NULL
|
|
GROUP BY a.cantidad"
|
|
|
|
LET answer = 0
|
|
|
|
PREPARE resto FROM query
|
|
EXECUTE resto USING search.orden_pedido, productos_cantidades[idx].cod_n,
|
|
productos_cantidades[idx].cod_grupo, productos_cantidades[idx].cod_tipo,
|
|
productos_cantidades[idx].cod_sec INTO answer
|
|
|
|
|
|
LET productos_cantidades[idx].cantidad =
|
|
productos_cantidades[idx].cantidad + answer
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
-------------------CARGAR PRODUCTOS SIN ORDEN DE PEDIDOS--------------------
|
|
|
|
|
|
FUNCTION cargar_productos_sinOrden()
|
|
|
|
DEFINE idx, i, container INT
|
|
DEFINE sin_desglose INT
|
|
|
|
SELECT secuencia_produccion INTO search.orden_produccion FROM prtb00040_tmp
|
|
LET search.orden_produccion = search.orden_produccion + 1
|
|
|
|
UPDATE prtb00040_tmp SET secuencia_produccion = search.orden_produccion,
|
|
us_mod = usuarios,
|
|
fech_mod = getdate()
|
|
|
|
INPUT ARRAY productos
|
|
FROM record2.*
|
|
ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS)
|
|
|
|
BEFORE ROW
|
|
LET idx = arr_curr()
|
|
|
|
AFTER FIELD cod_sec
|
|
IF productos[idx].cod_n IS NULL THEN
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_n
|
|
END IF
|
|
|
|
IF productos[idx].cod_grupo IS NULL THEN
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_grupo
|
|
END IF
|
|
|
|
IF productos[idx].cod_tipo IS NULL THEN
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_tipo
|
|
END IF
|
|
|
|
IF productos[idx].cod_sec IS NULL THEN
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_sec
|
|
END IF
|
|
|
|
|
|
SELECT TOP (1) descrip_esp INTO productos[idx].descrip FROM iptb00002 WHERE cod_n = productos[idx].cod_n AND
|
|
cod_grupo = productos[idx].cod_grupo AND
|
|
cod_tipo = productos[idx].cod_tipo AND
|
|
cod_sec = productos[idx].cod_sec AND
|
|
status_t IS NULL AND
|
|
es_produccion = 1
|
|
|
|
|
|
IF STATUS <> NOTFOUND THEN
|
|
DISPLAY productos[idx].descrip TO descrip_esp
|
|
ELSE
|
|
LET numero_msg = 1684
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_n
|
|
END IF
|
|
|
|
AFTER FIELD cantidad
|
|
IF productos[arr_curr()].cantidad = 0 OR productos[idx].cantidad IS NULL THEN
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cantidad
|
|
ELSE
|
|
CALL FechasEstados(productos[arr_curr()].*, 1, idx)
|
|
END IF
|
|
|
|
|
|
ON ACTION ACCEPT ATTRIBUTES(TEXT = 'Guardar')
|
|
FOR i = 1 TO productos.getLength()
|
|
|
|
IF productos[i].cod_n IS NOT NULL THEN
|
|
|
|
IF productos[i].cod_grupo IS NULL OR
|
|
productos[i].cod_tipo IS NULL OR
|
|
productos[i].cod_sec IS NULL OR
|
|
productos[i].descrip IS NULL OR
|
|
productos[i].cantidad IS NULL OR
|
|
productos[i].cantidad = 0 THEN
|
|
|
|
LET numero_msg = 16
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cod_n
|
|
END IF
|
|
END IF
|
|
END FOR
|
|
|
|
# Exigir que cada item tenga su desglose de fechas/departamento (prtb00043_tmp)
|
|
LET sin_desglose = 0
|
|
FOR i = 1 TO productos.getLength()
|
|
IF productos[i].cod_n IS NOT NULL THEN
|
|
IF NOT item_con_desglose(search.orden_produccion, NULL,
|
|
productos[i].cod_n, productos[i].cod_grupo,
|
|
productos[i].cod_tipo, productos[i].cod_sec) THEN
|
|
LET sin_desglose = i
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
END FOR
|
|
|
|
IF sin_desglose > 0 THEN
|
|
CALL fgl_winmessage("Orden de produccion",
|
|
"Falta capturar fechas y departamento en la linea "
|
|
||(sin_desglose USING "<<<<")||
|
|
". Ubiquese en la cantidad de ese renglon y presione ENTER.",
|
|
"exclamation")
|
|
CALL Dialog.setCurrentRow('record2', sin_desglose)
|
|
NEXT FIELD cantidad
|
|
|
|
ELSE
|
|
TRY
|
|
BEGIN WORK
|
|
|
|
SELECT a.secuencia_produccion
|
|
INTO container
|
|
FROM prtb00040 a
|
|
|
|
LET container =
|
|
container + 1
|
|
|
|
INSERT INTO prtb00038(
|
|
orden_produccion,
|
|
orden_pedido,
|
|
fecha,
|
|
tipo_cliente,
|
|
sec_cliente,
|
|
nombre_cliente,
|
|
sec_vend,
|
|
nombre_vend,
|
|
bodega,
|
|
cotizacion_no,
|
|
us_crea,
|
|
fech_crea)
|
|
VALUES(container,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no,
|
|
usuarios,
|
|
getdate())
|
|
|
|
FOR idx = 1 TO productos.getLength()
|
|
|
|
IF productos[idx].cod_n IS NOT NULL THEN
|
|
INSERT INTO prtb00039(
|
|
orden_produccion,
|
|
cod_n,
|
|
cod_grupo,
|
|
cod_tipo,
|
|
cod_sec,
|
|
descrip,
|
|
cantidad,
|
|
us_crea,
|
|
fech_crea)
|
|
VALUES(container,
|
|
productos[idx].cod_n,
|
|
productos[idx].cod_grupo,
|
|
productos[idx].cod_tipo,
|
|
productos[idx].cod_sec,
|
|
productos[idx].descrip,
|
|
productos[idx].cantidad,
|
|
usuarios,
|
|
getdate())
|
|
END IF
|
|
|
|
END FOR
|
|
|
|
DECLARE confirmacion2 CURSOR FOR
|
|
SELECT * FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
IF STATUS <> NOTFOUND THEN
|
|
|
|
DECLARE buscarFecha_Estado CURSOR FOR
|
|
SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario
|
|
FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
LET idx = 1
|
|
INITIALIZE FechasEstados_array TO NULL
|
|
|
|
FOREACH buscarFecha_Estado INTO FechasEstados_array[idx].*
|
|
INSERT INTO prtb00043
|
|
(orden_produccion,
|
|
cod_n,
|
|
cod_grupo,
|
|
cod_tipo,
|
|
cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
secuencia)
|
|
VALUES (container,
|
|
FechasEstados_array[idx].cod_n,
|
|
FechasEstados_array[idx].cod_grupo,
|
|
FechasEstados_array[idx].cod_tipo,
|
|
FechasEstados_array[idx].cod_sec,
|
|
FechasEstados_array[idx].cantidad_detalle,
|
|
FechasEstados_array[idx].fecha_prometida,
|
|
FechasEstados_array[idx].depto_asignado,
|
|
FechasEstados_array[idx].estatus,
|
|
FechasEstados_array[idx].fecha_entregado,
|
|
FechasEstados_array[idx].comentario,
|
|
idx)
|
|
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_produccion
|
|
|
|
END IF
|
|
|
|
LET search.orden_produccion = container
|
|
|
|
UPDATE prtb00040
|
|
SET secuencia_produccion = search.orden_produccion,
|
|
us_mod = usuarios,
|
|
fech_mod = getdate()
|
|
|
|
COMMIT WORK
|
|
LET numero_msg = 1
|
|
CALL msg(numero_msg)
|
|
DISPLAY BY NAME search.orden_produccion
|
|
ACCEPT INPUT
|
|
CATCH
|
|
ROLLBACK WORK
|
|
LET numero_msg = 1663
|
|
CALL msg(numero_msg)
|
|
END TRY
|
|
|
|
END IF
|
|
|
|
END INPUT
|
|
|
|
END FUNCTION
|
|
|
|
-------------------CARGAR PRODUCTOS CON ORDEN DE PEDIDO--------------------
|
|
|
|
FUNCTION cargar_productos(caso INT)
|
|
|
|
DEFINE
|
|
idx INT,
|
|
flag BOOLEAN,
|
|
keytmp INT,
|
|
sin_desglose INT
|
|
|
|
|
|
INPUT ARRAY productos
|
|
FROM record2.*
|
|
ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS)
|
|
|
|
BEFORE INPUT
|
|
CALL dialog.setFieldActive("cod_n",FALSE)
|
|
CALL dialog.setFieldActive("cod_grupo",FALSE)
|
|
CALL dialog.setFieldActive("cod_tipo",FALSE)
|
|
CALL dialog.setFieldActive("cod_sec",FALSE)
|
|
|
|
BEFORE DELETE
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_pedido
|
|
AND cod_n = FechasEstados_array[arr_curr()].cod_n
|
|
AND cod_grupo = FechasEstados_array[arr_curr()].cod_grupo
|
|
AND cod_tipo = FechasEstados_array[arr_curr()].cod_tipo
|
|
AND cod_sec = FechasEstados_array[arr_curr()].cod_sec
|
|
|
|
AFTER FIELD cantidad
|
|
IF Productos[arr_curr()].cod_n IS NOT NULL THEN
|
|
CALL checkCantidad(2, arr_curr()) RETURNING flag
|
|
|
|
IF flag <> TRUE THEN
|
|
CALL FechasEstados(productos[arr_curr()].*, caso, arr_curr())
|
|
ELSE
|
|
LET numero_msg = 46
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cantidad
|
|
CALL Dialog.setCurrentRow('cantidad', idx)
|
|
END IF
|
|
END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES (TEXT = 'Cancelar')
|
|
|
|
IF search.orden_produccion IS NOT NULL THEN
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_produccion
|
|
ELSE
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_pedido
|
|
END IF
|
|
|
|
EXIT INPUT
|
|
|
|
ON ACTION ACCEPT ATTRIBUTES(TEXT = "Guardar")
|
|
|
|
CALL checkCantidad(1, NULL) RETURNING flag
|
|
|
|
IF flag THEN
|
|
LET numero_msg = 46
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD cantidad
|
|
CALL Dialog.setCurrentRow('cantidad', idx)
|
|
ELSE
|
|
# Exigir que cada item tenga su desglose de fechas/departamento (prtb00043)
|
|
IF search.orden_produccion IS NULL THEN
|
|
LET keytmp = search.orden_pedido
|
|
ELSE
|
|
LET keytmp = search.orden_produccion
|
|
END IF
|
|
LET sin_desglose = 0
|
|
FOR idx = 1 TO productos.getLength()
|
|
IF productos[idx].cod_n IS NOT NULL THEN
|
|
IF NOT item_con_desglose(keytmp, search.orden_produccion,
|
|
productos[idx].cod_n, productos[idx].cod_grupo,
|
|
productos[idx].cod_tipo, productos[idx].cod_sec) THEN
|
|
LET sin_desglose = idx
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
END FOR
|
|
|
|
IF sin_desglose > 0 THEN
|
|
CALL fgl_winmessage("Orden de produccion",
|
|
"Falta capturar fechas y departamento en la linea "
|
|
||(sin_desglose USING "<<<<")||
|
|
". Ubiquese en la cantidad de ese renglon y presione ENTER.",
|
|
"exclamation")
|
|
CALL Dialog.setCurrentRow('record2', sin_desglose)
|
|
NEXT FIELD cantidad
|
|
|
|
ELSE
|
|
IF caso = 1 THEN {GUARDADO CUANDO SE CREA NUEVO REGISTRO}
|
|
TRY
|
|
BEGIN WORK
|
|
|
|
SELECT a.secuencia_produccion
|
|
INTO search.orden_produccion
|
|
FROM prtb00040 a
|
|
|
|
LET search.orden_produccion =
|
|
search.orden_produccion + 1
|
|
|
|
INSERT INTO prtb00038(
|
|
orden_produccion,
|
|
orden_pedido,
|
|
fecha,
|
|
tipo_cliente,
|
|
sec_cliente,
|
|
nombre_cliente,
|
|
sec_vend,
|
|
nombre_vend,
|
|
bodega,
|
|
cotizacion_no,
|
|
us_crea,
|
|
fech_crea)
|
|
VALUES(search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no,
|
|
usuarios,
|
|
getdate())
|
|
|
|
FOR idx = 1 TO productos.getLength()
|
|
|
|
IF productos[idx].cod_n IS NOT NULL THEN
|
|
INSERT INTO prtb00039(
|
|
orden_produccion,
|
|
cod_n,
|
|
cod_grupo,
|
|
cod_tipo,
|
|
cod_sec,
|
|
descrip,
|
|
cantidad,
|
|
us_crea,
|
|
fech_crea)
|
|
VALUES(search.orden_produccion,
|
|
productos[idx].cod_n,
|
|
productos[idx].cod_grupo,
|
|
productos[idx].cod_tipo,
|
|
productos[idx].cod_sec,
|
|
productos[idx].descrip,
|
|
productos[idx].cantidad,
|
|
usuarios,
|
|
getdate())
|
|
END IF
|
|
|
|
END FOR
|
|
|
|
DECLARE confirmacion3 CURSOR FOR
|
|
SELECT * FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_pedido
|
|
|
|
IF STATUS <> NOTFOUND THEN
|
|
|
|
DECLARE buscarFecha_Estado2 CURSOR FOR
|
|
SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario
|
|
FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_pedido
|
|
|
|
LET idx = 1
|
|
INITIALIZE FechasEstados_array TO NULL
|
|
|
|
FOREACH buscarFecha_Estado2 INTO FechasEstados_array[idx].*
|
|
INSERT INTO prtb00043
|
|
(orden_produccion,
|
|
cod_n,
|
|
cod_grupo,
|
|
cod_tipo,
|
|
cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
secuencia)
|
|
VALUES (search.orden_produccion,
|
|
FechasEstados_array[idx].cod_n,
|
|
FechasEstados_array[idx].cod_grupo,
|
|
FechasEstados_array[idx].cod_tipo,
|
|
FechasEstados_array[idx].cod_sec,
|
|
FechasEstados_array[idx].cantidad_detalle,
|
|
FechasEstados_array[idx].fecha_prometida,
|
|
FechasEstados_array[idx].depto_asignado,
|
|
FechasEstados_array[idx].estatus,
|
|
FechasEstados_array[idx].fecha_entregado,
|
|
FechasEstados_array[idx].comentario,
|
|
idx)
|
|
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_pedido
|
|
|
|
END IF
|
|
|
|
|
|
|
|
UPDATE prtb00040
|
|
SET secuencia_produccion = search.orden_produccion,
|
|
us_mod = usuarios,
|
|
fech_mod = getdate()
|
|
|
|
COMMIT WORK
|
|
LET numero_msg = 1
|
|
CALL msg(numero_msg)
|
|
DISPLAY BY NAME search.orden_produccion
|
|
ACCEPT INPUT
|
|
CATCH
|
|
|
|
ROLLBACK WORK
|
|
LET numero_msg = 1663
|
|
CALL msg(numero_msg)
|
|
END TRY
|
|
|
|
ELSE {CUANDO SE ACTUALIZA UN REGISTRO}
|
|
|
|
TRY
|
|
BEGIN WORK
|
|
|
|
UPDATE prtb00038 SET us_mod = usuarios,
|
|
fech_mod = getdate()
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
FOR idx = 1 TO productos.getLength()
|
|
|
|
IF productos[idx].cod_n IS NOT NULL THEN
|
|
UPDATE prtb00039
|
|
SET cantidad = productos[idx].cantidad,
|
|
us_mod = usuarios,
|
|
fech_mod = getdate()
|
|
WHERE orden_produccion = search.orden_produccion
|
|
AND cod_n = productos[idx].cod_n
|
|
AND cod_grupo = productos[idx].cod_grupo
|
|
AND cod_tipo = productos[idx].cod_tipo
|
|
AND cod_sec = productos[idx].cod_sec
|
|
END IF
|
|
|
|
END FOR
|
|
|
|
DECLARE confirmacion4 CURSOR FOR
|
|
SELECT * FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
IF STATUS <> NOTFOUND THEN
|
|
|
|
DECLARE buscarFecha_Estado3 CURSOR FOR
|
|
SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
secuencia
|
|
FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion
|
|
ORDER BY secuencia
|
|
|
|
LET idx = 1
|
|
INITIALIZE FechasEstados_array TO NULL
|
|
|
|
FOREACH buscarFecha_Estado3 INTO FechasEstados_array[idx].*
|
|
|
|
IF idx = 1 THEN
|
|
DELETE FROM prtb00043 WHERE orden_produccion = FechasEstados_array[1].orden_produccion AND
|
|
cod_n = FechasEstados_array[1].cod_n AND
|
|
cod_grupo = FechasEstados_array[1].cod_grupo AND
|
|
cod_tipo = FechasEstados_array[1].cod_tipo AND
|
|
cod_sec = FechasEstados_array[1].cod_sec
|
|
END IF
|
|
|
|
IF idx > 1 THEN
|
|
IF FechasEstados_array[idx - 1].cod_n <> FechasEstados_array[idx].cod_n AND
|
|
FechasEstados_array[idx - 1].cod_grupo <> FechasEstados_array[idx].cod_grupo AND
|
|
FechasEstados_array[idx - 1].cod_tipo <> FechasEstados_array[idx].cod_tipo AND
|
|
FechasEstados_array[idx - 1].cod_sec <> FechasEstados_array[idx].cod_sec THEN
|
|
|
|
DELETE FROM prtb00043 WHERE orden_produccion = FechasEstados_array[idx].orden_produccion AND
|
|
cod_n = FechasEstados_array[idx].cod_n AND
|
|
cod_grupo = FechasEstados_array[idx].cod_grupo AND
|
|
cod_tipo = FechasEstados_array[idx].cod_tipo AND
|
|
cod_sec = FechasEstados_array[idx].cod_sec
|
|
|
|
END IF
|
|
END IF
|
|
|
|
INSERT INTO prtb00043
|
|
(orden_produccion,
|
|
cod_n,
|
|
cod_grupo,
|
|
cod_tipo,
|
|
cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
secuencia)
|
|
VALUES (search.orden_produccion,
|
|
FechasEstados_array[idx].cod_n,
|
|
FechasEstados_array[idx].cod_grupo,
|
|
FechasEstados_array[idx].cod_tipo,
|
|
FechasEstados_array[idx].cod_sec,
|
|
FechasEstados_array[idx].cantidad_detalle,
|
|
FechasEstados_array[idx].fecha_prometida,
|
|
FechasEstados_array[idx].depto_asignado,
|
|
FechasEstados_array[idx].estatus,
|
|
FechasEstados_array[idx].fecha_entregado,
|
|
FechasEstados_array[idx].comentario,
|
|
idx)
|
|
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = search.orden_produccion
|
|
|
|
END IF
|
|
|
|
COMMIT WORK
|
|
LET numero_msg = 1
|
|
CALL msg(numero_msg)
|
|
ACCEPT INPUT
|
|
|
|
CATCH
|
|
ROLLBACK WORK
|
|
LET numero_msg = 1663
|
|
CALL msg(numero_msg)
|
|
|
|
END TRY
|
|
|
|
END IF
|
|
|
|
END IF
|
|
|
|
END IF
|
|
|
|
END INPUT
|
|
|
|
END FUNCTION
|
|
|
|
# Devuelve TRUE si el item ya tiene su desglose de fechas/departamento,
|
|
# ya sea en el borrador (prtb00043_tmp) o en la orden confirmada (prtb00043).
|
|
FUNCTION item_con_desglose(p_key_tmp, p_key_prod, p_n, p_g, p_t, p_s)
|
|
DEFINE p_key_tmp INT, p_key_prod INT
|
|
DEFINE p_n INT, p_g INT, p_t INT, p_s INT
|
|
DEFINE cnt INT
|
|
|
|
LET cnt = 0
|
|
SELECT COUNT(*) INTO cnt FROM prtb00043_tmp
|
|
WHERE orden_produccion = p_key_tmp
|
|
AND cod_n = p_n AND cod_grupo = p_g
|
|
AND cod_tipo = p_t AND cod_sec = p_s
|
|
IF cnt > 0 THEN
|
|
RETURN TRUE
|
|
END IF
|
|
|
|
IF p_key_prod IS NOT NULL THEN
|
|
LET cnt = 0
|
|
SELECT COUNT(*) INTO cnt FROM prtb00043
|
|
WHERE orden_produccion = p_key_prod
|
|
AND cod_n = p_n AND cod_grupo = p_g
|
|
AND cod_tipo = p_t AND cod_sec = p_s
|
|
IF cnt > 0 THEN
|
|
RETURN TRUE
|
|
END IF
|
|
END IF
|
|
|
|
RETURN FALSE
|
|
END FUNCTION
|
|
|
|
-------------------BUSCAR REGISTROS-------------------------------
|
|
|
|
FUNCTION search_registro()
|
|
|
|
DEFINE query, opt STRING
|
|
|
|
INITIALIZE search.* TO NULL
|
|
|
|
CONSTRUCT criterio
|
|
ON a.orden_produccion,
|
|
a.orden_pedido,
|
|
a.cotizacion_no,
|
|
a.tipo_cliente,
|
|
a.sec_cliente,
|
|
a.sec_vend
|
|
FROM orden_produccion,orden_pedido, cotizacion_no, tipo_cliente,
|
|
sec_cliente, sec_vend
|
|
|
|
LET query =
|
|
"SELECT a.orden_produccion,
|
|
a.orden_pedido,
|
|
a.fecha,
|
|
a.tipo_cliente,
|
|
a.sec_cliente,
|
|
a.nombre_cliente,
|
|
a.sec_vend,
|
|
a.nombre_vend,
|
|
a.bodega,
|
|
a.cotizacion_no FROM prtb00038 a WHERE a.status_t IS NULL AND ", criterio
|
|
|
|
PREPARE searching FROM query
|
|
|
|
DECLARE datos SCROLL CURSOR FOR searching
|
|
OPEN datos
|
|
|
|
FETCH FIRST datos
|
|
INTO search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
LET numero_msg = 3
|
|
CALL msg(numero_msg)
|
|
RETURN
|
|
ELSE
|
|
DISPLAY BY NAME search.*
|
|
END IF
|
|
|
|
MENU "OPCIONES "
|
|
COMMAND "Siguiente"
|
|
"Presenta en pantalla el proximo registro encontrado"
|
|
FETCH NEXT datos
|
|
INTO search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no
|
|
|
|
IF status = NOTFOUND THEN
|
|
LET numero_msg = 4
|
|
CALL msg(numero_msg)
|
|
ELSE
|
|
DISPLAY BY NAME search.*
|
|
END IF
|
|
|
|
COMMAND "Anterior"
|
|
"Presenta en pantalla el registro anterior encontrado"
|
|
FETCH PREVIOUS datos
|
|
INTO search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no
|
|
|
|
IF status = NOTFOUND THEN
|
|
LET numero_msg = 5
|
|
CALL msg(numero_msg)
|
|
ELSE
|
|
DISPLAY BY NAME search.*
|
|
END IF
|
|
|
|
COMMAND "Escoger" "Actualiza este registro"
|
|
|
|
{SELECT a.num_oc FROM cgtb00017 a
|
|
WHERE a.num_oc = ordenes.num_oc AND
|
|
a.status_t IS NULL
|
|
|
|
IF STATUS <> NOTFOUND THEN
|
|
CALL fgl_winmessage("ERROR","NO PUEDES MODIFICAR ORDEN, TIENE LIQUIDACION","INFO")
|
|
CONTINUE MENU
|
|
END IF}
|
|
|
|
CALL buscar_productos(search.orden_pedido, 2)
|
|
CALL cargar_productos(2)
|
|
|
|
COMMAND "Eliminar" "Eliminar este registro"
|
|
|
|
LET opt =
|
|
FGL_WINQUESTION(
|
|
"Eliminar",
|
|
"Desea eliminar este registro?",
|
|
"Yes",
|
|
"Yes|no",
|
|
"question",
|
|
0)
|
|
LET opt = upshift(opt)
|
|
|
|
IF opt = "YES" THEN
|
|
|
|
TRY
|
|
BEGIN WORK
|
|
|
|
UPDATE prtb00038
|
|
SET status_t = 'E'
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
UPDATE prtb00039
|
|
SET status_t = 'E'
|
|
WHERE orden_produccion = search.orden_produccion
|
|
|
|
COMMIT WORK
|
|
LET numero_msg = 39
|
|
CALL msg(numero_msg)
|
|
EXIT MENU
|
|
CATCH
|
|
|
|
ROLLBACK WORK
|
|
LET numero_msg = 1663
|
|
CALL msg(numero_msg)
|
|
|
|
END TRY
|
|
|
|
END IF
|
|
|
|
COMMAND "Primero" "Presenta en pantalla el primer registro encontrado"
|
|
FETCH FIRST datos
|
|
INTO search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no
|
|
|
|
LET numero_msg = 5
|
|
CALL msg(numero_msg)
|
|
|
|
DISPLAY BY NAME search.*
|
|
|
|
COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado"
|
|
FETCH LAST datos
|
|
INTO search.orden_produccion,
|
|
search.orden_pedido,
|
|
search.fecha,
|
|
search.tipo_cliente,
|
|
search.sec_cliente,
|
|
search.nombre,
|
|
search.sec_vend,
|
|
search.nombre_vend,
|
|
search.bodega,
|
|
search.cotizacion_no
|
|
|
|
LET numero_msg = 4
|
|
CALL msg(numero_msg)
|
|
|
|
DISPLAY BY NAME search.*
|
|
|
|
COMMAND "Retornar" "Retorna al menu anterior"
|
|
CLEAR FORM
|
|
EXIT MENU
|
|
END MENU
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION FechasEstados(producto_mirror, caso, producto_indice)
|
|
|
|
DEFINE producto_mirror RECORD
|
|
cod_n INT,
|
|
cod_grupo INT,
|
|
cod_tipo INT,
|
|
cod_sec INT,
|
|
descrip STRING,
|
|
cantidad NUMERIC(12,5)
|
|
END RECORD
|
|
|
|
DEFINE producto_indice INT
|
|
|
|
DEFINE filtro NUMERIC(12, 5), idx INT, flag BOOLEAN, wipe_flag BOOLEAN
|
|
DEFINE caso INT, checking INT
|
|
DEFINE tabla, query STRING , findTemporaryCase INT
|
|
DEFINE faltante STRING
|
|
INITIALIZE FechasEstados_Array TO NULL
|
|
|
|
OPEN WINDOW w2 WITH FORM "Fechas_Estados"
|
|
|
|
INPUT ARRAY FechasEstados_Array FROM record1.* ATTRIBUTES (UNBUFFERED, WITHOUT DEFAULTS )
|
|
BEFORE INPUT
|
|
CALL departamentos()
|
|
LET wipe_flag = FALSE
|
|
LET findTemporaryCase = 0
|
|
|
|
IF caso = 1 THEN
|
|
|
|
SELECT TOP (1) orden_produccion FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_pedido AND
|
|
cod_n = producto_mirror.cod_n AND
|
|
cod_grupo = producto_mirror.cod_grupo AND
|
|
cod_tipo = producto_mirror.cod_tipo AND
|
|
cod_sec = producto_mirror.cod_sec
|
|
ORDER BY orden_produccion
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
SELECT TOP (1) orden_produccion FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion AND
|
|
cod_n = producto_mirror.cod_n AND
|
|
cod_grupo = producto_mirror.cod_grupo AND
|
|
cod_tipo = producto_mirror.cod_tipo AND
|
|
cod_sec = producto_mirror.cod_sec
|
|
ORDER BY orden_produccion
|
|
|
|
IF STATUS = NOTFOUND THEN
|
|
LET findTemporaryCase = 0
|
|
ELSE
|
|
LET findTemporaryCase = 2
|
|
END IF
|
|
ELSE
|
|
LET findTemporaryCase = 1
|
|
END IF
|
|
|
|
IF findTemporaryCase <> 0 THEN
|
|
|
|
IF findTemporaryCase = 1 THEN
|
|
DECLARE LoadFromTemporary CURSOR FOR
|
|
SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
NULL
|
|
FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_pedido
|
|
AND cod_n = producto_mirror.cod_n
|
|
AND cod_grupo = producto_mirror.cod_grupo
|
|
AND cod_tipo = producto_mirror.cod_tipo
|
|
AND cod_sec = producto_mirror.cod_sec
|
|
|
|
LET idx = 1
|
|
|
|
FOREACH LoadFromTemporary INTO FechasEstados_array[idx].*
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
IF idx > 1 THEN
|
|
LET wipe_flag = TRUE
|
|
END IF
|
|
ELSE
|
|
DECLARE LoadFromTemporary2 CURSOR FOR
|
|
SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
NULL
|
|
FROM prtb00043_tmp
|
|
WHERE orden_produccion = search.orden_produccion
|
|
AND cod_n = producto_mirror.cod_n
|
|
AND cod_grupo = producto_mirror.cod_grupo
|
|
AND cod_tipo = producto_mirror.cod_tipo
|
|
AND cod_sec = producto_mirror.cod_sec
|
|
LET idx = 1
|
|
|
|
FOREACH LoadFromTemporary2 INTO FechasEstados_array[idx].*
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
IF idx > 1 THEN
|
|
LET wipe_flag = TRUE
|
|
END IF
|
|
END IF
|
|
|
|
ELSE
|
|
|
|
# CALL calcular_cantidad(producto_mirror.*) RETURNING FechasEstados_array[1].cantidad_detalle
|
|
LET FechasEstados_array[1].estatus = 1
|
|
LET FechasEstados_array[1].cantidad_detalle = productos[producto_indice].cantidad
|
|
|
|
END IF
|
|
|
|
ELSE
|
|
|
|
LET checking = 0
|
|
SELECT COUNT(*) INTO checking FROM prtb00043_tmp WHERE orden_produccion = search.orden_produccion
|
|
AND cod_n = producto_mirror.cod_n
|
|
AND cod_grupo = producto_mirror.cod_grupo
|
|
AND cod_tipo = producto_mirror.cod_tipo
|
|
AND cod_sec = producto_mirror.cod_sec
|
|
|
|
IF checking = 0 THEN
|
|
LET tabla = "prtb00043"
|
|
ELSE
|
|
LET tabla = "prtb00043_tmp"
|
|
END IF
|
|
|
|
LET query = "SELECT orden_produccion,
|
|
cod_n, cod_grupo, cod_tipo, cod_sec,
|
|
cantidad_detalle,
|
|
fecha_prometida,
|
|
departamento,
|
|
estatus,
|
|
fecha_entregado,
|
|
comentario,
|
|
secuencia
|
|
FROM ",tabla,"
|
|
WHERE orden_produccion = ",search.orden_produccion,"
|
|
AND cod_n = ",producto_mirror.cod_n,"
|
|
AND cod_grupo = ",producto_mirror.cod_grupo,"
|
|
AND cod_tipo = ",producto_mirror.cod_tipo,"
|
|
AND cod_sec = ",producto_mirror.cod_sec,"
|
|
ORDER BY secuencia"
|
|
|
|
DECLARE loadFromOriginal CURSOR FROM query
|
|
|
|
LET idx = 1
|
|
|
|
FOREACH loadFromOriginal INTO FechasEstados_array[idx].*
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
IF idx > 1 THEN
|
|
LET wipe_flag = TRUE
|
|
END IF
|
|
|
|
END IF
|
|
|
|
BEFORE FIELD fecha_entregado
|
|
CALL Dialog.setFieldActive("fecha_entregado", FechasEstados_Array[arr_curr()].estatus = 2)
|
|
|
|
ON CHANGE estatus
|
|
CALL Dialog.setFieldActive("fecha_entregado", FechasEstados_Array[arr_curr()].estatus = 2)
|
|
|
|
{ ON ACTION DELETE
|
|
IF search.orden_produccion IS NOT NULL THEN
|
|
LET checking = search.orden_produccion
|
|
ELSE
|
|
LET checking = search.orden_pedido
|
|
END IF }
|
|
|
|
BEFORE INSERT
|
|
IF FechasEstados_array[arr_curr()].estatus IS NULL THEN
|
|
LET FechasEstados_array[arr_curr()].estatus = 1
|
|
END IF
|
|
|
|
AFTER FIELD fech_prometida
|
|
IF FechasEstados_array[arr_curr()].fecha_prometida < fecha_ordenPedido THEN
|
|
LET numero_msg = 1682
|
|
CALL msg(numero_msg)
|
|
NEXT FIELD fech_prometida
|
|
END IF
|
|
|
|
|
|
ON ACTION ACCEPT ATTRIBUTES(TEXT = "Guardar")
|
|
LET flag = TRUE
|
|
LET filtro = 0
|
|
LET faltante = ""
|
|
|
|
FOR idx = 1 TO FechasEstados_array.getLength()
|
|
IF FechasEstados_array[idx].cantidad_detalle IS NOT NULL THEN
|
|
LET filtro = filtro + FechasEstados_array[idx].cantidad_detalle
|
|
IF filtro > producto_mirror.cantidad THEN
|
|
LET flag = FALSE LET faltante = "cantidad"
|
|
EXIT FOR
|
|
END IF
|
|
# fecha_prometida y departamento OBLIGATORIOS (son la fuente del calendario)
|
|
IF FechasEstados_array[idx].fecha_prometida IS NULL THEN
|
|
LET flag = FALSE LET faltante = "fecha"
|
|
EXIT FOR
|
|
END IF
|
|
IF FechasEstados_array[idx].depto_asignado IS NULL THEN
|
|
LET flag = FALSE LET faltante = "depto"
|
|
EXIT FOR
|
|
END IF
|
|
END IF
|
|
END FOR
|
|
|
|
# Exigir al menos un renglon con cantidad
|
|
IF flag AND filtro = 0 THEN
|
|
LET flag = FALSE LET faltante = "vacio"
|
|
END IF
|
|
|
|
|
|
IF flag THEN
|
|
LET productos[producto_indice].cantidad = filtro
|
|
|
|
TRY
|
|
IF search.orden_produccion IS NOT NULL THEN
|
|
LET checking = search.orden_produccion
|
|
ELSE
|
|
LET checking = search.orden_pedido
|
|
END IF
|
|
|
|
BEGIN WORK
|
|
|
|
|
|
IF wipe_flag THEN
|
|
|
|
DELETE FROM prtb00043_tmp WHERE orden_produccion = checking
|
|
AND cod_n = producto_mirror.cod_n
|
|
AND cod_grupo = producto_mirror.cod_grupo
|
|
AND cod_tipo = producto_mirror.cod_tipo
|
|
AND cod_sec = producto_mirror.cod_sec
|
|
|
|
END IF
|
|
|
|
|
|
FOR idx = 1 TO FechasEstados_array.getLength()
|
|
|
|
IF FechasEstados_array[idx].cantidad_detalle IS NOT NULL THEN
|
|
INSERT INTO prtb00043_tmp VALUES
|
|
(checking,
|
|
producto_mirror.cod_n,
|
|
producto_mirror.cod_grupo,
|
|
producto_mirror.cod_tipo,
|
|
producto_mirror.cod_sec,
|
|
FechasEstados_array[idx].cantidad_detalle,
|
|
FechasEstados_array[idx].fecha_prometida,
|
|
FechasEstados_array[idx].depto_asignado,
|
|
FechasEstados_array[idx].estatus,
|
|
FechasEstados_array[idx].fecha_entregado,
|
|
FechasEstados_array[idx].comentario,
|
|
FechasEstados_array[idx].secuencia)
|
|
|
|
END IF
|
|
END FOR
|
|
COMMIT WORK
|
|
|
|
CALL FechasEstados_Array.clear()
|
|
|
|
EXIT INPUT
|
|
CLOSE WINDOW w2
|
|
|
|
CATCH
|
|
|
|
ROLLBACK WORK
|
|
LET numero_msg = 1680
|
|
CALL msg(1680)
|
|
|
|
NEXT FIELD cantidad_detalle
|
|
|
|
END TRY
|
|
|
|
ELSE
|
|
CASE faltante
|
|
WHEN "cantidad"
|
|
CALL fgl_winmessage("Fechas de compromiso",
|
|
"La suma de cantidades excede la cantidad del producto.", "exclamation")
|
|
CALL Dialog.setCurrentRow('record1', idx)
|
|
NEXT FIELD cantidad_detalle
|
|
WHEN "fecha"
|
|
CALL fgl_winmessage("Fechas de compromiso",
|
|
"Cada renglon debe tener FECHA PROMETIDA.", "exclamation")
|
|
CALL Dialog.setCurrentRow('record1', idx)
|
|
NEXT FIELD fech_prometida
|
|
WHEN "depto"
|
|
CALL fgl_winmessage("Fechas de compromiso",
|
|
"Cada renglon debe tener DEPARTAMENTO asignado.", "exclamation")
|
|
CALL Dialog.setCurrentRow('record1', idx)
|
|
NEXT FIELD departamento
|
|
OTHERWISE
|
|
CALL fgl_winmessage("Fechas de compromiso",
|
|
"Debe capturar al menos un renglon con cantidad.", "exclamation")
|
|
NEXT FIELD cantidad_detalle
|
|
END CASE
|
|
|
|
END IF
|
|
|
|
ON ACTION CANCEL ATTRIBUTES (TEXT = 'Salir')
|
|
INITIALIZE FechasEstados_Array TO NULL
|
|
EXIT INPUT
|
|
CLOSE WINDOW w2
|
|
|
|
END INPUT
|
|
|
|
CLOSE WINDOW w2
|
|
|
|
END FUNCTION
|
|
|
|
|
|
|
|
------------PARA BUSCAR ORDENES DE PEDIDO POR CLIENTE-------------
|
|
|
|
FUNCTION OrdenPedido_cliente()
|
|
|
|
DEFINE pedidoClientes DYNAMIC ARRAY OF RECORD
|
|
tipo_cliente TINYINT,
|
|
sec_cliente SMALLINT,
|
|
nombre_cliente STRING,
|
|
num_orden INT,
|
|
fecha_orden DATE,
|
|
estadoOrden CHAR(1),
|
|
seleccion BOOLEAN
|
|
END RECORD
|
|
|
|
DEFINE idx INT, query STRING
|
|
|
|
INITIALIZE pedidoClientes, idx TO NULL
|
|
|
|
OPEN WINDOW w3 WITH FORM "ordenPedido_cliente"
|
|
CALL fgl_settitle("Ordenes de pedido - Cliente")
|
|
|
|
CONSTRUCT criterio
|
|
ON a.tipo_cliente,
|
|
a.sec_cliente,
|
|
b.nombre
|
|
FROM tipo_cliente1, sec_cliente1, nom_cliente1
|
|
|
|
|
|
LET query =
|
|
"SELECT DISTINCT a.tipo_cliente, a.sec_cliente,b.nombre, a.num_oc, a.fecha_oc, a.cerrada, 0
|
|
FROM prtb00012 a INNER JOIN vetb00004 b ON
|
|
a.tipo_cliente = b.tipo_cliente AND
|
|
a.sec_cliente = b.sec_cliente
|
|
INNER JOIN prtb00013 c ON a.num_oc = c.num_oc
|
|
INNER JOIN iptb00002 d ON c.cod_n = d.cod_n
|
|
AND c.cod_grupo = d.cod_grupo
|
|
AND c.cod_tipo = d.cod_tipo
|
|
AND c.cod_sec = d.cod_sec
|
|
LEFT JOIN prtb00038 e on a.num_oc = e.orden_pedido
|
|
WHERE a.status_t is null AND a.cerrada = 'N' AND d.es_produccion = 1 AND e.orden_pedido IS NULL
|
|
AND ",criterio,"
|
|
ORDER BY a.fecha_oc DESC"
|
|
|
|
DECLARE pedidos_clientes CURSOR FROM query
|
|
|
|
LET idx = 1
|
|
FOREACH pedidos_clientes INTO pedidoClientes[idx].*
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
INPUT ARRAY pedidoClientes FROM record1.* ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS,
|
|
APPEND ROW = FALSE,
|
|
DELETE ROW = FALSE,
|
|
AUTO APPEND = FALSE,
|
|
INSERT ROW = FALSE)
|
|
|
|
ON ACTION CANCEL ATTRIBUTES(TEXT = 'Cancelar')
|
|
EXIT INPUT
|
|
|
|
ON CHANGE seleccionado
|
|
FOR idx = 1 TO pedidoClientes.getLength()
|
|
IF idx <> arr_curr() THEN
|
|
LET pedidoCLientes[idx].seleccion = 0
|
|
END IF
|
|
END FOR
|
|
|
|
ON ACTION ACCEPT ATTRIBUTES(TEXT = "Seleccionar")
|
|
|
|
LET idx = 1
|
|
INITIALIZE respuesta.* TO NULL
|
|
|
|
FOR idx = 1 TO pedidoClientes.getLength()
|
|
|
|
IF pedidoClientes[idx].seleccion THEN
|
|
LET respuesta.tipo_c = pedidoClientes[idx].tipo_cliente
|
|
LET respuesta.sec_c = pedidoClientes[idx].sec_cliente
|
|
LET respuesta.orden_pedido = pedidoClientes[idx].num_orden
|
|
EXIT FOR
|
|
END IF
|
|
|
|
END FOR
|
|
EXIT INPUT
|
|
|
|
END INPUT
|
|
CLOSE WINDOW w3
|
|
|
|
END FUNCTION
|
|
|
|
--CHEQUEANDO QUE LA CANTIDAD NO SE PASE DE LA EXISTENTE EN NINGUN AMBITO--
|
|
|
|
FUNCTION checkCantidad(caso INT, indice INT)
|
|
|
|
DEFINE flag BOOLEAN, idx INT
|
|
|
|
|
|
LET flag = FALSE
|
|
|
|
IF caso = 1 THEN
|
|
|
|
FOR idx = 1 TO productos_cantidades.getLength()
|
|
|
|
IF productos_cantidades[idx].cod_n = productos[idx].cod_n
|
|
AND productos_cantidades[idx].cod_grupo = productos[idx].cod_grupo
|
|
AND productos_cantidades[idx].cod_tipo = productos[idx].cod_tipo
|
|
AND productos_cantidades[idx].cod_sec = productos[idx].cod_sec THEN
|
|
|
|
IF productos[idx].cantidad > productos_cantidades[idx].cantidad THEN
|
|
LET flag = TRUE
|
|
EXIT FOR
|
|
END IF
|
|
|
|
END IF
|
|
|
|
END FOR
|
|
|
|
|
|
ELSE
|
|
|
|
LET idx = 1
|
|
WHILE flag <> TRUE AND idx <= productos_cantidades.getLength()
|
|
|
|
IF productos_cantidades[idx].cod_n = productos[indice].cod_n
|
|
AND productos_cantidades[idx].cod_grupo = productos[indice].cod_grupo
|
|
AND productos_cantidades[idx].cod_tipo = productos[indice].cod_tipo
|
|
AND productos_cantidades[idx].cod_sec = productos[indice].cod_sec THEN
|
|
|
|
IF productos[indice].cantidad > productos_cantidades[idx].cantidad THEN
|
|
LET flag = TRUE
|
|
END IF
|
|
|
|
END IF
|
|
|
|
LET idx = idx + 1
|
|
|
|
END WHILE
|
|
|
|
END IF
|
|
|
|
RETURN flag
|
|
|
|
|
|
END FUNCTION
|
|
|
|
------CHEQUEANDO SI LOS PRODUCTOS TIENEN CANTIDAD DISPONIBLE---------
|
|
|
|
FUNCTION chequear_cantidades()
|
|
|
|
DEFINE idx, i INT, query STRING
|
|
DEFINE checking NUMERIC(12, 5)
|
|
|
|
INITIALIZE productos_cantidades TO NULL
|
|
|
|
LET query = "SELECT a.cantidad - SUM(c.cantidad) FROM prtb00013 a INNER JOIN prtb00038 b on a.num_oc = b.orden_pedido
|
|
INNER JOIN prtb00039 c on b.orden_produccion = c.orden_produccion
|
|
WHERE b.orden_pedido = ? and a.cod_n = c.cod_n and a.cod_grupo = c.cod_grupo and a.cod_tipo = c.cod_tipo
|
|
AND a.cod_sec = c.cod_sec AND
|
|
c.cod_n = ? AND
|
|
c.cod_grupo = ? AND
|
|
c.cod_tipo = ? AND
|
|
c.cod_sec = ? AND
|
|
B.status_t IS NULL
|
|
GROUP BY a.cantidad"
|
|
|
|
PREPARE chequea_cantidad FROM query
|
|
LET i = 1
|
|
|
|
FOR idx = 1 TO productos.getLength()
|
|
|
|
INITIALIZE checking TO NULL
|
|
|
|
EXECUTE chequea_cantidad USING search.orden_pedido, productos[idx].cod_n,
|
|
productos[idx].cod_grupo, productos[idx].cod_tipo, productos[idx].cod_sec
|
|
INTO checking
|
|
|
|
IF checking IS NULL THEN
|
|
LET checking = productos[idx].cantidad
|
|
END IF
|
|
|
|
LET productos[idx].cantidad = checking
|
|
|
|
IF productos[idx].cantidad > 0 THEN
|
|
|
|
LET productos_cantidades[i].* = productos[idx].*
|
|
LET i = i + 1
|
|
|
|
END IF
|
|
|
|
|
|
END FOR
|
|
|
|
CALL productos.clear()
|
|
|
|
FOR idx = 1 TO productos_cantidades.getLength()
|
|
|
|
LET productos[idx].* = productos_cantidades[idx].*
|
|
|
|
END FOR
|
|
|
|
|
|
END FUNCTION
|
|
|
|
|
|
--FUNCIONES AUXILIARES--
|
|
|
|
FUNCTION departamentos()
|
|
DEFINE pdepartamento SMALLINT,pdescripcion CHAR(30),
|
|
kdepto ui.ComboBox
|
|
LET kdepto = ui.ComboBox.forName("formonly.departamento")
|
|
CALL kdepto.clear()
|
|
|
|
DECLARE busca_dpto CURSOR FOR
|
|
SELECT a.departamento,a.nom_dpto FROM adtb00001 a
|
|
WHERE a.status_t IS NULL AND a.tipo_departamento = 'PRODUCCION'
|
|
ORDER BY a.nom_dpto
|
|
|
|
FOREACH busca_dpto INTO pdepartamento,pdescripcion
|
|
CALL kdepto.additem(pdepartamento,pdescripcion)
|
|
END FOREACH
|
|
|
|
END FUNCTION
|
|
|
|
|
|
|
|
--OLD CODE
|
|
|
|
{FUNCTION calcular_cantidad(producto_mirror)
|
|
|
|
DEFINE producto_mirror RECORD
|
|
cod_n INT,
|
|
cod_grupo INT,
|
|
cod_tipo INT,
|
|
cod_sec INT,
|
|
descrip STRING,
|
|
cantidad DECIMAL(12, 2)
|
|
END RECORD
|
|
|
|
DEFINE ordenes_produccion DYNAMIC ARRAY OF INTEGER
|
|
DEFINE idx, i INT
|
|
DEFINE container, temporal, answer DECIMAL(12,2)
|
|
DEFINE query STRING
|
|
|
|
DECLARE buscar_restante CURSOR FOR
|
|
SELECT orden_produccion FROM prtb00038 WHERE orden_pedido = search.orden_pedido AND status_t IS NULL
|
|
|
|
LET idx = 1
|
|
|
|
FOREACH buscar_restante INTO ordenes_produccion[idx]
|
|
LET idx = idx + 1
|
|
END FOREACH
|
|
|
|
IF idx = 1 THEN
|
|
LET answer = producto_mirror.cantidad
|
|
ELSE
|
|
LET query = "SELECT ISNULL(SUM(a.cantidad_detalle),0) FROM prtb00043 a
|
|
WHERE a.orden_produccion = ? AND
|
|
a.cod_n = ? AND
|
|
a.cod_grupo = ? AND
|
|
a.cod_tipo = ? AND
|
|
a.cod_sec = ?"
|
|
|
|
|
|
PREPARE consulta FROM query
|
|
|
|
LET container = 0
|
|
LET temporal = 0
|
|
|
|
FOR i = 1 TO ordenes_produccion.getLength() - 1
|
|
|
|
EXECUTE consulta USING ordenes_produccion[i],producto_mirror.cod_n,
|
|
producto_mirror.cod_grupo,producto_mirror.cod_tipo,
|
|
producto_mirror.cod_sec INTO temporal
|
|
|
|
LET container = container + temporal
|
|
|
|
END FOR
|
|
|
|
LET answer = producto_mirror.cantidad - container
|
|
|
|
END IF
|
|
|
|
RETURN answer
|
|
|
|
END FUNCTION }
|