Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   ReportManager, cambiar consulta en ejecución (https://www.clubdelphi.com/foros/showthread.php?t=76186)

felipe88 14-10-2011 16:33:14

ReportManager, cambiar consulta en ejecución
 
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:

Código Delphi [-]
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:
Código Delphi [-]
// 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:

Código SQL [-]
SELECT * FROM CLIENTE WHERE NOMBRE LIKE PARAMETRO

y

Código SQL [-]
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

Cita:

Empezado por Casimiro Notevi (Mensaje 415647)
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:

Código Delphi [-]
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í:

Código Delphi [-]
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.
Código Delphi [-]
rept.Report.DataInfo.Items[0].SQL:= 'select loquesea from latabla where campotal like %pepe';

y en el otro caso
Código Delphi [-]
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:

Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 17:41:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi