PDA

Ver la Versión Completa : Query dinamico en rave Report, no es problema de parametros


sflexas
05-11-2006, 17:52:56
Gente:
Necesito ayuda para Rave report. El problema es que tengo una componente TRVdatasetConection asociada a un AdoQuery en mi aplicacion. Lo que yo quiero es generar una secuencia SQL dinamica (diferentes tablas, diferentes campos, etc)y se la inserto al AdoQuery. El tema es que tengo distintos campos y varia la cantidad de los mismos tambien.
Para solucionar eso lo que hice es que en la sentencia sql pongo un alias a la tabla y le pongo un nombrefijo a los campos de la forma campo1, campo2, campo3, etc. De esta forma en tiempo de diseño puedo realizar el reporte
tranquilamente. El problema surge en ejecucion. Cuando genero la sentencia SQL y se la agrego al query, lo ejecuto y en el listado me quedan los valores viejos del query de tiempo de diseño. Imagino que nesesito un 'refresh' del TRVdatasetConection o algo por el estilo.
A quien pueda ayudarme, gracias. Saludos

mlara
07-11-2006, 03:44:23
Yo hice lo mismo... hasta el punto en que puedo crear el reporte tranquilamente. Luego, lo que hice fue cambiar el nombre de la conexión al componente DataView 'apuntando' a un TRvCustomConection. Este RvCustomConection se encarga de hacer todas las consultas pertinentes de tal forma que devuelve los valores de los campos: campo1, campo2, etc... En el RvCustomConection hay que manejar los eventos OnOpen, OnGetCols, OnGetRow, y OnEOF.

Obs: El TRvDataSetConection lo puedes borrar, y el query al que apuntaba se puede reutilizar precisamente en los eventos del RvCustomConection.

sflexas
16-11-2006, 17:39:10
Esta muy buena la respuesta pero estuve leyendo sobre como utilizar el TRvCustomConection y no puedo dar con la tecla
para saber donde lo conecto con el query. En el evento getCols le asigno asi Conexion.WriteField('Campo1',dtInteger,8,'Campo1','') (Esta bien?)
y en el evento get rows deberia asignarlo al query?. No se como se hace para ir identificando los campos. Te agredezco muchisimo tu respuesta. Saludos

mlara
18-11-2006, 16:50:51
Veamos... estoy revisando, porque esto lo hice hace mucho tiempo.

1) En el Data View Dictionary en la interfaz Rave tengo un DataView cuyo nombre de conexión es un Rave Custom Connection creado en Delphi. Recordar que antes el nombre de la conexión era un Rave Query Connection o Rave DataSet Connection, y que se cambió por la cuestión esta de los campos.

2) Yo selecciono el reporte en tiempo de ejecución (SelectReport), y listo. Sin embargo habrá que haberse escrito el código en los eventos mencionados antes.

En el evento OnOpen yo defino el número de filas así


Connection.DataRows := AlgunQuery.FieldByName('NumeroRegistros').AsInteger;


Luego, en el evento OnGetCols escribo los nombres de las columnas (previamente no se ha indicado el número de columnas), así:


Connection.WriteField('NombreCol1', TipoCol1, LongitudCol1, '', '');
Connection.WriteField('NombreCol2', TipoCol2, LongitudCol2, '', '');
...


Luego, en el evento OnGetRow, se escriben los valores de cada campo (columna)...


// Antes se harán las consultas pertinentes para determinar los valores de cada campo.
...
Connection.WriteStrData('', ValorCampo1);
Connection.WriteStrData('', ValorCampo2);
...


Eso es todo. Espero que te sirva.

PD1. Quizás encuentres útil usar la propiedad FieldAliasList del RvCustomConnection. Yo la verdad nunca la usé.
PD2. Recomiendo leer la ayuda de Rave, y la lista de Tips & Tricks de Rave (en el sitio Web de Nevrona).
PD3. Uso la versión 5.0.8 de Rave para Delphi 7.