{ 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 }