Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Como añadir parámetros o variables (QReport) (https://www.clubdelphi.com/foros/showthread.php?t=50517)

salvica 20-11-2007 21:30:19

Como añadir parámetros o variables (QReport)
 
Hola

Necesito definir unas variables globales al QReport, en Reportman hacía lo siguiente:

Código Delphi [-]
{ actualizar las variables del Report con las variables del proceso }
  with VCLReport1 do begin
       FileName        := strFileReport;
       Preview         := False; //------> para imprimir
       //Preview         := True; //-------> para verlo en pantalla
       ShowProgress    := True; //-------> ver la barra de progreso
       ShowPrintDialog := False; //------> no ver la barra de herramientas
       Title           := 'INFORME DE DATOS CALCULADOS';
     { rellenar el informe }
       with Report.Params do begin
          { parametros de la oficina }
            ParamByName('OFICINA').Value       := 'En mi casa';
            ParamByName('PROVINCIA').Value     := 'ALBACETE';
          { unidades de medida }
            ParamByName('EN_METROS').Value     := EN_NUDOS;
            ParamByName('EN_KILOMETROS').Value := EN_KILOMETROS;
       end; { del with Report.Params do }
     { ejecutar el informe }
       Execute;
  end; { del with VCLReport1 do }
No he encontrado información para hacer lo mismo con QReport.

Agradecido
Salvica.

Lepe 21-11-2007 11:43:29

Nunca he usado parámetros en un QuickReports. Los parámetros los tiene la consulta (TQuery) en la que se basa el QuickReport, y se accede directamente al query.params

En QuickRpeports, no existe el "Filename". Digamos que tendrás un QuickReport por cada tipo de informe que necesites.

Para mostrar el informe se usa: PreviewModal, Preview, PreviewModeless (previsualización del informe)



Saludos

salvica 21-11-2007 17:46:38

Hola Lepe, gracias por responder.

De lo que se trata es de que QReport actúe en base a unas condiones externas (en mi caso las unidades de medida).
Encontré una mínima información en Google (dos enlaces), y una consulta de jmselesan en éste foro http://www.clubdelphi.com/foros/show...ight=functions

En teoría, según pone en http://www.quickreport.co.uk/QuickReportFAQ.doc, en la pregunta I have some variables defined in the report's functions property and I can't initialize them in the report's BeforePrint event., tengo que hacer lo siguiente:

1º - Crearme la variable en tiempo de diseño, por ejemplo una denominada "test"
2º - Modificarla por código, tal que así:
Código Delphi [-]
{ procedimiento de creación de una variable entera }
procedure TReportForm1.CrearVariableInteger( sNombre:string; iValor:integer );
var
  aQREvElement: TQREvElement;
begin
  with QuickRep1.Functions do
  begin
    aQREvElement := GetConstant(sNombre);

    if (aQREvElement <> nil) and (aQREvElement.Value(nil).Kind = resInt) then
    begin
      SetIntegerConstant(aQREvElement, iValor);
    end;
  end;
end;

{ función de lectura de una variable entera }
function  TReportForm1.LeerVariableInteger( sNombre:string ):integer;
var
  aQREvElement: TQREvElement;
begin
  with QuickRep1.Functions do
       aQREvElement := GetConstant(sNombre);

  Result := aQREvElement.Value(nil).intResult;
end;

y llamar a las funciones tal que así:
Código Delphi [-]
var
   miIntPrueba : ineteger;
begin
   ...
   CrearVariableInteger( 'INTPRUEBA', 300 );
   ...

   ...
   miIntPrueba            := LeerVariableInteger( 'INTPRUEBA' );
   QRLabel_PRUEBA.Caption := FormatFloat( '##0', miIntPrueba );
   ...
end;
Bueno, pues esto "casca" y dá un error de excepción, al hacer un seguimiento "paso a paso" la creación de la variable devuelve nil

¿ideas?
Salvica

salvica 21-11-2007 17:55:04

Añado (disculpas por la omisión) :mad::mad::mad::mad:
Delphi 7, Windows Xp, QReport que trae Delphi (activado según he visto en éste foro)
Saludos
Salvica

Lepe 22-11-2007 00:05:17

Pero, ¿debes hacerlo así exactamente o puedes cambiar el procedimiento?

Lo más fácil, File -> New -> Form, y ahora dentro pones el QuickReport. Las variables esas que necesites, las pones como variables / propiedades públicas del form, y en el OnPrint del Quickreport, lees las variables del Form.

La "variable que digo" puedes definirla de tipo Variant, y así puedes almacenar una fecha, float, integer, string, boolean, etc. Incluso un array of variant con un Tstringlist para guardar los nombres, etc.



Saludos

Lepe 22-11-2007 00:38:23

En cuanto al error, es muy posible que dicho parámetro, aunque sea global a QuickReports no esté creado o disponible para asignar su valor antes de hacer el Preview (no me extrañaría nada de QuickReports).

Saludos

Lepe 22-11-2007 17:47:31

Ya he tenido un poco más de tiempo con esto, no me gusta el estilo, pero bueno, si es lo que necesitas....

Que conste que no son "parámetros" como has visto, se incluye pagenumber, por tanto son funciones que debe interpretar QuickReport;

Código Delphi [-]
uses qrExpr;

var pr:TqrEvResult;
// añadimos por código una función:
Quickreport1. functions.addFunction('piopio', quotedStr('mi gorrioncito canta pio pio')); 
Quickreport1. functions.addFunction('unEntero', 25)); 
// si es un string, debes pasarlo con quotedStr, o el parser interno creerá que es una 
//función de agregado (avg, sum, etc) o funciones interna dando excepciones 'Unknow function 'migorrioncito canta pio pio'.

