Fórum Grouby by com duas tabelas ? #59722

09/05/2008

0

Esta são as tabelas: Pagar, Receber
com os campo Data_vencimento, valor duplicata, quero um relatório como este :

Valor a Pagar data Vencimento Valor a Receber data Vencimento

R$ 500,00 10/05/2008 R$100,00 10/05/2008
-----------------------------------------------------------------------------
R$ 200,00 12/06/2008
-----------------------------------------------------------------------------
R$ 30,00 13/07/2008 R$ 1.000,00 13/07/2008
-----------------------------------------------------------------------------
R$ 500,00 15/07/2008
-----------------------------------------------------------------------------
R$ 50,00 16/07/2008
----------------------------------------------------------------------------

Se não colocar a clausua where ele repete os a ocorrencia de duplicata ;
Se colocar tem que ter duplicatas a receber e pagar na mesma data para somar caso não exista uma ou outra não aparece na soma

select pagar.datavenc,receber.datavenc, sum(pagar.valordup)valorrc,sum(receber.valordup)valorpg
from pagar, receber where pagar.datavenc = receber.datavenc
group by pagar.datavenc,receber.datavenc


desde já adradeço

Hugo Fabrício


Hugofab

Hugofab

Responder

Posts

09/05/2008

Emerson Nascimento

faça isso num stored procedure:
CREATE PROCEDURE RELATORIO_TITULOS
returns (
    data date,
    valorpagar double precision,
    valorreceber double precision)
as
declare variable datafinal date;
declare variable dataaux date;
begin
  /* procuro pela menor e pela maior data de vencimento.
     note que aqui está simplesmente verificando a menor
     e a menor data, sem avaliar se o título ainda está
     em aberto.
     creio que para um melhor resultado, deveria listar
     somente os títulos em aberto
  */
  -- obtenho data inicial
  select min(datavenc) from pagar into :dataaux;
  select min(datavenc) from receber into :data;

  if (dataaux < data) then
    data = dataaux;

  -- obtenho data final
  select max(datavenc) from pagar into :dataaux;
  select max(datavenc) from receber into :datafinal;

  if (dataaux > datafinal) then
    datafinal = dataaux;

  /* com as datas "em mãos", vamos ao relatório */
  while (data <= datafinal) do
  begin
    -- valor a pagar na data
    select coalesce(sum(valordup),0) from pagar
    where datavenc = :data into :valorpagar;

    -- valor a receber na data
    select coalesce(sum(valordup),0) from receber
    where datavenc = :data into :valorreceber;

    if ((valorpagar > 0) or (valorreceber > 0)) then
      suspend;

    data = data + 1;
  end
end


para usar faça:
select * from RELATORIO_TITULOS
ou
select * from RELATORIO_TITULOS where data between ´01.03.2008´ and ´31.03.2008´


Responder

Gostei + 0

09/05/2008

Hugofab

emerson,


executei o exemplo como você me passou mas ele esta travando,
tirei os selecte que seleciona os dados para ver se o while estava gerando loop infinito e notei que mesmo sem selecionar valores ele demora um pouco para retornar mas retorna.

coloquei para filtrar só os titulos em abertos mas mesmo assim travol.


desde já agradeço

Hugo Fabrício


Responder

Gostei + 0

10/05/2008

Emerson Nascimento

fiz uma pequena alteração:
CREATE PROCEDURE RELATORIO_TITULOS
returns (
    data date,
    valorpagar double precision,
    valorreceber double precision)
as
declare variable datafinal date;
declare variable dataauxini date;
declare variable dataauxfim date;
begin
  /* procuro pela menor e pela maior data de vencimento.
     note que aqui está simplesmente verificando a menor
     e a menor data, sem avaliar se o título ainda está
     em aberto.
     creio que para um melhor resultado, deveria listar
     somente os títulos em aberto
  */
  -- obtenho as datas inicial e final
  select min(datavenc), max(datavenc) from pagar
  where [emaberto] into :dataauxini, :dataauxfim;

  select min(datavenc), max(datavenc) from receber
  where [emaberto] into :data, datafinal;

  if (dataauxini < data) then
    data = dataauxini;

  if (dataauxfim > datafinal) then
    datafinal = dataauxfim;

  /* com as datas "em mãos", vamos ao relatório */
  while (data <= datafinal) do
  begin
    -- valor a pagar na data
    select coalesce(sum(valordup),0) from pagar
    where datavenc = :data and [emaberto] into :valorpagar;

    -- valor a receber na data
    select coalesce(sum(valordup),0) from receber
    where datavenc = :data and [emaberto] into :valorreceber;

    if ((valorpagar > 0) or (valorreceber > 0)) then
      suspend;

    data = data + 1;
  end
end


de qualquer forma, publique a SP alterada por você.


Responder

Gostei + 0

12/05/2008

Hugofab

emerson,

fiz algumas modificações e funcionou,
veja como ficou !

CREATE OR ALTER PROCEDURE RELATORIO_TITULOS (
inicio date,
fim date)
returns (
data date,
valorpagar double precision,
valorreceber double precision)
as
begin

/* com as datas ´em mãos´, vamos ao relatório */
DATA = INICIO;
while (DATA <= FIM) do
begin
-- valor a pagar na data
select coalesce(sum(valordup),0) from contas
where datavenc = :DATA and (Liq = ´N´) into :valorpagar;

-- valor a receber na data
select coalesce(sum(valordup),0) from duplicata
where datavenc = :DATA and (Liq = ´N´) into :valorreceber;

if ((valorpagar > 0) or (valorreceber > 0)) then
suspend;

DATA = DATA + 1;
end

Muito obrigado


Hugo Fabrício


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar