Files
MBS/PROYECTO/PRDIR/prprmt023.4gl
T

1749 lines
66 KiB
Plaintext

{
PROGRAMA : prprmt023
OBJETIVO : Orden de Produccion
PROGRAMADOR : ING. ELVIS GARCA
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 }