IMPORT util -- Tipos reutilizables para evitar duplicar la definición de campos TYPE t_master RECORD ventas CHAR(1), cotizacion_no INT, num_oc INT, fecha_oc DATE, orden_compra CHAR(15), sec_vend SMALLINT, nombreVendedor VARCHAR(100), tipo_cliente SMALLINT, sec_cliente SMALLINT, cliente VARCHAR(100), direccion CHAR(80), telefono CHAR(20), fax CHAR(20), fecha_entrega DATE, cond_pago SMALLINT, cantidad_i DEC(8, 2), precio_i DEC(8, 2), cantidad_mo DEC(10, 2), precio_mo DEC(10, 2), transporte DEC(10, 2), itbis DEC(10, 2), ubicacion VARCHAR(170), estado_orden CHAR(10), fecha_cierre DATE, observacion VARCHAR(100), nombre_file2 VARCHAR(100) END RECORD TYPE t_detalle RECORD num_oc INT, secuencia SMALLINT, area SMALLINT, cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion VARCHAR(100), precio DEC(10, 2), cantidad_1 DEC(12, 4), cantidad DEC(12, 5), descuento DEC(10, 2), fecha_compromiso DATE, estado_produccion VARCHAR(20), observacion VARCHAR(100), id_kit INT END RECORD FUNCTION ordenesCocinas(data) DEFINE i SMALLINT, idx SMALLINT, data STRING DEFINE credenciales RECORD usuario VARCHAR(50), clave VARCHAR(50), orden INT END RECORD -- Estructura de salida: ORDEN { master, [detalle] } DEFINE o RECORD ordenes DYNAMIC ARRAY OF RECORD master t_master, detalle DYNAMIC ARRAY OF t_detalle END RECORD, menajes RECORD cod_msg INT, descripcion STRING END RECORD END RECORD -- Registros temporales donde cae cada FETCH antes de copiarlo al arreglo DEFINE orden_master t_master DEFINE orden_detalle t_detalle DEFINE v_num_oc INT CALL util.JSON.parse(data, credenciales) DISPLAY "USUARIO ", credenciales.usuario, " clave ", credenciales.clave CONNECT TO "smarmotech" USER credenciales.usuario USING credenciales.clave IF STATUS < 0 THEN LET o.menajes.cod_msg = 400 LET o.menajes.descripcion = "USUARIO NO VALIDO ", SQLCA.SQLERRM DISCONNECT CURRENT RETURN util.JSON.stringify(o) END IF DISPLAY "DATOS: ", credenciales.orden -- Cursor maestro: una fila por orden de cocina (cod_n = 52) -- NOTA: aqui van 25 columnas para 25 campos del maestro. -- En tu version original habia un a.num_oc repetido al final -- (26 columnas vs 25 campos), que lo quite. DECLARE buscaOrden CURSOR FOR SELECT DISTINCT a.ventas, a.cotizacion_no, a.num_oc, a.fecha_oc, RTRIM(a.nombre_file), a.sec_vend, RTRIM(c.nom1_emp) || ' '|| RTRIM(c.apell1_emp), a.tipo_cliente, a.sec_cliente, RTRIM(d.nombre), RTRIM(a.direccion), a.telefono, a.fax, a.fecha_entrega, ISNULL(a.cond_pago, 0), ISNULL(a.cantidad_i, 0), ISNULL(a.precio_i, 0), ISNULL(a.cantidad_mo, 0), ISNULL(a.precio_mo, 0), a.transporte, a.itbis, RTRIM(a.ubicacion), a.cerrada, a.fecha_cierre, a.observacion, a.nombre_file2 FROM prtb00012 a INNER JOIN adtb00003 c ON c.num_emp = a.sec_vend INNER JOIN prtb00013 k ON k.num_oc = a.num_oc, vetb00004 d WHERE k.cod_n IN (52,56,40,43) AND a.cerrada = 'N' AND a.tipo_cliente = d.tipo_cliente AND a.sec_cliente = d.sec_cliente AND a.status_t IS NULL -- Cursor de detalle: items de UNA sola orden, parametrizado por v_num_oc. -- Se declara una sola vez; el valor de v_num_oc se lee al abrir el FOREACH. DECLARE u27 CURSOR FOR SELECT b.num_oc, b.secuencia, b.area, b.cod_n, b.cod_grupo, b.cod_tipo, b.cod_sec, RTRIM(k.descrip_esp), b.precio, b.cantidad, c.cantidad_1, b.descuento, b.fecha_compromiso, b.estado_produccion, b.observacion, b.id_kit FROM prtb00012 a, prtb00013 b INNER JOIN iptb00002 k ON k.cod_n = b.cod_n AND k.cod_grupo = b.cod_grupo AND k.cod_tipo = b.cod_tipo AND k.cod_sec = b.cod_sec, prtb00023 c WHERE a.num_oc = b.num_oc AND b.num_oc = v_num_oc AND b.num_oc = c.num_oc AND a.cerrada = 'N' AND b.cod_n = c.cod_n AND b.cod_grupo = c.cod_grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec AND a.status_t IS NULL LET idx = 0 CALL o.ordenes.clear() FOREACH buscaOrden INTO orden_master.* LET idx = idx + 1 -- Estado de la orden IF orden_master.estado_orden = 'N' THEN LET orden_master.estado_orden = 'ABIERTA' ELSE LET orden_master.estado_orden = 'CERRADA' END IF -- Copio el maestro a su posicion en el arreglo de ordenes LET o.ordenes[idx].master.* = orden_master.* -- Parametro para traer el detalle de ESTA orden LET v_num_oc = orden_master.num_oc -- Detalle anidado dentro de la orden actual LET i = 0 FOREACH u27 INTO orden_detalle.* LET i = i + 1 LET o.ordenes[idx].detalle[i].* = orden_detalle.* END FOREACH END FOREACH FREE u27 FREE buscaOrden DISCONNECT CURRENT LET o.menajes.cod_msg = 200 LET o.menajes.descripcion = 'OPERACION EXITOSA' RETURN util.JSON.stringify(o) END FUNCTION