Dbexpress Mestre Detalhe

Delphi

28/04/2006

Estou fazendo com esse passo-a-passo retirado aqui do prorio forum, mas
no item 9 da o seguinte erro:

[b:3a56d98e35]Field name cannot be longer the 31 characters. Try setting objectview to true on the dataset.[/b:3a56d98e35]


Alguem sabe o que pode ser????



Possuindo as tabelas TABELA_MESTRE e TABELA_DETALHE em seu banco de dados e um componente SQLConnection devidamente configurado, adicione ao seu DataModule os componentes seguintes e dê nome a eles (os nomes deste exemplo seguem entre parênteses à frente do nome do componente):

- Dois SQLDataSet (dst_Mestre e dst_Detalhe)

- Um DataSetProvider (dsp_Mestre)

- Dois ClientDataSet (cds_Mestre e cds_Detalhe)

- Três DataSource (dts_LinkMestre, dts_Mestre e dts_Detalhe)

2) Escreva a SQL de dst_Mestre na sua propriedade CommandText:

SELECT <colunas_da_tabela_mestre>

FROM TABELA_MESTRE

WHERE <coluna_chave_do_relacionamento_na_tabela_mestre> = :parametro

3) Configure na propriedade Params ´parametro´ conforme seu tipo, neste
caso, DataType = ftInteger.

4) Mude a propriedade DataSet de dts_LinkMestre para dst_Mestre

5) Escreva a SQL de dst_Detalhe na sua propriedade CommandText:

SELECT <colunas_da_tabela_detalhe)
FROM TABELA_DETALHE
WHERE <coluna_chave_do_relacionamento_na_tabela_detalhe> =
:<coluna_chave_do_relacionamento_na_tabela_mestre>

NOTA IMPORTANTE:

O nome do parâmetro na tabela detalhe tem que obrigatoriamente ser igual ao nome da coluna a que corresponde na tabela mestre.

6) Mude a propriedade DataSource de dst_Detalhe para dts_LinkMestre

7) Mude a propriedade DataSet de dsp_Mestre dst_Mestre

8) Mude a propriedade ProviderName de cds_Mestre para dsp_Mestre

9) Adicione os TFields do cds_Mestre e note a presença de um campo novo (campo anhinhado) que é quem será o responsável pelo relacionamento com a tabela detalhe.

10) Mude a propriedade DataSetField do cds_Detalhe, colocando nela o nome do campo anhinhado mencionado no item anterior.

11) Mude a propriedade DataSet de dts_Mestre para cds_Mestre

12) Mude a propriedade DataSet de dts_Detalhe para cds_Detalhe

13) Adicione os TFields do cds_Detalhe

Agora é só fornecer o valor de ´parametro´ (item 2) e abrir o cds_Mestre que o resto será feito automaticamente!


Macedo-fabio

Macedo-fabio

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

28/04/2006

o nome dos seus clientdatasets é muito grande. qdo o sistema gera o campo aninhado, seu nome fica com mais de 31 caracteres. renomeie seus clientdatasets de modo a tornar o nome do campo aninhado menor que 31 caracteres.


GOSTEI 0
Macedo-fabio

Macedo-fabio

28/04/2006

Deu certo muito obrigado.


GOSTEI 0
Ecptavares

Ecptavares

28/04/2006

Ola Gente...

Eu to fazendo o mesmo q o Fabio , porem eu tenho 8 tabelas detalhes.
So q se eu acabo de inserir um registro na tabela pai, eu so consigo inserir um registro em uma das tabelas filhas se eu reiniciar o meu sistema.

Da essa mensagem: No corresponding master record found

o q pode ser?


GOSTEI 0
Ricardocopano

Ricardocopano

28/04/2006

Meu amigo, sofri pra caramba pra descobrir ...

mas como no exemplo anterior, o paso a paso, a resposta esta entre-linhas: importante: o campo chave-detalhe deve ser o mesmo nome que o campo chave-mestre.

por exemplo:
select <campos>
from <tabela_datalhe>
where id_codigo=:id_codigo

o primeiro id_codigo corresponde ao campo da tabela detalhe, e o segundo ao campo chave da tabela mestre, os nomes dos campos devem ser iguaizinhos.

so isso, espero que ajude.

blz


GOSTEI 0
Ecptavares

Ecptavares

28/04/2006

Mas é exatamente assim q estou fazendo


GOSTEI 0
Ricardocopano

Ricardocopano

28/04/2006

Então caro amigo...

essa menssagem diz que não corresponde o campo detalhe em relação ao campo mestre....
ou esta tentando salvar o registro detalhe sem antes ter salvo o registro mestre? esta fazendo o comit do registro mestre primeiro?

outra coisa, no after insert do detalhe, pase o valor do campo chave do mestre...
algo como
dsDetalhe.FieldByName(´id_cliente´).AsInteger := dsMestre.FieldByName(´id_cliente´).AsInteger

acho que so tem isso pra verificar...


Mas vale morrer tentando, do que perecer na vida.....
by Ricardo Copano.

:)


GOSTEI 0
Ecptavares

Ecptavares

28/04/2006

Se vc puder baixar meu projeto e dar uma olhada ficarei mais do que agradecido...

www.djchambinho.com/igep.rar

muito obrigado


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/04/2006

colega, tentei abrir seu banco de dados mas ocorre um erro informando que o arquivo está numa versão obsoleta. em qual SGBD você criou esse banco? (eu estou utilizando FB 1.5)


GOSTEI 0
Ecptavares

Ecptavares

28/04/2006

Eu usei o IBConsole pra criar o banco mas salvei com extançao fdb pois eu quero usar e firebird e o meu SGDB é firebird 1.5


GOSTEI 0
Ricardocopano

Ricardocopano

28/04/2006

Amigo, baixei o teu projeto.... esta usando quais componentes? não tenho os que esta usando. pelo que entendi no datamodule vc tem clientes(mestre) e tratamento (detalhe) certo ?
então no cdsTratamento falta no after insert a instrução que te pasei antes:
cdsTratamento.FieldByName(´codcli´).AsInteger := cdsClientes.FieldByName(´codcli´).AsInteger;

Espero ter ajudado...

boa sorte!

Ricardo Copano


GOSTEI 0
POSTAR