- Este tópico contém 2 respostas, 1 voz e foi atualizado pela última vez 18 anos, 7 meses atrás por Anônimo.
-
AutorPosts
-
23 de abril de 2006 às 5:34 pm #75585Anô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
)
ISvar_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.codlancaAND 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; —27 de abril de 2006 às 6:12 pm #75607Anônimonao 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 codigo27 de abril de 2006 às 10:40 pm #75609AnônimoAmigo , 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 bancoe 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.00resumindo 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
)
ISvar_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.codlancaAND 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; -
AutorPosts
- Você deve fazer login para responder a este tópico.