PDA

Ver la Versión Completa : Acomodo de Datos en Qreport


david duarte
07-10-2005, 15:56:09
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:confused:, 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::cool:
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???:confused:

Gracias por su tiempo y espero haberme explicado bien:rolleyes:.

Cómo te sientes hoy?

droguerman
08-10-2005, 05:25:35
puedes usar el evento onPrint para asignar un valor al momento de imprimir el campo

Lepe
08-10-2005, 10:09:03
Mira el qrCreateList (http://www.clubdelphi.com/foros/showthread.php?t=18282&highlight=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

fjcg02
10-10-2005, 11:05:45
Mira este hilo.
http://www.clubdelphi.com/foros/showthread.php?t=6224&highlight=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

david duarte
10-10-2005, 18:34:33
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?

david duarte
10-10-2005, 19:52:03
Oigan, ya se que esta pregunta no es de este hilo, pero me salio un EStackOverflor, y no se porque, les pongo mi codigo:

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?

vtdeleon
10-10-2005, 20:17:22
Saludo

David, usa las etiquetas (http://www.clubdelphi.com/foros/misc.php?do=bbcode), en esta ocasión las [ delphi] [ /delphi]

david duarte
10-10-2005, 20:25:22
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:cool:, 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???:rolleyes:

Alguna vez en la vida le trate con quickrep1.newpage:mad:, 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???:confused:
:p;):D

david duarte
12-10-2005, 16:26:47
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

david duarte
13-10-2005, 00:01:35
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


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:
lab : TQRLabel
asignacion
lab := TQRLabel.Create(Self)

y ahi no hay ningun problema..
pero si lo hago como dijeron, asignarla a el arreglo directamente cuando se crea
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?

fjcg02
13-10-2005, 09:00:19
david,
no se si has asignado el tamaño del array de las etiquetas antes de crearlas.

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

Lepe
13-10-2005, 14:32:25
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

Lepe
13-10-2005, 14:47:39
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:


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.

david duarte
13-10-2005, 16:35:31
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.

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.

fjcg02
13-10-2005, 18:07:31
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

Lepe
13-10-2005, 19:15:14
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

david duarte
13-10-2005, 21:00:44
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:


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


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


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?

fjcg02
14-10-2005, 08:51:59
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.

Lepe
14-10-2005, 11:57:34
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):

Application.CreateForm(Tfrmreporte2, frmReporte2);// tipo de form, variable


y en el Onclose:

action := cafree;
frmReporte2:= nil;


De esta forma el Reporte consume memoria, solo cuando lo necesites ver.

fjcg02
14-10-2005, 22:28:16
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 :p

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

david duarte
17-10-2005, 16:26:49
OK. Gracias

Lo voy a revisar y a cambiarle unas cosas.

Gracias.

Cómo te sientes hoy?

david duarte
18-10-2005, 15:59:13
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??

fjcg02
18-10-2005, 17:42:59
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

david duarte
18-10-2005, 18:09:34
es mas o menos parecido al tuyo

mira, como comentaba al principio de este hilo, tengola tabla de resultados con los siguientes datos(Paradox).

Folio -> folio de la solicitud
Num -> numero de muestra a analizar
Posicion -> numero de la posicion de la muestra (las muestras tienen una posicion, ya que son de unas maquinas de hilo, y existen muchas maquinas de hilo con muchas posiciones).
Analisis1 -> aqui manejo 'o' para saber si esta seleccionado y se va a capturar los resultados o 'x' para ver que no esta seleccionado y no se va a realizar analisis de este.
Analisis2 ->
etc.

y para cada muestra, tiene un registro.

p.e.

me traen una 3 muestras para hacerles el analisis1, analisis2, analisis 4 y analisis 6, (folio1) y me traen otros analisis con 2 muestras, analisis: 1,3,5(folio 2)
entonces en la tabla voy a tener lo siguiente (cuando apenas se de de alta)


