condiçao no OnColExit do DBGrid

Delphi

28/04/2008

como eu digo pro dbgrid (que esta ligado a tabela detalhe) no evento onColExit do componente a seguinte coisa:
se (sair da terceira coluna) e (antes de dar um insert na tabela detalhe) entao
begin
  tabela detalhe.post;
  tabela detalhe.apllyupdates(0);
end;


a primeira condição eu sei como escrever mas a segunda nao:

if (dbgrid.SelectedIndex = 3) and (antes de dar um insert na tabela detalhe) then
    begin
      DM.cdsDetalhe.Post;
      DM.cdsDetalhe.ApplyUpdates(0);
    end;


alguem poderia me dar uma mao?

abraços a todos!


Mahdak

Mahdak

Curtidas 0

Respostas

Webjoel

Webjoel

28/04/2008

Caro colega!

Você conseguirá melhores resultados controlando isso no BeforePost do ClientDataSet, mas ai vem o porém:

Que componentes de acesso ao banco você está usando?


GOSTEI 0
Webjoel

Webjoel

28/04/2008

Opa!

Viajei, logo depois do post vi que vc usa ClientDataSet, hehehe...desculpa...

a melhor forma de você controlar isso é no BeforePost do ClientDataSet, de ante mão já aviso que passando pra linha seguinte o ClientDataSet já dá um post automático por estar ligado a um DataSource que consecutivamente está ligado a dbgrid.

Mas qual é a sua intenção ao fazer isse código?


GOSTEI 0
Mahdak

Mahdak

28/04/2008

Opa! Viajei, logo depois do post vi que vc usa ClientDataSet, hehehe...desculpa... a melhor forma de você controlar isso é no BeforePost do ClientDataSet, de ante mão já aviso que passando pra linha seguinte o ClientDataSet já dá um post automático por estar ligado a um DataSource que consecutivamente está ligado a dbgrid. Mas qual é a sua intenção ao fazer isse código?


olá webjoel, meu problema é que tenho um dbgrid ligado a uma tabela (detalhe) no qual insiro dados. nesse dbgrid, a primeira coluna é lookup e obrigatória atualmente eu to salvando esses dados junto com o botao salvar d formulario. nesse botao eu primeiro salvo a tabela mestre e depois a detalhe, pelo fato do campo lookup do dbgrid fazer referencia ao ID da tabela mestre.

if DM.cdsMestre.State in [dsEdit, dsInsert]  then
begin
   DM.cdsMestre.Post;
   DM.cdsMestre.ApplyUpdates(0);
end;

if DM.cdsDetalhe.State in [dsEdit, dsInsert]  then
begin
   DM.cdsDetalhe.Post;
   DM.cdsDetalhe.ApplyUpdates(0);
end;



o problema nisso tudo é que o meu sistema ficou muito instavel quando to inserindo registros no dbGrid, por exemplo:

acabei de inserir um registro no dbgrid, dei um tab, ele inseriu a proxima linha (um novo registro). se eu nao informar nada nesse novo registro e clicar no registro anterior ja da merda pq o dbgrid da um cancelUpdates na tabela e eu nao consigo salvar aquilo que ja foi feito.

eu precisaria de uma maneira que sempre que eu inserisse um novo registro(), fosse dado um post, applyUpdates na tabela detalhe...

ja tentei no OnNewRecord, onAfterInsert do ClientDataSet, onAfterInsert mas me é retornado o erro que o campo obrigatorio da tabela detalhe nao foi preenchido.

no onAfterPost, onBeforePost, onBeforeInsert do Clientdataset nao acontece nada...

to meio perdido nessa historia... se vc puder me dar uma luz fico grato!
abraços!


GOSTEI 0
Webjoel

Webjoel

28/04/2008

Olha...

Já fiz esse tipo de coisa também, e passei por muitos problemas, mas a melhor forma de você fazer um cadastro mestre detalhe é mesmo usando o MasterDetail.

Procure na net artigos que explicam o funcionamento do MasterDetail, é a forma mais confiável a ser usada neste caso, no começo parece meio complicado mas depois você vai ver que fica simples e muito prático.

Qualquer duvida me dá um toque..Valeu!


GOSTEI 0
Marco Salles

Marco Salles

28/04/2008

eu reforço o que voce diz :

mas a melhor forma de você fazer um cadastro mestre detalhe é mesmo usando o MasterDetail.


e o clientDataSet é ainda mais fiel nesta estrutura por ter um campo especifico para isto o Nested Datasets , que facilita e muito a estrutura de Mestre Detalhe


GOSTEI 0
POSTAR