Trabalhando com ClientDataSet

Delphi

03/10/2005

:?: Olá a todos.
1.) A dúvida é quando ativar/desativar o CLIENTEDATASET E SQLDATASET???
Estou começando a usar FireBird/Delphi 7, nos campos do form de cadastro
uso edit´s.
Em meu sistema estou usando SQLCONNECTION, SQLDATASET,
DATESETPROVIDER, CLIENTDATASET E DATASOURCE, todos devidamente ligados
um ao outro.
No CommandText do SQLCONNECTION está SELECT * FROM BANCOS (EXEMPLO).
Para permitir o reaproveitamento de códigos criei as seguintes
variáveis públicas no form principal:
V_SQLCNCTN : TSQLCONNECTION;
V_SQLDTST : TSQLDATASET;
V_CLIDTST : TCLIENTDATASET;
V_DTSOURCE : TDATASOURCE;
Ao Criar o formulario principal (Menu Principal), faço:
V_SQLCONCTN := DM.SQLCNCTNBASE;
V_SQLCNCTN.OPEN;// ATIVAR A CONEXÃO.
Quando seleciono o programa desejado Exemplo Cadastro de Bancos,
no FormCrete do form selecionado faço:
V_SQLDTST := DM.SQLDTSTBancos;//
V_CLIDTST := DM.CLIDTSTBANCOS;
V_DTSOURCE := DM.DSBANCOS;
No FormActivate faço:
V_CLIDTST.ACTIVE := true;// Ativo o ClientDataSet
e não ativo o SQLDATASET, só ativo o SQLDATASET quando faço
uma pesquida de registros usando where com parametro e desativo
quando é pressionado o botão Gravar, permanecendo
o CLIENTDATASET ativado.
Gostaria de saber se assim é o correto de trabalhar com
Banco de Dados, ou como é o correto???

2.) Todo novo registro que incluo na tabela é gravado dois
registros iguais, uso a seguinte estrutura no botão Gravar Inclusão:

If M_TipoOperacao = 1 then // inclusão
begin
// define a transacao chamada TrV
TrV.TransactionID := 1;
TrV.IsolationLevel := xilReadCommitted;
// Ativa a transação
V_SqlCnctn.StartTransaction(TrV);
Try
With V_SqlDtSt do
begin
Active := False;
Close;
CommandText := ´Insert Into Bancos (Bnc_Cod, Bnc_Numero, Bnc_Descricao, Bnc_Fantasia) Values (:Codigo, :Nro, :Descr, :Apelido)´;
Parambyname(´Codigo´).AsString := EdtCodigo.Text;
Parambyname(´Nro´).AsString := EdtNumero.Text;
Parambyname(´Descr´).AsString := EdtDescricao.Text;
Parambyname(´Apelido´).AsString := EdtFantasia.Text;
ExecSql;
end;

V_CliDtSt.ApplyUpdates(-1);
V_SqlCnctn.Commit(TrV);
V_SqlDtSt.Active := false

Ini_Bancos;// Limpa edit´s

except
V_SqlCnctn.Rollback(TrV);
end;
end;

3.) Nas consultas de registros da tabela o sistema não respeita o parametro e também não
ordena conforme a instrução order By, trazendo sempre todo comteúdo da tabela
o código é o seguinte:

V_SqlQuery := ´SELECT A.BNC_COD, A.BNC_NUMERO, A.BNC_DESCRICAO, A.BNC_FANTASIA FROM BANCOS A ´;
V_SqlWhere := ´Where Upper(A.Bnc_Fantasia) Like :Consulta ´;
V_OrderBy := ´Order By Bnc_Fantasia Asc´;

DBGrid1.DataSource := V_DtSource;

V_SqlDtSt.Close;
V_SqlDtSt.CommandText := V_SqlQuery + V_SqlWhere + V_OrderBy;
V_SqlDtSt.Parambyname(´Consulta´).Value := EdtPesquisa.Text + ´¬´;
V_SqlDtSt.Open;