Folio Num Posicion Analisis1 Analisis2 Analisis3 Analisis4 Analisis 5 Analisis6
1 01 o o o x o x o
1 02 o o o x o x o
1 03 o o o x o x o
2 01 o o x o x o x
2 02 o o x o x o x


etc.. puedes tener x folios. La posicion siempre tiene que estar seleccionada.

Entonces p.e. si quiero ver el reporte del folio 1, me tiene que aparecer...

Analisis Seleccionados : 1, 2, 4, 6

en la parte de resultados (en caso de que tengan resultados capturados), te aparecera la posicion y el resultado de el analisis que ya se realizo y en caso de que no se haya realizado ese analisis, te debera de aparecer en blanco o te aparecera '----'.

Posicion Analisis1 Analisis2 Analisis4 Analisis6
3a --- 3.25 4.25 ----
1a 1.25 ---- 6.25 -----
1a' ---- ---- ---- -----

aqui no se ha realizado el analisis6.

y asi es como debe de aparecer en el qreport, pero no me queda. se traslapan las labels de los resultados.

Gracias

Espero que me entiendas me puedas ayudar!!!!

Cómo te sientes hoy??

Lepe
18-10-2005, 19:56:54
Pues sinceramente creo que te estas complicando la vida. El primer mensaje que puse hablando del QrCreateList hace exactamente eso.

Lo único es montar una consulta, del tipo

select * from tabla where folio = 1

Ahora creas un TStringList, y añades los campos:
Analisis1
Analisis2
Analisis4
Analisis6

Llamas a la función qrCreateList, y ya tienes generado el listado.

Si acaso, puedes recorrer los datos antes de hacer el preview, para que el campo que sea nulo, ponerle los guiones '----', si no lo haces, saldrá un 0 (que tampoco es tan grave).

En apens 15 lineas de código lo tienes hecho.

saludos

david duarte
18-10-2005, 20:30:40
Hola Lepe, gracias por tu ayuda, pero creo que lo que yo quiero es que los analisis salgan en posicion horizontal, no vertical.

Creo que ya logre solucionarlo, al menos en la primera linea de los resultados.

Lo que me hacia era que el ultimo campo, al momento de pasar al siguiente registro, me lo bajaba a la siguiente linea, por lo tanto se traslapaba con el primer resultado de la posicion.

Lo que hice es que al final de recorrer los campos de la tabla, genero un label en blanco, nada mas lo creo
lab := TQRLabel.Create(QRBResultados);
y ya.

por lo que veo, es que si el ultimo label se baja, como no tiene nada de datos, aunque se traslape, pues no se verá.

Necesito que me digan si esta bien la solucion o existe otra mas facil(ya se que me han dicho otras cosas).

les anexo las imagenes para que las chequen como quedó, y vean las anteriores para que comparen.

Ahora lo que necesito es que las labels de los resultados queden abajo de los nombre de los analisis.

Gracias

Cómo te sientes hoy?

Lepe
19-10-2005, 08:12:09
Hola Lepe, gracias por tu ayuda, pero creo que lo que yo quiero es que los analisis salgan en posicion horizontal, no vertical.

En realidad quedarían en horizontal, simplemente estaba enumerando los campos :o . Realmente el qrcreateList, te haría exactamente lo que deseas. Posición titulo, elasticidad y debajo los resultados, pero tendrías que añadir a mano los datos de solicitante y el resto del encabezado. Si ya tienes casi todo hecho, continúa así campeón ;).

Para hacer lo que quieres, al crear los labels de los analisis (Posicion titulo), yo guardaría un array of record, y en cada record, guardaría el top, left, y width de cada uno de los labels. Cuando creas los labels para los resultados:
- Creas el label
- le pones autosize a false, Alignment según corresponda, para que quede alineado a la derecha los números y lo que sea texto alineado a la izq.
- Lees de ese array donde estas y le pones el top, left y width que corresponda segun la columna.

