Fórum Ajuda atualizar clientdataset #411247
06/01/2012
0
procedure TFInspecoesRealizadas.Grava;
var
i: Integer;
begin
with DM.CDSInspecaoRealizada do
begin
for i := 0 to ClbInspecao.Count - 1 do
begin
Append;
FieldByName(Documento_ID).Value :=
DMConsulta.CDSDocumento.FieldByName(ID).Value;
FieldByName(TipoInspecao_ID).Value :=
Integer(ClbInspecao.Items.Objects);
if ClbInspecao.Checked = true then
FieldByName(SituacaoInspecao).Value := Sim
else
FieldByName(SituacaoInspecao).Value := Não;
FieldByName(Situacao).Value := 1;
Post;
ApplyUpdates(0);
Refresh;
end;
end
Gostaria de nao ter q ficar dando refresh; toda vez que gravar um registro no banco, pois causara lentidao no sistema ter que trazer todos dados novamente ao CDS
Alguem teria uma solução para isso ?
Carlos
Curtir tópico
+ 0Posts
06/01/2012
Rafael Ribeiro
Dê uma olhada nesse artigo: https://www.devmedia.com.br/post-23242-Criando-Banco-de-Dados-e-Geradores-com-IBEXPERT--Aplicacao-Completa-Delphi-Firebird-e-TcxScheduler.html.
Use os geradores de ID e seus problemas acabarão.
Att.
Rafael
Gostei + 0
06/01/2012
Carlos
e nao sei onde esta o problema que gera o erro
Gostei + 0
06/01/2012
Rafael Ribeiro
Gostei + 0
06/01/2012
Rafael Ribeiro
Gostei + 0
06/01/2012
Carlos
Esse erro é gerado apenas quando tento inserir dados dentro de um loop
Lendo sobre recordrefresh acredito que o caminho seja por ai mesmo, porem nao achei em nenhum lugar como utiliza-lo quando estou inserindo ( Append ou Insert ) somente quando estou editando dados (Edit), alguem teria uma sugestao
Grato
Gostei + 0
06/01/2012
Francisco Macário
seu problema esta nesse trecho
FieldByName(TipoInspecao_ID).Value := Integer(ClbInspecao.Items.Objects);
Voce não esta passando o index do for feito em ClbInspecao
Exemplo:
FieldByName(TipoInspecao_ID).Value := Integer(ClbInspecao.Items.Objects[x])
Espero que ajude.
Gostei + 0
06/01/2012
Carlos
Vou postar o codigo mais completo pra ver se ajuda no auxilio
procedure TFInspecoesRealizadas.Grava;
var
i: Integer;
begin
with DM.CDSInspecaoRealizada do
begin
for i := 0 to ClbInspecao.Count - 1 do
begin
Append;
FieldByName(Documento_ID).Value :=
DMConsulta.CDSDocumento.FieldByName(ID).Value;
FieldByName(TipoInspecao_ID).Value :=
Integer(ClbInspecao.Items.Objects[i]);
if ClbInspecao.Checked[i] = true then
FieldByName(SituacaoInspecao).Value := Sim
else
FieldByName(SituacaoInspecao).Value := Não;
FieldByName(Situacao).Value := 1;
Post;
ApplyUpdates(0);
Refresh; //
end;
end;
sem o Refresh gera o erro KeyViolation no segundo loop do for, porem nao gostaria de ter que dar refresh toda vez que gravasse um registro pois afetaria no trafego da rede.
no evento BeforeApplyUpdates existe um procedimento para recuperar o novo ID
procedure TDM.CDSBeforeApplyUpdates(Sender: TObject; var OwnerData: OleVariant);
begin
NewID := getID(copy(TDataSet(Sender).Name, 4));
end;
no primeiro loop ele entra no procedimento e grava td certinho no banco, porem como disse antes no segundo loop ele nem chega a entrar no procedimento ...
Ajudem, grato
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)