Problema com Master/Detail
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!
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
Curtidas 0
Respostas
Pietro Braga
10/11/2010
Creio que não precise do order by na SQL do detalhe.
GOSTEI 0
João Telles
10/11/2010
Realmente, ORDER BY não é necessário. Porém o problema ainda continua..
GOSTEI 0
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
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?
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
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:
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
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
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!
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
10/11/2010
up...
algum dos colegas tem alguma solução?
algum dos colegas tem alguma solução?
GOSTEI 0
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!
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