Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
rosinha Novato

Registrado: Domingo, 16 de Setembro de 2007 Mensagens: 7
|
Enviada: Qua Nov 14, 2007 9:06 pm Assunto: Tlist retornando informações repetidas!!!! |
|
|
Moderadores Active-Delphi escreveu: |
Tópico editado por: johnny-walker.
Motivo: Regras do Fórum.
Titulo Original: Socorro: Tlist retornando informações repetidas!!!!
|
Boa noite,
Já tentei de todas as formas e não consigo fazer a variável do tipo TList que recebe o resultado de consulta passar mais de um resultado encontrado.
O código da consulta é este:
function TdtmInsumo.cons_insumo_nome(strnome: string; oInsumo: TInsumos):TList;
var
linsumo:TList;
i:integer;
begin
//consulta de insumo
linsumo:=TList.Create;
with dtmInsumo.ADOqryInsumo do
begin
close;
sql.Clear;
sql.Add('SELECT cod_insumo, nome, qtde_tot, vlr_unit, qtde_min ');
sql.Add('FROM insumo ');
sql.Add('WHERE nome like :pnome ');
Parameters.ParamByName('pnome').Value:='%'+strnome+'%';
open;
first;
end;
while (not (ADOqryInsumo.Eof)) do
begin
oInsumo.codinsumo:=ADOqryInsumo.Fields[0].AsInteger;
oInsumo.nome:=ADOqryInsumo.Fields[1].AsString;
oInsumo.qtdetot:=ADOqryInsumo.Fields[2].AsInteger;
oInsumo.vlrunitario:=ADOqryInsumo.Fields[3].AsCurrency;
oInsumo.qtdemin:=ADOqryInsumo.Fields[4].AsInteger;
linsumo.Add(oinsumo);
ADOqryInsumo.next;
end;
result:=linsumo;
end;
O código para trazer para a tela(stringgrid) os resultados é este:
lInsumo:=objinsumo.cons_insumo_nome(edtconsulta.Text);
if linsumo.count > 0 then
begin
for j:=0 to linsumo.count-1 do
begin
encher_grid;
strgrConsulta.RowCount:=linsumo.count+j;
objInsumo:=linsumo.items[j];
strgrConsulta.Cells[0,j+1]:=inttostr(objInsumo.codinsumo);
strgrConsulta.Cells[1,j+1]:=objInsumo.nome;
strgrConsulta.Cells[2,j+1]:=inttostr(objInsumo.qtdetot);
strgrConsulta.Cells[3,j+1]:=inttostr(objInsumo.qtdemin);
strgrConsulta.Cells[4,j+1]:=floattostr(objInsumo.vlrunitario);
end;
end;
Sempre que na consulta é encontrado mais de um resultado ele repete no stringgrid o último resultado encontrado tantas vezes quantos forem os resultados da consulta.
Obs.: Código OO
Desde já agradeço a atenção de quem possa ajudar. |
|
Voltar ao Topo |
|
 |
levijr00 Membro Junior

Registrado: Sexta-Feira, 16 de Setembro de 2005 Mensagens: 356 Localização: Rio Verde - GO
|
Enviada: Sex Nov 16, 2007 9:04 am Assunto: |
|
|
velho tenta criar o objeto antes de passar pro grid e destruir depois...
Código: |
lInsumo:=objinsumo.cons_insumo_nome(edtconsulta.Text);
//faz um teste pra verifica os objetos q tao na lista acima...
if linsumo.count > 0 then
begin
strgrConsulta.RowCount:=linsumo.count+j;
for j:=0 to linsumo.count-1 do
begin
//pra que serve essa encher_grid??
encher_grid;
objInsumo := TObject.Create(Self);
objInsumo := linsumo.items[j];
strgrConsulta.Cells[0,j+1]:=inttostr(objInsumo.codinsumo);
strgrConsulta.Cells[1,j+1]:=objInsumo.nome;
strgrConsulta.Cells[2,j+1]:=inttostr(objInsumo.qtdetot);
strgrConsulta.Cells[3,j+1]:=inttostr(objInsumo.qtdemin);
strgrConsulta.Cells[4,j+1]:=floattostr(objInsumo.vlrunitario);
objInsumo.Free;
end;
end; |
espero ter ajudado...flwss |
|
Voltar ao Topo |
|
 |
