Só para deixar registrado:

Eu usei por muito tempo esse esquema do DATASETFIELD para utilizar em 
Master/Detail... Até que um dia, utilizando a ferramenta OraTracer para pegar 
um 
comando sql do Oracle eu pude perceber que ao utilizar essa técnica, quando o 
CDS carrega os registros do Master, ele tras também, para cada registro pai, 
todos os registros do filho... Fiquei abismada com o tráfego que isso causa na 
rede...  Quando o DBA da empresa viu disse para nunca mais utilizar dessa 
forma...

Agora eu abro o CDS filho utilizando o mesmo parametro mas no evento 
AfterScroll 
do CDS pai... 


Alguém já fez essa verificação com outros bancos?

--
Eny Trova Urias

"Somos o que repetitivamente fazemos, portanto, a excelência não é um feito, 
mas 
um hábito"- Aristóteles





________________________________
De: Walter Chagas (Bol) <wchag...@bol.com.br>
Para: delphi-br@yahoogrupos.com.br
Enviadas: Quinta-feira, 22 de Julho de 2010 14:58:28
Assunto: Re: [delphi-br] [CLIENTDATASET 3 TABELAS]

  
Marcio,

Este passo-a-passo meu já é bem conhecido aqui na lista. Ve se te atende:

1) TODAS AS TABELAS ENVOLVIDAS NESTE PROCESSO TEM QUE TER CHAVE PRIMÁRIA E 
ESTRANGEIRA, DO CONTRARIO ISTO DAÍ NÃO VAI FUNCIONAR 100% ESTÁVEL. 

2) Coloque um componente TADOConnection no seu DataModule e defina as 
configurações devidas nele. 

3) Coloque um compoente TQuery no Datamodule ou então um TSQLDataSet. Vamos 
Chamá-lo de qMaster, ou sqldMaster. 

4) Coloque na propriedade SQL do qMaster, ou então na propriedade 
CommandText do sqldMaster a sentença SQL que você deseja buscar como dados 
da Tabela Master. 

5) Dê um clique duplo na qMaster. Aparecerá o FieldsEditor. Manda adicionar 
todo mundo. 

6) Em cada TField, localize a propriedade providerflags. Os campos que são 
chave primária na Tabela, ficaraão com pfInkey true nos, os demais ficou 
false. Os pfInUpdate e pfInWhere todos ficam como true (em todos os campos). 

7) Sete a propriedade CursorLocation da qMaster ou do sqldMaster pra 
"clUseServer" 

8) Se a sentença SQL da qMaster tiver parametros, ajuste as configurações 
dele, na propriedade "Parameters" (A não configuração do parametro irá dar 
pau nos ClientDatasets posteriormente) 

9) Coloque um componente TDatasetProvider no Datamodule. vamos chamá-lo de 
dspMaster. 

10) Aponte o Dataset dele pra qMaster ou pro sqldMaster. 

11) Abra a propriedade Options do dspMaster. Todas as subpropriedades dele 
devem ficar como false, exceto as poCascadeDeletes, poCascadeUpdates, 
poAutoRefresh. Estas tres deverão ficar setadas como True. 

12) Mude a propriedade, no dspMaster, UpdateMode para "upWhereKeyOnly" 

13) Coloque no seu Datamodule um componente TClientDataset. Vamos chamalo de 
cdsMaster. 

14) Aponte o Provider dele pra dspMaster. 

15) Ative o cdsMaster, mudando a propreiedade Active dele para True. Dê um 
clique duplo na cdsMaster. Aparecerá o FieldsEditor. Manda adicionar todo 
mundo. 

16) Repita o passo 6. Mas agora, você pode formatar os campos. Na 
propriedade DisplayLabel, coloque um nome mais legível ao usuário. Na 
propriedade Displayformat, você pode formatar valores monetários e de data 
para serem exibidos. Na propriedade EditFormat voce pode formatar estes 
valores para serem editados no cadastro. A propriedade Visible do TField, 
permite você ocultar este campo nos DBwares. 

17) Coloque no seu DataModule, um componente TDataSource. Vamos chama-lo de 
dsMaster. 

18) Aponte o Dataset dele para o cdsMaster. 
Seu Módulo Master está pronto. 
Agora vamos linkar ele ao Modulo detail. 

1) Coloque no seu DataModule, um componente TDataSource. Vamos chama-lo de 
dsMasterDetail. 

2) Aponte o Dataset dele para o dsMaster. 

3)Coloque um compoente TQuery no Datamodule ou então um TSQLDataSet. Vamos 
Chamá-lo de qDetail, ou sqldDetail. 

4) Coloque na propriedade SQL do qMaster, ou então na propriedade 
CommandText do sqldMaster a sentença SQL que você deseja buscar como dados 
da Tabela Detail, com o detalhe de que o parametro de referência na tabela 
detail, deve ter OBRIGATÓRIAMENTE o nome exato do campo chave na tabela 
master. Veja o exemplo: 
Na tabela master queremos buscar todas as MM (movimentação de material) de 
um determinado amoxarifado: 

