PDA

Ver la Versión Completa : Como Rellenar Componentes En Qreport


MARIA_MAR
20-03-2012, 19:56:33
Buenas tardes a todos, tengo un problema con un qreport. Tengo definidos varios componentes de tipo QRRICHTEXT (50) , y debo ir rellenandolos.
Cuando invoco el qreport debo ir recorriendo los 50 QRRICHTEXT pero no se como indicarle el nombre de cada uno sin necesidad de escribir 50 veces lo mismo.
Os paso el codigo que estoy utilizando, en el cual evidentemente la variable "ncelda" es un string y me da error. ¿ Como puedo hacerlo ?


var ncelda:string;

begin
profe:='1';
finforme:=tfinforme.Create(self);
for orden:= 1 to 49 do
begin
ncelda:='q'+IntTostr(orden);
memo:='celda'+IntTostr(orden);

basededatos.ado_uno.SQL.Clear;
basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
basededatos.ado_uno.Active:=true;
basededatos.ADO_uno.First;
While not basededatos.ado_uno.Eof do
begin
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);
basededatos.ado_uno.Next;
end;

fdisenohorario.QuickRep1.Preview;
end;


Gracias por el tiempo que dedicais todos a este foro.

ecfisa
20-03-2012, 21:47:57
Hola MARIA_MAR.

Por favor cuando incluyas código en tus mensajes, para darle mayor legibilidad usa los TAG's. Te pongo una imágen que explica el uso:

http://img403.imageshack.us/img403/3461/75416396.jpg


Un saludo. :)

kapcomx
20-03-2012, 23:22:10
podrias decir exactamente que dice el error???:confused:

MARIA_MAR
21-03-2012, 11:07:07
Gracias ecfisa por tu aclaración , vuelvo a plantear mi mensaje como me indicas.
Tengo un problema con un qreport. Tengo definidos varios componentes de tipo QRRICHTEXT (50) , y debo ir rellenandolos.
Cuando invoco el qreport debo ir recorriendo los 50 QRRICHTEXT pero no se como indicarle el nombre de cada uno sin necesidad de escribir 50 veces lo mismo.
Os paso el codigo que estoy utilizando, en el cual evidentemente la variable "ncelda" es un string y me da error. ¿ Como puedo hacerlo ?


var ncelda:string;

begin
profe:='1';
finforme:=tfinforme.Create(self);
for orden:= 1 to 49 do
begin
ncelda:='q'+IntTostr(orden);
memo:='celda'+IntTostr(orden);

basededatos.ado_uno.SQL.Clear;
basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
basededatos.ado_uno.Active:=true;
basededatos.ADO_uno.First;
While not basededatos.ado_uno.Eof do
begin
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);
basededatos.ado_uno.Next;
end;

fdisenohorario.QuickRep1.Preview;
end;


El error me da es sintactico y marca la siguiente linea

finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);


Y me dice:
"Undeclared identifier: 'ncelda' "
"Missing operator or semicolon"

Espero haber sido un poco mas clara y que asi me podais ayudar.
Gracias

juanlaplata
21-03-2012, 13:26:00
No se si interpreto bien tu codigo, veamos ..
1ro.
var ncelda:string;
mas adelante.ncelda:='q'+IntTostr(orden);
el cual va ir tomando el valor segun el bucle
q1
q2
..
q49
el cual no veo q utilices en ningun momneto.

y por ultimofinforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString);

aqui tratas a "ncelda" como un memo cuyo "dueño" dice ser "finforme"

El error dice q en finforme no existe declaracion ncelda.
Esto es correcto ?

MartinS
21-03-2012, 15:31:15
Estee... No entiendo? :confused: ¿50 QRRICHTEXT en un QReport? :o Con que los rellenas y donde los estas invocando?..

Saludos

MARIA_MAR
21-03-2012, 16:31:31
Hola juanlaplata,
Si me has interpretado bien, el problema que tengo es que no se como declarar 'ncelda' ó como ponerlo para que sea un memo en vez de un string,
y a su vez vaya cambiando su valor en el bucle.
Saludos

MartinS
21-03-2012, 16:35:43
Hola: Ahora mas o menos interprete lo que quieres hacer... (Puede que no)
El error se da porque declaraste la variable string ncelda y despues en:
finforme.ncelda.Lines.Add(basededatos.ado_uno.FieldByName('ALUMNO').AsString); la tratas como componente. Lo que debes hacer es verificar que antes de asignar el valor si el componente de llegada es un TQRRichText. Lo que yo suelo hacer es lo siguiente y como para que te des una idea:

for I := 0 To ComponentCount -1 do
BEgin
if (Components[i] Is TEdit) then
(Components[I] as TEdit).Text := '';
End;

en este caso lo que hace es de acuerdo a todos los componentes que hay dentro del formulario ir verificando si alguno es del tipo TEdit (en este ejemplo) y en el caso de que así sea aplica el correspondiente valor...

Para tu caso:

for I := 0 To FInforme.ComponentCount -1 do
BEgin
if (FInforme.Components[i] Is TQrRichText) then
(FInforme.Components[I] as TQrRichText).Lines.Add := Valor;
End;

Espero que hayas entendido y que yo tambien haya interpretado :D

Saludos y cualquier cosa acá estamos.

juanlaplata
21-03-2012, 17:15:17
seguimos con el analisis ....
finforme, lo tienes prediseñado ?
si es asi, inserta un memo, y renombralo como ncelda.
o de que tipo es finforme ?
trata de redactar un poco mas el contexto, como para , talves, buscar otro camino para el mismo resultado

MARIA_MAR
21-03-2012, 18:52:34
Bueno Martins,tu idea me ha sido muy valida y he conseguido solucionarlo gracias a ti, de esta manera ya me da
igual que haya 50 componentes TQrRichText ó 200. Paso el codigo de como lo he dejado al final por si le sirve a alguien
de ayuda, solo aclarar que en el Qreport ha asignado a cada TQrRichText un 'Tag' para llevar un orden.


begin
fdisenohorario:=tfdisenohorario.Create(self);
for i:=0 to fdisenohorario.ComponentCount-1 do
begin
if (fdisenohorario.Components[i] is TQrRichtext) then
begin
orden:=(fdisenohorario.Components[i].Tag);
memo:='celda'+IntTostr(orden);

basededatos.ado_uno.SQL.Clear;
basededatos.ado_uno.SQL.Add('SELECT * FROM GRUPOHORARIO WHERE C_PROFESOR="'+profe+'" AND CELDA="'+memo+'";');
basededatos.ado_uno.Active:=true;
basededatos.ADO_uno.First;
While not basededatos.ado_uno.Eof do
begin
(fdisenohorario.Components[i] as TQrRichText).Lines.Add(' '+basededatos.ado_uno.FieldByName('ALUMNO').AsString);
basededatos.ado_uno.Next;
end; // del while
end; // del if
end; // del for

// Imprimo el previo
fdisenohorario.e_nombreprofesor.Lines.Add(e_nombreprofesor.Text);
fdisenohorario.QuickRep1.Preview;

end; // del if


Al final no he necesitado para nada la variable 'ncelda' que tantos problemas me daba.

De nuevo muchas gracias a todos por se tan atentos.