rosinha Novato

Registrado: Domingo, 16 de Setembro de 2007 Mensagens: 7
|
Enviada: Seg Nov 19, 2007 7:25 pm Assunto: |
|
|
O encher_grid preenche o cabeçalho do stringgrid, se eu crio o objeto e destruo a cada loop do for ele dá access violation, se eu somente der o create ele continua repetindo o primeiro resultado no stringgrid que era o problema inicia.
SOCORRO!!!!!!!!!! |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Nov 19, 2007 8:16 pm Assunto: |
|
|
na realidade vai repetir mesmo!!
pelo menos foi o q vc fez?
se vc checar no seu List tods itens tem o mesmo endereço.
pq foi o q vc fez. vc adiciona o mesmo objeto, e muda sempre o valor do mesmo objeto |
|
Voltar ao Topo |
|
 |
rosinha Novato

Registrado: Domingo, 16 de Setembro de 2007 Mensagens: 7
|
Enviada: Seg Nov 19, 2007 8:31 pm Assunto: |
|
|
Gilson, se você reparar estou dando um next no objeto para carregar o próximo da lista.
Será que tem outra forma de fazer???
SOCORRO!!!!!!!!!!!!!!!!!!!!!!!!! |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Nov 19, 2007 8:35 pm Assunto: |
|
|
qdo digo objeto, to falando do oInsumo.
entendeu?
vc teri q estar usando algo como
New(oInsumo).
mas vc tem q liberar memoria dps usando um Dispose pq esse tipo de coisa o delphi nao libera automaticamente. |
|
Voltar ao Topo |
|
 |
rosinha Novato

Registrado: Domingo, 16 de Setembro de 2007 Mensagens: 7
|
Enviada: Ter Nov 20, 2007 8:53 am Assunto: |
|
|
Compreendi que seria Insumo sim.
Tentei NEW e dispose porem não funciona e dá erro de compilação.
SOCORRO!!!!!!!!!!!!!!!!!!!!!!! |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Nov 20, 2007 9:00 am Assunto: |
|
|
como é a definição/estrtura de TInsumos? |
|
Voltar ao Topo |
|
 |
rosinha Novato

