PDA

Ver la Versión Completa : Creación automática de formulario por Query


pape19
10-07-2013, 23:41:18
Buenos días.

Tengo un árbol, con diferentes consultas a la base de datos. Cada consulta(IBQuery) tiene ciertos parámetros, como pueden ser, fechas, tipo de comprobante, familia de artículos, etc. Estos parámetros se pasan por la interfaz, por medio de componentes estilo Edit y LookUp, etc.

Mi problema es que para cada Query, necesito un Formulario distinto para ingresar los parámetros.

Existe algún componente, intérprete, etc; que me cree automáticamente un formulario, con los componentes necesarios, para poder ingresar los parámetros? Esto leería un código propio de la Query pero q no forma parte del SQL de la misma, donde se establecería que y cuantos componentes de cada tipo de necesitan, y con que propiedades.

Saludos

Casimiro Notevi
10-07-2013, 23:50:37
Más o menos se entiendes lo que quieres, pero sería conveniente que ampliaras la información con más detalle.

pape19
11-07-2013, 00:06:50
Ejemplo, tengo dos consultas.

Sistema de un Negocio de Electrónica.

1) Cantidad de ventas en un período.

2) Cantidad de TV LED vendidos.

Voy a tener para cada consulta, su respectivo SQL con parámetros. En la primera, los parámetros serán, Fecha_Inicio y Fecha_Fin, indicados en dos DateTimePicker en un form. La segunda, el parámetro será Tipo_Artículo (TV LED), indicados en una combo en otro form.

Es decir, hasta aca tengo 2 form, creados en tiempo de diseño, uno para cada Query. En caso de tener 1000 Querys con parámetros, debería crear 1000 forms.

Lo que quiero, es que al llamar a una Query, previamente se lea código parecido a lo siguiente(Ejemplo Query 1 mencionada):


<#PARAM NAME=FEC_DESDE TYPE=tdDate CAPTION="Fecha desde">
<#PARAM NAME=FEC_HASTA TYPE=tdDate CAPTION="Fecha hasta">


Donde debería haber un intérprete, que al leer eso, cree en tiempo de ejecución un form con dos datetimepicker. Quiero ahorrarme hacer el intérprete.

Casimiro Notevi
11-07-2013, 01:06:00
Quiero ahorrarme hacer el intérprete.

Precisamente, eso es lo que sí tienes que hacer, algún "intérprete" para todos los tipos de informes.

Lo normal es tener en una tabla todos los informes y sus parámetros, tipos de datos, valores predeterminados, tipo de componente a mostrar, etc.
Y luego crear el formulario con esos datos extraidos de la tabla.

También puedes hacer algo "sencillo" de la forma en que comentas, pero tienes que hacerlo, no hay nada hecho que te solucione esa problemática. Que yo sepa.

Lepe
11-07-2013, 12:17:46
Yo lo hice alguna vez de forma muy simple, explicarlo no va a ser fácil XD:

Primero tienes el form general que mostrará los parámetros. Dentro de él tienes un Scrollbox (por ejemplo), y ahora diseñas cada serie de parámetros en un TFrame distinto. (Quien dice TFrames, también dice una serie de paneles ocultos en el form, que los haces visible según quieras).

Por ejemplo:
- Un Frame que tenga dos TDateTimePicker, (para seleccionar las fechas inicio y fin)
- Otro frame que tenga un combo con las opciones a mostrar, etc.

Ahora en el form te creas un tipo enumerado:

type
TSqlOption = (soFechas, soCombo);
TOptionToShow = set of TSqlOption ;

FormX = class(tform)
public
property Mostrar : TOptionToShow read FMostrar write SetMostrar;

Cuando quieras cear el form con distintos parámetros para el Sql, solo tienes que modificar la propiedad "Mostrar", de forma que en SetMostrar, lo que haces es crear los Frames adecuados, y ponerlos uno debajo de otro en el ScrollBox del Form.

Para hacerlo "más profesional", puedes quitar las barras del ScrollBox y hacer que el Form cambie de tamaño para acomodar todos los parámetros posibles.

Otra forma más laboriosa, fue crear un estilo a Windows XP, que te añade paneles a la izquierda de la ventana, cada uno con los TFrames que quieras añadir. Cosa que queda muy bien y es estandard.

Espero se entienda, cualquier duda, dispara.

fjcg02
11-07-2013, 12:44:11
Algo parecido a lo que propone Lepe...
Pones un form con un ValuelistEditor, y por cada parámetro das de alta una nueva clave. Luego, dependiendo del tipo de parámetro, juegas con las propiedades de cada uno.
Otro botón de ejecutar y hala, a correr.

for n:=0 to Query1.Params.Count-1 do
begin
ValueListEditor1.InsertRow( ...);
ValueListEditor1.ItemProps[ValueListEditor1.Items.Count-1].EditMask:= '...';
ValueListEditor1.ItemProps[ValueListEditor1.Items.Count-1].PickList...;
...
end;

Seguramente podrás incorporar un calendario cuando el parámetro sea de tipo fecha.
También podrías cargar la picklist desde una query auxiliar para que el usuario seleccione de una lista. Por ejemplo, si quiero sacar la lista de estados de los pedidos ( que es uno de los parámetros ) pongo una query que me rellena los valores, para que el usuario no "meta la pata".

Un saludo

pape19
11-07-2013, 15:21:25
Gracias a todos por las respuestas, y sus buenas ideas.

Lo que necesito, es la creación de un form en ejecución cuando se llame a la consulta X; no tengo que realizar nada en tiempo de diseño. Veo con muy buenos ojos la creación de una tabla, un registro por parámetro, utilizando una clave compuesta entre nro_query y nro_parametro; y que cada vez que se llame a esa query recorrer esos registros creando los componentes en un form con los datos extraídos de la tabla.

Pruebo las opciones, y les comento como me fue; y si sale algo "aceptable" comparto.

Saludos y gracias!