Dbexpress Mestre Detalhe
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!
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
Curtidas 0
Respostas
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
28/04/2006
Deu certo muito obrigado.
GOSTEI 0
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?
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
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
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
28/04/2006
Mas é exatamente assim q estou fazendo
GOSTEI 0
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.
:)
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
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
www.djchambinho.com/igep.rar
muito obrigado
GOSTEI 0
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
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
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
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