Erro com consulta master detail com dbexpress.
Eu tenho as seguintes tabelas.
Tabela Master.
Tabela detail
Criei um SQLDataset, DataSetProvider e um clientDataSet no meu Datamodule, no meu formulário coloquei um data source estou usando o seguinte código.
Ele faz a consulta e até consegue pegar os parametros o problema é que ele está duplicando os registros.
O que pode ser?
Tabela Master.
CREATE TABLE VENDAS (
VEN_CODIGO D_CODIGO NOT NULL /* D_CODIGO = INTEGER NOT NULL */,
CLI_CODIGO D_CODIGO NOT NULL /* D_CODIGO = INTEGER NOT NULL */,
VEN_DESCRICAO D_NOME_90 /* D_NOME_90 = VARCHAR(90) */,
VEN_DATA D_DATA /* D_DATA = DATE */,
VEN_TOTAL D_NUMERO /* D_NUMERO = NUMERIC(8,2) */,
VEN_OBSERVACAO D_NOME_90 /* D_NOME_90 = VARCHAR(90) */,
VEN_PAGAMENTO D_NOME_20 /* D_NOME_20 = VARCHAR(20) */
);
ALTER TABLE VENDAS ADD CONSTRAINT PK_VENDAS PRIMARY KEY (VEN_CODIGO);
ALTER TABLE VENDAS ADD CONSTRAINT FK_VENDAS_1 FOREIGN KEY (CLI_CODIGO) REFERENCES CLIENTES (CLI_CODIGO); Tabela detail
CREATE TABLE ITENS (
ITE_CODIGO D_CODIGO /* D_CODIGO = INTEGER NOT NULL */,
VEN_CODIGO D_CODIGO NOT NULL /* D_CODIGO = INTEGER NOT NULL */,
PRO_CODIGO D_CODIGO NOT NULL /* D_CODIGO = INTEGER NOT NULL */,
ITE_QUANTIDADE D_NUMERO /* D_NUMERO = NUMERIC(8,2) */,
ITE_PRECO D_NUMERO /* D_NUMERO = NUMERIC(8,2) */,
ITE_TOTAL D_NUMERO /* D_NUMERO = NUMERIC(8,2) */
);
ALTER TABLE ITENS ADD CONSTRAINT PK_ITENS PRIMARY KEY (ITE_CODIGO);
ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_2 FOREIGN KEY (PRO_CODIGO) REFERENCES PRODUTOS (PRO_CODIGO) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ITENS ADD CONSTRAINT FK_ITENS_3 FOREIGN KEY (VEN_CODIGO) REFERENCES VENDAS (VEN_CODIGO) ON DELETE CASCADE ON UPDATE CASCADE; Criei um SQLDataset, DataSetProvider e um clientDataSet no meu Datamodule, no meu formulário coloquei um data source estou usando o seguinte código.
with dm.cdsConsultas do
begin
Screen.Cursor := crHourGlass;
Close;
S := TStringList.Create;
S.Add('select vendas.ven_codigo, vendas.cli_codigo, vendas.ven_descricao, vendas.ven_data, vendas.ven_total, ');
S.Add('vendas.ven_observacao, vendas.ven_pagamento, itens.ite_codigo, itens.ven_codigo, itens.pro_codigo, ');
S.Add('itens.ite_quantidade, itens.ite_preco, itens.ite_total from itens, vendas ');
S.Add('where VENDAS.VEN_CODIGO = ITENS.VEN_CODIGO and ');
S.Add('vendas.ven_data between :datainicial and :datafinal and ');
S.Add('vendas.ven_pagamento like :pagamento ');
CommandText := S.Text;
FetchParams;
Params.ParamByName('datainicial').AsDate := DataInicial.Date;
Params.ParamByName('datafinal').AsDate := DataFinal.Date;
Params.ParamByName('pagamento').AsString := 'Pago';
Open;
FreeAndNil(S);
Screen.Cursor := crDefault;Ele faz a consulta e até consegue pegar os parametros o problema é que ele está duplicando os registros.
O que pode ser?
Nícolas Braz
Curtidas 0
Respostas
Marco Salles
19/06/2013
com esta configurado a propriedade options do DatasetProvider
Vc tem um só né ???
Vc tem um só né ???
GOSTEI 0
Hudson Leite
19/06/2013
Caro Nicola, boa tarde!
Tenta dessa Forma.:
Configurações do componentes.:
adicione um sqlConnection
adicione uma SqlQueryMaster
propriedade Sql = "select * from vendas"
adicione um dataSourceLigacao
adicione um SqlQueryDetalhe na sua propriedade dataSource setar dataSourceLigacao
propriedade Sql = "select * from itens where ven_codigo = :ven_codigo"
adicione um dataSetProvider na sua propriedade dataSet setar SqlQueryMaster
adicione um ClientDataSetMaster na sua propriedade providerName setar dataSetProvider
Ative o ClientDataSetMaster e carregue os campos, obseve que será carregado um campo com o nome SqlQueryDetalhe.
adicione um dataSourceMaster na sua propriedade dataSet setar ClientDataSetMaster
adicione um ClientDataSetDetalhe na sua propriedade providerName setar dataSetProvider
adicione um dataSourceDetalhe na sua propriedade dataSet setar ClientDataSetDetalhe
agora basta ligar os dataSourceMaster e dataSourceDetalhe nas dbgrid, adicionar dois DBNavigator e pronto.
Tenta dessa Forma.:
Configurações do componentes.:
adicione um sqlConnection
adicione uma SqlQueryMaster
propriedade Sql = "select * from vendas"
adicione um dataSourceLigacao
adicione um SqlQueryDetalhe na sua propriedade dataSource setar dataSourceLigacao
propriedade Sql = "select * from itens where ven_codigo = :ven_codigo"
adicione um dataSetProvider na sua propriedade dataSet setar SqlQueryMaster
adicione um ClientDataSetMaster na sua propriedade providerName setar dataSetProvider
Ative o ClientDataSetMaster e carregue os campos, obseve que será carregado um campo com o nome SqlQueryDetalhe.
adicione um dataSourceMaster na sua propriedade dataSet setar ClientDataSetMaster
adicione um ClientDataSetDetalhe na sua propriedade providerName setar dataSetProvider
adicione um dataSourceDetalhe na sua propriedade dataSet setar ClientDataSetDetalhe
agora basta ligar os dataSourceMaster e dataSourceDetalhe nas dbgrid, adicionar dois DBNavigator e pronto.
GOSTEI 0
Hudson Leite
19/06/2013
Caro Nicolas,
Após adicionar o dataSourceLigacao,
setar no dataSourceLigacao a propriedade dataSet SqlQueryMaster.
Depois pode continuar normalmente os processos
Após adicionar o dataSourceLigacao,
setar no dataSourceLigacao a propriedade dataSet SqlQueryMaster.
Depois pode continuar normalmente os processos
GOSTEI 0
Nícolas Braz
19/06/2013
Galera a consulta estava correta! Eu que não estava sabendo agrupar os dados, obrigado pela ajuda.
GOSTEI 0
José
19/06/2013
Amigo, podemos dar sua duvida como resolvida ?
GOSTEI 0
Nícolas Braz
19/06/2013
Sim, já resolveu o meu problema! Como eu marco nesse fórum que a minha dúvida foi resolvida?
GOSTEI 0
José
19/06/2013
Olá amigo obrigado pelo retorno, em relação a marcar o tópico por concluído, somos nós moderadores que fizemos isso.
Para ficar mas fácil de identificarmos se a duvida já foi solucionada pedimos aos usuário que coloquem "Duvida sanada, podem finalizar o tópico.".
Para ficar mas fácil de identificarmos se a duvida já foi solucionada pedimos aos usuário que coloquem "Duvida sanada, podem finalizar o tópico.".
GOSTEI 0
Nícolas Braz
19/06/2013
Duvida sanada, podem finalizar o tópico.
GOSTEI 0