Problema do ApplyUpdates()

Delphi

31/10/2005

Estou usando Conexão com Banco SQL Server 2000, com componentes DBExpress. Abro uma tabela no clientdataset, só que na hora que vou deletar um registro, tenho a seguinte mensagem:
Após a instruão:

cds.Delete;
cds.Post;

Dataset in not edit or insert mode.

Eu coloquei o comando ApplyUpdates no AfterPost do clientDataset.

Meu dataset esta aberto, mas não sei como resolver este problema , alguem pode me ajudar ?


Eleusis

Eleusis

Curtidas 0

Respostas

Martins

Martins

31/10/2005

Estou usando Conexão com Banco SQL Server 2000, com componentes DBExpress. Abro uma tabela no clientdataset, só que na hora que vou deletar um registro, tenho a seguinte mensagem: Após a instruão: cds.Delete; cds.Post; Dataset in not edit or insert mode. Eu coloquei o comando ApplyUpdates no AfterPost do clientDataset. Meu dataset esta aberto, mas não sei como resolver este problema , alguem pode me ajudar ?


[b:77907562ca][color=red:77907562ca]ataset in not edit or insert mode.[/color:77907562ca][/b:77907562ca]

Faz sentido, veja:

[i:77907562ca][color=blue:77907562ca]cds.Delete;
[b:77907562ca]cds.Post;[/b:77907562ca][/color:77907562ca][/i:77907562ca]

vc não pode salvar um registro q não está em modo de inserção ou edição, ao excluir vc pode e deve dar um refresh no clientdataset que é conseguindo com ApplyUpdates(-1).

Cds.Delete;
Cds.ApplyUpdates(-1);



Boa Sorte!!!


GOSTEI 0
Eleusis

Eleusis

31/10/2005

Valeu Martins.
É que só vi por aí exemplos usando ApplyUpdates(0), achava que outros parâmetros desta função seriam só para controlar mensagens de erro ou coisa assim.

Valeu mesmo

Grato
Eleusis.


GOSTEI 0
Martins

Martins

31/10/2005

Valeu Martins. É que só vi por aí exemplos usando ApplyUpdates(0), achava que outros parâmetros desta função seriam só para controlar mensagens de erro ou coisa assim. Valeu mesmo Grato Eleusis.


Blz !!!

Depois posta aqui para dizer se deu certo ou não com vc, pq tem neguinho q não consegue.

Boa Sorte!!!


GOSTEI 0
Eleusis

Eleusis

31/10/2005

Caro Martins, acho que vou ficar louco.
Agora o comando UpplyUpdates(0) não está gravando no banco de dados.
O incrível é que ontem estava(31/10/2005) HOJE (01/11/2005) NÃO ESTÁ GRAVANDO.

o QUE SERÁ QUE ACONTECEU.

Grato

Eleusis


GOSTEI 0
Martins

Martins

31/10/2005

Caro Martins, acho que vou ficar louco. Agora o comando UpplyUpdates(0) não está gravando no banco de dados. O incrível é que ontem estava(31/10/2005) HOJE (01/11/2005) NÃO ESTÁ GRAVANDO. o QUE SERÁ QUE ACONTECEU. Grato Eleusis


vc fez alguma modificação?

poderia postar o código q vc está usando para gravar aqui?

Assim poderemos ver qual o motivo.

Boa sorte!!


GOSTEI 0
Eleusis

Eleusis

31/10/2005

La vai o código:
botão confirma do formulario de cadastro de Departamento.

procedure Tfrm_CadDepto.btn_ConfirmaClick(Sender: TObject);
begin
if p_Opcao = ´I´
then DMDepto.cdsDepto.Append;
if p_Opcao = ´A´
then DMDepto.cdsDepto.Edit;
DMDepto.cdsDepto.FieldByName(´Codigo´).Value := StrToInt(edt_Codigo.Text);
DMDepto.cdsDepto.FieldByName(´Descricao´).Value := edt_Descricao.Text;
DMDepto.cdsDepto.FieldByName(´Responsav´).Value := edt_Resp.Text;
DMDepto.cdsDepto.FieldByName(´Campus´).Value := edt_Campus.Text;
DMDepto.cdsDepto.FieldByName(´Ramal´).Value := edt_Ramal.Text;
if chk_Finaliza.Checked
then DMDepto.cdsDepto.FieldByName(´Finaliza´).Value := ´S´
else DMDepto.cdsDepto.FieldByName(´Finaliza´).Value := ´N´ ;
if chk_Filtro.Checked
then DMDepto.cdsDepto.FieldByName(´Filtro´).Value := ´S´
else DMDepto.cdsDepto.FieldByName(´Filtro´).Value := ´N´ ;
DMDepto.cdsDepto.FieldByName(´EMail´).Value := edt_EMail.Text;
DMDepto.cdsDepto.Post;
Close;
end;

no datamodulo DMDepto tenho :

procedure TDMDepto.cdsDeptoAfterPost(DataSet: TDataSet);
begin
cdsDepto.ApplyUpdates(0);
end;

Será que isto é o suficiente.

Grato Martins

Eleusis


GOSTEI 0
Adriano Santos

Adriano Santos

31/10/2005

La vai o código: botão confirma do formulario de cadastro de Departamento. procedure Tfrm_CadDepto.btn_ConfirmaClick(Sender: TObject); begin if p_Opcao = ´I´ then DMDepto.cdsDepto.Append; if p_Opcao = ´A´ then DMDepto.cdsDepto.Edit; DMDepto.cdsDepto.FieldByName(´Codigo´).Value := StrToInt(edt_Codigo.Text); DMDepto.cdsDepto.FieldByName(´Descricao´).Value := edt_Descricao.Text; DMDepto.cdsDepto.FieldByName(´Responsav´).Value := edt_Resp.Text; DMDepto.cdsDepto.FieldByName(´Campus´).Value := edt_Campus.Text; DMDepto.cdsDepto.FieldByName(´Ramal´).Value := edt_Ramal.Text; if chk_Finaliza.Checked then DMDepto.cdsDepto.FieldByName(´Finaliza´).Value := ´S´ else DMDepto.cdsDepto.FieldByName(´Finaliza´).Value := ´N´ ; if chk_Filtro.Checked then DMDepto.cdsDepto.FieldByName(´Filtro´).Value := ´S´ else DMDepto.cdsDepto.FieldByName(´Filtro´).Value := ´N´ ; DMDepto.cdsDepto.FieldByName(´EMail´).Value := edt_EMail.Text; DMDepto.cdsDepto.Post; Close; end; no datamodulo DMDepto tenho : procedure TDMDepto.cdsDeptoAfterPost(DataSet: TDataSet); begin cdsDepto.ApplyUpdates(0); end; Será que isto é o suficiente. Grato Martins Eleusis



Cara, deixa eu me meter um pouco. Você pode dar um ApplyUpdates junto do seu código de gravação, assim:

...
  then DMDepto.cdsDepto.FieldByName(´Filtro´).Value    := ´S´
  else DMDepto.cdsDepto.FieldByName(´Filtro´).Value    := ´N´ ;
  DMDepto.cdsDepto.FieldByName(´EMail´).Value     := edt_EMail.Text;
  DMDepto.cdsDepto.Post;
  cdsDepto.ApplyUpdates(0);
  Close;
end;
...



GOSTEI 0
Martins

Martins

31/10/2005

É isso aí q o [b:9c26e29bae]Adriano[/b:9c26e29bae] Falou!!!!

se não der certo assim, vc pode colocar lá no AfterPost [b:9c26e29bae] ApplyUpdate(-1).

Uma vez fiz isso só para testar.

//Tentando evitar q os dados sejam perdidos.

if cds.ApplyUpdates(-1) <> 0 then 

begin

showmessage(´Algo impedi q os dados sejam gravados!!!´);

cds.CancelUpdates;

end

Else

ShowMessage(´Dados gravados com sucesso!!!´);


Deve funcionar da forma descrita pelo [b]Adriano[/b:9c26e29bae]


