Procedure Registros Duplicados (Urgente)

Firebird

09/07/2011

Galera eu tenho uma procedure onde eu faço dois selects, uma para pegar os dados do cliente com a venda e outro para calcular porcentagens e outros valores. Mas os registros estão duplicados.

Segue abaixo a procedure:

CREATE OR ALTER PROCEDURE SP_LISTA_VENDAS (
    dt_ini date,
    dt_fim date,
    status_in varchar(9),
    tipo integer,
    cli_in integer)
returns (
    ven_id integer,
    data_cad timestamp,
    data_alt timestamp,
    data_baixa timestamp,
    cli_id integer,
    status varchar(9),
    loj_id integer,
    usu_id integer,
    cpgto_id1 integer,
    fgpto_id1 integer,
    cpgto_id2 integer,
    fgpto_id2 integer,
    data_base timestamp,
    total numeric(9,2),
    ven_obs varchar(300),
    cpgto_descricao varchar(80),
    fgpto_descricao varchar(30),
    cli_razao varchar(80),
    cli_nome varchar(80),
    cli_cnpj_cpf varchar(14),
    cli_endereco varchar(80),
    cli_numero varchar(6),
    cli_bairro varchar(30),
    cli_complemento varchar(80),
    cli_cep varchar(10),
    cli_cidade varchar(30),
    cli_uf char(2),
    cli_fone1 varchar(10),
    gf varchar(1),
    total_pago numeric(9,2),
    desconto numeric(18,2),
    percentual varchar(22))