// una vez creados los parámetros por código, es necesario que internamente cree esas funciones:
quickreport1.functions.Prepare;

// Ver los valores que tiene asignados:

// 1ª forma:
ShowMessage(quickreport1.functions.Value('piopio').strResult);


// 2ª forma:
pr := quickreport1.functions.Value('unEntero');
ShowMessage(inttostr(pr.intResult));

// pr es un puntero, así que podemos cambiar su valor y lo acepta sin problemas:
pr.intResult := 32;

// comprobación de que ha aceptado:
pr := quickreport1.functions.Value('unEntero'); // buscamos de nuevo la funcion
ShowMessage(inttostr(pr.intResult)); // dará el valor 32.
Si accedemos por ejemplo a una función que no esté creada, no dará errores de ejecución, tomará lo que haya en la memoria RAM, osea el típico jeroglífico de código máquina.

También tienes DeleteFunction, y después de ejecutarla, asegúrate de llamar a functions.Prepare.

Saludos

Alfredo 22-11-2007 18:00:14

Efectivamente, tal como lo describe Lepe, lo mejor seria crear el form con el Qreport y sus variables, y si la llamada la haces desde un Tbutton puedes implementar algo como:

Código Delphi [-]
    if form1 = nil then  //Presumiendo que el form no esta creado
        begin
          dm.qDiario.DisableControls; // si vienen los datos de un Dataset
          form1:= tform1.Create(self); // de crea el form en runtime
          form1.QuickRep1.print; // mandas a imprimir directamente
          dm.qDiario.EnableControls;
          form1.Free; //destruye el form
          form1:= nil;
        end
      else
        begin
          form1.Free;
          form1:= nil;
        end;

salvica 24-11-2007 19:47:05

Ante todo gracias lepe y alfredo por las molestias ;)
Cita:

Empezado por Alfredo (Mensaje 247773)
Efectivamente, tal como lo describe Lepe, lo mejor seria crear el form con el Qreport y sus variables, y si la llamada ...

No, esa solución no me vale porque tendría que declarar todos los OnPrint de los campos que utilizasen las variables (soy un vago, que le voy a hacer ) :rolleyes::rolleyes::rolleyes:

Cita:

Empezado por Lepe (Mensaje 247745)
Ya he tenido un poco más de tiempo con esto, no me gusta el estilo, pero bueno, si es lo que necesitas....

Que conste que no son "parámetros" como has visto, se incluye pagenumber, por tanto son funciones que debe interpretar QuickReport;
Código Delphi [-] uses qrExpr;

var pr:TqrEvResult;
// añadimos por código una función:
Quickreport1. functions.addFunction('piopio', quotedStr('mi gorrioncito canta pio pio'));
Quickreport1. functions.addFunction('unEntero', 25));
// si es un string, debes pasarlo con quotedStr, o el parser interno creerá que es una
//función de agregado (avg, sum, etc) o funciones interna dando excepciones 'Unknow function 'migorrioncito canta pio pio'.


También tienes DeleteFunction, y después de ejecutarla, asegúrate de llamar a functions.Prepare.

Saludos

Probaré con esto y ya os contaré.

Me parece que el problema que tenía era el Prepare que no lo estaba llamando :mad:

Abusando un poco de vuestra confianza :D:D

¿Donde puedo encontrar información para/como crear funciones de usuario en Report Manager?
Estoy pensando volverme a los orígenes :)

Saludos
Salvica

Alfredo 27-11-2007 14:36:13

Pues te pido por favor que si lo consigues, lo publiques aqui. Yo estoy muy interezado en el report manager. Le veo complicado de usar, pero creo que debe tener por donde entrarle. Actualmete estoy buscando la forma de controlar los eventos de impresión desde delphi, porque el constructor de expresiones lo encuentro muy limitado. Pero bueno esos son granos de otro costal....


La franja horaria es GMT +2. Ahora son las 02:53:06.

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