Jump to content
ftalhadas

Simular futuras datas

Recommended Posts

Pessoal, bom dia!

 

Estou com um probleminha aqui, que na real não sei nem qual título poderia dar para o tópico da complexidade que ele está para mim.

 

Bom, seguinte, eu tenho um controle de contratos via um aplicativo, que nele tenho um banco de dados. O presidente da empresa me solicitou que quer a perspectiva de todos os recorrentes até o término do mesmo. Se vocês verem a imagem em anexo, da para entender melhor. Nesse contrato, faltam 20 parcelas. Eu consegui fazer o relatório mostrando o valor total até o fim do contrato, porém, ele queria tudo detalhado. No caso, teria um outro campo, chamado parcelas futuras, que mostraria a parcela 77, 78, 79, 80, 81... 

Ai que entra o meu problema. Eu não faço a mínima ideia de qual função do Oracle eu usaria para "simular" essas outras parcelas, e etc. Poderiam me ajudar, por favor?

 

 

Obrigado!
Felipe.

 

 

Capturar.JPG

Share this post


Link to post
Share on other sites

Estas PARCELAS  existem fisicamente no modelo ?

 

Ou são criadas à medida que são cobradas ?

 

 

Share this post


Link to post
Share on other sites

Não existem. São criadas a medida que são cobradas. Tenho apenas o mês "total" de referência, que seria a data de vencimento do contrato. No caso ali, é fev/2019, pois faltam 20 parcelas. Eu já ouvi falar de uma função chamada pipelined que poderia me ajudar, que com um loop dentro dela, iria ter que fazer alguma lógica entre esses campos de parcelas para ir gerando a quantidade de parcelas totais. Bom, só um comentário mesmo, gostaria de fazer de uma maneira mais fácil que você tiver em mente!

 

 

 

Share this post


Link to post
Share on other sites

--simulando uma tabela
 

select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual

--selecionando esta tabela
 

select cod,(ultima_parcela_paga+1) de,parcelas ate
from
(
select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual
)

--simulando uma sequncia
 

select rownum seq from user_tables where rownum < 21

--parcelas faltantes
 

select *
from
(select cod,(ultima_parcela_paga+1) de,parcelas ate
from
(
select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual
)) t1,
(select rownum seq from user_tables where rownum < 21) t2
where t2.seq between t1.de and t1.ate
order by 1,4

a ideia básica e usar o rownum para simular uma sequencia

Share this post


Link to post
Share on other sites
1 hora atrás, Motta disse:

--simulando uma tabela
 


select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual

--selecionando esta tabela
 


select cod,(ultima_parcela_paga+1) de,parcelas ate
from
(
select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual
)

--simulando uma sequncia
 


select rownum seq from user_tables where rownum < 21

--parcelas faltantes
 


select *
from
(select cod,(ultima_parcela_paga+1) de,parcelas ate
from
(
select 1 cod,5 ultima_parcela_paga,20 parcelas,123.45 valor from dual
union all
select 2 cod,5 ultima_parcela_paga,6 parcelas,234.56 valor from dual
union all
select 3 cod,2 ultima_parcela_paga,10 parcelas,111.11 valor from dual
union all
select 4 cod,5 ultima_parcela_paga,5 parcelas,222.22 valor from dual
)) t1,
(select rownum seq from user_tables where rownum < 21) t2
where t2.seq between t1.de and t1.ate
order by 1,4

a ideia básica e usar o rownum para simular uma sequencia

Hmm... saquei. Vou tentar implementar aqui.

Da uma olhada no que eu já fiz para conseguir chegar na consulta da imagem:

 

SELECT DISTINCT 

			DECODE(PSC.SITPROD,'A','ATIVO','B','BONIFICADO','C','CANCELADO','S','EM IMPLANTAÇÃO') AS SITPROD,
				CON.NUMCONTRATO
			, CON.CODPARC
			, P.NOMEPARC
			, CON.CODPROJSINT
			, PRJ.IDENTIFICACAO
			, CON.AD_CODTIPOPER
			, TOP.DESCROPER,
        P.AD_NOMECOMERCIAL