4.) Toda vez que faço uma consulta na tabela usando o código acima descrito
o sistema retorna a tabela toda, e quando desejo fazer novamente uma
nova consulta seja por codigo ou descrição o sistema da o seguinte erro:
Aritmetic excepton, numeric overflow, or string trucation, depois mostra também
CliDtStBancos: Cannot perform this operation on a closed dataset.
Bem como podem observar estou com muitos problemas e gostaria de ajuda...
Obrigado a todos
Neto


Neto

Neto

Curtidas 0

Respostas

Neto

Neto

03/10/2005

Alguem colabora com uma dica????
Eu tenho que obrigatoriamente adicionar os campos
no Fields Editor???


GOSTEI 0
Vinicius2k

Vinicius2k

03/10/2005

Colega,

1. Quando vc trabalha com ClientDataSet (CDS) vc só precisa abrir e fechar o CDS. Não há necessidade fazer nada com o DataSet (SQLDataSet), a não ser passar os parametros.
Simplesmente faça:
ClientDataSet1.Close;
SQLDataSet1.ParamByName(´parametro´).AsTipo := valor;
ClientDataSet1.Open;

Isto porque a Midas (camada composta pelo TDataSetProvider e TClientDataSet) irá se encarregar de todo o processo, desde a transação até o fetch dos registros. Ela irá abrir a transação, abrir o DataSet, efetuar o fetch dos registros para o lado do cliente, armazenar no buffer do CDS, fechar o SQLDataSet e fechar a transação. Tudo automático, sem necessidade explícita de sua interferência.

2. Vc precisa escolher apenas um dos dois métodos que vc está usando:
Utilizando o CDS, vc não precisa fazer nenhuma operação via SQL no BD. Os registros incluídos, editados ou excluídos no buffer do CDS serão repassados ao BD no momento do ´ApplyUpdates´.
Por isto seus registros estão duplicados: vc insere no CDS, posta, insere manualmente no BD (através de SQL) e aplica os updates do CDS para o BD.
Ou vc faz ´no braço´ com SQL, parametros, controle explícito da transação* e sem controles DB-Aware (DBEdits e etc) ou utiliza o CDS e os controles DB-Aware.
* No caso das transações é possível (e recomendável em muitos casos) manter o controle manual. Vide este tópico: http://forum.clubedelphi.net/viewtopic.php?t=58547

3. Como eu disse, passe os parametros para o SQLDataSet mas abra e feche o ClientDataSet. O CDS tem um buffer, um cache dos registros. Abrir e fechar o SQLDataSet não influencia no buffer do CDS. Fazer o open/close em ambos é carga desnecessária, pois no momento do Open do CDS, a instrução SQL do SQLDataSet será re-executada. Não importa que vc tenha-o aberto antes... ele será fechado pelo Provider e executará a query novamente.
O que vc está vendo no CDS é um buffer antes da informação dos parametros, por isso vc não vê o que realmente foi retornado na query executada diretamente no SQLDataSet.

4. Ajuste suas rotinas com as considerações que fiz nas 3 primeiras questões e este último problema deve desaparecer. Ele só deve estar existindo em virtude da pequena confusão sobre quando e onde executar o que.

5. Se vc utilizar controles DB-Aware, sim, vc precisa dos TFields para manipular os dados e a forma mais prática é adicioná-los de forma persistente no FieldsEditor, caso contrário, terá que criá-los manualmente via código.

O que está lhe faltando é entender o funcionamento da Midas. A Midas pode ser utilizada com qualquer camada de acesso, não só o dbExpress. O resultado e a forma de desenvolver é a mesma até o DataSet, o que torna fácil a migração de aplicações entre camadas de acesso.
O ´porém´, é que com dbExpress, se vc quiser um DataSet navegável é obrigado a utilizar a Midas pq o dbExpress é unidirecional.

T+


GOSTEI 0
Neto

Neto

03/10/2005

Muito obrigado Vinicius2K.
Vou fazer conforme suas orientações
Abraços.
Neto


GOSTEI 0
POSTAR