Tendrás un problema añadido, y es que si un label tiene 60 pixels de ancho y el dato no cabe, tendrás que controlar cómo lo haces. Ahora no recuerdo, creo que QR tiene una propiedad adicional, si no cabe el texto creo que se puede truncar el ancho, o bien dejar que se solapen. (¿autosize? u ¿otra propiedad?)

Por supuesto no traspasarás el margen derecho del folio, y si se van a mostrar más columnas de las que caben, poner en apaisado el informe, esto quizás no te guste, pero no hay más remedio.

No puedo comentar si te has complicado mucho o no, ya que no veo codigo fuente, solo las imagenes ;). Pero si lo necesitas, se hace y punto.

saludos

fjcg02
19-10-2005, 12:49:41
Pues eso :p . no podría explicarlo mejor.

A darle duro a la mollera, que aunque salga humo no se quema !

Un saludo

david duarte
19-10-2005, 15:38:49
Hola!!!

Muchas gracias por su tiempo y por leer estos mensajes.
oigan, una pregunta, a que se refieren con el apaisado??

Lo que estaba pensando hacer para que queden los resultados abajo del titulo de los analisis, es como dicen anteriormente, guardar en un arreglo, solamente el left y el width, pero me gustaria dividir el width/2, asi siempre quedaa a la mitad de cada titulo, no creen?

les anexo el codigo por si quiere hecharle una ojedada, creo que se puede reducir un poco.


procedure Tfrm_reporte2.FormShow(Sender: TObject);
Var
b : Boolean;
fol : String[9];
cont, arriba, izq, campos,registros,totmuestras,contmuestras : Integer;
begin
arriba :=0;
izq :=10;
cont :=0;
registros :=0;
campos :=0;
contmuestras :=0;
{si el laboratorio seleccionado es Textil}
if (form_opcion.label1.Caption[1] = 'T') then
Begin
{buscamos el folio que quiere ver el usuario}
b := modulotablas.tbltextil.Locate('LabFolio', form_opcion.label1.caption, [locaseInsensitive]);
{si lo encuentra}
if (b) then
Begin
{en las labels uso lo siguiente:
qr -> para decir que es de quickreport
m -> quiere decir que va a mostrar algo
lbl -> se trata de un label
{primero se muestra la parte de la solicitud... analisis, solicitante, etc...}
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;
{aqui empieza la parte de resultados de la solicitud}
fol := modulotablas.resul_textil.FieldByName('LabFolio').value;
cont := 2; //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 menor que los campos que tiene la base de datos}
if (cont <= modulotablas.resul_textil.FieldCount-1) then
Begin
{mientras campos sea menor que fieldcount}
while campos < modulotablas.resul_textil.FieldCount-2 do
Begin
{si modulotablas en el campo de contados esta seleccionado entonces
esto es, si el analisis esta seleccionado, creamos la etiqueta}
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;
lab.Parent := frm_reporte2.QRBResultados;
izq := izq + 4 + 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.
top := arriba;
left := izq;
lab := TQRLabel.Create(QRBResultados);
//esto lo asigno para que se baje al momento de crear las labels de los resultados
arriba := arriba + 20;
izq := 20;
cont := 2;
campos := 0;
registros := 0;
modulotablas.resul_textil.First;
//este solamente lo ocupo para posicionarme en el folio que debe de ser
b:= modulotablas.resul_textil.Locate('LabFolio',form_opcion.Label1.Caption,[lopartialkey]);

{*************************************************************************
** aqui empieza el ciclo para mostrar los resultados de los analisis ***
************************************************************************}
while (fol = form_opcion.label1.Caption) and (registros < modulotablas.resul_textil.RecordCount)do
Begin
lab.Top := arriba;
lab.Left := izq;
//mientras que el contador de muestras sea < que el numero de muestras
//que capturo el usuario
while contmuestras < modulotablas.tbltextil.FieldByName('Num_muestras').value do
Begin
//recorre todos los campos de la tabla
while campos < modulotablas.resul_textil.FieldCount-2 do
Begin
if (modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs[cont].DisplayName).value <> 'x') then
Begin
lab := TQRLabel.Create(QRBResultados);
lab.Top := arriba;
lab.Left := izq;
if (modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs[cont].DisplayName).value = 'o') then
lab.caption := '---'
else
lab.Caption := modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs.Items[cont].DisplayName).value;
lab.Parent := QRBResultados;
if (lab.Left = 0) then
izq := izq + 7 + FontWidth(lab.Font,lab.Caption)
else
izq := izq + 30 + FontWidth(lab.Font,lab.Caption);
end; //if (modulotablas.resul_textil.FieldByName(modulotablas.resul_textil.FieldDefs[cont].DisplayName).value <> 'x') then
cont := cont +1;
campos := campos +1;
end; //while campos < modulotablas.resul_textil.FieldCount-1 do
contmuestras := contmuestras+1;
modulotablas.resul_textil.Next;
cont := 2;
campos := 0;
izq := 20;
lab := TQRLabel.Create(QRBResultados);
arriba := arriba + 20;
end; //if ( cont <= modulotablas.resul_textil.FieldCount-2) then

