Bom dia, Chiappa.

Segue abaixo o código da minha função.
O insert seria a linha comentada.
Sei que o código é de péssima qualidade, mas é o que resolveu pra mim ,
como autodidata curioso.
É uma Aging List do contas a pagar contra receber.
Só que o cliente quer um histórico dessa aging list.





CREATE OR REPLACE
FUNCTION edu_fluxo(DTINICIAL DATE,DTFINAL DATE, intervalos varchar,
vencidos varchar)
  RETURN TABELA_edu_FLUXO IS

  CURSOR CR_FLUXO IS
select
vencidos AS VENCIDO
, intervalos AS INTERVALO
, 0 AS REC_VERBA_QTD
, 0 REC_VERBA_VALOR
,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAG   IS NULL AND CODCOB IN ('DH', 'D'
))REC_AVISTA_QTD
,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAG   IS NULL AND CODCOB IN ('CH', 'CHC', 'CHP','CHV'
 ))REC_CHEQUES_QTD
,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAG   IS NULL AND CODCOB IN ('237', 'C'
 ))REC_TITULOS_QTD
,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAG   IS NULL AND CODCOB IN
('237','C','CH','CHC','DH','D','CHP','CHV'))REC_TOTAL_QTD
,(SELECT COUNT(*) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAGTO IS NULL AND TIPOLANC = 'P'
 )PAG_PROV_QTD
,(SELECT COUNT(*) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAGTO IS NULL AND TIPOLANC = 'C'
 )PAG_CONF_QTD
,(SELECT COUNT(*) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL
AND DTPAGTO IS NULL
  )PAG_TOTAL_QTD

,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAG   IS NULL AND CODCOB IN ('DH','D'
  ))REC_AVISTA_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAG   IS NULL AND CODCOB IN ('CH','CHC','CHP','CHV'
  ))REC_CHEQUES_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAG   IS NULL AND CODCOB IN ('237','C'
 ))REC_TITULOS_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAG   IS NULL AND CODCOB IN
('237','C','CH','CHC','DH','D','CHP','CHV'))REC_TOTAL_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'P'
 )PAG_PROV_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'C'
 )PAG_CONF_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM pagar  WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAGTO IS NULL
  )PAG_TOTAL_VALOR
,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND
DTFINAL AND DTPAG   IS NULL
AND CODCOB IN ('237','C','CH','CHC','DH','D','CHP','CHV'))
/
(SELECT nvl(SUM(VALOR),0) FROM receber WHERE DTPAG   IS NULL AND CODCOB IN
('237','C','CH','CHC','DH','D','CHP','CHV')) * 100 AS REC_TOTAL_PERC
, 0 AS SALDO
from DUAL ;

  RETORNO TABELA_edu_FLUXO;
BEGIN
  RETORNO := TABELA_edu_FLUXO();

  FOR ITEM IN CR_FLUXO LOOP
    RETORNO.EXTEND;

    RETORNO(RETORNO.COUNT) := TIPO_edu_FLUXO( VENCIDO                    =>
NULL,
                                              INTERVALO                  =>
NULL,
                                              REC_VERBA_QTD              =>
NULL,
                                              REC_VERBA_VALOR            =>
NULL,
                                              REC_AVISTA_QTD             =>
NULL,
                                              REC_AVISTA_VALOR           =>
NULL,
                                              REC_CHEQUES_QTD            =>
NULL,
                                              REC_CHEQUES_VALOR          =>
NULL,
                                              REC_TITULOS_QTD            =>
NULL,
                                              REC_TITULOS_VALOR          =>
NULL,
                                              REC_TOTAL_QTD              =>
NULL,
                                              REC_TOTAL_VALOR            =>
NULL,
                                              REC_TOTAL_PERC             =>
NULL,
                                              PAG_PROV_QTD               =>
NULL,
                                              PAG_PROV_VALOR             =>
NULL,
                                              PAG_CONF_QTD               =>
NULL,
                                              PAG_CONF_VALOR             =>
NULL,
                                              PAG_TOTAL_QTD              =>
NULL,
                                              PAG_TOTAL_VALOR            =>
NULL,
                                              SALDO                      =>
NULL);


