Fórum Ao criar instancia de um ClientDataset não vem os Fields ??? #340664

19/04/2007

0

Oi, eu gostaria de saber como faço para criar uma instância de um ClientDataSet que já tenha Fields e estes persistam na instância, exemplo:

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

Ibotirama

Responder

Posts

20/04/2007

Adriano Santos

Oi, eu gostaria de saber como faço para criar uma instância de um ClientDataSet que já tenha Fields e estes persistam na instância, exemplo: 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 ?

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;



Responder

Gostei + 0

20/04/2007

Ibotirama

Ok, mas o negócio é o seguinte, quanto a isso não tem problema, o meu problema é o seguinte, quando eu clono ou crio uma instância do ClientDataSet que foi definido em tempo de projeto os Fields perdem as propriedades como DisplayLabel, etc.

como eu faço pra que isso não ocorra ?


Responder

Gostei + 0

20/04/2007

Marco Salles

Ok, mas o negócio é o seguinte, quanto a isso não tem problema, o meu problema é o seguinte, quando eu clono ou crio uma instância do ClientDataSet que foi definido em[b:57c4a51a84] tempo de projeto os Fields perdem as propriedades como DisplayLabel[/b:57c4a51a84], etc. como eu faço pra que isso não ocorra ?


[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


Responder

Gostei + 0

20/04/2007

Ibotirama

Veja em tempo de projeto eu coloco lá as definições certo.

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 ?


Responder

Gostei + 0

20/04/2007

Marco Salles

Veja em tempo de projeto eu coloco lá as definições certo. 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 ?


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
var umClone:TclientDataSet; begin umClone:=TclientDataSet.Create(nil) umClone.CloneCursor(SeuClientDataSet,true,true); DataSorce2.Dataset:=umClone; end;


[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ê :?: :?: :?:


Responder

Gostei + 0

20/04/2007

Ibotirama

Seguinte descobri o que está acontecendo :

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]


Responder

Gostei + 0

20/04/2007

Adriano Santos

Seguinte descobri o que está acontecendo : 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]


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


Responder

Gostei + 0

20/04/2007

Marco Salles

sinceramente eu nen imaginei que este clientdataset estava associado usando a tecnologia dbexpress... Acho que é porque eu estou tão envolvido numa aplicação mybase que nen me passou pela idéia

Mexi um pouco aqui e descobri que tb dá pra fazer assim Código: procedure TForm1.Button2Click(Sender: TObject); var umClone:TClientDataSet; begin ClientDataSet1.Open; umClone:= TClientDataSet.Create(Nil); umClone.Data := ClientDataSet1.Data; umClone.Open; end;


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...


Responder

Gostei + 0

20/04/2007

Adriano Santos

[quote:90a58d175b=´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...[/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


Responder

Gostei + 0

21/04/2007

Marco Salles

eitaaaa..... :lol: :lol:

[b:17d35efc4f]marco saales citou[/b:17d35efc4f]
As vezes voce quer fazer uma Pesquisa , percorrer os registros do ClientDataSet, e usando o Data , voce desloca os registros do Outro ClientDataSet simultaneamente...



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 ..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar