Erro com consulta master detail com dbexpress.

Delphi

19/06/2013

Eu tenho as seguintes tabelas.
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

Nícolas Braz

Curtidas 0

Respostas

Marco Salles

Marco Salles

19/06/2013

com esta configurado a propriedade options do DatasetProvider

Vc tem um só né ???
GOSTEI 0
Hudson Leite

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.
GOSTEI 0
Hudson Leite

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
GOSTEI 0
Nícolas Braz

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é

José

19/06/2013

Amigo, podemos dar sua duvida como resolvida ?
GOSTEI 0
Nícolas Braz

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é

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.".
GOSTEI 0
Nícolas Braz

Nícolas Braz

19/06/2013

Duvida sanada, podem finalizar o tópico.
GOSTEI 0
POSTAR