Ajuda atualizar clientdataset

Delphi

06/01/2012

Se eu nao colocar o comando Refresh apos o applyupdates ele grava o primeiro registro do loop corretamente e no segundo applyupdate ele gera um erro KeyViolation. O banco de dados é FireBird e a chave primaria da tabela é auto incremento, o CDS esta configurado corretamente para Key required False.

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

Carlos

Curtidas 0

Respostas

Rafael Ribeiro

Rafael Ribeiro

06/01/2012

Carlos, bom dia!

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
Carlos

Carlos

06/01/2012

muito obrigado pela dica, mais eu ja uso generator e triggers para minhas tabelas, o problema nao esta ai

e nao sei onde esta o problema que gera o erro
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

06/01/2012

Dê então apenas um RefreshRecord.
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

06/01/2012

E outra coisa.... se está dando Key Violation é porque seu gerador de ID não está funcionando corretamente. Por isso sugeri que desse uma lida no artigo.
GOSTEI 0
Carlos

Carlos

06/01/2012

os generators das tabelas estao funcionando corretamente, quando tento inserir registros fora de um loop (Ex: for) ele grava e incrementa normalmente.

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
Francisco Macário

Francisco Macário

06/01/2012


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
Carlos

Carlos

06/01/2012

Macario, não sei por que motivo mais na hora de postar removi essa parte do codigo, eu ja estava passando o indice do objeto, e mesmo assim nao funciona.

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
POSTAR