Necesito saber la manera de poder filtrar una lista de códigos (numéricos) en una datawindow, sin procedimiento almacenado. La ventana previa me permite elegir una lista de códigos (Ej. Productores de Fruta), estos los puedo armar en formato string concatenando uno a uno y pasar como argumento a la datawindow, pero ¿cómo los filtro?.
1 respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
La ventaja sobre lo que necesitas es simplemente que power builder tiene el concepto de vectores dinámicos, esto significa que el vector puede crecer tanto como lo necesites, y eso en tiempo de corrida. Un datawindow puede ser generado por la selección de una o varias tablas de una base de datos, la realidad es que detrás del datawindow, se encuentra un simple select. El cual selecciona una serie de campos o columnas de una o varias tablas. Este select igualmente puede contener una instrucción WHERE, la cual es la que define el rango de datos a seleccionar de dichas tablas. Por ejemplo. Podría seleccionar las facturas emitidas con numero del 1 al 100 SELECT numero_factura, monto_factura, fecha_factura, codigo_cliente FROM facturas WHERE numero_factura between 1 and 100 Al formar parte este script de un datawindow object, este genera las columnas, numero_factura, monto_factura, fecha_factura, codigo_cliente. Y al ejecutar la función retrieve(), los datos son presentados en dicho datawindow. Dentro del área del script del datawindow existe una opción llamada DESIGNE, o diseño, es donde defines como quieres ver el script, gráfico o sintaxis, personalmente me gusta más sintaxis, pues me da más control de lo que estoy haciendo. igualmente existe una opcion de RETRIEVE ARGUMENTS. Que es donde defines los argumentos de retrieve. Sigamos con el ejemplo anterior. Con la diferencia que ahora en lugar de colocar constantes, colocaremos variables. Para eso definimos en la parte de argumentos de carga. Una variable del tipo numérico llamada, num_desde y otra de igual tipo llamada num_desde. El script deberá quedar. SELECT numero_factura, monto_factura, fecha_factura, codigo_cliente FROM facturas WHERE numero_factura between :num_desde and :num_hasta El datawindow no cambia en nada, pues las columnas inscritas son las mismas, sin embargo lo que cambia ahora es la forma de ejecutar la función retrieve. dw_1. Retrieve(1, 100) Como veras los parámetros deben coincidir, lo que estoy haciendo en el ejemplo, es cargando los datos de ventas desde la factura 1, a la factura 100, ahora el alcance es mayor, pues los datos pueden ser enviados desde afuera del datawindow object. Y por ejemplo podrías tener dos campos en donde el usuario coloca los rangos de selección. Y estos trasladarlos como función de carga con la función retrieve del datawindow. Digamos que el asunto se complica, y en lugar de querer definir un rango desde-hasta, necesitas algo más al azar, es cuando utilizas un parámetro o argumento de carga del tipo numérico pero vector. Igualmente como lo defines en el área de argumentos de carga, defines ahora uno único, que se llame números, y el tipo sera NUMBER ARRAY. ahora el select cambia. SELECT numero_factura, monto_factura, fecha_factura, codigo_cliente FROM facturas WHERE numero_factura in (:numeros) Y la forma de hacer el llamado con la función retrieve será retrieve([1, 10, 25, 80, 100]) Claro, siempre puedes utilizar un vector, el cual previamente cargas por ejemplo con la selección de un numero determinado de facturas, las cuales el usuario (tal como tienes en tu pregunta), tiene delante una pantalla, y por ejemplo cada factura contiene una casilla del tipo CHECK, la cual el marca, y en función de esto el vector carga todas aquellas facturas marcadas y este vector es enviado como parámetro a la función retrieve. Ej. integer vector[] ... ... Procesos de carga para vector[] ... .. dw_1.retrieve(vector) El resultado sera exactamente lo que estas buscando. Para finalizar, mi recomendación es que trates de evitar el uso de procedimientos almacenados, pues estos son elementos adicionales, que tienes que dar permisos, grabar en tus copias de seguridad, y si transportas tu base de datos, o migras tus datos, igual tienes que migrar los procedimientos almacenados, esperando que estos sean compatibles con la nueva opción de base de datos. Personalmente es mejor, hacerlo todo por medios programáticos propios de power builder, de esa forma todo esta en ejecutable. Y nada esta externo.
Me pareces bastante claro, y la opción del number array finalmente ya la había aplicado y funciono tal como lo explicas acá. Gracias de todas maneras.