,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CON.AMBIENTE,'VL','Validador'),'SV','Vision'),'AU','Autorizador'),'AT','ATM'),'SB','Balance'),'ME','Modulo Extra'),'BD','Adm Banco De Dados'),'DC','Data Center'),'PC','Preparador'),'MH','Mant. HW'),'SS','Seguimento Saude'),'V/','Venda/'),'L/','Locacao/') AS COMERCIALIZADO

			, PSC.CODPROD
			, PRO.DESCRPROD
			, CON.DTBASEREAJ
			, PRE.REFERENCIA
			,(CASE WHEN PSC.SITPROD = 'S' THEN SYSDATE + 90 ELSE CON.DTREFPROXFAT END) AS DTREFPROXFAT
			,TO_CHAR(CON.DTTERMINO, 'MON/YY') AS VENC_ORIGINAL
			,TO_CHAR(ADD_MONTHS(CON.DTREFPROXFAT, (CON.PARCELAQTD - CON.PARCELAATUAL)-1), 'MON/YY') AS LIMITE_FATURA
			,CON.PARCELAQTD
			, CON.PARCELAATUAL
			, (CON.PARCELAQTD - CON.PARCELAATUAL)AS ParcRestante
			, PRE.VALOR AS VrUnitario
			, PSC.QTDEPREVISTA
			,(CASE WHEN PSC.SITPROD = 'A' THEN (PSC.QTDEPREVISTA*PRE.VALOR*(CASE WHEN CON.AD_CODTIPOPER =1798 THEN (SELECT M.COTACAO FROM TSICOT M WHERE M.CODMOEDA = 9 AND M.DTMOV = (SELECT MAX(M2.DTMOV) FROM TSICOT M2 WHERE M.CODMOEDA = M2.CODMOEDA )) ELSE 1 END)) ELSE 0 END) AS VLR_EM_VIGOR
			,(CASE WHEN PSC.SITPROD = 'S' THEN (PSC.QTDEPREVISTA*PRE.VALOR*(CASE WHEN CON.AD_CODTIPOPER =1798 THEN (SELECT M.COTACAO FROM TSICOT M WHERE M.CODMOEDA = 9 AND M.DTMOV = (SELECT MAX(M2.DTMOV) FROM TSICOT M2 WHERE M.CODMOEDA = M2.CODMOEDA )) ELSE 1 END)) ELSE 0 END) AS VR_EM_IMPLANTACAO
			,(ABS(CON.PARCELAQTD - CON.PARCELAATUAL)*(PSC.QTDEPREVISTA*PRE.VALOR)*(CASE WHEN CON.AD_CODTIPOPER =1798 THEN (SELECT M.COTACAO FROM TSICOT M WHERE M.CODMOEDA = 9 AND M.DTMOV = (SELECT MAX(M2.DTMOV) FROM TSICOT M2 WHERE M.CODMOEDA = M2.CODMOEDA )) ELSE 1 END)) AS VLR_BACKLOG_TOTAL

FROM TCSCON CON, TCSPSC PSC, TGFPRO PRO, TCSPRJ PRJ, TCSPRE PRE, TGFTOP TOP, TGFPAR P

      WHERE CON.NUMCONTRATO = PSC.NUMCONTRATO
            AND PRO.CODPROD = PSC.CODPROD
            AND PRJ.CODPROJ = CON.CODPROJSINT
            AND CON.ATIVO = 'S'
            AND PSC.SITPROD IN ('A', 'S', 'B')
            AND CON.NUMCONTRATO NOT IN (0, 1)
            AND PRE.NUMCONTRATO = CON.NUMCONTRATO
  		  AND PRE.CODPROD = PSC.CODPROD
            AND CON.AD_CODTIPOPER=TOP.CODTIPOPER
            AND CON.CODPARC = P.CODPARC
           
            AND PRE.REFERENCIA =
                   (SELECT MAX (R.REFERENCIA)
                      FROM TCSPRE R
                     WHERE R.NUMCONTRATO = CON.NUMCONTRATO
                       AND R.CODPROD = PRE.CODPROD
                       AND R.REFERENCIA < sysdate)
          
ORDER BY SITPROD, PRJ.IDENTIFICACAO, P.NOMEPARC, CON.NUMCONTRATO;

 

Share this post


Link to post
Share on other sites
PARCELAATUAL

  é seu "de"

 

PARCELAQTD

 

