Fórum Ajuda atualizar clientdataset #411247

06/01/2012

0

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

Responder

Posts

06/01/2012

Rafael Ribeiro

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
Responder

Gostei + 0

06/01/2012

Carlos

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
Responder

Gostei + 0

06/01/2012

Rafael Ribeiro

Dê então apenas um RefreshRecord.
Responder

Gostei + 0

06/01/2012

Rafael Ribeiro

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.
Responder

Gostei + 0

06/01/2012

Carlos

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
Responder

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.
Responder

Gostei + 0

06/01/2012

Carlos

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar