Uma tabela mestre e duas/tres detalhes com DBExpress

Delphi

29/05/2009

Tem como utilizar uma tabela mestre e duas/tres detalhes com DBExpress? Se sim, como faço isso? Necessito disso tanto para inserção de dados com consultas. Se alguem tiver um pequeno exemplo de como se faz e que posso me enviar ficarei muito agradecido.

Obrigado e aguardo qualquer ajuda.

Abraço a todos.


Aprendiz_ce

Aprendiz_ce

Curtidas 0

Respostas

Marco Salles

Marco Salles

29/05/2009

Jeito tem... Mas como passar isto

A mágica é feita com DataSources e apenas um DataSetProvider
ligado Ao Mestre e ao comamando Sql ( Usar o memso Parametro)

Exemplo de ligação

SqlMestre -->> Propriedade SqlConnection -->> Ligar ao SqlConnection
SqlDetalheMestre -->> Propriedade SqlConnection -->> Ligar ao SqlConnection
SqlDetalhe -->> Propriedade SqlConnection -->> Ligar ao SqlConnection


(DataSource) *****NOTE UM SO DATASOURCE para Os Tres
DspMestre --->> Ligado ao SqlMestre

DsMestre --->>> Ligado no SqlMestre


SqlDetalheMestre --->>> Propriedade DaTaSorce Ligado ao DsMestre
DsDetalhe ---->>> Ligado ao SqlDetalheMestre

SqlDetalhe --->>> Propriedade Datasouce Ligado ao DsDetalhe

Todos os Sql com a mesmo parametro (commandText)

SqlMestre
Select * From Tabela Mestre Where Mes_Cod =:Mes_Cod

SqlDetalheMestre
Select * From Tabela MestreDetalhe Where Mes_Cod =:Mes_Cod

SqlDetalhe
Select * From Tabela Detalhe Where Mes_Cod =:Mes_Cod

As Tes tabelas tem o Mesmo Campo (Mes_Cod) ***Que se relacionam
na Base de Dados

Na tabela Mestre
Mes_Cod é Chave Primaria

Na Tabela MestreDetalhe
Mes_Cod é Chave estrangeira para a Tabela Mestre

Na Tabela Detalhe
Mes_Cod é chave estrangeira para a Tabela DetalheMestre


É claro que tem que configurar os parametros , e tb os Providers Flags

Para ver se esta priemeira Etapa esta legau é dar um Open en cada SqlDataSetProvider

Se tudo der certo o proximo passo sera carregar e configuarar os Cds.

