Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
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
  #2  
Antiguo 13-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #3  
Antiguo 13-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 22
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
  #4  
Antiguo 14-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
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
  #5  
Antiguo 14-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #6  
Antiguo 14-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
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
  #7  
Antiguo 17-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 22
david duarte Va por buen camino
OK. Gracias

Lo voy a revisar y a cambiarle unas cosas.

Gracias.

Cómo te sientes hoy?
Responder Con Cita
  #8  
Antiguo 18-10-2005
david duarte david duarte is offline
Miembro
 
Registrado: ago 2005
Posts: 217
Poder: 22
david duarte Va por buen camino
Hola!!!! fjcg02

ya revise tu codigo y me parece perfecto, pero hay una cosa!!!

Sigo sin entender como hacerle para que las labels no se te traslapen??

he seguido haciendo pruebas, pero al momento de crear la segunda hilera de labels, todas se me traslapan, ya estoy un poco fastidiado con eso, me tiene estresado.

Pero asi es esto, hay que seguir a prueba y error.

Gracias
Vi las funciones de ancho de caja y otras, pero verdaderamente estoy hecho un lio.

Cómo te sientes hoy?

Acabo de fijarme en algo, esta chistoso

Al momento de crear todas las labels del nombre de los analisis, que van en la primera fila, cuando se crean, todo esta perfecto, pero al momento de crear las labels para mostrar los resultados, se baja el ultimo nombre del analisis a la label del primer resultado y por lo tanto se enciman.
Alguien sabe porque???

Gracias
Cómo te sientes hoy?

Les mando las imagenes en zip para que las cheques

el primero es grid_res, que es donde tengo la informacion como debe de quedar.

la segunda imagen es qrp_antes, esta imagen como puedes ver, se muestran bien los titulos de los analisis a realizar, son los ultimos

y la 3a imagen es qrp_c_resultados, si te fijas bien, el nombre del ultimo analisis se bajo a la linea siguiente y los resultados no se muestran bien, las rayas '----' son los analisis que todavia no tienen resultados.

Gracias
Cómo te sientes hoy??
Archivos Adjuntos
Tipo de Archivo: zip imagenes.zip (7,3 KB, 32 visitas)

Última edición por david duarte fecha: 18-10-2005 a las 17:44:46.
Responder Con Cita
  #9  
Antiguo 18-10-2005
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.419
Poder: 24
fjcg02 Va camino a la fama
Perdona, pero creo que estamos en dimensiones diferentes.
Intuyo que lo que quieres es realizar un listado que no coincide con el que te he pasado. El mio es para sacar una fila de datos por registro, hacer totales, etc, una cosa sencilla. Creo que tú quieres imprimir tus datos en un informe tipo factura, más elaborado, en el que las bandas de cabecera, cuerpo etc, tienen un diseño más alborado.
No te acabo de entender del todo, por lo que no puedo ayudarte ( siempre y cuando sepa ) a no ser que me des más información.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 10:27:17.


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