Fórum Ao criar instancia de um ClientDataset não vem os Fields ??? #340664
19/04/2007
0
Tenho um ClientDataset: cdsPacientes e neles tem os seguintes fields:
cdsPacientesPAC_CODIGO cujo DisplayText é ´Código´ entre outras configurações;
cdsPacientesPAC_NOME cujo DisplayText é ´Nome´.
ao fazer o seguinte :
cdsNovoPaciente:= cdsPacientes.Create(Self);
o cdsNovoPaciente perde os displaytexts assim como os outros atributos, o mesmo acontece quando tento fazer um clone, alguém poderia me ajudar a solucionar este problema ?
Ibotirama
Curtir tópico
+ 0Posts
20/04/2007
Adriano Santos
Não colega, a forma que vc quer usar (TabelaCAMPO) só é possível porque vc adiciona os campos em tempo de projeto, ou seja, tipifica os campos.
Em runtime use FieldByName
cdsPacientes.FieldByName(´PAC_CODIGO´).AsTipo; cdsPacientes.FieldByName(´PAC_NOME´).AsTipo;
Gostei + 0
20/04/2007
Ibotirama
como eu faço pra que isso não ocorra ?
Gostei + 0
20/04/2007
Marco Salles
[u:57c4a51a84]em tempo de projeto[/u:57c4a51a84] ???? voce tem certeza disso :?: :?:
Como o adriano colocou :
em tempo de projeto estas alteraçoes estão persistidas .. Nun entendo , porque isto esta occorrendo com voce
Gostei + 0
20/04/2007
Ibotirama
depois em tempo de execução eu tento clonar ou criar uma instânica do objeto (definido em tempo de projeto) e este (em tempo de execução) não vem com os DisplayLabels dos fields do mesmo jeito que estão em tempo de projeto.
Entendeu ?
Gostei + 0
20/04/2007
Marco Salles
entender eu entendi..... So estou achando muito estranho isto esta ocorrendo , porque os Tfields estão persistidos ... Deveria vir sim com as propriedades alteradas
Saia deste projeto e faça um outro teste simples
Coloque um Tclientdataset Dois DataSorce e dois dbgrid
Defina os campos para o ClintDtaset
de um CreateDataSet
Mude as propriedades a Gosto
Coloque no novo projeto
[b:670c3d08ed]Ao executar este método aparecerá no DbGrid2 as Propreidades Alteradas pelo SeuClientDataSet[/b:670c3d08ed]
Não é isso que esta ocorrendo com Você :?: :?: :?:
Gostei + 0
20/04/2007
Ibotirama
1 - a propriedade Options - > poIncFieldProps tem que estar true.
2 - as propriedades vem do SQLDataSet ligado ao Provider e não diretamente do ClientDataSet que está sendo clonado ou seja:
tenho um SQLDataSet dstPacientes, um DataSetProvider dspPacientes e um ClientDataSet cdsPacientes. caso eu faça
var umClone:TclientDataSet; begin umClone:=TclientDataSet.Create(nil) umClone.CloneCursor(cdsPacientes, true, true); DataSorce2.Dataset:=umClone; end;
as propriedades como DisplayLabel viram de dstPacientes e não de cdsPacientes.[/code]
Gostei + 0
20/04/2007
Adriano Santos
var umClone:TclientDataSet; begin umClone:=TclientDataSet.Create(nil) umClone.CloneCursor(cdsPacientes, true, true); DataSorce2.Dataset:=umClone; end;
Ixi, ainda bem que descobriu pq eu já ia responder:
[b:0738a751a4]Ixi Marco não funfou...rsrsr.[/b:0738a751a4]
Mexi um pouco aqui e descobri que tb dá pra fazer assim
procedure TForm1.Button2Click(Sender: TObject); var umClone:TClientDataSet; begin ClientDataSet1.Open; umClone:= TClientDataSet.Create(Nil); umClone.Data := ClientDataSet1.Data; umClone.Open; end;
Porém com a propriedade Options > poIncFieldProps ativa ele traz as propriedades do SqlDataSet e com ela falsa traz do ClientDataSet. Bem loko isso hein?
vlw
Gostei + 0
20/04/2007
Marco Salles
esta maneira Adriano , nun acho legal . Voce fica com o mesmo Ponteiro
As vezes voce quer fazer uma Pesquisa , percorrer os registros do ClientDataSet, e usando o Data , voce desloca os registros do Outro ClientDataSet simultaneamente...
Gostei + 0
20/04/2007
Adriano Santos
esta maneira Adriano , nun acho legal . Voce fica com o mesmo Ponteiro
As vezes voce quer fazer uma Pesquisa , percorrer os registros do ClientDataSet, e usando o Data , voce desloca os registros do Outro ClientDataSet simultaneamente...[/quote:90a58d175b]
Perai véio, tah me dizendo que se eu fizer uma pesquisa qualquer usando um locate, findfirst ou seja lá o que, no primeiro ClientDataSet o segundo é deslocado tb? Acho que não hein véio. Porque ambos vão trabalhar idenpendente. Acabei de fazer um teste e tudo certo. Não consegui visualizar isso. Coloquei na minha area de ftp o exemplo, talvez eu esteja fazendo algo diferente.
Uso isso em n-tier. O engraçado que posso até fechar o clientdataset1 que tudo está normal.
Vlw.
http://www.doiscliques.com/pub/teste-clone.zip
Gostei + 0
21/04/2007
Marco Salles
[b:17d35efc4f]marco saales citou[/b:17d35efc4f]
veja , vamos supor que voce esteja numa situação de inserção de algum produto.. Existem infinitas situaçoes e razões , para [u:17d35efc4f][b:17d35efc4f]não permitir [/b:17d35efc4f][/u:17d35efc4f], produtos com códigos identicos.. Entre várias soluçoes < esqueça um Pouco a estrutura de banco de dados e nos apeguemos ao nosso ClientDataset > uma solução é apresentada abaixo:
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet); var CdsData:TClientdataset; begin try //cria cdsData:=TclientDataSet.Create(nil); //copia cdsData.Data:=clientDataset1.Data; //efetua busca if cdsData.Locate(´Id_empresa´,dataset.FieldByName (´Id_empresa´).AsString,[]) Then //se achou gera exceção raise exception.Create(´Exi maria´); finally //destroe cdsData.Free;end;
o codigo acima , usa a Propriedade [b:17d35efc4f]Data[/b:17d35efc4f] ...Olhando a estrutura acima , daríamos certo que o codigo implementa o esperado :arrow: Que é impedir o cadastramento de dois produtos com codigos Iguais...
:cry: :cry:
O unico e fatal problema é que o Cursor do cdsData não é independente do ClintDataSet1..[u:17d35efc4f][color=red:17d35efc4f][b:17d35efc4f] Isto cria uma situaçõ de Loop Infinito[/b:17d35efc4f][/color:17d35efc4f][/u:17d35efc4f]
Apos criado este CdsData , posso ate concordar pelos teste que voce fez ,que se tem dois cursores independentes.. Porém no exato momento
da atribuição de
cdsData.Data:=clientDataset1.Data; [u:17d35efc4f]o cursor não são idependentes[/u:17d35efc4f]
:arrow:
Porém , voce poderia escrever o codigo anterior usando o CloneCursor que não teria nenhum Problema ..
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)