PDA

Ver la Versión Completa : ReportManager, cambiar consulta en ejecución


felipe88
14-10-2011, 16:33:14
Que tal foro,
no pienso en que tan posible sea pero si de lo importante que pudiera conocer al respecto.
La idea de cambiar la consulta que creamos en el reporte me surgió al tener la opción de generar un listado desde dos posibles parámetros, ambos accediendo a la misma tabla y obteniendo los mismos resultados, lo que varia es el like del query.

¿Hasta dónde es posible esto?



Saludos!

Casimiro Notevi
14-10-2011, 17:32:52
Yo tengo algunos informes al que les paso el sql que voy a necesitar porque los campos que se muestran es igual.

Esto es un ejemplo rescatado de algún sitio:

sql := 'Select field1, field2 from tableA where fieldX = 1 order by cli.NOMECLIENTE, rec.CODCLIENTE, rec.DATAVENCIMENTO, rec.EMISSAO';
VCLReport.FileName := directorioinformes + 'RelContasReceber.rep';
VCLReport.Report.DatabaseInfo.Items[0].SQLConnection := dm.sqlsisAdimin;
VCLReport.Report.DataInfo.Items[0].SQL:= sql; // <<<------------- aquí se le asigna un select
VCLReport.Execute;


Y esto es de mi código:

// cParametro lleva el nombre del dataset (conjunto de datos) del reportmanager al que le vamos a asignar el select.
// cValor lleva el SQL
RMvcl1.Report.DataInfo.ItemByName(cParametro).SQL := cValor;


Como ves en los ejemplos, puedes indicarlo por su posición o por su nombre: items[0].sql o itembyname('conjuntodedatos').sql


Creo que es lo que estás buscando.

felipe88
14-10-2011, 18:28:36
Hola Casimiro, gracias por responder.
Había estado consultando en internet y encontré las "cadenas de sustitución", que son un tipo de parámetro que permiten alterar pequeñas partes de la consulta dentro del reporte, más información aquí: http://reportman.sourceforge.net/doc/repparams.html

No sé si sea lo mismo que me propones, puesto que los ejemplos no muestran como debería ir la consulta dentro del reporte, de todas formas voy a revisar bien el ejemplo. Gracias :)


Saludos!

felipe88
14-10-2011, 22:35:22
Hola, para entender mejor lo que quiero lograr estas serían las consultas:

SELECT * FROM CLIENTE WHERE NOMBRE LIKE PARAMETRO

y

SELECT * FROM CLIENTE WHERE ID LIKE PARAMETRO



Saludos!

Casimiro Notevi
14-10-2011, 22:54:01
Pues lo que te he contestado es lo que necesitas :)

felipe88
14-10-2011, 22:59:36
Pues lo que te he contestado es lo que necesitas :)

Asi es Casimiro, es válido, lo único que no había mencionado es que llamo al reporte usando las funciones de la dll reportman.ocx, algo como decir:


procedure TForm1.Button1Click(Sender: TObject);
var rept: OleVariant;
begin
rept := CreateOleObject('ReportMan.ReportManX');
rept.Preview := true;
rept.ShowProgress := false;
rept.ShowPrintDialog:= false;
rept.Title := 'Informe de Prueba';
rept.Filename := 'C:\Archivos de programa\Report Manager\sample4.rep';
rept.execute;
end;


Y de esta forma no puedo llamar las propiedades que mencionas.


Saludos!

Casimiro Notevi
14-10-2011, 23:45:47
Pues ahí no tengo ni idea, nunca lo he usado de esa manera.

felipe88
15-10-2011, 16:52:27
Hola Casimiro, he logrado solucionarlo con el parámetro de sustitución, la verdad estaba confundido al principio de como usarlo, pero fué simple.
Ejemplo, yo tengo la siguiente consulta: SELECT * FROM CLIENTE WHERE NOMBRE LIKE :PARAMETRO, el parámetro de este tipo solo reemplaza la cadena o frase que le indique, en este caso solo le indique cambiar "NOMBRE" por "ID" y en Delphi sería algo así:


procedure TForm1.Button1Click(Sender: TObject);
var rept: OleVariant;
begin
rept := CreateOleObject('ReportMan.ReportManX');
rept.Preview := true;
rept.ShowProgress := false;
rept.ShowPrintDialog:= false;
rept.Title := 'Informe de Prueba';
rept.Filename := 'C:\MiReporte.rep';
rept.Report.Params.Items[0].Value := 'ID';
rept.SetParamValue('PARAMETRO',123); // 123 seria el ID del cliente
rept.execute;
end;


Y funciona perfecto... ahora solo me surgió un pequeño detalle que me dejó volando :rolleyes:, yo declaré el parámetro para el caso de buscar por nombre como cadena, pero no sé cómo pasarle el valor, ya que si hago algo como:

rept.SetParamValue('PARAMETRO','Fulanito');

no me retorna los datos, ¿cómo debo pasarle ese valor al like de la consulta?



Saludos!

Casimiro Notevi
15-10-2011, 17:47:48
Pues entonces hazlo como te he indicado antes, en lugar de cambiar parámetros, pásale la consulta completa.
rept.Report.DataInfo.Items[0].SQL:= 'select loquesea from latabla where campotal like %pepe';

y en el otro caso
rept.Report.DataInfo.Items[0].SQL:= 'select loquesea from latabla where campotal=123';

El datainfo.items[0] es el conjunto de datos, si tienes más de uno, pues el número que le corresponda, aunque también puedes hacerlo por su nombre:

rept.Report.DataInfo.Itembyname('CLIENTES').SQL:= 'select loquesea from latabla where campotal=123';

felipe88
15-10-2011, 23:12:32
Solucionado Casimiro, solo creé otro campo de este tipo para reemplazar en la consulta el valor del like.
Gracias por tus consejos :)


Saludos!