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 johnklo
      COM BASE NA TABELA HR DO ORACLE
      Preciso criar uma sub-rotina (procedure) que imprima na tela o número de funcionários (employees) agrupados por departamentos (department_id). Deve-se ordenar a saída em ordem decrescente pela quantidade de departamentos. Pode-se utilizar qualquer forma de cursor para imprimir o resultado.
    • By EREGON
      Olá,
      ao chamar a função, estou a receber o erro:
       
      "ORA-01422: extracção exacta devolve mais que o número pedido de linhas"
       
      create or replace FUNCTION "CALC_ADDT_SIM_DISC" (ACCT_INPUT VARCHAR2) RETURN VARCHAR2 IS SIM_MSISDN VARCHAR2(20); BEGIN SELECT CASE WHEN ADDT_DISC_1 = 1 THEN mu.MSISDN WHEN ADDT_DISC_1 > 1 THEN (SELECT DISTINCT t02.MSISDN FROM CDM.DMKV_TRANSP_VAR_RESULT_02 t02 WHERE SERV_ACCT_OLDER_MSISDN_FLG = 'Y' AND PRICING_PLAN_TYPE IN ('valor1', 'valor2') AND t02.DW_SERV_ST_ID='100000003' AND t02.CUST_ACCT_EXT_KEY = ACCT_INPUT ) END MSISDN_ADDT_DISC INTO SIM_MSISDN FROM( SELECT DISTINCT CUST_ACCT_EXT_KEY, COUNT(CUST_ACCT_EXT_KEY) AS ADDT_DISC_1 FROM MOBILE_UPSELL WHERE FLAG_ADDITIONAL_SIM_DISCOUNT = '0' GROUP BY CUST_ACCT_EXT_KEY )t, MOBILE_UPSELL mu WHERE t.CUST_ACCT_EXT_KEY = mu.CUST_ACCT_EXT_KEY AND t.CUST_ACCT_EXT_KEY = ACCT_INPUT; RETURN SIM_MSISDN; END; O que estou a fazer de errado?
       
      Obrigado
    • By Querendo_ser_Nerd
      Bom dia , 
       
      Pessoal, realizei diversas pesquisas em Fórum e Artigos, meu caso seria, criei uma aplicação na qual realiza a importação de arquivo em XLS em um DataGridView , está carregando a informação a principio em uma coluna (Duvida as colunas no Excel algumas contem sinais e espaço como "Cód. Cliente" como faço select * from [plan1$] para retornar apenas pela posição da coluna ex. select [A1] from [plan1$] ) , certo , carreguei no DataGrid, creei um botão para carregar as informações do data grid para o BD Oracle, passei toda a configuração conexão e realizei o INSERT , mas não popula com as informações do grid na tabela, apenas quando no INSERT ...Values (1) por exemplo o mesmo inseri o valor na tabela no banco. Já realizei a depuração mas não consigo. Sou novo nessa linguagem. Obg pela Ajuda.
       
      using System; using System.Data; using System.Data.OleDb; // intregração Excel using System.Data.OracleClient; using System.Windows.Forms; namespace WindowsFormsLog {     public partial class Form4 : Form     {                  public Form4()         {             InitializeComponent();         }         private void button1_Click(object sender, EventArgs e)         {             OpenFileDialog openFileDialog = new OpenFileDialog();             if(openFileDialog.ShowDialog()== System.Windows.Forms.DialogResult.OK)             {                 this.textBox1.Text = openFileDialog.FileName;             }         }                 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)         {                     }         public void button2_Click_1(object sender, EventArgs e)         {              string PathCpnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + textBox1.Text + ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";             OleDbConnection conn = new OleDbConnection(PathCpnn);             //LINQ c#              OleDbDataAdapter myDbDataAdapter = new OleDbDataAdapter("Select *  from [Plan1$]", conn); // planilha deve conter o nome Plan1             DataTable dt = new DataTable(); // armazena dado               myDbDataAdapter.Fill(dt);               dataGridView1.DataSource = dt;             dataGridView1.Columns[0].HeaderText = "NROPEDCLIENTE"; //alterando nome das colunas             //  dataGridView1.Columns[1].HeaderText = "DTAINCLUSAO";                  }             private void Form4_Load(object sender, EventArgs e)         {         }         public void button3_Click(object sender, EventArgs e)         {             string OracleConn = @"Data Source = ok; User ID =ok ; Password = ok; Unicode = True";             OracleConnection conexao = new OracleConnection(OracleConn);                          try             {                                if (dataGridView1.Rows.Count > 1)                 {                     for (int i = 1; i <= dataGridView1.Rows.Count ; i++)//-1                     {                         int dataGridView1 = Convert.ToInt32(this.dataGridView1.Rows[i].Cells[0].Value);                         conexao.Open();                         OracleCommand comando = new OracleCommand ("insert into pedido values(@NROPEDCLIENTE)", conexao);                           comando.Parameters.AddWithValue("NROPEDCLIENTE", dataGridView1);                                             comando.ExecuteNonQuery();                         MessageBox.Show("Insert");                         conexao.Close();                     }                 }             }             catch (Exception)             {                 MessageBox.Show("Erro ao inserir"); // Sempre finaliza aqui depuração             }                      }                }     }
          
    • By emerod
      Boa tarde!
       
      Estou montando uma rotina de backup para um banco de dados oracle, com o seguinte comando:
       
      expdp compiere/compiere@COMPIERE directory=compierebkp schemas=compiere dumpfile=ExpDat.dmp NOLOGFILE=Y
       
      Porém está retornando estes erros:
       
      Conectado a: Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
      ORA-39001: valor de argumento invßlido
      ORA-39000: especificaþÒo de arquivo de dump incorreto
      ORA-31641: nÒo Ú possÝvel criar o arquivo de dump "c:\compiere2\data/ExpDat.dmp"
      ORA-27040: erro ao criar arquivo, nÒo foi possÝvel criar o arquivo
      Linux-x86_64 Error: 2: No such file or directory
      Additional information: 1
       
      O banco está instalado em uma maquina linux e eu estou montando o backup em uma maquina linux.
       
      Segue a tela com o detalhamento do erro:

       
      Alguém pode me ajudar?
       
      Obrigado
       
      Emerson Ricardo Rodrigues
       
       
    • By sadamkim
      Pessoal,  me deparei com um problema.
      Tenho uma Tabela, onde fica armazenada as transações dos clientes.
      Cada transação tem vários registros com o campo STATUS.
       
      Preciso fazer um MAX, para pegar a ultima transação por data, e assim saber qual foi o status da mesma.
      Mas ao utilizar o MAX e selecionar o campo STATUS ele me traz todos os registro, porque o mesmo não pode agrupar por status, por conter valores diferentes.
      É possível criar alguma forma de selecionar no meu caso a ultima transação por data (MAX) e trazer o campo status?
      Seja com alguma procedure, ou outra função do ORACLE.


×

Important Information

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