CdsMestre
Propriedade DataSetProvider --->> Ligar ao DspMestre
(De Duplo Clik e Adicione-os Tfields
Deve Aparecer um Campo DataSetNested dst que representa a Tabela
DetalheMestre

cdsDetalheMestre
Ai esta a Dica
Propriedade DataSetProvider --->> Deixar em BRANCO
propriedade DataSetField -->> Ligar ao Dst ( o Tfield ´especial´ que apareceu no CdsMestre
Novamente : De Duplo Clik e Adicione-os Tfields
Deve Aparecer um Campo DataSetNested dst que representa a Tabela
Detalhe

cdsDetalhe
Ai esta a Dica Novamente
Propriedade DataSetProvider --->> Deixar em BRANCO
propriedade DataSetField -->> Ligar ao Dst ( o Tfield ´especial´ que apareceu no CdsDetalheMestre
Novamente : De Duplo Clik e Adicione-os Tfields
Aqui ja não deve aparecer nenhum Tfield Especial

Para que isto funcione é necessário deixar todos os SQLDATASET ABERTOS

Conclusão::: O Processo é repetitivo , não é deve ser feito com Atençaõ
cada passo tera conseqeuncias no proximo passo.
Boa sorte


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:5d0cfb990c=´Marco Salles´]Jeito tem... Mas como passar isto

A mágica é feita com DataSources e apenas um DataSetProvider
ligado Ao Mestre e ao comamando Sql ( Usar o memso Parametro)

Exemplo de ligação

SqlMestre -->> Propriedade SqlConnection -->> Ligar ao SqlConnection
SqlDetalheMestre -->> Propriedade SqlConnection -->> Ligar ao SqlConnection
SqlDetalhe -->> Propriedade SqlConnection -->> Ligar ao SqlConnection


(DataSource) *****NOTE UM SO DATASOURCE para Os Tres
DspMestre --->> Ligado ao SqlMestre

DsMestre --->>> Ligado no SqlMestre


SqlDetalheMestre --->>> Propriedade DaTaSorce Ligado ao DsMestre
DsDetalhe ---->>> Ligado ao SqlDetalheMestre

SqlDetalhe --->>> Propriedade Datasouce Ligado ao DsDetalhe

Todos os Sql com a mesmo parametro (commandText)

SqlMestre
Select * From Tabela Mestre Where Mes_Cod =:Mes_Cod

SqlDetalheMestre
Select * From Tabela MestreDetalhe Where Mes_Cod =:Mes_Cod

SqlDetalhe
Select * From Tabela Detalhe Where Mes_Cod =:Mes_Cod

As Tes tabelas tem o Mesmo Campo (Mes_Cod) ***Que se relacionam
na Base de Dados

Na tabela Mestre
Mes_Cod é Chave Primaria

Na Tabela MestreDetalhe
Mes_Cod é Chave estrangeira para a Tabela Mestre

Na Tabela Detalhe
Mes_Cod é chave estrangeira para a Tabela DetalheMestre


É claro que tem que configurar os parametros , e tb os Providers Flags

Para ver se esta priemeira Etapa esta legau é dar um Open en cada SqlDataSetProvider

Se tudo der certo o proximo passo sera carregar e configuarar os Cds.

CdsMestre
Propriedade DataSetProvider --->> Ligar ao DspMestre
(De Duplo Clik e Adicione-os Tfields
Deve Aparecer um Campo DataSetNested dst que representa a Tabela
DetalheMestre

cdsDetalheMestre
Ai esta a Dica
Propriedade DataSetProvider --->> Deixar em BRANCO
propriedade DataSetField -->> Ligar ao Dst ( o Tfield ´especial´ que apareceu no CdsMestre
Novamente : De Duplo Clik e Adicione-os Tfields
Deve Aparecer um Campo DataSetNested dst que representa a Tabela
Detalhe

cdsDetalhe
Ai esta a Dica Novamente
Propriedade DataSetProvider --->> Deixar em BRANCO
propriedade DataSetField -->> Ligar ao Dst ( o Tfield ´especial´ que apareceu no CdsDetalheMestre
Novamente : De Duplo Clik e Adicione-os Tfields
Aqui ja não deve aparecer nenhum Tfield Especial

Para que isto funcione é necessário deixar todos os SQLDATASET ABERTOS

Conclusão::: O Processo é repetitivo , não é deve ser feito com Atençaõ
cada passo tera conseqeuncias no proximo passo.
Boa sorte[/quote:5d0cfb990c]

Olá,

Confesso que fiquei meio confuso com o exemplo passado por você. Vou fazer um EXEMPLO na prática e vê se consigo entendê-lo melhor.

Outra coisa:

Esse exemplo tanto pode ser utilizado para consultar como inserir dados, né?

Muito obrigado pela sua atenção e qualquer coisa darei retorno.

Abraço.


GOSTEI 0
Marco Salles

Marco Salles

29/05/2009

Confesso que fiquei meio confuso com o exemplo passado por você. Vou fazer um EXEMPLO na prática e vê se consigo entendê-lo melhor.


é realmente... Pode ser que normalizai muito < este exemplo é o caso
de todas as tres tabelas se relacionarem com o mesmo codigo

Um exemplo é o caso de Tabela Clientes , Funcionarios e Fornecedore
que são pessoas fisicas ou Juridica que por sua ves são pessoas
Pq nada impede por exemplo um Funcionário ser Tb Cliente
O que ocorre com a maioria dos aplicativos é ter dois cadastro
Um endereço para Funcionario e Outro para o Funcionario Cliente
Porém esta reduntancia se resolve com Normalização e neste caso
usando a facilidade RAD do Delphi construimos o Relacionamento
Mestre Detalhe de modo bem simples

Mas Talvez vc queira um Exemplo menos normalizado ( com é o cado por
exempllo de :

Tabela Vendas --->> Tabela Clientes -->> Tabela Telefones dos clientes

Aonde
Tabela Vendas se relacina com Clientes
Tabela Clientes se relaciona com Telefones dos clientes

eu entendi errado sua duvida...

De qq Forma Monte primeiro a Tabela , defina os Relacionamentos e
pratique para ver as dificuldades.. A prática é nosso melhor aliado


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:9d10eeb859=´Marco Salles´]
Confesso que fiquei meio confuso com o exemplo passado por você. Vou fazer um EXEMPLO na prática e vê se consigo entendê-lo melhor.


é realmente... Pode ser que normalizai muito < este exemplo é o caso
de todas as tres tabelas se relacionarem com o mesmo codigo

Um exemplo é o caso de Tabela Clientes , Funcionarios e Fornecedore
que são pessoas fisicas ou Juridica que por sua ves são pessoas
Pq nada impede por exemplo um Funcionário ser Tb Cliente
O que ocorre com a maioria dos aplicativos é ter dois cadastro
Um endereço para Funcionario e Outro para o Funcionario Cliente
Porém esta reduntancia se resolve com Normalização e neste caso
usando a facilidade RAD do Delphi construimos o Relacionamento
Mestre Detalhe de modo bem simples

Mas Talvez vc queira um Exemplo menos normalizado ( com é o cado por
exempllo de :

Tabela Vendas --->> Tabela Clientes -->> Tabela Telefones dos clientes

Aonde
Tabela Vendas se relacina com Clientes
Tabela Clientes se relaciona com Telefones dos clientes

eu entendi errado sua duvida...

De qq Forma Monte primeiro a Tabela , defina os Relacionamentos e
pratique para ver as dificuldades.. A prática é nosso melhor aliado[/quote:9d10eeb859]

Entendo prefeitamente o que você quis dizer. Utilizando NORMATIZAÇÃO com você mesmo menciona, a coisa fica até melhor.

Estou vendo aqui como fazer o que eu necessito baseado no seu exemplo e caso eu me nao consiga, vou aqui pra informar.

Obrigado pela sua atenção.

Abraço.


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:7c42c1b003=´Marco Salles´][quote:7c42c1b003]Confesso que fiquei meio confuso com o exemplo passado por você. Vou fazer um EXEMPLO na prática e vê se consigo entendê-lo melhor.


é realmente... Pode ser que normalizai muito < este exemplo é o caso
de todas as tres tabelas se relacionarem com o mesmo codigo

Um exemplo é o caso de Tabela Clientes , Funcionarios e Fornecedore
que são pessoas fisicas ou Juridica que por sua ves são pessoas
Pq nada impede por exemplo um Funcionário ser Tb Cliente
O que ocorre com a maioria dos aplicativos é ter dois cadastro
Um endereço para Funcionario e Outro para o Funcionario Cliente
Porém esta reduntancia se resolve com Normalização e neste caso
usando a facilidade RAD do Delphi construimos o Relacionamento
Mestre Detalhe de modo bem simples

Mas Talvez vc queira um Exemplo menos normalizado ( com é o cado por
exempllo de :

Tabela Vendas --->> Tabela Clientes -->> Tabela Telefones dos clientes

Aonde
Tabela Vendas se relacina com Clientes
Tabela Clientes se relaciona com Telefones dos clientes

eu entendi errado sua duvida...

De qq Forma Monte primeiro a Tabela , defina os Relacionamentos e
pratique para ver as dificuldades.. A prática é nosso melhor aliado[/quote:7c42c1b003]

Entendo prefeitamente o que você quis dizer. Utilizando NORMATIZAÇÃO com você mesmo menciona, a coisa fica até melhor.

Estou vendo aqui como fazer o que eu necessito baseado no seu exemplo e caso eu me nao consiga, vou aqui pra informar.

Obrigado pela sua atenção.

Abraço.[/quote:7c42c1b003]

Olá,

Fiz o procedimento e deu tudo certinho.

Agora, me tira outra dúvida se possível. Caso eu queira deixa a ´regra de negocios´ no banco de dados como seria o procedimento E também no caso de estar utilizando ´3 camadas´ como ficaria se procediemento?

Obrigado mais uma vez pela sua atenção e aguardo retorno.

Um forte abraço.


GOSTEI 0
Marco Salles

Marco Salles

29/05/2009

no caso de estar utilizando ´3 camadas´ como ficaria se procediemento?


Mesmo que vc esteja usando uma Aplicação Cliente\Server ´Normal´
O DbExpress Local funciona de forma muito semelhante ao DataSnap
Multicamadas por fazer uso dos componentes ClientDataSet e
DataSetProvider

As ligações (procedimentos) se é que eu entendi direito , praticamente
são as mesmas , so que as camadas se comunicarão atraves de
protocolos que implemetaraão uma interface..Agora o tipo de protocolo
que será utilizado nesta comunicação , dependerá da Tecnologia
escolhida .Geralmente se esta utilizando : O COM+, O SOAP , BSS
pois algumas outros protocolos suportados pelo DataSnap , foram
descontinuados.


Caso eu queira deixa a ´regra de negocios´ no banco de dados como seria o procedimento


Ai vd deve Usar Stored Procedures e Triggers ..O que consiste isto ?
é vc executar inserçoes diretamente no Banco sem Utilizar métodos
ou funçoes na Aplicação Delphi . Um exemplo prético é o Relacionamento
entre uma Tabela [parcela] e uma Tabela [Caixa] ... Para cada baixa
da Tabela [Parcela] é gerada um lançamento na Tabela [caixa]

Porém outras situações de Relacionamentos (com é o caso de [Telefones]
e [clientes] , não requer o uso de Stored Procedures e Triggers . Pois nen
todo cliente tem telefone e essas inserções não são Automaticas a ponto
de uma gerar outra automaticamente

Então a aplicação disso é criteriosa e particular


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:a89325e75a=´Marco Salles´]
no caso de estar utilizando ´3 camadas´ como ficaria se procediemento?


Mesmo que vc esteja usando uma Aplicação Cliente\Server ´Normal´
O DbExpress Local funciona de forma muito semelhante ao DataSnap
Multicamadas por fazer uso dos componentes ClientDataSet e
DataSetProvider

As ligações (procedimentos) se é que eu entendi direito , praticamente
são as mesmas , so que as camadas se comunicarão atraves de
protocolos que implemetaraão uma interface..Agora o tipo de protocolo
que será utilizado nesta comunicação , dependerá da Tecnologia
escolhida .Geralmente se esta utilizando : O COM+, O SOAP , BSS
pois algumas outros protocolos suportados pelo DataSnap , foram
descontinuados.


Caso eu queira deixa a ´regra de negocios´ no banco de dados como seria o procedimento


Ai vd deve Usar Stored Procedures e Triggers ..O que consiste isto ?
é vc executar inserçoes diretamente no Banco sem Utilizar métodos
ou funçoes na Aplicação Delphi . Um exemplo prético é o Relacionamento
entre uma Tabela [parcela] e uma Tabela [Caixa] ... Para cada baixa
da Tabela [Parcela] é gerada um lançamento na Tabela [caixa]

Porém outras situações de Relacionamentos (com é o caso de [Telefones]
e [clientes] , não requer o uso de Stored Procedures e Triggers . Pois nen
todo cliente tem telefone e essas inserções não são Automaticas a ponto
de uma gerar outra automaticamente

Então a aplicação disso é criteriosa e particular[/quote:a89325e75a]

Beleza, mas quanto as tecnologias empregadas para 3 camadas e stored procedues/triggers para a regra de negocios no banco de dados, eu não tenho dúvidas não. A minha dúvida mesmo é sobre a interface/acesso a dados do aplicativo. No segundo caso, como é que eu monto isso? Da mesma forma com o DBExpress ou não?

Obrigado mais uma vez pela sua atenção e aguardo seu comentário.

Abraço.


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:5571b3635c=´Marco Salles´][quote:5571b3635c]no caso de estar utilizando ´3 camadas´ como ficaria se procediemento?


Mesmo que vc esteja usando uma Aplicação Cliente\Server ´Normal´
O DbExpress Local funciona de forma muito semelhante ao DataSnap
Multicamadas por fazer uso dos componentes ClientDataSet e
DataSetProvider

As ligações (procedimentos) se é que eu entendi direito , praticamente
são as mesmas , so que as camadas se comunicarão atraves de
protocolos que implemetaraão uma interface..Agora o tipo de protocolo
que será utilizado nesta comunicação , dependerá da Tecnologia
escolhida .Geralmente se esta utilizando : O COM+, O SOAP , BSS
pois algumas outros protocolos suportados pelo DataSnap , foram
descontinuados.


Caso eu queira deixa a ´regra de negocios´ no banco de dados como seria o procedimento


Ai vd deve Usar Stored Procedures e Triggers ..O que consiste isto ?
é vc executar inserçoes diretamente no Banco sem Utilizar métodos
ou funçoes na Aplicação Delphi . Um exemplo prético é o Relacionamento
entre uma Tabela [parcela] e uma Tabela [Caixa] ... Para cada baixa
da Tabela [Parcela] é gerada um lançamento na Tabela [caixa]

Porém outras situações de Relacionamentos (com é o caso de [Telefones]
e [clientes] , não requer o uso de Stored Procedures e Triggers . Pois nen
todo cliente tem telefone e essas inserções não são Automaticas a ponto
de uma gerar outra automaticamente

Então a aplicação disso é criteriosa e particular[/quote:5571b3635c]

Beleza, mas quanto as tecnologias empregadas para 3 camadas e stored procedues/triggers para a regra de negocios no banco de dados, eu não tenho dúvidas não. A minha dúvida mesmo é sobre a interface/acesso a dados do aplicativo. No segundo caso, como é que eu monto isso? Da mesma forma com o DBExpress ou não?

Obrigado mais uma vez pela sua atenção e aguardo seu comentário.

Abraço.[/quote:5571b3635c]

complementando:

Mas a dúvida é em cima da questão do ´mestre/detalhe´.

Espero que tenha entendido.


GOSTEI 0
Marco Salles

Marco Salles

29/05/2009

complementando: Mas a dúvida é em cima da questão do ´mestre/detalhe´. Espero que tenha entendido.


Então , monte o Banco peq. com poucos bancos
Passe para mim
Que eu monto para vc a estrutura
Ok...


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:b08ce3addd=´Marco Salles´]
complementando: Mas a dúvida é em cima da questão do ´mestre/detalhe´. Espero que tenha entendido.


Então , monte o Banco peq. com poucos bancos
Passe para mim
Que eu monto para vc a estrutura
Ok...[/quote:b08ce3addd]

Olá Marco,

Você pode montar um exemplo ou até mesmo me mostra uma rotina que você já tenha por aí, ok?

Banco para exemplo:

TABELA CLIENTES - CODIGO CLIENTE
NOME CLIENTE

TABELA PRODUTOS - CODIGO PRODUTO
DESCRICAO DO PRODUTO
PRECO DO PRODUTO

TABELA PEDIDOS - CODIGO PEDIDO
EMISSAO PEDIDO
CLIENTE PEDIDO

TABELA ITENS - CODIGO PEDIDO
CODIGO PRODUTO
QUANTIDADE PRODUTO

Só lembrando que a minha duvida é somente com relacão a como MONTAR o aplicativo (cliente) nos dois formatos (regras de negocio no DB e/ou 3 camadas com datasnap). Sempre trabalhei com as regras no aplicativo e como as vezes o aplicativo acessa um DB REMOTO, a performance cai bastante e quero dar uma melhorada nessa questão de acesso remoto.

Outra dúvida:

No caso do aplicativo ficar em ´3 camadas´... Tentei algum tipo de problema em instala-lo em um unico computador acessando dados local e na própria máquna ou não?

Mas uma vez obrigado pela sua atenção e aguardo retorno.

Um forte abraço.


GOSTEI 0
Marco Salles

Marco Salles

29/05/2009

Você pode montar um exemplo ou até mesmo me mostra uma rotina que você já tenha por aí, ok?

Ja lhe enviei umMini Exemplo


GOSTEI 0
Aprendiz_ce

Aprendiz_ce

29/05/2009

[quote:b6d6235cf3=´Marco Salles´]
Você pode montar um exemplo ou até mesmo me mostra uma rotina que você já tenha por aí, ok?

Ja lhe enviei umMini Exemplo[/quote:b6d6235cf3]

Beleza, vou dar uma olhadinha no mesmo e dou retorno.

Muitissimo obrigado pela sua pronta atenção.

Um forte abraço.


GOSTEI 0
POSTAR