UpdateStatus
Ola Amigos.
Alguém sabe Como cancelar o UpdateStatus do CDS ?
Mesmo usando .Cancel ou .CancelUpdates o status do CDS permanece em [usDeleted, usInserted, usModified].
Não tinha percebido isto até hoje , mas preciso de multiplos CDS numa tela e escrevi uma rotina generica de verificação de troca de PageIndex em um PageControl e aí apareceu o problema.
Vejam bem :
1ª Rotina : Botão Cancel :
for i := 0 to Self.ComponentCount - 1 do if (Components[i] is TClientDataSet) then
if (Components[i] as TClientDataSet).Active then if (Components[i] as TClientDataSet).UpdateStatus in [usDeleted, usInserted, usModified] then
begin (Components[i] as TClientDataSet).CancelUpdates; (Components[i] as TClientDataSet).Cancel; (Components[i] as TClientDataSet).Refresh; end;
LigarControlesNavegacao;
2ª Rotina : PageControlPadraoChanging (Sender: TObject;
var AllowChange: Boolean);
for i := 0 to Self.ComponentCount - 1 do if (Components[i] is TClientDataSet) then
if (Components[i] as TClientDataSet).Active then if (Components[i] as TClientDataSet).UpdateStatus in [usDeleted, usInserted, usModified] then
begin ShowMessage(´Você deve Salvar ou Cancelar os Dados antes de Mudar de Página´); AllowChange := False end;
Bom , deveria funcionar que nem relogio , o usuário não poderia mudar de página sem cancelar ou aplicar as mudanças , mas não funciona , o UpdateStatus não retorna ao state unModified com o cancelamento.
Alguém tem uma dica ou já passou por isto.
Desde já sou grato.
Alguém sabe Como cancelar o UpdateStatus do CDS ?
Mesmo usando .Cancel ou .CancelUpdates o status do CDS permanece em [usDeleted, usInserted, usModified].
Não tinha percebido isto até hoje , mas preciso de multiplos CDS numa tela e escrevi uma rotina generica de verificação de troca de PageIndex em um PageControl e aí apareceu o problema.
Vejam bem :
1ª Rotina : Botão Cancel :
for i := 0 to Self.ComponentCount - 1 do if (Components[i] is TClientDataSet) then
if (Components[i] as TClientDataSet).Active then if (Components[i] as TClientDataSet).UpdateStatus in [usDeleted, usInserted, usModified] then
begin (Components[i] as TClientDataSet).CancelUpdates; (Components[i] as TClientDataSet).Cancel; (Components[i] as TClientDataSet).Refresh; end;
LigarControlesNavegacao;
2ª Rotina : PageControlPadraoChanging (Sender: TObject;
var AllowChange: Boolean);
for i := 0 to Self.ComponentCount - 1 do if (Components[i] is TClientDataSet) then
if (Components[i] as TClientDataSet).Active then if (Components[i] as TClientDataSet).UpdateStatus in [usDeleted, usInserted, usModified] then
begin ShowMessage(´Você deve Salvar ou Cancelar os Dados antes de Mudar de Página´); AllowChange := False end;
Bom , deveria funcionar que nem relogio , o usuário não poderia mudar de página sem cancelar ou aplicar as mudanças , mas não funciona , o UpdateStatus não retorna ao state unModified com o cancelamento.
Alguém tem uma dica ou já passou por isto.
Desde já sou grato.
Emerson Azevedo
Curtidas 0
Respostas
Kotho
26/07/2005
Tente usar ClientDataSet.ChangeCount... que retorna a quantidade de alterações constantes no log...
GOSTEI 0
Emerson Azevedo
26/07/2005
Ja tentei , não retorna nada pois não tem alteraçao no cahe , mas o UpdateStatus continua como usInserted , estranho né , tente ai , coloque dois Qry , 2 Dsp , 2 CDS , altere o estado do Detalhe , chame o metodo cancel e teste o UpdateStatus , ele vai permanecer alterado ( mesmo que vc chame o metodo cancel pelo nome do CDS , no caso do for i.... da na mesma) deve ser bug . Preciso saber como liberar o UpdateStatus diretamente , talvez passando pelo ancestrau ( TCustomClientDataset ).[/i]
GOSTEI 0
Kotho
26/07/2005
Você não entendeu o que eu quiz dizer... use o ChangeCount na sua função para verificar se tem alterações pendentes...
GOSTEI 0
Emerson Azevedo
26/07/2005
Caro Amigo.
Obrigado pela atenção.
Entendi o que você propôs.
A opção .Changecount retorna 0 ( zero ) e eu já tinha tentado.
As outras opções tentadas foram .RevertRecord , .CancelUpdates , TCustomClientDataset.CancelUpdates e (TDataSetProvider.DataSet as TClientDataSet).Cancel.
Nenhuma delas libera o Status do CDS ou seja , retorna ele ao estado usUnModified.
Parece bug .
Temos que tentar outra opção ou sempre que precisarmos de loop de liberação , vamos ficar com pending = true Ok?
Obrigado pela atenção.
Entendi o que você propôs.
A opção .Changecount retorna 0 ( zero ) e eu já tinha tentado.
As outras opções tentadas foram .RevertRecord , .CancelUpdates , TCustomClientDataset.CancelUpdates e (TDataSetProvider.DataSet as TClientDataSet).Cancel.
Nenhuma delas libera o Status do CDS ou seja , retorna ele ao estado usUnModified.
Parece bug .
Temos que tentar outra opção ou sempre que precisarmos de loop de liberação , vamos ficar com pending = true Ok?
GOSTEI 0