Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Post Acomodo de Datos en Qreport

Hola!!!

Existe un problema (logicamente por eso les escribo) y tengo la idea de solucionarlo por medio de dos formas Veamos;

Tengo una tabla(paradox) con 20 campos, pero no quiero que se visualicen todos los campos, los campos que estan seleccionados(que son los que quiero mostrar) son llenados con o ò en su caso con un valor numerico, y los campos que no fueron seleccionados tienen una x(que esos no me importan, porque no se van a mostrar.

1. Vayamos directamente con qreport.

He tratado de hacerlo directamente con qreport, pero hay veces que se traslapan los valores de los campos, no se porque haga eso, en la propiedad de QRLabel le pongo que sea autoestrech, y aparte no se como hacerle para que solamente se muestren los que tienen 'o' (es una o) o un valor numerico, ya que como comentaba anteriormente no me interesan los que tengan la 'x'. ya que pueden ser variables el numero de campos seleccionados para cada Solicitud.
p.e. la solicitud 1 puede tener 2 campos seleccionados
la solicitud 2 puede tener 4 campos seleccionados. etc

y me deberian de aparecer de la manera siguiente:
si el valor del campo es 'o' me debe de aparecer en blanco o vacio, pero si tiene un valor numerico, me debe de aparecer el valor

En la solicitud me deberia de aparecer asi:

solicitud posicion campo3 campo4
1 1a 2.25 1.57
1 2b 1.25 3.25
1 . . .
1 . . .

me deben de aparecer solamente 2 campos en este caso del ejemplo me aparecen el campo 3 y 4 porque son los que el usuario selecciono anteriormente y se encuentran almacenados en la base de datos.

Veamos la solicitud 2

solicitud posicion campo1 campo2 campo3 campo4
2 1a 1.25 1.22 6.25 78.25
2 2a 1.55 8.25
2 . . . . .
2 . . . . .

En este caso el usuario selecciono los 4 campos y como se ve en la posicion 2a, en el campo 1 y 3 no aparecen valores porque no se ha capturado ningun valor, (en este caso no hay problem porque los valores se jalan de la base de datos y solamente hay que validar si tiene o no valor).

ya lo trate de hacer directamente en qreport, pero es un relajo y hay valores que no aparecen, se traslapan los nombres de los campos (QRLabel)
Ademas de que tengo que poner los 20 QRlabel, por si el usuario selecciono los 20, me aparezcan todos los labels.

Habia pensado otra forma, crear los QRLabel en tiempo de diseño, pero no se que convenga mas.


forma 2: pasarlos a un stringgrid y posteriormente a qreport(creo que seria mas facil) jejeje.

los datos ya los tengo en un stringgrid, solamente hace falta pasarlos directamente al qreport, pero no tengo la idea de como hacerlo, tengo que usar algun evento o como le hago para pasarle los datos desde el sgrid hacia el qreport???

Gracias por su tiempo y espero haberme explicado bien.

Cómo te sientes hoy?
Responder Con Cita
  #2  
Antiguo 08-10-2005
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
puedes usar el evento onPrint para asignar un valor al momento de imprimir el campo
Responder Con Cita
  #3  
Antiguo 08-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Mira el qrCreateList para listados personalizados.

Despues de llamar a esa rutina y antes de hacer el preview del informe, puedes recorrer los qrExpr de la banda detalle y mostrar / ocultar los datos que quieras.

saludos
Responder Con Cita
  #4  
Antiguo 10-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Mira este hilo.
http://www.clubdelphi.com/foros/show...ht=quickreport

Creé en su día un generador de reportes automático. Vale para cualquier consulta que tengas creada en tu programa.
Aunque no es exactamente lo que pides, te puede dar una idea de lo que se puede hacer en tiempo de ejecución y lo que no.
Creo que el código que está es válido, aunque mejorable.

Se basa en una llamada a una función con una serie de parámetros, que presenta un formulario con la lista de campos de la consulta. Seleccionas los campos que quieres y 'monta' las bandas de titulos, datos y totales en un reporte. Los campos se crean en tiempo de ejecución.

Para que te hagas una idea, antes de leer ese hilo, yo no tenía ni idea de cómo hacerlo.

Espero que te sea de ayuda

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 10-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Muchas Gracias por tomarse el tiempo para responderme. Voy a revisarlo detalladamente y posteriormente les dire como solucione el problema.

Me han sacado de una gran problema!!!!

Cómo te sientes hoy?
Responder Con Cita
  #6  
Antiguo 10-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Oigan, ya se que esta pregunta no es de este hilo, pero me salio un EStackOverflor, y no se porque, les pongo mi codigo:
Código Delphi [-]
unit reporte_runtime;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  QuickRpt, ExtCtrls,QRCTRLS, db;

type
  TForm1 = class(TForm)
    QuickRep1: TQuickRep;
    QRBand1: TQRBand;
    QRBand2: TQRBand;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
  c : TQRlabel;
begin
  c.Top := 10;
  c.Left := 10;
  c.Name := 'label';
  c.Caption := 'label1';
  c.parent := QRBand1;
  c := tQRlabel.Create(Self);
  c.Top := 10;
  c.Left := 50;
  c.Name := 'lll';
  c.Caption := 'prueba';
  c.parent := QRBand1;  <<------ aqui es donde me marca el desbordado de pila
  quickrep1.Preview;
  c.free;
end;

end.
Error : Project reporte.exe raised exception class EStackOverflow with message
"Stack overflow". Proccess stopped.

Gracias.

Si alguien tiene las ganas y el tiempo necesario para darle una revisadilla se los agradeceria.

Cómo te siente hoy?

Última edición por vtdeleon fecha: 10-10-2005 a las 20:18:36. Razón: Etiqueta Delphi
Responder Con Cita
  #7  
Antiguo 10-10-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludo

David, usa las etiquetas, en esta ocasión las [ delphi] [ /delphi]
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #8  
Antiguo 10-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Question

Lo siento mucho, es que casi no uso las etiquetas, les prometo que de ahora en adelante voy a tratar de trabajar mas con ellas.

Ya solucione mi problema creo que habia un problema, porque no tenia un ciclo, y creaba dos labels al mismo tiempo y se encimaban las etiquetas en las pila.

Otra pregunta, esta si es relacionada con qreport.

En el qreport se pueden añadir paginas, pero no le he encontrado la manera de añadir una, en el ejemplo que les puse anteriormente, cuando creo las labels, le puse un ciclo desde 0 hasta 100, pero en la primera pagina solamente se muestran como 60 aprox. pero no me añade automaticamente la otra pagina, como le puedo añadir la otra pagina o paginas en caso de que sea necesario???

Alguna vez en la vida le trate con quickrep1.newpage, pero no pasa nada, algunas veces me marca error, ya lei la ayuda, pero nomas no me sale.

Gracias.

Cómo te sientes hoy??

Alguien sabe donde puedo conseguir o comprar o bajar algun manual completo de quickreport???

Última edición por david duarte fecha: 10-10-2005 a las 20:28:09. Razón: Complemento
Responder Con Cita
  #9  
Antiguo 12-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Hola!!!

Oigan, se puede sabel la longitud de caracteres del nombre del campo, esto es para saber que espacio le voy a dejar antes de crear el TQRLabel o el TQRDBtext.

esto es

si el campo 1 se llama "Analisis_1" su longitud seria 10 y el campo 2 "Analisis2",
entonces el campo 1 se va a mostrar desde las coordenadas 0(top),0(left),
y para mostrar adecuadamente el campo2 tendria que sumarle a left los 10 caracteres mas 5 espacios en blanco y mostrar el siguiente nombre de campo.

Hice la prueba, pero creo que se manejan por pixeles o algo asi, no??
Gracias
Responder Con Cita
  #10  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Hola a todos!!!

Voy a crear muchas TQRLabels, que es donde voy a poner el nombre de los campos que selecciono el usuario y voy a mostrar su informacion.

Pero no he podido hacer el arreglo de etiquetas que comentaron anteriormente

Código Delphi [-]
etiquetas: array of TQRLabels

pero al momento de querer crearla o mejor dicho asignarla al arreglo me marca un error
primero la creaba asi
la declaracion:
Código Delphi [-]
 lab : TQRLabel
asignacion
Código Delphi [-]
 lab := TQRLabel.Create(Self)

y ahi no hay ningun problema..
pero si lo hago como dijeron, asignarla a el arreglo directamente cuando se crea
Código Delphi [-]
 etiquetas[cont] := TQRLabel.Create(Self)

me marca un error: EAccessViolation
y no se porque.

y por lo tanto cuando quier ver un segundo reporte, me marca error de que ya existen las etiquetas.
No se como liberarlas.
Agradeceria que me dijeran como asignarlas a un arreglo dinamico.

Gracias

Cómo te sientes hoy?
Responder Con Cita
  #11  
Antiguo 13-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
david,
no se si has asignado el tamaño del array de las etiquetas antes de crearlas.

Código:
SetLength(Etiquetas, Nº_de_etiquetas_que_vas_a_crear);
for n:= 0 to Nº_de_etiquetas_que_vas_a_crear
begin
  etiquetas[n]:= TQRLabel.Create(Self);
  // resto de propiedades de etiquetas[n]
end;

Cuando destruyas el formulario, libera el espacio que has reservado.
for n:= sizeof(Etiquetas) downto 0 do Etiquetas[n].Free;

Espero que te sirva de ayuda

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #12  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Código Delphi [-]
unit reporte_runtime;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  QuickRpt, ExtCtrls,QRCTRLS, db;

type
  TForm1 = class(TForm)
    QuickRep1: TQuickRep;
    QRBand1: TQRBand;
    QRBand2: TQRBand;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  lastleft, i : integer;
  c : TQRlabel;

begin
  lastleft:= 10;
  for i:= 0 to 10 do
  begin
    c := tQRlabel.Create(QRband1); // c no estaba creado, ahora si.
   // antes quien debía destruir el label era el Form porque usabas Self,
  // ahora quien lo destruye es la banda, que es donde estará el control.


    c.Top := 10;
    c.Caption := 'label' + inttostr(i);
    c.Width := 50;
    c.Left := lastleft+ 5+ FontWidth(c.Font,c.Caption); // para que se vean todas
    lastleft := c.Left;
//  c.Name := 'label'; // no tenemos por qué asignarlo
    c.parent := QRBand1;
    c.Enabled := true; // si está a false no se verá en pantalla.
  end;
  quickrep1.Preview;
// no tenemos que liberar nada, el QRBand se encargará de ello.
end;

end.
Probado y funcionando.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 13-10-2005 a las 14:48:44.
Responder Con Cita
  #13  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Para saber cuanto ocupa un String en el QuickReport, habría que usar el canvas del QuickReport.Printer, pero en el OnCreate del form, no está todavía asignada, así que tendremos nosotros que buscarlo por otro sitio:

Código Delphi [-]
function FontWidth(const Fuente:TFont;const Texto:string):Integer;
var c:TCanvas;
    h:HWND;
begin
  try
    c:= TCanvas.Create;
    c.Handle := GetDC(0);

    c.Font.Assign(Fuente);
    Result := c.TextWidth(Texto);
  finally
    FreeAndNil(c);
  end;
end;

uses shellapi, graphics, types, windows

He editado mi mensaje anterior para incluir la llamada a esta rutina.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Gracias por sus ayudas.

Gracias fjcg02, lo malo es que no se cuantas etiquetas se van a crear, eso depende de los analisis que requiera el usuario, pueden ser desde 2 hasta 50 o 1000, no se.

Imaginate, si el usuario quiere que se le realicen 30 muestras y por cada muestra son 5 analisis, ahi serian 150 labels y aparte de los titulos de los analisis.

Gracias Lepe.
Esta muy bien explicado

Los felicito a ambos

Solamente una cuestion, que cuando veo el primer reporte, no hay problema, se muestran los nombres de los campos bien, pero cuando quiero ver un segundo reporte, me salen encimadas las letras(creo que no se borran las etiquetas con anterioridad) que era lo que me estabas diciendo fjcg02, ya no me marca el mismo error, pero aparte
me marca un error de EInvalidOp, y sale un error : "Error Floating Point"

Gracias.

Entonces: Primero si es que me libera las etiquetas que creo en tiempo de ejecucion, no me las borra de la banda.

Y segundo, al ver un segundo o tercer reporte, me encima el nombre de los analisis(o las letras)

Cabe señalar que hasta ahorita solamente estoy mostrando el nombre de los analisis a realizar, posteriormente me enfocare a mostrar los resultados.
Cómo te sientes hoy

Lo solucione de la siguiete forma. no se si sea la mas adecuada, pero me funciona.

Código Delphi [-]
procedure Tfrm_reporte2.QuickRep1AfterPreview(Sender: TObject);
 var
   contlabels : Integer;
 begin
   frm_reporte2.Hide;
   contlabels := frm_reporte2.QRBResultados.ComponentCount;
   while contlabels > 0  do//to contcompact do
   Begin
     frm_reporte2.QRBResultados.Components[contlabels-1].Free;
     contlabels:= frm_reporte2.QRBResultados.ComponentCount;
   end;
   contlabels := frm_reporte2.QRBResultados.ComponentCount;
   frm_reporte2.qrlaboratorio.Caption := 'Laboratorio ';
   frmana.show;
 end;

Checenlo y me dan su opinion, probablemente sea posible de otra forma mas facil.

Última edición por david duarte fecha: 13-10-2005 a las 17:50:20. Razón: Solucion
Responder Con Cita
  #15  
Antiguo 13-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hay una cosa que no acabo de entender.

Hablas de 2, 50, 1000 etiquetas.

el código que adjunto es para imprimir una consulta a una BBDD, que puede devolver desde 0 a n registros, dependiendo de los datos que se hayan introducido en la misma, el filtro que se aplique, etc. Para ello, observa que en la llamada se pasa como parámetro una query, que es la que origina los datos.
Lógicamente, se crearán tantas columnas como campos se visualicen el la consulta
Insisto, vale para cualquier consulta que hagas en tu programa.

A grosso modo
El reporte tiene 3 bandas,
titulos- > titulos de los campos, los toma de al query que le pasas de parámetro
campos -> valores de los campos. Por cada registro el QickReport crea una banda.
Totales-> Es un string que se pasa como parámetro con los nombres de los campos que se quieren totalizar.

Por ejemplo
GenerarListado( ADOQuery1, DBGrid1, 'Titulo que quiero que ponga',
'Empresa','Condiciones por si pongo un filtro en la consulta','campo2;campo3','campo1' );

ADOQuery1 es una consulta de articulos en un primer caso
SELECT * FROM Articulos ORDER BY nombre

ADOQuery1 es una consulta de personas en un primer caso
SELECT * FROM Personas ORDER BY nombre

La llamada será igual en los dos casos, cambiando el titulo del listado, el resto lo hará todo la función.

:: Funcion de generar listados a partir de un Grid automáticamente ::
:: Forma de llamarlo ::
:: GenerarListado( Query que queremos imprimir ADO ::
:: Grid asociado a la query ::
:: Titulo del Listado ::
:: empresa del listado ::
:: Condiciones del listado ( literal) ::
:: Campos que queremos sumar separados por comas ::
:: Campos que cuando cambian se imprimen los totales::
:: separados por comas ::
:: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: }


POR CIERTO, me he dado cuenta de que el código publicado no está del todo correcto al ser primeras versiones, seguro que tiene algun error. Si puedo os colgaré el bueno, con el dfm para que podais echarle un vistazo.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #16  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por david duarte
pero cuando quiero ver un segundo reporte, me salen encimadas las letras(creo que no se borran las etiquetas con anterioridad)
Eso tiene miga, tendrás que poner el código que usas para mostrar por primera y segunda vez el informe.

Se debe solucionar creando el Form que contiene al QuickReport dinamicamente, creando los labels, y despues del Preview, hacer un Freeandnil(Form). Pero me quedan dudas de como haces el proceso de crear el form, mostrar el Preview, y despues liberarlo.

Si se crean los labels en el FormCreate, por más que hagas el preview 2 o 3 veces, jamás se pueden crear otros labels y/o ponerse encima; me da la impresion de que estas creando varias veces el form ¡¡aunque ya estaba creado!! pero no puedo asegurarlo.

Liberar los componentes no es buena idea, porque se ha dicho que lo libere la QRBand1, así que despues de liberarlos tú a mano con componentsCount, la banda tambien intentará destruirlos y es más que probable que tengas Access Violations. Tendrás que explicar la lógica de tu programa, para enfocar bien el tema de:
- Creación del Form que tiene el QuickReport
- Creación de los labels
- Hacer el preview
- Destruir solo los labels o bien destruir el Form entero.
- Mostrar de nuevo los informes, o incluso varios informes a la vez.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 19
david duarte Va por buen camino
Hola!!!
La form que tiene el qreport se genera desde que se carga el proyecto, y esta forma la mando llamar desde otra forma que tengo que es form_opcion(en esta forma aparecen dos botones los cuales son: capturar datos o ver reporte), y cuando le das clic en ver reporte utilizo esto:

Código Delphi [-]
 procedure Tform_opcion.btnversolicitudClick(Sender: TObject);
 begin
   frm_reporte2.show;

y en la frm_reporte2 en la propiedad OnShow manejo lo que es la creacion de las labels

Código Delphi [-]
procedure Tfrm_reporte2.FormShow(Sender: TObject);
 Var
   b : Boolean;
   fol : String[9];
   cont, arriba, izq, campos,registros : Integer;
 //  long : Integer
 begin
   arriba :=0;
   izq :=10;
   cont :=0;
   registros :=0;
   campos :=0;
   if (form_opcion.label1.Caption[1] = 'T') then
   Begin
     b := modulotablas.tbltextil.Locate('LabFolio', form_opcion.label1.caption, [locaseInsensitive]);
     if (b) then
     Begin
       frm_reporte2.qrlaboratorio.Caption := frm_reporte2.qrlaboratorio.Caption + ' Textil';
       frm_reporte2.qrmlblfecha.Caption := modulotablas.tbltextil.FieldByName('Fecha').value;
       frm_reporte2.qrmlblfolio.Caption := modulotablas.tbltextil.FieldByName('LabFolio').value;
       frm_reporte2.qrmlblsolicitante.Caption := modulotablas.tbltextil.FieldByName('Solicitante').value;
       frm_reporte2.qrmlbltipomuestra.Caption := modulotablas.tbltextil.FieldByName('Tipo_muestra').value;
       frm_reporte2.qrmlbldeptosol.Caption := modulotablas.tbltextil.FieldByName('Depto_sol').value;
       frm_reporte2.qrmlblpruebasol.Caption := modulotablas.tbltextil.FieldByName('Pruebas').value;
       frm_reporte2.qrmlblobjetivo.Caption := modulotablas.tbltextil.FieldByName('Objetivo_trab').value;
       frm_reporte2.qrmlblfechaent.Caption := modulotablas.tbltextil.FieldByName('Fecha_ent').value;
       modulotablas.resul_textil.First;
       fol := modulotablas.resul_textil.FieldByName('LabFolio').value;
       cont := 1; //cont1 se utiliza para manejar el ciclo del numero de muestras del pre
       while fol <> form_opcion.label1.Caption do
       Begin
         modulotablas.resul_textil.Next;
         fol := modulotablas.resul_textil.FieldByName('LabFolio').value;
       end;
       {ciclo para mostrar los analisis que seleciono el usuario}
       if ((fol = form_opcion.label1.Caption) and (registros < modulotablas.resul_textil.RecordCount)) then
       Begin
         {si contador es menot que los campos que tiene la base de datos}
         if (cont <= modulotablas.resul_textil.FieldCount-2) then
         Begin
           {mientras campos sea menot que fieldcount}
           while campos < modulotablas.resul_textil.FieldCount-1 do
           Begin
             {si modulotablas en el campo de contados esta seleccionado entonces}
             if modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName).value <> 'x' then
             Begin
               lab := TQRlabel.Create(QRBResultados); //se crea la label en el QRBResultados
               lab.Top := arriba;
               lab.Left := izq;
               lab.Caption := modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName;
 //              long := length( modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName);
               lab.Parent := frm_reporte2.QRBResultados;
               izq := izq + 5 + FontWidth(lab.Font,lab.Caption);
               cont := cont+1;
               campos := campos +1;
             end //modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName).value <> 'x' then
             else
             Begin
               cont := cont+1;
               campos := campos +1;
             end;
           end; //while campos < modulotablas.resul_textil.FieldCount-1 do
           modulotablas.resul_textil.Next;
         end //if (cont1 <= modulotablas.tbltextil.FieldByName('Num_muestras').value) then
       end; //while ((fol = label1.Caption) and (modulotablas.resul_textil.
 
 end //if (b) then
     else
       ShowMessage ('No se encuentra el folio solicitado');
   end; //if (label1.Caption[1] = 'T') then
   frm_reporte2.QuickRep1.Preview; <----- PREVIEW
   form_opcion.Hide;

