Lentidão com dbExpress

Delphi

15/08/2007

Socorro!!!

Cenário: Tenho um ClientDataSet que exibe os produtos de uma lista. Para que o nome destes produtos apareçam no DbGrid, criei um campo Lookup no ClientDataSet, ligado a um SqlDataSet, que por sua vez, puxa todos os dados da tabela de produtos. Essa tabela tem mais de 5000 linhas. Quando eu abro a tela no servidor, fica tudo rápido, mas quando eu abro nas estações, da um lag de mais de 2 segundos.

[list:fd408480d2]Pq isto está acontecendo?[/list:u:fd408480d2]
[list:fd408480d2]Tem como agilizar isto?[/list:u:fd408480d2]
[list:fd408480d2]Tem algum componente trabalhe com Master-Detail sem precisar fazer ´remendos´?[/list:u:fd408480d2]
[list:fd408480d2]Tem como fazer ORM em delphi? Se sim, como?[/list:u:fd408480d2]


Adminfo

Adminfo

Curtidas 0

Respostas

Adminfo

Adminfo

15/08/2007

O pessoal, alguem ai sabe de alguma forma pra agilizar essa conexão? Algum componente ou coisa parecida. Quando o sistema roda no servidor ele funciona beleza, mas quando roda em uma estação, fica muito lento.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

15/08/2007

já que você utiliza ClientDataset, exiba a descrição do produto utilizando join na tabela. não utilize lookup.


GOSTEI 0
Adminfo

Adminfo

15/08/2007

já que você utiliza ClientDataset, exiba a descrição do produto utilizando join na tabela. não utilize lookup.



Acontece que quando eu uso o join, eu não consigo salvar, pois o cds diz que os campos exibidos pelo join não pertence a tabela.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

15/08/2007

pra isso você precisa alterar as flags nos campos ´estrangeiros´. coloque as ProviderFlags como pfHidden e assim o DatasetProvider os ignora no momento da gravação.

isso pode ser feito no evento BeforeUpdateRecord do DatasetProvider ou nos campos diretamente no ClientDataset (desde que estejam persistidos).

no BeforeUpdateRecord do DatasetProvider seria algo assim:

procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
  UpdateKind: TUpdateKind; var Applied: Boolean);
begin
  DeltaDS.FieldByName(´CampoEstrangeiro1´).ProviderFlags := [pfHidden];
  DeltaDS.FieldByName(´CampoEstrangeiro2´).ProviderFlags := [pfHidden];
  DeltaDS.FieldByName(´CampoEstrangeiroX´).ProviderFlags := [pfHidden];
end;



GOSTEI 0
Adminfo

Adminfo

15/08/2007

Fiz do jeito que vc me falou, e ficou bom, a velocidade aumentou muito. Porém, agora a descrição do produto não aparece no DBGrid. Já fiz todas as alterações que estavam relacionadas ao camo lookup, mas mesmo assim não exibe nada.

O meu problema é o seguinte: Eu tenho um cds em branco, que mais tarde irá ser salvo em uma tabela. Quando o usuario vai adicionando itens neste cds, ele exibe os itens adicionados em um DBGrid. Usando esta forma como vc me falou, o campo que deveria aparecer a descrição do produto, não aparece nada, fica em branco.

Como resolver isto?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

15/08/2007

antes de incluir no clientdataset vc precisa fazer a busca do produto no banco - o que provavelmente já faz para verificar se o produto existe - e atualizar o campo que contém o nome do produto normalmente, assim como vc faz com os demais campos.


GOSTEI 0
POSTAR