Fórum Campo no ClientDataSet #375229
24/09/2009
0
1) Tenho um sistema com firebird 2.1 e dbexpress com delphi 7 usando a dbexpUIBfire15.dll
2) Em um data module de cadastro tenho o sqlconnection, um datasetprovider e um sqldataset que são genéricos
3) Ligo o datasetprovider no sqldataset e o sqldataset no sqlconnection o ClientDataSet de cadastro ligo no datasetprovider e até ai tudo bem
4) Passo o sql do ClientDataSet de cadastro para o sqldataset: select id, descricao, dtcad from produtos where id =:id e com isso o ClientDataSet
de cadastro recebe este sql e os campos são chamados e até ai tudo bem
5) Eu chamo o sql do cadastro no momento da inserção:
sqldataset.close;
sqldataset.commandtext := ´select id, descricao, dtcad from produtos where id =:id´;
if not(ClientDataSet.active) then
begin
ClientDataSet.close;
ClientDataSet.active := True;
end;
ClientDataSet.append;
e até ai tudo bem
6) Na gravação eu uso:
ClientDataSetdescricao.asstring := dbedtdescricao.text;
ClientDataSetdtcad.asdatetime := Now;
ClientDataSet.Post;
ClientDataSet.applyupdates(0);
e até ai tudo bem
7) Agora se eu deletar por exemplo o field dtcad do ClientDataSet e mandar gravar da seguinte maneira:
ClientDataSetdescricao.asstring := dbedtdescricao.text;
ClientDataSet.fieldbyname(´dtcad´).asdatetime := Now; ==> AQUI APARECE O ERRO
ClientDataSet.Post;
ClientDataSet.applyupdates(0);
Aparece a mensagem de erro dizendo: ´field dtcad not found´
O campo dtcad esta no ClientDataSet porque foi recebido no sql acima. Usei o showmessage(ClientDataSet.commandtext) e
apareceu : ´select id, descricao, dtcad from produtos where id =:id´ ou seja, o campo esta lá no ClientDataSet.
8) Minha pergunta é: onde esta o erro?
Obrigado.
Developer1978
Curtir tópico
+ 0Posts
24/09/2009
Afarias
Vc ´deleta´ o campo DTCad e depois tenta usar o campo ´deletado´, dai recebe a mensagem ´campo DTCad não encontrado´
Me parece claro onde está o erro.
T+
Gostei + 0
24/09/2009
Developer1978
Vc ´deleta´ o campo DTCad e depois tenta usar o campo ´deletado´, dai recebe a mensagem ´campo DTCad não encontrado´
Me parece claro onde está o erro.
O field foi deletado do fields editor do ClientDataSet mas permanece no sql do ClientDataSet ´select id, descricao, DTCAD from produtos where id =:id´;
Quero usar o field do sql através do fieldbyname e não do fields editor.
T+[/quote:ab4858a0f5]
Gostei + 0
24/09/2009
Afarias
Bom, vamos ver...
O ´campo do sql´ faz parte do comando q será tratado pelo banco de dados e retornará algo... ele faz sentido apenas para o BANCO...
Os TFields são objetos que representam os ´campos´ ... as propriedades/métodos FieldByName, Fields, FindField, etc só ´entendem´ esse conjunto de TFields...
Não sei se está claro mas... vc TEM Q TER o TField (seja ele criado em tempo de projeto ou em tempo de execução)
T+
Gostei + 0
24/09/2009
Osocram
Principalmente essa parte que vc deleta o Field
O que não faz muito sentido se isso for em tempo de execução.
Gostei + 0
24/09/2009
Developer1978
Fiz um teste no meu trabalho com Tquery no lugar do sqldataset e não chamei nenhum field no fields editor e funcionou só que eu deixei a propriedade store defs do clientdataset para true e em casa deixei como false, pode ser que seja isso. Agora grava todos os campos apenas recebendo por fieldbyname:
clientdataset.fieldbyname(´descricao´).asstring := dbedtdescricao.text;
clientdataset.fieldbyname(´dtcad´).asdatetime := now;
Tá perfeito, e com isso diminuiu o tamanho do executável o que é ainda melhor!
Quando chegar em casa eu testo e falo para voces.
Gostei + 0
24/09/2009
Afarias
|chamei nenhum field no fields editor e funcionou
Quando vc não cria (define) *nenhum* TField em Design-Time (ou mesmo manualmente em Run-Time) -- é uma funcionalidade comum para maioria dos DataSets criar automaticamente os TFields quando vc ABRE o DataSet.
Isso depende do DataSet e, as vezes, de alguma propriedade como é o caso da propriedade StoreDefs q define se o q está definido (para campos e indices) em Design-Time é salvo ou não.
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)