Atualizar registros de um ClientDataSet

Delphi

26/06/2012

Olá Pessoal!

Estou utilizando um ClientDataSet para criar uma lista de promoções de produtos.
Carrego a lista com os produtos que desejo colocar em promoção, dai registro o valor da promoção para cada produto, para então gravar no Banco.
Estou com o seguinte problema: quando eu informar um valor para um produto que pertence a uma familia de preço, esse valor tem que ser gravado em todos os produtos da lista que pertence a essa familia.

Estou utilizando o UpdateData do DBGrid da seguinte forma:

procedure Tfrm_promocao.dbgPromoColumns4UpdateData(Sender: TObject;
var Text: String; var Value: Variant; var UseText, Handled: Boolean);
var StrFM: string;
VlrPromo: Real;
begin
if Value >= cdsPromovenda.AsFloat then begin
Text := 0;
Value := 0;
MsgDlg(O valor da promoção não pode ser maior ou igual ao valor da venda!,mtInformation,[mbOK]);
Exit;
end;

if Length(cdsPromofamilia.AsString) > 0 then
if MsgDlg(O produto pertence a família +cdsPromofamilia.AsString+.+#13+
Deseja aplicar a promoção aos produtos que pertence a mesma família?,mtInformation,[mbYes,mbNo],mbNo) = mrYes then
begin
StrFM := cdsPromofamilia.AsString;
VlrPromo := Value;
cdsPromo.First;
while not cdsPromo.Eof do begin
if cdsPromofamilia.AsString = StrFM then begin
cdsPromo.Edit;
cdsPromopromocao.AsFloat := Value;
cdsPromo.Post;
end;
cdsPromo.Next;
end;
Text := 0;
Value := 0;
end;
end;

O problema é que ao terminar é apresentado um erro dizendo que o cdsPromo (ClientDataSet) não está em modo de edição ou inserção, e está alterando o valor do ultimo registro, independente dele estar ou não cadastrado na mesma familia de preços.

Alguém poderia me dar uma ajuda de como resolver isso, se é esse o ponto para fazer essa função ou se existe um jeito melhor.

Agradeço desde já qualquer ajuda....
Vagner Almeida

Vagner Almeida

Curtidas 0

Respostas

William

William

26/06/2012

Colega não sei o tamanho da sua base de dados, mas imagine vc rodando esse loop para atualização em uma tabela com mais de 1000 registros, dependendo da quantidade que atendesse sua condição poderia ocorrer 1000 Edits, 1000 Post e por aí vai, esse tipo de processamento iria comprometer a performance do sua aplicação e servidor de banco de dados.

Aconselho vc à atualizar esses registros via SQL com o comando UPDATE e usando a cláusula WHERE, poderia criar uma Store Procedure no Servidor para executar esse função.
GOSTEI 0
Vagner Almeida

Vagner Almeida

26/06/2012

Fiz dessa forma pelo fato dessa lista não ser grande.
Mas obrigado por me fazer repensar.
Realmente você tem razão.

Abraços.
GOSTEI 0
POSTAR