Fórum Dbexpress Mestre Detalhe #320222
28/04/2006
0
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
Curtir tópico
+ 0Posts
28/04/2006
Emerson Nascimento
Gostei + 0
28/04/2006
Macedo-fabio
Gostei + 0
28/04/2006
Ecptavares
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
04/05/2006
Ricardocopano
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
04/05/2006
Ecptavares
Gostei + 0
04/05/2006
Ricardocopano
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
05/05/2006
Ecptavares
www.djchambinho.com/igep.rar
muito obrigado
Gostei + 0
05/05/2006
Emerson Nascimento
Gostei + 0
05/05/2006
Ecptavares
Gostei + 0
06/05/2006
Ricardocopano
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
Clique aqui para fazer login e interagir na Comunidade :)