Registrado: Domingo, 16 de Setembro de 2007 Mensagens: 7
|
Enviada: Ter Nov 20, 2007 10:01 am Assunto: |
|
|
Segue a estrutura.
type
TInsumos=class(TObject)
private
Fcodinsumo:integer;
Fnome:string;
Fqtdetot:integer;
Fvlrunitario:currency;
Fqtdemin:integer;
public
property codinsumo:integer read Fcodinsumo write Fcodinsumo;
property nome:string read Fnome write Fnome;
property qtdetot:integer read Fqtdetot write Fqtdetot;
property vlrunitario:currency read Fvlrunitario write Fvlrunitario;
property qtdemin:integer read Fqtdemin write Fqtdemin; |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Nov 20, 2007 11:35 am Assunto: |
|
|
blz
achei q era um tipo ponteiro de registro
mas é tipo classe.
vc teria q criar uma instancia pra cada item do tlist
porem nao esqucendo de destruí-los dps.
agora na minha opniao, vc ta complicando a coisa sem necessidade!!
existe maneira + simples e mais eficas de solucionar seu prob! |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Ter Nov 20, 2007 12:02 pm Assunto: |
|
|
bem rosinha, fiz este petit code para vc, espero que consiga resolver o seu caso... claro que nao usei uma classe comum e sim uma derivada de TCollectionItem, mas nada que te impeça de usar a sua...
Código: |
type
TProduto = Class(TCollectionItem)
public
Codigo: Integer;
Descricao: String;
end;
type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
Var
Produto: TProduto;
Colecao: TCollection;
I: Integer;
begin
Colecao := TCollection.Create(TProduto);
try
Produto := TProduto(Colecao.Add);
Produto.Codigo := 1;
Produto.Descricao := 'Produto 1';
Produto := TProduto(Colecao.Add);
Produto.Codigo := 2;
Produto.Descricao := 'Produto 2';
Produto := TProduto(Colecao.Add);
Produto.Codigo := 3;
Produto.Descricao := 'Produto 3';
With Colecao do
begin
StringGrid1.RowCount := Colecao.Count+1;
StringGrid1.Cells[0, 0] := 'Código';
StringGrid1.Cells[1, 0] := 'Descrição';
for i := 0 to Colecao.Count -1 do
with Colecao do
begin
StringGrid1.Cells[0, I+1] := IntToStr(TProduto(Items[i]).Codigo);
StringGrid1.Cells[1, I+1] := TProduto(Items[i]).Descricao;
end;
end;
finally
Colecao.Free
end;
end;
|
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Nov 20, 2007 1:37 pm Assunto: |
|
|
com akele seu codigo mesmo vc poderia fazer o seguinte:
modificar só o seguinte:
Código: | procedure TdtmInsumo.cons_insumo_nome(strnome: string; Lista : TList);
var
oInsumo: TInsumos;
begin
//consulta de insumo
with dtmInsumo.ADOqryInsumo do
begin
close;
sql.Clear;
sql.Add('SELECT cod_insumo, nome, qtde_tot, vlr_unit, qtde_min ');
sql.Add('FROM insumo ');
sql.Add('WHERE nome like :pnome ');
Parameters.ParamByName('pnome').Value:='%'+strnome+'%';
open;
first;
while not Eof do
begin
oInsumo := TInsumos.Create;
Lista.Add(oinsumo);
oInsumo.codinsumo := Fields[0].AsInteger;
oInsumo.nome := Fields[1].AsString;
oInsumo.qtdetot := Fields[2].AsInteger;
oInsumo.vlrunitario := Fields[3].AsCurrency;
oInsumo.qtdemin := Fields[4].AsInteger;
next;
end;
Close;
end;
end; |
O código para trazer para a tela(stringgrid) os resultados é este:
Código: | var
objInsumo : TInsumos;
J : Integer;
begin
lInsumo := TList.Create;//pra q fique + seguro.
try
objinsumo.cons_insumo_nome(edtconsulta.Text, lInsumo);
if linsumo.count > 0 then
begin
strgrConsulta.RowCount := linsumo.Count + 1;//creio q seria o correto
for j:=0 to linsumo.count-1 do
begin
encher_grid;
//strgrConsulta.RowCount := linsumo.count + j;//achei estranho
objInsumo := TInsumos(lInsumo.items[j]);
strgrConsulta.Cells[0, j+1] := IntToStr(objInsumo.codinsumo);
strgrConsulta.Cells[1, j+1] := objInsumo.nome;
strgrConsulta.Cells[2, j+1] := inttostr(objInsumo.qtdetot);
strgrConsulta.Cells[3, j+1]:= inttostr(objInsumo.qtdemin);
strgrConsulta.Cells[4, j+1]:=FloatToStr(objInsumo.vlrunitario);
lInsumo.items[j] := nil;//mt importante
objInsumo.Free; //mt importante
end;
end;
finally
try
//pra o caso de ter dado algum erro e tiver um infeliz na memoria.
for j:=0 to linsumo.count-1 do
begin
if linsumo[J] <> nil then
begin
TInsumos(linsumo[J]).Free;
linsumo[J] := nil;
end;
finally
lInsumo.Free; //isso aki ja nem precisa comentar, né?
end;
end;
end; |
|
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
|
Voltar ao Topo |
|
 |
|