en este caso manejo el mismo procedimiento para mostrar el reporte la 1a vez que la 2a y 3a, etc...


Ahora para destruir los labels lo hago despues del AfterPreview

Código Delphi [-]
 procedure Tfrm_reporte2.QuickRep1AfterPreview(Sender: TObject);
 var
   contlabels : Integer;
 begin
  frm_reporte2.Hide; //ocultamos la forma donde se encuentra el reporte
   contlabels := frm_reporte2.QRBResultados.ComponentCount;// contamos los componentes en este caso son las labels
   while contlabels > 0  do// ciclo para liberar las labels
   Begin
     frm_reporte2.QRBResultados.Components[contlabels-1].Free;
     contlabels:= frm_reporte2.QRBResultados.ComponentCount;
   end; //while contlabels > 0  do
   frm_reporte2.qrlaboratorio.Caption := 'Laboratorio ';
   frmana.show;
 end;

Espero que me hayan entendido

Les doy las gracias por tomarse el tiempo de revisar mi codigo.

Gracias

Cómo te sientes hoy?

Última edición por david duarte fecha: 13-10-2005 a las 21:08:44. Razón: Por error
Responder Con Cita
  #18  
Antiguo 14-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Efectivamente, tal y como yo lo he preparado, cada vez que ejecuto el listado, genero el form, porque ¿ para que voy a gastar recursos del pc si no los necesito?. Una vez terminado, se destruye. Por lo tanto, no tengo que preocuparme de liberar, no liberar, ...