arriba := arriba + 20; //-->> vuelvo a asignar otros 20 en cada renglon
izq := 12; //-->> asigno a left 12 para que empiece desde 12
modulotablas.resul_textil.Next;
inc(registros);
fol := modulotablas.resul_textil.FieldByName('LabFolio').value;
end; //while fol = form_opcion.label1.Caption do
end //if (b) then
else
ShowMessage ('No se encuentra el folio solicitado');
end; //if (label1.Caption[1] = 'T') then
frm_reporte2.QuickRep1.Preview;
form_opcion.Hide;
end;



De antemano les agradezco su tiempo y su atencion.
Cómo te sientes hoy??

fjcg02
21-10-2005, 21:39:10
Hola que tal,
yo cambiaría de estrategia. Crearia una query en tiempo de ejecucion para mostrar los datos, generandola dependiendo del tipo de prueba que se haya realizado.
Por ejemplo

Creas la TQuery o ya la tienes creada
QueryListado.Clear;
QueryListado.Add('SELECT POSICION');

Bucle que incluye los campos que tienes incluir, ya sabes, que tenga el valor 'o 'y no 'x'
// Por cada analisis que quieres incluir
QueryListado.Add(', AnalisisCorrespondiente');
fin del bucle

QueryListado.Add('FROM TABLA WHERE TIPO=:PTipo AND FOLIO=:PFolio ');
QueryListado.Params.ParamByName('PTipo').Value:= form_opcion.label1.Caption[1]; // lo que sea
QueryListado.Params.ParamByName('PFolio').Value:= form_opcion.label1.caption // lo que sea

Y aqui llama a la funcion Generar Listado del código que te pasé
GenerarListado(True, QueryListado, '','','');

Lo pruebas , y si te vale, lo maqueas a tu gusto. En lugar de titulo, empresa, ... que pongo yo pones los campos de Fecha, solicitante, ....

Para comprobar si lo que ves es lo que necesitas, mientras depuras el código de la generación pones un DBGrid en el formulario y ves el resultado.
Ya me contarás, lo que es la presentación te la hace completa.
No he probado nunca la funcion qrCreateList que comenta Lepe, pero también parece una solución buena.

Espero que lo entiendas. No he podido responder antes por que estoy un poco liado, ya sabes, hay que ganarse el pan...
Un saludo

david duarte
02-12-2005, 01:16:31
oK fjcg02, creo que seria buena idea, aparte de que seria un poco mas rapido si utilizo querys, lo voy a probar y despues les digo como me fue.