RETORNO(RETORNO.COUNT).VENCIDO              :=ITEM.VENCIDO;
RETORNO(RETORNO.COUNT).INTERVALO            :=ITEM.INTERVALO;
RETORNO(RETORNO.COUNT).REC_VERBA_QTD        :=ITEM.REC_VERBA_QTD;
RETORNO(RETORNO.COUNT).REC_VERBA_VALOR      :=ITEM.REC_VERBA_VALOR;
RETORNO(RETORNO.COUNT).REC_AVISTA_QTD       :=ITEM.REC_AVISTA_QTD;
RETORNO(RETORNO.COUNT).REC_AVISTA_VALOR     :=ITEM.REC_AVISTA_VALOR;
RETORNO(RETORNO.COUNT).REC_CHEQUES_QTD      :=ITEM.REC_CHEQUES_QTD;
RETORNO(RETORNO.COUNT).REC_CHEQUES_VALOR    :=ITEM.REC_CHEQUES_VALOR;
RETORNO(RETORNO.COUNT).REC_TITULOS_QTD      :=ITEM.REC_TITULOS_QTD;
RETORNO(RETORNO.COUNT).REC_TITULOS_VALOR    :=ITEM.REC_TITULOS_VALOR;
RETORNO(RETORNO.COUNT).REC_TOTAL_QTD        :=ITEM.REC_TOTAL_QTD;
RETORNO(RETORNO.COUNT).REC_TOTAL_VALOR      :=ITEM.REC_TOTAL_VALOR;
RETORNO(RETORNO.COUNT).REC_TOTAL_PERC       :=ITEM.REC_TOTAL_PERC;
RETORNO(RETORNO.COUNT).PAG_PROV_QTD         :=ITEM.PAG_PROV_QTD;
RETORNO(RETORNO.COUNT).PAG_PROV_VALOR       :=ITEM.PAG_PROV_VALOR;
RETORNO(RETORNO.COUNT).PAG_CONF_QTD         :=ITEM.PAG_CONF_QTD;
RETORNO(RETORNO.COUNT).PAG_CONF_VALOR       :=ITEM.PAG_CONF_VALOR;
RETORNO(RETORNO.COUNT).PAG_TOTAL_QTD        :=ITEM.PAG_TOTAL_QTD;
RETORNO(RETORNO.COUNT).PAG_TOTAL_VALOR      :=ITEM.PAG_TOTAL_VALOR;
RETORNO(RETORNO.COUNT).SALDO                :=ITEM.SALDO;

--INSERT INTO edu_FLUXO_LOG ( VENCIDO,INTERVALO)  VALUES ( ITEM.VENCIDO,
ITEM.INTERVALO);
--insert into edu_log_fluxo select * from table (TIPO_edu_FLUXO);


  END LOOP;


  RETURN RETORNO;

EXCEPTION
  WHEN OTHERS THEN
    raise_application_error(-20001, 'Erro motivo: ' || SQLERRM || '. Linha:
' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END;
--Perdomo 12/09/2018
/



-- End of DDL Script for Function edu.edu_FLUXO


On Mon, Sep 24, 2018 at 3:19 PM jlchia...@yahoo.com.br [oracle_br] <
oracle_br@yahoogrupos.com.br> wrote:

>
>
> Bom, embora eu NÂO USE ISSO (entre outros MUITOS limitadores, vc está
> basicamente trabalhando com ARRAYS EM MEMÓRIA - Obviamente arrays esses
> sujeitos às limitações de PGA do Oracle -, E obviamente Também ao fato de
> que a própria linguagem SQL não foi completamente instrumentada pra
> trabalhar com isso), Sei que  pra vc poder fazer INSERT INTO tabelareal
> (SELECT * FROM objecttypetable), antes de mais nada vc tem que fazer o
> SELECT : se a sua versão for no mínimo 12c (cfrme indicado em
> https://stackoverflow.com/questions/5165580/how-to-use-a-table-type-in-a-select-from-statement
> e em
> https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1)
> em princípio vc pode usar o operador TABLE, tipo SELECT * FROM
> TABLE(nomedasuaTABLEOFtype) .... SE a sua versão (a qual vc Não nos Diz
> qual é) for Inferior à 12c, Provavelmente vc vai ter que usar Object Types
> e  Nested Tables, vide
> https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:774225935270
> .....
>
> []s
>
>   Chiappa
>
>   OBS : caso ainda restem dúvidas, manda pra gente a versão EXATA do
> RDBMS, os CREATE TABLEs e os INSERTs pra gente ter uma massinha de testes,
> E explica em detalhes a lógica que vc quer implementar, que a gente pode
> tentar palpitar mais em cima e/ou escrever código de exemplo mais
> específico...
> 
>


-- 

Eduardo Perdomo
Consultor de Implantação
Grupo PC Sistemas - www.grupopc.com.br
(21) 6845-8592
panc...@gmail.com
eduardo.perd...@pcinformatica.com.br
Blog: eduardo.perdomo.nom.br

Responder a