Fórum Procedure Registros Duplicados (Urgente) #404693
09/07/2011
0
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
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
Curtir tópico
+ 0
Responder
Posts
10/07/2011
Francisco Costa
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.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)