GOSTEI 0
Eleusis

Eleusis

31/10/2005

Caro Martins, agora endoidei de vez, criei outro datamodulo com os componentes de conexão e liguei a outra tabela.

Milagre agora gravou.

Acho que esta com algum problema nos componentes de conexão do datamodulo da tabela de departamento.(DMDepto). Acho que vou excluir estes componentes e criá-los novamente.

Valeu pela ajuda.

Eleusis.

PS.: Não fiz o que falou a Adriano porque senão terei que por varios ApplyUpDates() , um no confirma, outro na exclusão, acho q não há problema deixar no afterPost do clientDataset.


GOSTEI 0
Martins

Martins

31/10/2005

Caro Martins, agora endoidei de vez, criei outro datamodulo com os componentes de conexão e liguei a outra tabela. Milagre agora gravou. Acho que esta com algum problema nos componentes de conexão do datamodulo da tabela de departamento.(DMDepto). Acho que vou excluir estes componentes e criá-los novamente. Valeu pela ajuda. Eleusis. PS.: Não fiz o que falou a Adriano porque senão terei que por varios ApplyUpDates() , um no confirma, outro na exclusão, acho q não há problema deixar no afterPost do clientDataset.


Certo, mas não esquece os ApplyUpdates em AfterPost e AfterDelte, pq vc pode ter problemas quanto a excluir ou gravar fisicamente os dados.

Boa sorte!!


GOSTEI 0
Rômulo Barros

Rômulo Barros

31/10/2005

Deixa eu me meter um pouquinho:
Vamos supor que vc tenha alterado 10 registros no seu TClientDataSet. Dos 10 registros alterados, apenas 8 foram alterados com sucesso ( os outros 2 registros deu pau). Então, vejamos a diferença no parametros do applyUpdates:
ApplyUpdates(-1);
Quando o parâmetro é setado para -1, estamos dizendo ao TClientDataSet que ele atualize no banco de dados todos os registros que não deram problemas ( os 8 registros ). Ou seja, ele grava no banco todos os registros que foram alterados / incluídos / deletados com sucesso sem exibir erros.
ApplyUpdates(0):
Quando o parâmetro é setado para 0, estamos dizendo ao TClientDataSet que grave no banco tudo ( se não tiver ocorrido nenhum erro). Ou seja, ou ele grava tudo ou não grava nada. Se qualquer um dos registros modificados / incluídos / deletados tiver tido algum erro, nada irá ser gravado no banco. ELE SÓ GRAVA SE NÃO DER ERRO EM NENHUM DOS REGISTROS.


GOSTEI 0
Martins

Martins

31/10/2005

[quote:476d8a207f=´Rômulo Barros´]Deixa eu me meter um pouquinho:
Vamos supor que vc tenha alterado 10 registros no seu TClientDataSet. Dos 10 registros alterados, apenas 8 foram alterados com sucesso ( os outros 2 registros deu pau). Então, vejamos a diferença no parametros do applyUpdates:
ApplyUpdates(-1);
Quando o parâmetro é setado para -1, estamos dizendo ao TClientDataSet que ele atualize no banco de dados todos os registros que não deram problemas ( os 8 registros ). Ou seja, ele grava no banco todos os registros que foram alterados / incluídos / deletados com sucesso sem exibir erros.
ApplyUpdates(0):
Quando o parâmetro é setado para 0, estamos dizendo ao TClientDataSet que grave no banco tudo ( se não tiver ocorrido nenhum erro). Ou seja, ou ele grava tudo ou não grava nada. Se qualquer um dos registros modificados / incluídos / deletados tiver tido algum erro, nada irá ser gravado no banco. ELE SÓ GRAVA SE NÃO DER ERRO EM NENHUM DOS REGISTROS.[/quote:476d8a207f]


Certo já sabia dessa parte, agora [b:476d8a207f]Rômulo[/b:476d8a207f], qual a melhor opção ao seu ver? (-1) com os devidos tratamentos ou (o)?

Valew!!


GOSTEI 0
POSTAR