No he podido coger el código, pero esta tarde podré y lo colgaré para que le echeis un vistazo, con un ejemplo de llamada.
En los programas que hago, generalmente pongo un módulo de listados ( "Cuadro de Mando" para los responsables ) que cogen las querys de una tabla, cuyo resultado presento en un grid; desde un botón llamo a la función con los parámetros correspondientes si se desea imprimir ( los parametros están tanbién en la misma tabla, por supuesto). De esta manera, para añadir un listado en el programa, solo tengo que añadir un registro en la tabla de listados, y no tengo que recompilar el programa y distribuirlo. Con una pequeña entrevista con los clientes, en una tarde puedes definir todos los listados que necesite y darlos de alta en la tabla. El programa no cambia. De todas maneras, no flipeis, que los listados son muy simples, pero efectivos. Soy de la opinion de que en un programa/aplicación empresarial lo importante son los datos, no las presentaciones.

Tendreis noticias, un saludo
PD: Cuando empecé a desarrollar la idea me llamaron 'tarao', pero al final es una manera muy útil de sacar la información en papel. Antes haciamos los programas, y posteriormente tardabamos el doble de tiempo una vez desarrollado haciendo listados de todo tipo.
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #19  
Antiguo 14-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por david duarte
Hola!!!
La form que tiene el qreport se genera desde que se carga el proyecto, y esta forma la mando llamar desde otra forma que tengo que es form_opcion(en esta forma aparecen dos botones los cuales son: capturar datos o ver reporte), y cuando le das clic en ver reporte utilizo esto:
Ahí mismo tienes el fallo. Como dice fjcg02, quita el formulario de informes de Projects --> options --> autocreate y dejalo en Available.