select IDMOV, CODTMV, SERIE, NUMEROMOV, DATAEMISSAO, DATAENTREGA, 
COMPETENCIA, CODFILIAL, CODPESSOA, CODLOCALIDADE, 
CODOSATIV, CODCONTRATO, CODLOC, CODFILIALDEST, CODLOCDEST, STATUS, 
OBSERVACAO, USRCRIACAO, DATACRIACAO, USRALTERACAO, 
DATAALTERACAO, DATAEXPORTACAO, NOMEARQEXPORT, CODCCUSTO, CODDEPTO, CODAREA 
from ZMMTMOV 
Na tabela detail, queremos buscar todos os itens da MM (movimentação de 
material) de um determinado registro master: 
select IDMOV, NSEQITMMOV, IDPRD, QUANTIDADE, CODUND, LOTE, ROLO, PATRIMONIO 
from ZMMTITMMOV where IDMOV = :IDMOV 
ATENTE PARA O PARÂMETRO IDMOV. ELE É O MESMO NOME DO CAMPO MASTER IDMOV. 

5) repita os passos 5 e 6 da geração da query master (referentes ao Tfieds). 

6) Sete a propriedade CursorLocation da qDetail ou do sqldDetail pra 
"clUseClient" 

8) Repita o passo 8 da geração da query master (referentes ao parametro). 

9) Aponte o Datasource de qDetail para o dsMasterDetail. 

11) Repita o passo 15 do cdsMaster, só que agora, ao você mandar adicionar 
os TFields, irá aparecer um novo campo. Este campo é um DATASETFIELD é o elo 
de comunicação entre o seu master e o detail e deverá ter o nome qDetail. 

12) No cdsDetail, aponte o seu Datasetfield para qDetail. 

15) Repita o passo 16 do cdsMaster para o cdsDetail. Mesma coisa. 
Está pronta a sua tão sonhada conexão MD. 
Você pode criar ainda Details que sejam detail deste ultimo Detail que 
criamos agora. Para fazer isto, basta fazer o seguinte: 

1) Coloque no seu DataModule, um componente TDataSource. Vamos chama-lo de 
dsDetailDetail. 

2) Aponte o Dataset dele para o dsDetail. 
O resto dos procedimentos, você pode seguir os passos da criação do CDS e do 
Datasource. A unica diferença é que pra este novo caso (Detail de um Detail 
mestre), não é necessário um novo DatasourceProvider. 
E assim você pode fazer relacionamento MD em cascata ou em arvore mesmo. Só 
tome o cuidado pra não fazer bagunça e depois a coisa ficar inviável pra dar 
manutenção. 

Para fazer uma inclusão ou uma edição em um relacionamento MD: você deve dar 
insert/Edit em todos os Datasets. Para dar o post, dê post apenas nos 
details, NO MASTER PRINCIPAL SOMENTE DAR O APPLYUPDATES DIRETO. Não dê 
applyUpdates em algum detail. 

Para fazer uma exclusão em um relacionamento MD: você deve dar delete em 
todos os Datasets, SOMENTE NO MASTER DAR O APPLYUPDATES DEPOIS DO DELETE. 
Não dê applyUpdates em NENHUM detail. 

1) Sugestão de código para você dar um ApplyUpdates no Dataset: 

Deve ser colocado nos eventos: onAfterPost e onAfterDelete do ClientDataSet: 
if (DataSet as TClientDataSet).ApplyUpdates(0) <> 0 then 
raise EDataBaseError.Create(Exception(exceptobject).Message) 
else 
(DataSet as TClientDataSet).Refresh; 

2) Sugestão para abertura do ClientDataset ordenado: 
Deve ser colocado no evento onBeforeOpen do ClientDataSet: 
(DataSet as TClientDataSet).indexname := 'DEFAULT_ORDER'; 

3) Ativar o ReconcileError em todos os ClientDatasets do DataModule: 
Declare na cláusula Private do DM: 
procedure CdsReconcileError( 
(*$IFDEF VER150*) 
DataSet: TCustomClientDataSet; 
(*$ELSE*) 
DataSet: TClientDataSet; 
(*$ENDIF*) 
E: EReconcileError; UpdateKind: 
TUpdateKind; 
var Action: TReconcileAction); 
Em seguida, no Evento onCreate do DM, coloque o seguinte código: 
for i := 0 to ComponentCount-1 do 
begin 
if Components[i] is TClientDataSet then 
TClientDataSet(Components[i]).OnReconcileError := CdsReconcileError; 
end; 

4) Gerar o formulário de cadastro já pronto pra ser utilizado. 

1)Crie um novo form. 

2)Coloque um DBNavigator nele ou um outro componente de navegação na tabela. 

3)Dê um clique duplo no CDS referente aquele cadastro e deixe aberto o 
Fields Editor 

4)Minimize outras telas de forma a deixar o Fields Editor emparelhado com o 
form. Marque todos os TFields 

5) Arraste todos eles ou um a um para o form. Já será criado o Label com o 
DBEdit e o Datasource refernte aquele Dataset. 

[]s


Walter Alves Chagas Junior
Belo Horizonte - MG - Brazil
wchag...@bol.com.br
http://delphitocorporerm.blogspot.com/
http://twitter.com/wchagas
MSN: whitesock...@hotmail.com
SKYPE: WalterChagasJr

----- Original Message ----- 
From: Marcio 
To: delphi-br@yahoogrupos.com.br 
Sent: Wednesday, July 21, 2010 4:59 PM
Subject: [delphi-br] [CLIENTDATASET 3 TABELAS]

Olá para os entendidos ...

como é que se faz para usar ClientDataset com 3 tabelas no caso .

ex: (Respresentantes 1-N Clientes )

TAB_Representante x TAB_rep_cli x TAB_Cliente

supondo que eu esteja cadastrando o cliente, como faco para fazer a ligacao
com o representante ??

[As partes desta mensagem que não continham texto foram removidas]


 


      

[As partes desta mensagem que não continham texto foram removidas]

Responder a