Query somente leitura com FB
Olá, queria uma query que me traga meu select, mas somente leitura, ou seja, soh pra exibição.. usei IBQuery e IBDataSet, porem toda vez, q mudo de registro no DBGrid, ele vai no banco e pega algo, isso torna lento...
como faço pra ele nao ir no banco?
desde ja agradeco
[]s
como faço pra ele nao ir no banco?
desde ja agradeco
[]s
Titanius
Curtidas 0
Respostas
Edilcimar
20/04/2005
tente stringgrid em vez de dbgrid
GOSTEI 0
Gandalf.nho
20/04/2005
Use um ClientDataSet ligado ao IbQuery, assim os dados ficarão na memória.
GOSTEI 0
Titanius
20/04/2005
mas soh de eu usar o ClientDataSet, eh preciso instalar o midas.dll nao eh?
GOSTEI 0
Gandalf.nho
20/04/2005
Sim, ou incorporar a unit correspondente no seus USES. Outra sugestão é usar outras tabelas em memória como as da biblioteca RxLib
GOSTEI 0
Titanius
20/04/2005
Sim, pensei nisso.. estou usando a do RxLib, porem por ser um sistema que acessa o firebird, via internet, demora certo tempo pra trazer os dados, e com isso demora pra incluir os dados no RxLib MemData... queria ver se tinha como fazer o proprio componente do interbase ficar somente como leitura.. :(
irei tentar melhorar a query pra ver se diminui otempo,
Obrigado
irei tentar melhorar a query pra ver se diminui otempo,
Obrigado
GOSTEI 0
Marco Salles
20/04/2005
Observaçoes:
1)Com esta a propriedade [b:a35f250420]Unidirecional[/b:a35f250420] do Componente IbQuery
2)Voce esta Usando BDE :?: :?: --->> o BDE neste caso ajuda muito , pois ele mantem em um Cache local os dados ja carregados da tabela
3)a dica do edilcimar não funciona :?: :?:
3)O Caso simples de um controle dbgrid usado para percorrer uma tabela inteira é comum em Programas Locais, mas geralmente deve ser evitado em ambiente Cliente\Servidor... É melhor filtrar apenas parte dos registros e apenas os campos que se esta interessado.. Por exemplo , para lista de nome --->> Solicite ao Usuário a Inicial do Nome
1)Com esta a propriedade [b:a35f250420]Unidirecional[/b:a35f250420] do Componente IbQuery
2)Voce esta Usando BDE :?: :?: --->> o BDE neste caso ajuda muito , pois ele mantem em um Cache local os dados ja carregados da tabela
3)a dica do edilcimar não funciona :?: :?:
tente stringgrid em vez de dbgrid
3)O Caso simples de um controle dbgrid usado para percorrer uma tabela inteira é comum em Programas Locais, mas geralmente deve ser evitado em ambiente Cliente\Servidor... É melhor filtrar apenas parte dos registros e apenas os campos que se esta interessado.. Por exemplo , para lista de nome --->> Solicite ao Usuário a Inicial do Nome
GOSTEI 0
Edilcimar
20/04/2005
se não funciona como é que eu uso?
GOSTEI 0
Titanius
20/04/2005
nao, nao estou usando bde, estou usando a paleta normal do interbase e ja tentei a propriedade unidirecional, e tbm nao funcionou... tentei com o stringgrid e tbm nao funcionou... :(
edilcimar, tem como vc me enviar um exemplo de como voce usou?
[]s
edilcimar, tem como vc me enviar um exemplo de como voce usou?
[]s
GOSTEI 0
Edilcimar
20/04/2005
não tenho o dlephi aqui, mas jogue para variáveis e delas para o stringgrid.coluns[x,y]
GOSTEI 0
Titanius
20/04/2005
tentei isso, mas preciso do evento que muda a localizacao, pois pra cada item selecionado tem uma descricao diferente....
GOSTEI 0
Edilcimar
20/04/2005
você utilizou matriz para as variáveis?
GOSTEI 0
Edilcimar
20/04/2005
veja este exemplo que eu utilizo para calcular comissão de vendedores de um programa para farmácia, adapte-o para o seu caso, não tenho o delphi mas abri o pas com o notepad
procedure TForm56.Button1Click(Sender: TObject);
var
Vendedor, Comissao, VendaBo, VendaTotal, Percentual, PercentualBo,
Nome : Variant;
I, NumVendedor : Integer;
TotalGeral : Real;
begin
Numero := 1;
NumVendedor := 1;
TotalGeral := 0;
Table1.Open;
With Table1 do
Begin
First;
While not eof do
Begin
Numero := FieldByName(´NUMERO´).AsInteger;
Next;
End;
End;
Vendedor := VarArrayCreate([1, Numero], VarOleStr);
Comissao := VarArrayCreate([1, Numero], VarCurrency);
VendaBo := VarArrayCreate([1, Numero], VarCurrency);
VendaTotal := VarArrayCreate([1, Numero], VarCurrency);
Percentual := VarArrayCreate([1, Numero], varDouble);
PercentualBo := VarArrayCreate([1, Numero], varDouble);
For I := 1 to Numero do
Begin
Vendedor[I] := ´´;
Comissao[I] := 0;
VendaBo[I] := 0;
VendaTotal[I] := 0;
Percentual[I] := 0;
PercentualBo[I] := 0;
End;
Table2.Open;
Table2.Filtered := True;
With Table1 do
Begin
First;
While not eof do
Begin
NumVendedor := FieldByName(´NUMERO´).AsInteger;
Vendedor[NumVendedor] := FieldByName(´NOME´).AsString;
With Table2 do
Begin
While not eof do
Begin
Comissao[NumVendedor] := Comissao[NumVendedor] + FieldByName(´COMISSAO´).AsFloat;
If FieldByName(´COMISSAO´).AsFloat > 0 then
VendaBo[NumVendedor] := VendaBo[NumVendedor] + FieldByName(´VALOR´).AsFloat;
VendaTotal[NumVendedor] := VendaTotal[NumVendedor] + FieldByName(´VALOR´).AsFloat;
TotalGeral := TotalGeral + FieldByName(´VALOR´).AsFloat;
Next;
End;
End;
Next;
End;
First;
I := 1;
StringGrid1.Cells[0,0] := ´VENDEDOR´;
StringGrid1.Cells[1,0] := ´COMISSÃO´;
StringGrid1.Cells[2,0] := ´VENDA COMISSIONADO´;
StringGrid1.Cells[3,0] := ´¬ COMISSÃO´;
StringGrid1.Cells[4,0] := ´VENDA TOTAL´;
StringGrid1.Cells[5,0] := ´¬. VENDAS´;
While not eof do
Begin
NumVendedor := FieldByName(´NUMERO´).AsInteger;
Percentual[NumVendedor] := 100 * VendaTotal[NumVendedor] / TotalGeral;
If VendaTotal[NumVendedor] > 0 then
PercentualBo[NumVendedor] := 100 * VendaBo[NumVendedor] / VendaTotal[NumVendedor]
Else
PercentualBo[Numvendedor] := 0;
StringGrid1.Cells[0,I] := Vendedor[NumVendedor];
StringGrid1.Cells[1,I] := FloatToStrF(Comissao[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[2,I] := FloatToStrF(VendaBo[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[3,I] := FloatToStrF(PercentualBo[NumVendedor], ffFixed, 3,3);
StringGrid1.Cells[4,I] := FloatToStrF(VendaTotal[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[5,I] := FloatToStrF(Percentual[NumVendedor], ffFixed, 3,3);
I := I + 1;
StringGrid1.RowCount := I + 1;
Next;
End;
End;
end;
isto calcula e acrescenta uma linha em branco no final
procedure TForm56.Button1Click(Sender: TObject);
var
Vendedor, Comissao, VendaBo, VendaTotal, Percentual, PercentualBo,
Nome : Variant;
I, NumVendedor : Integer;
TotalGeral : Real;
begin
Numero := 1;
NumVendedor := 1;
TotalGeral := 0;
Table1.Open;
With Table1 do
Begin
First;
While not eof do
Begin
Numero := FieldByName(´NUMERO´).AsInteger;
Next;
End;
End;
Vendedor := VarArrayCreate([1, Numero], VarOleStr);
Comissao := VarArrayCreate([1, Numero], VarCurrency);
VendaBo := VarArrayCreate([1, Numero], VarCurrency);
VendaTotal := VarArrayCreate([1, Numero], VarCurrency);
Percentual := VarArrayCreate([1, Numero], varDouble);
PercentualBo := VarArrayCreate([1, Numero], varDouble);
For I := 1 to Numero do
Begin
Vendedor[I] := ´´;
Comissao[I] := 0;
VendaBo[I] := 0;
VendaTotal[I] := 0;
Percentual[I] := 0;
PercentualBo[I] := 0;
End;
Table2.Open;
Table2.Filtered := True;
With Table1 do
Begin
First;
While not eof do
Begin
NumVendedor := FieldByName(´NUMERO´).AsInteger;
Vendedor[NumVendedor] := FieldByName(´NOME´).AsString;
With Table2 do
Begin
While not eof do
Begin
Comissao[NumVendedor] := Comissao[NumVendedor] + FieldByName(´COMISSAO´).AsFloat;
If FieldByName(´COMISSAO´).AsFloat > 0 then
VendaBo[NumVendedor] := VendaBo[NumVendedor] + FieldByName(´VALOR´).AsFloat;
VendaTotal[NumVendedor] := VendaTotal[NumVendedor] + FieldByName(´VALOR´).AsFloat;
TotalGeral := TotalGeral + FieldByName(´VALOR´).AsFloat;
Next;
End;
End;
Next;
End;
First;
I := 1;
StringGrid1.Cells[0,0] := ´VENDEDOR´;
StringGrid1.Cells[1,0] := ´COMISSÃO´;
StringGrid1.Cells[2,0] := ´VENDA COMISSIONADO´;
StringGrid1.Cells[3,0] := ´¬ COMISSÃO´;
StringGrid1.Cells[4,0] := ´VENDA TOTAL´;
StringGrid1.Cells[5,0] := ´¬. VENDAS´;
While not eof do
Begin
NumVendedor := FieldByName(´NUMERO´).AsInteger;
Percentual[NumVendedor] := 100 * VendaTotal[NumVendedor] / TotalGeral;
If VendaTotal[NumVendedor] > 0 then
PercentualBo[NumVendedor] := 100 * VendaBo[NumVendedor] / VendaTotal[NumVendedor]
Else
PercentualBo[Numvendedor] := 0;
StringGrid1.Cells[0,I] := Vendedor[NumVendedor];
StringGrid1.Cells[1,I] := FloatToStrF(Comissao[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[2,I] := FloatToStrF(VendaBo[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[3,I] := FloatToStrF(PercentualBo[NumVendedor], ffFixed, 3,3);
StringGrid1.Cells[4,I] := FloatToStrF(VendaTotal[NumVendedor], ffCurrency, 10,2);
StringGrid1.Cells[5,I] := FloatToStrF(Percentual[NumVendedor], ffFixed, 3,3);
I := I + 1;
StringGrid1.RowCount := I + 1;
Next;
End;
End;
end;
isto calcula e acrescenta uma linha em branco no final
GOSTEI 0
Titanius
20/04/2005
nao, eh q tem somente uma coluna, mas de qulquer forma nao daria para mim, pois teria que dar o .Next na query e assim ele de qualqueer forma iria ao banco de dados..
obrigado..
[]s
obrigado..
[]s
GOSTEI 0
Edilcimar
20/04/2005
no exemplo eu leio para depois mostrar
GOSTEI 0
Gandalf.nho
20/04/2005
Vc não pode delimitar os dados antes de trazê-los? Pq qualquer solução teria que trazer todos os dados antes de jogá-los numa tabela em memória, stringgrid ou algo semelhante. Na verdade, vc não quer somente leitura (o que o IBQuery já é), vc quer um cache ou algo do gênero.
GOSTEI 0
Titanius
20/04/2005
justamente,.. isso mesmo que eu quero.. :oops:
mas por hora vou deixar na tabela de memoria, jah melhora bastante..
obrigado
mas por hora vou deixar na tabela de memoria, jah melhora bastante..
obrigado
GOSTEI 0
Marco Salles
20/04/2005
Marco salles Escreveu:
Edicilmar Replicou:
Amigo , veja a [b:35f89aaeea]interrogação [/b:35f89aaeea]na minha Deixa... Eu não [b:35f89aaeea]afirmei,[/b:35f89aaeea] eu apenas por achar uma dica Boa , [b:35f89aaeea] Perguntei [/b:35f89aaeea]ao[b:35f89aaeea] Titanius [/b:35f89aaeea]se sua dica não[b:35f89aaeea] o servia [/b:35f89aaeea]:P :P
No fundo foi o que eu disse:
e parece que a [b:35f89aaeea]gandalf.nho[/b:35f89aaeea] sugere algo parecido:
3)a dica do edilcimar não funciona :?: :?:
[quote:35f89aaeea] edicilmar Escreveu Citação:
tente stringgrid em vez de dbgrid
[/quote:35f89aaeea]Edicilmar Replicou:
se não funciona como é que eu uso?
Amigo , veja a [b:35f89aaeea]interrogação [/b:35f89aaeea]na minha Deixa... Eu não [b:35f89aaeea]afirmei,[/b:35f89aaeea] eu apenas por achar uma dica Boa , [b:35f89aaeea] Perguntei [/b:35f89aaeea]ao[b:35f89aaeea] Titanius [/b:35f89aaeea]se sua dica não[b:35f89aaeea] o servia [/b:35f89aaeea]:P :P
No fundo foi o que eu disse:
O Caso simples de um controle dbgrid usado para percorrer uma tabela inteira é comum em Programas Locais, mas geralmente deve ser evitado em ambiente Cliente\Servidor...[b:35f89aaeea] É melhor filtrar [/b:35f89aaeea]apenas parte dos registros e apenas os campos que se esta interessado.. Por exemplo , para lista de nome --->> Solicite ao Usuário a Inicial do Nome
e parece que a [b:35f89aaeea]gandalf.nho[/b:35f89aaeea] sugere algo parecido:
[b:35f89aaeea]Vc não pode [b]delimitar os dados [/b:35f89aaeea]antes de trazê-los? Pq qualquer solução teria que trazer todos os dados antes de jogá-los numa tabela em memória, stringgrid ou algo semelhante. Na verdade, vc não quer somente leitura (o que o IBQuery já é), vc quer um cache ou algo do gênero.[/b]
GOSTEI 0
Edilcimar
20/04/2005
é realmente eu não vi a interrogação, é que eu não olho os bonequinhos, quanto ao colocar na memória eu utilizo uma matriz, portanto fica tudo na memória e indexado; a partir daí pode utilizar da maneira que quizer
GOSTEI 0
Marco Salles
20/04/2005
:idea: :idea: Existe Uma Outra alternativa,
a teoria consiste em [b:3693ac58b4]desabilitar e habilitar [/b:3693ac58b4]o controle consciente de dados ...
Segundo a teoria , o tempo gasto para [b:3693ac58b4]atualizar[/b:3693ac58b4] a interface com o usuário é muito[b:3693ac58b4] maior [/b:3693ac58b4]do que o tempo gasto para que o Computador [b:3693ac58b4]realize[/b:3693ac58b4] alguns calculos
Esta política pode, [b:3693ac58b4]acelerar[/b:3693ac58b4] consideravelmente o Programa...
Se quiser implementar, ou pelo menos tentar :wink: :wink:
a teoria consiste em [b:3693ac58b4]desabilitar e habilitar [/b:3693ac58b4]o controle consciente de dados ...
Segundo a teoria , o tempo gasto para [b:3693ac58b4]atualizar[/b:3693ac58b4] a interface com o usuário é muito[b:3693ac58b4] maior [/b:3693ac58b4]do que o tempo gasto para que o Computador [b:3693ac58b4]realize[/b:3693ac58b4] alguns calculos
Esta política pode, [b:3693ac58b4]acelerar[/b:3693ac58b4] consideravelmente o Programa...
Se quiser implementar, ou pelo menos tentar :wink: :wink:
GOSTEI 0
Edilcimar
20/04/2005
e a maioria dos usuários utilizam estas porcarias de placa de vídeo onboard e compartilham a menor quantidade possível tornando o refresh da tela lento, as vezes o problema não é nem com o banco e sim com o vídeo
GOSTEI 0