Cuando lo necesites lo llamas así (suponiendo que los nombres son estos):
Código Delphi [-]
Application.CreateForm(Tfrmreporte2, frmReporte2);// tipo de form, variable

y en el Onclose:
Código Delphi [-]
action := cafree;
frmReporte2:= nil;

De esta forma el Reporte consume memoria, solo cuando lo necesites ver.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #20  
Antiguo 14-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Lo prometido... es deuda

Ya teneis el código, perfectamente utilizable, con ejemplo y todo.

Queda por hacer:
- hacerlo como un componente.
- mirar tal y como dice Lepe cómo se generan los titulos, campos, ... Si se crean con campo:= TQRLabel.Create(Banda), no seria necesario crear los arrays y destruirlos.
- Ajustar alguna cosilla

Este es un ejemplo ampliado. Permite imprimir y exportar a Excel, seleccionar los campos a listar, etc. Si en la llamada el primer parametro es falso, imprime directamente, si no saca la ventana para elegir campos. Los campos en rojo son los que se totalizan, ...
Si le lavais la cara a la ventana, marcaros un tanto en la oficina.

Este código es jamonware, o sea, que me podeis mandar un jamón. Mi mujer y yo os lo agradeceremos

Si los administradores del foro lo quieren publicar, pues que lo hagan , les doy mi permiso, ya que la idea la tenía, pero la forma y el cómo la di tras leer el hilo que doy de referencia.

Un saludo y que lo disfruteis
Archivos Adjuntos
Tipo de Archivo: zip Listados.zip (22,0 KB, 96 visitas)
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:10:57.


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
Copyright 1996-2007 Club Delphi