[firebase-br] Re: Por favor estou ficando maluco com o dbexpress :o(

Antonio Carlos a.lima.silva em terra.com.br
Ter Jun 21 08:55:50 -03 2005


Muito obrigado pela sua resposta, agora vejo uma luz mais proxima no final 
do tunel.
Se nao for abusar, voce poderia me responder creio que uma ultima questao, 
se nao tudo bem.
Veja por favor se entendi corretamente :

Acrescento todos os campos ( ou apenas as chaves primarias ) tambem no 
SQLDatSet e faco as definicoes lá, excluo os do ClientDataSet e depois os 
adiciona para efeito de atualizacao mas continuo com os componentes DBWare 
( DBGrid, DBEdit ) ligados aos Fields do ClientDataSet, correto ? Pergunto 
isso pois é dito aos quatro cantos ( livros, materias diversas ) que os 
fields do ClientDataSet é que devem ser manipulados por questoes como tabela 
em memoria, e bidirecionalidade.

Saindo um pouco do foco acima mas relacionado, na Internet achei o seguinte 
código :

No evento OnCreate do DataModule é declarada uma variavel, no exemplo abaixo 
TD como sendo uma classe do tipo TtransactionDesc
Depois é definido em algum ponto
TD.TransactionId := 1;
TD.IsolationLevel := xilReadCommited;

Continua a se usar por exemplo :

ClienteDataSet.Close;
SQLDataSet.CommandText := 'Select * from Tabele where chave =:chave';
ClienteDataSet.FecthParams;
ClienteDataSet.Open;

e no momento de gravar o que foi feito se usa :

SqlConnection.StartTransaction(TD);
ClienteDataSet.ApplyUpdates(0);
SqlConnection.Commit(TD);


Seria essa a forma de trabalhar com transacao mantendo-se o trio SQLDataSet 
+ DataSetProvider + ClientDataSet ? Fico um pouco no ar pois usava IBX e 
nele havia um componente IBTransaction e a coisa era mais as claras. Já vi 
outros códigos onde havendo a necessidade de transação usam apenas o 
SQLDataSet

Poderia comentar por favor.


----- Original Message ----- 
From: "Pha-Lista" <lista em pha.com.br>
To: "Antonio Carlos" <a.lima.silva em terra.com.br>
Sent: Monday, June 20, 2005 3:48 PM
Subject: Re: Por favor estou ficando maluco com o dbexpress :o(


> Flags que devem ser definidor no TSQLDataSet, no ClientDataSet nao e 
> necessario.
>
> 1) Campos chaves:
>
>   ProviderFlags[pfInUpdate,pfInWhere,pfInKey])
>
>
> 2) Campos que serao atualizados:
>
>   ProviderFlags[pfInUpdate,pfInWhere])
>
>
> 3) Campos que nao seram atualizados, mais que farao parte do 
> RefreshRecord:
>
>   ProviderFlags[pfInWhere])
>
>
> 4) Campos que nao seram atualizados, e pertecam a outra tabela:
>
>   ProviderFlags[])
>
> Uso dessa forma e funciona perfeitamente.
>
> Tente remover os campos do TClientDataSet e adiciona-los novamente.
>
>> Qual é o procedimento correto ? eu poderia usar upWhereChanged ? ou seja
>> atualizar apenas os modificados em vez de upWhereKeyOnly?
>
> A propriedade UpdateMode, defini como sera gerado o where para Edit e 
> Delete, e nao os campos que serao atualizado.
>
> Voce pode utilizar qualquer um dos 3 metodos, desde que o criterio de 
> pesquisa encontre o registro, voce pode usar o Metodo RefreshRecord (antes 
> do Edit ou Delete) para fazer com que os campos do Cliente estejam 
> atualizados com os campos do Servidor.
>
> upWhereAll: o where sera montado com todos os campos que tenha pfInWhere 
> no ProviderFlags.
>
> upWhereChanged: o where sera montado com todos os campos que tenha pfInkey 
> no ProviderFlags mais os campos alterados.
>
> upWhereKeyOnly: o where sera montado com todos os campos que tenha pfInkey 
> no ProviderFlags,
>
> Observacao:
>
> Nao esqueca de atualizar o D7.
>
> Nos paramtros do where serão utizados os OldValue dos campos do cliente.
>
> Isso nao tem nada haver com o DBExpress e sim com o TDataSetProvider que 
> funciona assim, nao importa o componente de acesso.
>
> Estou usando o Delphi 6.
>
> PHA
> Nova Odessa / SP - Brazil
>
> -----Mensagem original-----
> From: "Antonio Carlos" a.lima.silva em terra.com.br
> Date: Mon, 20 Jun 2005 16:18:01 -0300
> To: "Pha-Listas" lista em pha.com.br
> Subject: Por favor estou ficando maluco com o dbexpress :o(
>
>> Preciso de um help por favor
>>
>> Estou usando Delphi 7 + DBx ( SQLDataSet + DataSetProvider + 
>> ClientDataSet )
>> + Firebird
>> e estou abrindo o data set assim
>>
>> ClienteDataSet.Close;
>> SQLDataSet.CommandText := 'Select * from Tabele where chave =:chave';
>> ClienteDataSet.FecthParams;
>> ClienteDataSet.Open;
>>
>>
>> Vou no FieldsEditor do ClientDataSet e adiciono todos os campos da tabela 
>> e
>> seleciono tudo e coloco no provider flags de todos os campos que nao é 
>> chave
>> primaria
>>
>> ProviderFlags[] ( False para Update,Where,Key ) e Required = false
>>
>> e nos campos que sao chave primaria
>>
>> ProviderFlags True para  para Update,Where,Key e Required = True
>>
>> e coloco no DataSetProvider em UpdateMode = upWhereKeyOnly
>>
>> mas esta dando erro direto ao tentar inserir: Unable to find record no 
>> key
>> especified
>>
>> Me falaram que eu tenho que especificar no SQLDataSet, ai acrescentei os
>> campos que sao chave primaria e no
>>
>> ProviderFlags True para  para Update,Where,Key e Required = True e ai 
>> fica
>> pior
>> ao abrir o data set fica informando No argument for format  %s
>>
>> Qual é o procedimento correto ? eu poderia usar upWhereChanged ? ou seja
>> atualizar apenas os modificados em vez de upWhereKeyOnly?
>>
>> Obrigado pela luz.
>>
>> Antonio Carlos
>>
>>
>>
>>
>
>
> 






Mais detalhes sobre a lista de discussão lista