Problema com Master/Detail

Delphi

10/11/2010

  Boa tarde pessoal. Estou com uma dúvida ferrenha no Delphi.

Estou tentando fazer uma ligação Master/Detail. Inseri i IBDatabase (conecta normal), o IBTransaction (tudo ok).

Tabela Mestre
IBDATASET1 -> DATASETPROVIDER1 -> CLIENTEDATASET1 -> DATASOURCE1 -> DBGRID

COMANDO SQL UTILIZADO NO IBDATASET (SELECT * FROM MESTRE ORDER BY ID)

Até aqui tudo bem.. está tudo funcionando, o GRID mostra os dados normalmente. Agora é que vem o problema:

Tabela Detalhe
IBDATASET2 -> DATASETPROVIDER2 -> CLIENTEDATASET2 -> DATASOURCE2 -> DBGRID

COMANDO SQL UTILIZADO NO IBDATASET2 (SELECT * FROM DETALHE WHERE ID_LANC = :MESTRE ORDER BY ID)

E coloquei o PARAM no evento OnShow da minha aplicação.. dessa forma:

DETALHE.Close;
DETALHE.ParamByName('MESTRE').AsInteger := strtoint(MESTRE.FieldByName('ID').Text);
DETALHE.Open;


Só que.. no DBGRID da DETALHE não aparece nada! não sei oq fiz de errado.. talvez seja o parametro.. ou algum outro componente.. alguém pode me ajudar?

Obrigado!
João Telles

João Telles

Curtidas 0

Respostas

Pietro Braga

Pietro Braga

10/11/2010

Creio que não precise do order by na SQL do detalhe.
GOSTEI 0
João Telles

João Telles

10/11/2010

Realmente, ORDER BY não é necessário. Porém o problema ainda continua..
GOSTEI 0
Pietro Braga

Pietro Braga

10/11/2010


  Ctrl + C, Ctrl + V
se for com ClientDataset basta preencher a propriedade MasterSource com o DataSource associado ao ClientDataset da tabela de clientes e na propriedade MasterFields da tabela de endereços colocar os campos chave da tabela de cliente ou os campos que fazem a ligação entre as duas tabelas. isso nao muda em relação a aplicações com dados em paradox ou coisa parecida essa funcionalidade eh herdada da classe TDataSet.
GOSTEI 0
João Telles

João Telles

10/11/2010

Ainda não resolveu o problema..
O que ocorre é o seguinte:
O IBDataset está conectado ao DataSetProvider, que está conectado ao ClientDataSet, que está conectado ao Datasource, que Está conectado ao DBGRID
Na tabela Detalhe, nas propriedades MASTERSOURCE do ClientDataSet eu selecionei o Datasource da tabela mestre. E em MasterFields eu fiz a interligação entre ID da tabela detalhe e ID da tabela mestre. Até aqui acredito que esteja tudo bem. 
Ocorre que, ao ativar os ClientDataSets ocorre um erro: NAME NOT UNIQUE IN THIS CONTEXT. 
Como solucionar isso? Será q fiz alguma ligação errada?
GOSTEI 0
Rafael Ribeiro

Rafael Ribeiro

10/11/2010

QUANDO VOCÊ LANÇA UM PARÂMETRO VOCÊ TEM QUE COLOCAR O MESMO NOME DO FIELD QUE VAI RECEBER. NO SEU CASO:

SELECT * FROM DETALHE WHERE ID_LANC = :ID_LANC ORDER BY ID


NO SQLDATASET VÁ NA PROPRIEDADE PARAMS E VÊ SE ESTÁ "ftInteger" . DEPOIS CLICA COM O BOTÃO DIREITO EM CIMA DO CLIENTDATASET E CLIQUE EM "FETCH PARAMS".

SEU CÓDIGO IRÁ FUNCIONAR!

ESPERO TER AJUDADO!

RAFAEL RIBEIRO
GOSTEI 0
João Telles

João Telles

10/11/2010

Rafael.. estou utilizando o TIBDataSet e não SQLDataSet.. 
coloquei no SQL o código da forma como vc disse.. o parametro tem o mesmo nome que o campo agora.. 
vc tinha dito:
NO SQLDATASET VÁ NA PROPRIEDADE PARAMS E VÊ SE ESTÁ "ftInteger" . DEPOIS CLICA COM O BOTÃO DIREITO EM CIMA DO CLIENTDATASET E CLIQUE EM "FETCH PARAMS".
porém.. só possuo essa propriedade PARAMS no próprio ClientDataSet..
mesmo fazendo isso.. ainda aparece a mensagem NAME NOT UNIQUE IN THIS CONTEXT quando tento ativar o ClientDataSet...
consegue me dizer se tem algo mais errado?
Valeu!
GOSTEI 0
João Telles

João Telles

10/11/2010

up...
algum dos colegas tem alguma solução?
GOSTEI 0
Pietro Braga

Pietro Braga

10/11/2010


   Boa tarde pessoal. Estou com uma dúvida ferrenha no Delphi.



Estou tentando fazer uma ligação Master/Detail. Inseri i IBDatabase (conecta normal), o IBTransaction (tudo ok).



Tabela Mestre

IBDATASET1 -> DATASETPROVIDER1 -> CLIENTEDATASET1 -> DATASOURCE1 -> DBGRID



COMANDO SQL UTILIZADO NO IBDATASET (SELECT * FROM MESTRE ORDER BY ID)



Até aqui tudo bem.. está tudo funcionando, o GRID mostra os dados normalmente. Agora é que vem o problema:



Tabela Detalhe

IBDATASET2 -> DATASETPROVIDER2 -> CLIENTEDATASET2 -> DATASOURCE2 -> DBGRID



COMANDO SQL UTILIZADO NO IBDATASET2 (SELECT * FROM DETALHE WHERE ID_LANC = :MESTRE ORDER BY ID)



E coloquei o PARAM no evento OnShow da minha aplicação.. dessa forma:



DETALHE.Close;

DETALHE.ParamByName('MESTRE').AsInteger := strtoint(MESTRE.FieldByName('ID').Text);

DETALHE.Open;





Só que.. no DBGRID da DETALHE não aparece nada! não sei oq fiz de errado.. talvez seja o parametro.. ou algum outro componente.. alguém pode me ajudar?



Obrigado!
 

Olá amigo, há algo estranho quando você está definindo o paramentro, veja que está no evento onshow, creio que o que você deseja é carregar a tabela detalhe ao selecionar um registro na mestre certo? 
Vai ter que usar um evento da DBGrid para definir o Paramentro da detalhe, acho que é OnCellClick... 
Depois disso coloque no MasterSource do cds detalhe o datasource da tabela Mestre, em Marter Fields coloque o ID da tabela Mestre e em IndexFieldNames o ID da tabela detalhe. 
GOSTEI 0
POSTAR