as
BEGIN
  if (:tipo = 0) then -- Se for Geral
  begin
      FOR
        select
            vendas.ven_id,
            vendas.data_cad,
            vendas.data_alt,
            vendas.data_baixa,
            vendas.cli_id,
            case vendas.status when 'P' then 'PENDENTE' when 'B' then 'BAIXADA' when 'C' then 'CANCELADA' end as status,
            vendas.loj_id,
            vendas.usu_id,
            vendas.cpgto_id1,
            vendas.fgpto_id1,
            vendas.cpgto_id2,
            vendas.fgpto_id2,
            vendas.data_base,
            vendas.total,
            vendas.ven_obs,
            condicao_de_pagamento.cpgto_descricao,
            forma_de_pagamento.fgpto_descricao,
            clientes.cli_razao,
            clientes.cli_nome,
            clientes.cli_cnpj_cpf,
            clientes.cli_endereco,
            clientes.cli_numero,
            clientes.cli_bairro,
            clientes.cli_complemento,
            clientes.cli_cep,
            clientes.cli_cidade,
            clientes.cli_uf,
            clientes.cli_fone1,
            vendas.gf
        from vendas
           left join condicao_de_pagamento on (vendas.cpgto_id1 = condicao_de_pagamento.cpgto_id)
           left join forma_de_pagamento on (vendas.fgpto_id1 = forma_de_pagamento.fgpto_id)
           left join clientes on (vendas.cli_id = clientes.cli_id)
        where
           vendas.status = :STATUS_IN  and
            cast(vendas.data_cad as Date)  between :dt_ini and :dt_fim
        INTO :VEN_ID,
             :DATA_CAD,
             :DATA_ALT,
             :DATA_BAIXA,
             :CLI_ID,
             :STATUS,
             :LOJ_ID,
             :USU_ID,
             :CPGTO_ID1,
             :FGPTO_ID1,
             :CPGTO_ID2,
             :FGPTO_ID2,
             :DATA_BASE,
             :TOTAL,
             :VEN_OBS,
             :CPGTO_DESCRICAO,
             :FGPTO_DESCRICAO,
             :CLI_RAZAO,
             :CLI_NOME,
             :CLI_CNPJ_CPF,
             :CLI_ENDERECO,
             :CLI_NUMERO,
             :CLI_BAIRRO,
             :CLI_COMPLEMENTO,
             :CLI_CEP,
             :CLI_CIDADE,
             :CLI_UF,
             :CLI_FONE1,
             :GF
      DO
   
      FOR
        select
            v.ven_id,
            sum(coalesce(vi.vi_total,0)) as total,
            coalesce(v.total,0) as total_pago,
            (sum(coalesce(vi.vi_total,0)) - coalesce(v.total,0)) as desconto,
            round(((sum(coalesce(vi.vi_total,0)) - coalesce(v.total,0))/sum(coalesce(vi.vi_total,0)))*100) || ' %' as percentual
        from vendas v
           inner join vendas_itens vi on (v.ven_id = vi.ven_id)
        where
            v.status = :STATUS_IN and
            cast(v.data_cad as Date)  between :dt_ini and :dt_fim
        group by v.ven_id,v.total
        INTO :VEN_ID,
             :TOTAL,
             :TOTAL_PAGO,
             :DESCONTO,
             :PERCENTUAL
      DO
    
  BEGIN
    SUSPEND;
  END
  end


  if (:tipo = 1) then -- Se for por Cliente
  begin
      FOR
        select
            vendas.ven_id,
            vendas.data_cad,
            vendas.data_alt,
            vendas.data_baixa,
            vendas.cli_id,
            case vendas.status when 'P' then 'PENDENTE' when 'B' then 'BAIXADA' when 'C' then 'CANCELADA' end as status,
            vendas.loj_id,
            vendas.usu_id,
            vendas.cpgto_id1,
            vendas.fgpto_id1,
            vendas.cpgto_id2,
            vendas.fgpto_id2,
            vendas.data_base,
            vendas.total,
            vendas.ven_obs,
            condicao_de_pagamento.cpgto_descricao,
            forma_de_pagamento.fgpto_descricao,
            clientes.cli_razao,
            clientes.cli_nome,
            clientes.cli_cnpj_cpf,
            clientes.cli_endereco,
            clientes.cli_numero,
            clientes.cli_bairro,
            clientes.cli_complemento,
            clientes.cli_cep,
            clientes.cli_cidade,
            clientes.cli_uf,
            clientes.cli_fone1,
            vendas.gf
        from vendas
           left join condicao_de_pagamento on (vendas.cpgto_id1 = condicao_de_pagamento.cpgto_id)
           left join forma_de_pagamento on (vendas.fgpto_id1 = forma_de_pagamento.fgpto_id)
           left join clientes on (vendas.cli_id = clientes.cli_id)
        where
           vendas.status = :STATUS_IN  and
           cast(vendas.data_cad as Date)  between :dt_ini and :dt_fim  and
           vendas.cli_id = :cli_in
        INTO :VEN_ID,
             :DATA_CAD,
             :DATA_ALT,
             :DATA_BAIXA,
             :CLI_ID,
             :STATUS,
             :LOJ_ID,
             :USU_ID,
             :CPGTO_ID1,
             :FGPTO_ID1,
             :CPGTO_ID2,
             :FGPTO_ID2,
             :DATA_BASE,
             :TOTAL,
             :VEN_OBS,
             :CPGTO_DESCRICAO,
             :FGPTO_DESCRICAO,
             :CLI_RAZAO,
             :CLI_NOME,
             :CLI_CNPJ_CPF,
             :CLI_ENDERECO,
             :CLI_NUMERO,
             :CLI_BAIRRO,
             :CLI_COMPLEMENTO,
             :CLI_CEP,
             :CLI_CIDADE,
             :CLI_UF,
             :CLI_FONE1,
             :GF
      DO
   
      FOR
        select
            v.ven_id,
            sum(coalesce(vi.vi_total,0)) as total,
            coalesce(v.total,0) as total_pago,
            (sum(coalesce(vi.vi_total,0)) - coalesce(v.total,0)) as desconto,
            round(((sum(coalesce(vi.vi_total,0)) - coalesce(v.total,0))/sum(coalesce(vi.vi_total,0)))*100) || ' %' as percentual
        from vendas v
           inner join vendas_itens vi on (v.ven_id = vi.ven_id)
        where
            v.status = :STATUS_IN and
            cast(v.data_cad as Date)  between :dt_ini and :dt_fim  and
            v.cli_id = :cli_in
        group by v.ven_id,v.total
        INTO :VEN_ID,
             :TOTAL,
             :TOTAL_PAGO,
             :DESCONTO,
             :PERCENTUAL
      DO
        BEGIN
    SUSPEND;
  END

  end


END
Sidney Abreu

Sidney Abreu

Curtidas 0

Respostas

Francisco Costa

Francisco Costa

09/07/2011

Coincidentemente temos um procedure igual a essa mudando só os campos, inclusive funcionando. entra em contanto no email infobrasil@infobrasilnet.com.br  que o pessoal  te envia corrigida. seu antigo emprego.
GOSTEI 0
POSTAR