o seu "até"

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Motta
      Google e Oracle decidem na Suprema Corte briga judicial sobre Android
    • By Motta
      Oracle lança programa educacional para capacitar jovens na área de TI
    • By Maccio
      Estou tentando criar um relatório com total de horas trabalhadas do funcionários por dia, tenho uma tabela FRQ_digitacao onde eu tenho os dados para calcular o total de horas e se tiver com zero horas eu digo a ocorrência do mesmo, ex: falta, Folga, etc. Quero também colocar a informação de férias quando o mesmo estiver de férias, porém quando ele está de férias a tabela FRQ_digitacao fica sem registros nos dias de Férias, assim tenho que buscar a informação na tabela FLP_Ferias onde é lá que diz o gozoinicial e gozofinal, porém não estou conseguindo fazer essa comparação já que na tabela FRQ_digitacao nesses dias de ferias o funcionário fica sem registro.
       
      select T.CODINTFUNC, f.CHAPAFUNC, LISTAGG( CASE WHEN T.NORMALDIGIT=0 THEN OC.DESCMAPAOCORR WHEN t.DTDIGIT IS NULL THEN 'dt.dtdigit' --when dt.dtdigit between fe.inicio and fe.fim --then 'FER' ELSE to_char((TRUNC(T.NORMALDIGIT)+TRUNC(t.extradigit)+TRUNC(t.extranotdigit))+ ((trunc(((T.NORMALDIGIT-trunc(T.NORMALDIGIT))+(t.extradigit-trunc(t.extradigit))+(t.extranotdigit-trunc(t.extranotdigit)))/0.60))+ mod(((T.NORMALDIGIT - trunc(T.NORMALDIGIT))+(t.extradigit - trunc(t.extradigit))+(t.extranotdigit - trunc(t.extranotdigit))),0.60)),'FM99999D90', 'nls_numeric_characters=''.,''' ) END, ' ') within group (order by t.dtdigit) horas, MAX(FE.INICIO), MAX(FE.FIM ) from vw_funcionarios f, FRQ_DIGITACAOMOVIMENTO O, FRQ_OCORRENCIA OC, frq_digitacao t, (select f.codintfunc INT, f.chapafunc, max(fe.dtcompetfer)COMPET, MAX(fe.gozoinifer) INICIO, MAX(fe.Gozofinfer) FIM from flp_ferias fe, flp_funcionarios f where f.codintfunc=fe.codintfunc AND F.SITUACAOFUNC='A' and f.codigoempresa=1 AND FE.STATUSFERIAS='N' group by f.chapafunc, f.codintfunc) FE, (select t.DTDIGIT from frq_digitacao t WHERE t.dtdigit between '01-NOV-2019' AND '20-NOV-2019' group by t.dtdigit) DT where DT.DTDIGIT(+)=T.dtdigit and fe.INT=t.codintfunc and f.codintfunc=t.codintfunc AND F.CODIGOEMPRESA=1 and O.CODINTFUNC=T.CODINTFUNC AND T.DTDIGIT=O.DTDIGIT AND O.CODOCORR=OC.CODOCORR AND dt.dtdigit BETWEEN '01-NOV-2019' AND '20-NOV-2019' -- AND F.CODDEPTO BETWEEN 15 AND 15 AND O.STATUSDIGIT='N' and o.iddigit = (select max(p.iddigit) from frq_digitacaomovimento p where o.codintfunc=p.codintfunc and o.dtdigit=p.dtdigit AND P.STATUSDIGIT='N' and p.dtdigit between '01-NOV-2019' AND '20-NOV-2019') group by f.CHAPAFUNC, T.CODINTFUNC  



    • By ronimarcos.silva
      Estou com a seguinte situação: No Mysql eu consegui fazer em  "insert into" de uma única vez, com vários registros, conforme abaixo:
      insert into prefeitos (nome, cidade_id) VALUES ('Rodrigo Neves', 2), ('Caique Rosa Baldran', 9), ('Raquel Lira', 11), ('Maísa Albuquerque Sain', 12), ('Zenaldo Coutinho', null); Porém, no Oracle 12C, usando a mesma forma que no Mysql, está dando o seguinte erro: 
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'), ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'), ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'), ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100'); ORA-00933: comando SQL não encerrado adequadamente
      Será que a sintaxe no Oracle é diferente?
       
      Eu sei que assim funciona perfeitamente:
      insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '279', 'U', '5', '0', '0', '1360', '13730', '100', '31058', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '280', 'U', '5', '0', '0', '1360', '13730', '100', '31060', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '281', 'U', '5', '0', '0', '1360', '13730', '100', '31202', '100'); insert into e080rat (CODEMP, CODSER, SEQRAT, TIPRSC, CRIRAT, NUMPRJ, CODFPJ, CTAFIN, CTARED, PERCTA, CODCCU, PERRAT) values ('800', 'S0001', '282', 'U', '5', '0', '0', '1360', '13730', '100', '31203', '100');  
      Porém, eu tenho uma tabela com quase 100.000 registros e gostaria de fazer em um único "insert". Eu uso o PL/SQLDeveloper e quando faço o "insert" da forma acima, com vários "insert into", ele abre um novo documento para cada "insert into", nisso ele trava, fica horas rodando o "insert" e não conclui se for em um único "insert" como no Mysql, creio que não pesaria tanto.
      Tem uma forma mais fácil de fazer o "insert into" com muitos dados envolvidos?
      Desde já agradeço.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.