Não entendi, a idéia não é essa mesma, para cada registro do pai carregar os filhos automaticamente.
Exemplifica o que vc constatou. O que ele tava executando desnecessariamente. Em 22 de julho de 2010 22:09, Eny Urias <[email protected]> escreveu: > > > 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) <[email protected] <wchagasj%40bol.com.br>> > > Para: [email protected] <delphi-br%40yahoogrupos.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 > [email protected] <wchagasj%40bol.com.br> > http://delphitocorporerm.blogspot.com/ > http://twitter.com/wchagas > MSN: [email protected] <whitesockets%40hotmail.com> > SKYPE: WalterChagasJr > > ----- Original Message ----- > From: Marcio > To: [email protected] <delphi-br%40yahoogrupos.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] > > > [As partes desta mensagem que não continham texto foram removidas] ------------------------------------ -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> <*> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages <*> Para falar com o moderador, envie um e-mail para: [email protected] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [email protected] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html

