Pular para o conteúdo
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #75585
    Anônimo

      Ola , tudo bem
      Estou comecando agora a desenvolver usando pl/sql e estou me deparando com um problema , bem acho q simples. Criei uma procedure e dentro criei um cursor e faco um calculo simples e logo em seguida tento retornar esses registros. Resumindo, a cada vez q fosse dado um loop dentro do cursor eu conseguisse trazer o registro corrente.

      Estou anexando a procedure se alguem puder me ajudar , eu agradeco

      CREATE OR REPLACE PROCEDURE FLUXO_CAIXA (
      in_data_inicial IN DATE,
      in_data_final IN DATE,
      in_conta IN NUMBER,
      out_conta_pai OUT NUMBER,
      out_conta_filha OUT NUMBER,
      out_nome_conta OUT VARCHAR2,
      out_cod_fonec OUT NUMBER,
      out_nome_fornec OUT VARCHAR2,
      out_historico OUT VARCHAR2,
      out_vlr_d OUT NUMBER,
      out_vlr_c OUT NUMBER
      )
      IS

      var_fornec_ant NUMBER := 0;
      var_vlr_d NUMBER (15, 2) := 0;
      var_vlr_c NUMBER (15, 2) := 0;
      var_conta_pai NUMBER (10);
      var_conta_filha NUMBER (10);
      var_nome_conta VARCHAR2 (30);
      var_cod_fonec NUMBER;
      var_nome_fornec VARCHAR2 (40);
      var_historico VARCHAR2 (255);
      cont number default 1;

      CURSOR cur_fluxo
      IS
      SELECT a.codlanca AS lancto, a.dtmovtobco AS DATA,
      b.contrapartitemlanca AS conta_banco,
      b.debitocreditoitemlanca AS tipo,
      c.nomecontabco AS desc_conta, b.codcontactb AS contra_partida,
      UPPER (d.nomeconta) AS descricao_conta,
      UPPER (b.historicoitemlanca) AS historico,
      b.vritemlanca AS valor
      FROM bcomovto a, ctbitlnc b, bcoconta c, ctbconta d, ctbparam e
      WHERE a.codlanca = b.codlanca

      AND b.contrapartitemlanca = c.codcontactb
      AND d.codcontactb = b.codcontactb
      AND d.nroplano = e.nroplano
      AND b.nroplano = e.nroplano
      AND e.codigoempresa = a.codigoempresa
      AND e.codigofl = a.codigofl
      AND a.dtmovtobco /*período*/
      BETWEEN in_data_inicial
      AND in_data_final
      AND a.codigoempresa = 1 /*empresa*/
      AND a.codigofl = 1 /*filial*/
      AND b.contrapartitemlanca = in_conta /*conta do banco*/
      ORDER BY b.codcontactb;

      reg_fluxo cur_fluxo%ROWTYPE;
      — declaracao dos registro q recebera os valores da consulta
      BEGIN
      OPEN cur_fluxo;

      FETCH cur_fluxo
      INTO reg_fluxo;

      var_fornec_ant := reg_fluxo.contra_partida;

      WHILE cur_fluxo%FOUND
      LOOP
      IF (reg_fluxo.contra_partida = var_fornec_ant)
      THEN
      IF reg_fluxo.tipo = ‘D’
      THEN
      var_vlr_d := var_vlr_d + reg_fluxo.valor;
      ELSIF reg_fluxo.tipo = ‘C’
      THEN
      var_vlr_c := var_vlr_c + reg_fluxo.valor;
      END IF;
      ELSIF (reg_fluxo.contra_partida <> var_fornec_ant)
      THEN
      /* Aqui neste ponto esse registro atendeu as minhas condicoes entao deveriam ser retornado
      Resumindo seria um retorno de multiplas linhas.
      */
      out_conta_pai := var_conta_pai;
      out_conta_filha := var_conta_filha;
      out_nome_conta := var_nome_conta;
      out_cod_fonec := var_fornec_ant;
      out_nome_fornec := var_nome_fornec;
      out_historico := var_historico;
      out_vlr_d := var_vlr_d;
      out_vlr_c := var_vlr_c;
      var_fornec_ant := reg_fluxo.contra_partida;

      END IF;

      var_conta_pai := 0;
      var_conta_filha := reg_fluxo.conta_banco;
      var_nome_conta := reg_fluxo.desc_conta;
      var_nome_fornec := reg_fluxo.descricao_conta;
      var_historico := reg_fluxo.historico;

      FETCH cur_fluxo
      INTO reg_fluxo;
      END LOOP;

      CLOSE cur_fluxo;
      END fluxo_caixa; —

      #75607
      Anônimo

        nao fiz teste no seu codigo, mas tenta o seguinte:

        LOOP
        FETCH cur_fluxo
        INTO reg_fluxo;

        EXIT WHEN c_dadosCalculo%NOTFOUND;
        

        END LOOP;

        CLOSE reg_fluxo;

        no lugar do while…
        pra q um fetch fora e dentro do while? acho q colocando no inicio do loop resolve. qlqr coisa teste o codigo

        #75609
        Anônimo

          Amigo , obrigado pela dica, mas oq acontece e o seguinte desta forma esta me trazendo somente o ultimo registro , teria qser +- assim:

          select * from assetur_Fluxo(’01/03/2006′,’31/03/2006′,10004);

          onde parametro 1 -> Data inicial
          parametro 2 -> Data Final
          parametro 3 -> Numero do caixa/conta banco

          e esta procedure me devolver assim :

          Contra Partida – Fornecedor Entradas(+) Saidas(-)
          40004 -Ipiranga Distribuiodora 0,00 1500,00
          51584 -Banco Brasil 35.000.00 35.000.00
          13544 -Assetur 65.000.00 25.000.00
          12345 -Dipex Comercio de Auto 0.00 3.500,00
          23457 -Central das Borrachas 0.00 2.500,00
          45766 -Banco Itau 50.000.00 0.00

          resumindo cara , so ta pegando pra mim retornar estes registros , vou anexar ela aqui pra vc dar uma olhada, se vc tiver alguem ai ou vc mesmo que possa me dar uma luz ai , eu agradeco.

          Bom eu acho q se eu criace uma tabela temporaria, tavez resolveria meu problema , mas eu nao tenho previlegios no banco.

          Valeu

          PROCEDURE ASSETUR_FLUXO_CAIXA (
          in_data_inicial IN DATE,
          in_data_final IN DATE,
          in_conta IN NUMBER,
          out_conta_pai OUT NUMBER,
          out_conta_filha OUT NUMBER,
          out_nome_conta OUT VARCHAR2,
          out_cod_fonec OUT NUMBER,
          out_nome_fornec OUT VARCHAR2,
          out_historico OUT VARCHAR2,
          out_vlr_d OUT NUMBER,
          out_vlr_c OUT NUMBER
          )
          IS

          var_fornec_ant NUMBER := 0;
          var_vlr_d NUMBER (15, 2) := 0;
          var_vlr_c NUMBER (15, 2) := 0;
          var_conta_pai NUMBER (10);
          var_conta_filha NUMBER (10);
          var_nome_conta VARCHAR2 (30);
          var_cod_fonec NUMBER;
          var_nome_fornec VARCHAR2 (40);
          var_historico VARCHAR2 (255);
          cont number default 1;

          CURSOR cur_fluxo
          IS
          SELECT a.codlanca AS lancto, a.dtmovtobco AS DATA,
          b.contrapartitemlanca AS conta_banco,
          b.debitocreditoitemlanca AS tipo,
          c.nomecontabco AS desc_conta, b.codcontactb AS contra_partida,
          UPPER (d.nomeconta) AS descricao_conta,
          UPPER (b.historicoitemlanca) AS historico,
          b.vritemlanca AS valor
          FROM bcomovto a, ctbitlnc b, bcoconta c, ctbconta d, ctbparam e
          WHERE a.codlanca = b.codlanca

                 AND b.contrapartitemlanca = c.codcontactb
                 AND d.codcontactb = b.codcontactb
                 AND d.nroplano = e.nroplano
                 AND b.nroplano = e.nroplano
                 AND e.codigoempresa = a.codigoempresa
                 AND e.codigofl = a.codigofl
                 AND a.dtmovtobco                                        /*período*/
                        BETWEEN in_data_inicial
                            AND in_data_final
                 AND a.codigoempresa = 1                                 /*empresa*/
                 AND a.codigofl = 1                                       /*filial*/
                 AND b.contrapartitemlanca = in_conta             /*conta do banco*/
            ORDER BY b.codcontactb;
          

          reg_fluxo cur_fluxo%ROWTYPE; — declaracao dos registro q recebera os valores da consulta

          BEGIN
          OPEN cur_fluxo;

          FETCH cur_fluxo INTO reg_fluxo;

          var_fornec_ant := reg_fluxo.contra_partida;

          WHILE cur_fluxo%FOUND
          LOOP
          IF (reg_fluxo.contra_partida = var_fornec_ant)
          THEN
          IF reg_fluxo.tipo = ‘D’
          THEN
          var_vlr_d := var_vlr_d + reg_fluxo.valor;
          ELSIF reg_fluxo.tipo = ‘C’
          THEN
          var_vlr_c := var_vlr_c + reg_fluxo.valor;
          END IF;
          ELSIF (reg_fluxo.contra_partida var_fornec_ant)
          THEN
          /* Aqui neste ponto esse registro atendeu as minhas condicoes entao deveriam ser retornado
          Resumindo seria um retorno de multiplas linhas.
          */
          out_conta_pai := var_conta_pai;
          out_conta_filha := var_conta_filha;
          out_nome_conta := var_nome_conta;
          out_cod_fonec := var_fornec_ant;
          out_nome_fornec := var_nome_fornec;
          out_historico := var_historico;
          out_vlr_d := var_vlr_d;
          out_vlr_c := var_vlr_c;
          var_fornec_ant := reg_fluxo.contra_partida;
          END IF;

            var_conta_pai := 0;
            var_conta_filha := reg_fluxo.conta_banco;
            var_nome_conta := reg_fluxo.desc_conta;
            var_nome_fornec := reg_fluxo.descricao_conta;
            var_historico := reg_fluxo.historico;
          
            FETCH cur_fluxo
            INTO reg_fluxo;
          

          END LOOP;

          CLOSE cur_fluxo;
          END assetur_fluxo_caixa;

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress