Ajuda atualizar clientdataset
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 ?
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
Curtidas 0
Respostas
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
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
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
e nao sei onde esta o problema que gera o erro
GOSTEI 0
Rafael Ribeiro
06/01/2012
Dê então apenas um RefreshRecord.
GOSTEI 0
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
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
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
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
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
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