Con lo de reporte, todavia no me queda, tengo problemas para que me añada paginas nuevas, ya utilize el compositereport, pero no me respeta las paginas, si tengo 2, cuando hago el preview, me dice que tengo 2 paginas, pero cuando lo imprimo, me sale en una sola, o me sale en una pagina todo los datos del reporte 1 y parte del reporte 2 y en la segunda pagina, me sale el resto del reporte2.

He estado leyendo acerca del qreport, tengo el ForceNewPage = True, pero dicen que cuando es la primera pagina, el qreport por defecto lo omite o no le hace caso, y vienen ejemplos de como hacerle, pero no le encuentro me siguen marcando error, en este momento no tengo a la mano esas respuestas o preguntas, pero las voy a traer al trabajo y se las mando para ver si alguien logra hacerlo. porque yo nomas no =(.

Gracias.

fjcg02
02-12-2005, 21:11:45
David,
tras leer de nuevo con detenimiento el hilo, me he dado cuenta de que bajo mi punto de vista, tienes un error de concepto. Creo que intentas mostar los datos como si estuvieras escribiendo en un folio en blanco.

El qreport, te permite crear una banda de datos, que repite automáticamente por cada registro de datos que tiene el origen de los datos que le asignas.

Por ejemplo, si tienes una tabla con 5 registros, te repetirá la banda 5 veces. Si la tabla tiene 100 registros, te repite la banda 100 veces. Si el origen es una query, te repite la banda tantas veces como registros devuelve la misma. Comprueba que tu reporte tiene una banda de titulos, y otra de datos, así como asegurarte de que el origen de los datos de tu report es la tabla que contiene los datos. Si para imprimir los datos, se necesitan 15 páginas, las crea automáticamente.

En los ejemplos del Qreport, tienes ejemplos claros de qué puedes conseguir.

Tu problema se reducirá a saber qué campos tienes que visualizar dependiendo del tipo de pruebas que realices; los campos que tengas que poner a '-----' los pones en la función beforeprint del mismo. Si el valor es 0, cambias el valor a '-----'.

Vuelve a mirar tanto el código de Lepe y el mío, la solución te la hemos proporcionado ya en este mismo hilo.

Suerte y un saludo

david duarte
05-12-2005, 18:26:04
Si fjcg02, en mi reporte tengo una banda de titulo, que la utilizo para mostrar los valores principales de la solicitud(p.e. el titulo del documento, la fecha en que se creo la solicitud, el numero de la solicitud, los analisis, etc), que estos deben aparecer en cada pagina que se visualice o se imprima.

Tengo una banda de tipo detalle, que la utilizo para mostrar los resultados de los analisis, eso ya lo resolvi...
Mi problema es el siguiente, que aunque cree las labels o el memo o el qerdbtext, no me crea una nueva pagina, tengo el ancho de la banda detalle al minimo y se va ensanchando conforme se van agregando datos o como dices tu, se van creando otras nuevas bandas de detalle por cada valor que se le añada(en el caso de tener las labels).
Y la verdad es que no encuentro alguna solucion, ni siquiera con el composite report.

Gracias.
Cómo te sientes hoy??

fjcg02
05-12-2005, 18:45:40
David,
Con crear una banda de datos, recorrer los campos y asignar EL CAMPO a las QDBLabels es suficiente. Por supuesto, el reporte debe estar asociado a la query o a la tabla. NO DEBES recorrer la tabla para sacar los datos, lo hace el Qreport sólo.
Con los ejemplos que te hemos enviado es suficiente, pero,.... no podemos programar por tí. Insisto, el error que tienes es de concepto. Defines una banda de datos para un registro y se repetirá para cada uno de los registros de la tabla/query ( a ver si te das cuenta del concepto).

Lo que estás haciendo tú es 'estirar' la banda, escribir todos los registros en una banda. NUNCA tienes que utilizar el next, lo hace el qreport.

A ver si tienes más suerte, ... un saludo

david duarte
24-04-2006, 18:31:28
Hola!!!!

Perdon por responder hasta hoy, pero estaba ocupado con este proyecto que me ha sacado canas verdes(pero lo bueno es que he aprendido muchisisisisimo)

Lo que hice fue lo siguiente:

cree en tiempo de ejecucion los qrdbtext y les asigne el nombre de la tabla, y el nombre del campo.

Y me funciona a las mil maravillas, ahora lo que no logro es que me muestre espacios en blanco.

algunos campos tienen el valor de 'o' (letra o de Oscar), pero necesito que cuando se muestre el valor( si tiene 'o') que muestre un guion o dos (--),y si tiene otro valor numero, pues que muestre ese valor, pero no encuentro como hacerle

Alguien sabe como resolver este problemilla???
Tengo un rato buscandole pero no logro corregirlo

Muchas gracias!!!!
Saludos!!!!

Lepe
25-04-2006, 11:01:48
Puedes usar el evento BeforePrint de ese QrLabel o QrDbText, allí cambias el texto que viene como un parámetro de texto.

Saludos

david duarte
15-05-2006, 17:01:05
Hola, solucione mi problema, cambiando el 'o' por el '-' y asi ya no tengo que estar metiendome con ningun codigo y automaticamente si no tienen nada capturado se muestra el guion??

otra pregunta tengo una tabla del mismo proyecto que son los analisis extras en donde tengo la siguiente estructura

Folio ->El folio de la solicitud
Numero-> es para saber el renglon en el que esta
Nombre_analisis-> es para saber el nombre del analisis
Posicion-> la posicion de la maquina de donde sacaron la muestra
Resultado -> resultado del analisis de la muestra

mi pregunta es la siguiente, con la tabla normal creo un tqrdbtext por cada campo, eso no es ningun problema

texto := TQRDBText.Create(DetailBand1);
texto.Top := arriba;
texto.Left := izq;
texto.DataSet := Query1;
texto.DataField := modulotablas.resul_soplado.FieldDefs.Items[cont].DisplayName;
texto.Parent := DetailBand1;


pero ahora necesito crear un qrdbtext por cada analisis extra que este en la tabla.
Se puede hacer esto??

p.e.
si tengo 3 analisis extras, y se van a realizar 2 analisis de esas muestras
(in1,in2,in3 -> muestras)


Folio Numero Nombre analisis Posicion Resultado
IAbr00106 001 in1 - -
IAbr00106 001 in2 - -
IAbr00106 001 in3 - -
IAbr00106 002 in1 - -
IAbr00106 002 in2 - -
IAbr00106 002 in3 - -


Como puedo yo crear un qrdbtext para cada nombre de analisis extra?
se me ocurre con un query para cada uno, no se

select nombre_analisis, posicion, resultado
from analisis_extra
where nombre_analisis = (aqui supongo que tengo que crear un arreglo o algo para guardar el nombre de los analisis realizados)

Alguien sabe como le puedo hacer??, creo que poner un query para cada analisis, seria mucho no? que tal si tengo 10 o mas analisis extras?

El reporte tendria que quedar asi


(Nombre_ analisis)....
Posicion in1 in2 in3 ......
(RESULTADOS)
1A 125.5 125.5 125.5
3A - - -


Gracias por su tiempo.
Saludos!!!!

Lepe
15-05-2006, 17:36:31
select distinct nombre_analisis
from analisis_extra


Con eso ya sabes cuantos análisis extras tienes y como se llaman. Ahora si puedes crear un QRLabel con el nombre del analisis_extra y un QrDBText debajo.

Ahora tienes que montar otra query para obtener los Resultados de los análisis.

No sé ... quizás usando QrExpr sea más cómodo porque solo tienes que introducir en la propiedad Expression el nombre del analisis_extra, solo ahorras una línea de código, pero dentro de un bucle para 10 análisis_extras.... pues son 10 líneas menos a ejecutar ;).

Saludos

david duarte
15-05-2006, 21:06:43
Ok. muchas gracias!!!
lo voy a checar
lo acabo de checar con un dbgrid y me funciono a las mil maravillas, lo voy a aplicar en mi sistema y te digo como me fue.

Saludos!!!!

david duarte
16-05-2006, 21:11:43
Hola a todos!!!!

Acabo de platicar con mi jefe y me dijo que no era necesario tener los analisis extras en otra tabla, que los podia tener en la misma tabla, al fin y al cabo no son muchos los analisis que mandan a hacer, por lo que nada mas le voy a poner 5 campos mas a la tabla y ya.

pero ahora el problema que tengo es que no me caben los nombres de los analisis en forma horizontal, le cambie de formato al tamaño de la hoja(lo puse en horizontal), pero hay veces que ni siquiera así se alcanzan a mostrar todos, Alguien tiene una sugerencia???
La verdad es que creo que va a pasar lo mismo que cuando no popia mostrar los analisis en forma vertical, pero si alguien tiene alguna sugerencia, se los agradeceria.
Seguire investigando
Gracias!!!!
Saludos!!!

Edito

Lo que hice fue cambiarle el tamaño al font, pero no me ayudo de mucho, no me ahorra mucho espacio en forma horizontal

Lepe
04-06-2006, 11:06:53
Lamento responder tan tarde, supongo que ya se ha solucionado el problema. El tema está en que por alguna razón he perdido este hilo :(.

Si los nombres son muy grandes, puedes usar abreviaturas para los nombres de los campos, despues ajustar el DisplayWidth de cada campo para mostrar X carácteres. Puedes hacer una rutina que analice todos los valores de un Query y ajuste el DisplayWidth de cada campo a la cadena más larga, como son números siempre hará el ancho de columna más pequeño y podrá entrar más columnas en el informe.

Obviamente es una tarea costosa para el sistema, ya que se ha de recorrer todos las columnas por cada registro de la Query (dos For anidados). Otra forma que se me acaba de ocurrir, es crear Otra Query basada en los datos de la anterior y pedir el máximo a la base de datos:

Select Max(Length(campo1)) as Campo1, Max(Length(campo2)),...

Saludos y siento la tardanza.

david duarte
15-06-2006, 02:04:29
Hola!!!!

El problema es que si se seleccionan muchos analisis(no puedo abreviar el nombre de los analisis, lo que hice fue abreviar desde la tabla algunos campos, pero como comente anteriormente, no me fue de mucha ayuda), podrian no llegar a caber todos los analisis en el ancho de la hoja. Lo que comentas del fontwidth ya lo hice, analizo el ancho de cada columna y le pongo el tamaño (del campo) mas grande, pero ni asi funciona, no se que voy a hacer, no logro solucionar el problema.
Seguire investigando
Saludos!!!!

Muchas gracias por su tiempo y su ayuda.

Lepe
15-06-2006, 10:15:23
Imagino que cambiar la fuente al listado no es viable, porque se vería muy pequeño; tendrás que partir el informe en 2, 3 o 4 folios de ancho. El resultado será que primero imprime todos los registros (pero solo 10 columnas), y despues imprime todos los registros (pero solo las 10 columnas siguientes)

Ajustas el ancho para que se vean todos los datos, y ahora recorres las columnas sumando el Width de cada uno hasta llegar al ancho de la hoja.

Haces una consulta cuyo datasource sea la consulta donde tienes todas las columnas, pero solo seleccionas, digamos que caben las 10 primeras columnas, y esta consulta es la que imprimes. Lo digo así para que no tengas que crear otra consulta con el mismo where, además esta segunda consulta puede ser muy rápida porque ya los tienes los resultados.

Una vez finalizada la impresión, ahora cambias los nombres de los campos por las otras 10 columnas siguientes (o las que quepan) y vuelta a imprimir.

Saludos

david duarte
07-07-2006, 19:38:43
creo que me explique mal o no les entiendo=(

lo que yo quiero hacer es parecido a lo que hace el qreport horizontalmente cuando ya no le caben los datos en esa hoja ( cuando ya no le caben los datos, anexa otra hoja y sigue mostrando o imprimiendo los resultados en la(s) siguiente(s) hojas).

Creen que se pueda??
A ver si se me ocurre algo,

Y Perdon por la tardanza en responder.

Esta bien la respuesta que me dicen, pero el problema es cómo lo hago???
no encuentro la forma para hacerlo, tengo que seguir viendo las propiedades de la pagina del qreport

Muchas Gracias de nuevo
Saludos!!!

Lepe
08-07-2006, 00:32:03
Suponemos que queremos imprimir todos estos campos:

TeFolio Numero Nombre analisis Posicion Resultado


Pero los datos del campo TeFolio son muy largos y solo caben las dos primeras columnas en una página.

Armamos el SELECT:
SELECT TeFolio, Numero , Nombre ,analisis ,Posicion ,Resultado
FROM TABLE
Imagina que tu query tiene 180 registros, y en cada página caben 60 registros (uno debajo de otro), así que debemos imprimir 3 páginas, pues no, sacamos 6 páginas:
- 3 páginas con las columnas: TeFolio y Numero
- otras 3 páginas más, con las columnas : Nombre, analisis, posicion, resultado.

Si coges la primera página y a su derecha pones la cuarta página, tendrás un registro completo con sus 6 campos.


uses quickrpt, qrextra, qrprntr, qrctrls;

procedure TForm1.Button2Click(Sender: TObject);
var q:TQuickRep;
listaCampos:TStringList;
i:Integer;
begin
listaCampos:= TStringList.Create;
try
// lista de campos a incluir en el informe, como sabemos que solo caben 2, pues los 2 primeros
listacampos.add('TeFolio');
listaCampos.add('Numero');
query1.Open;
q:=nil;

// esto crea un listado con los campos que se le han dicho
QRCreateList(tcustomquickrep(q),nil,query1,'Listado Principal',listaCampos);
q.Print;

finally
FreeAndNil(q);
end;
// ya está impreso las 2 primeras columnas, ahora imprimimos el resto:
// el código es copy y paste, solo cambia los nombres del campo:
try
// lista de campos a incluir en el informe, el resto de campos,
// por simplificar, estoy suponiendo que las 4 columnas caben en el ancho de una página
ListaCAmpos.Clear;
listacampos.add('Nombre');
listacampos.add('analisis');
listaCampos.add('Posicion');
listaCampos.add('Resultado');
query1.First; // volvemos al primer registro.
q:=nil;

// esto crea un listado con los campos que se le han dicho
QRCreateList(tcustomquickrep(q),nil,query1,'Listado Principal',listaCampos);
q.Print;

finally
FreeAndNil(q);
end;

end;


Yo si entiendo lo que quieres hacer, pero no se puede hacer de forma automática, tienes que hacerlo tú a mano, y ésta es la solución que se me ocurre.

¿Se me entiende ahora?

Saludos

david duarte
11-07-2006, 19:03:24
Hola Lepe!!!

Muchas gracias.

Si entiendo como se puede hacer, pero en este caso deberia de guardar en una variable el largo del qreport(del area imprimible) y en otra variable ir sumando los valores de cada analisis y sumarlos hasta que sea < que el ancho del reporte o no??

Eso no se como se hace, como tomo el ancho del reporte(ya que a veces utilizo el reporte en forma horizontal y otras vertical).

O de que otra forma se te ocurre, en un ratillo mas voy a probar a ver como me va.

Ahh y aprovechando de tu amabilidad, sabes como le puedo agregar un retorno de carro a una cadena para ponerla en un qreport??

esto te lo pregunto porque hay veces que escriben una linea demasiada larga y se sale del reporte y no se alcanza a ver todo el texto, entonces volvemos a lo mismo tengo que tomar el ancho del reporte(portrait o landscape) y a partir de ahi agregarle un retorno de carro).

Muchas gracias de nuevo.
Saludos!!!