Fórum Stored Procedure com problemas #51106

23/05/2005

0

Criei uma stored procedure e a mesma não está funcionando da maneira que deveria, talvez por nunca ter feito uma em IB/FB eu deva ter feito algo errado.
O Objetivo dela e checar de um registro pai tem mais de 10 filhos e se houver, gerar novos registros pai e associar os registros filhos a esses novos registros pai, ou seja, se eu possuo um registro pai de numero 416 com 21 itens, gostaria que ele deixasse os 10 primeiros itens no 416 e gerasse mais 2 registros pai e associasse os prox 10 itens ao 417 e 1 item ao 418.
O Problema é que minha rotina está gerando somente 1 novo registro pai e associando somente 1 item a ele.
Debugei ela e aparentemente está tudo certo!!!
Será que alguma boa alma pode me ajudar???
O código que fiz é o seguinte:

CREATE PROCEDURE DIVIDE_CONTROLE (
NR_CONTROLE INTEGER)
AS
DECLARE VARIABLE CONT1 INTEGER;
DECLARE VARIABLE NEW_CONTROL INTEGER;
DECLARE VARIABLE QTD_ITENS INTEGER;
DECLARE VARIABLE VAR_ITEM_NF INTEGER;
DECLARE VARIABLE VAR_CONTROLE_ITEM_NF INTEGER;
begin
/* Verifica se o controle possui mais de 10 itens */
SELECT count(*)
FROM nfsitem
WHERE controle = :nr_controle
INTO :qtd_itens;
/* Se a quantidade de itens for superior a 10, separa em outros controles */
IF (qtd_itens > 10) then
begin
cont1 = 1;

/* Seleciona os itens do controle */
for SELECT item
, controle
FROM nfsitem
WHERE controle = :nr_controle
AND item > 10
INTO :var_item_nf
, :var_controle_item_nf
do
begin
/* Se o contador for = 1, insere um novo controle */
if (cont1 = 1) then
begin
/* Pega novo controle */
new_control=GEN_ID(NFSCAB_CONTROLE,1);
/* Insere novo controle */
insert into nfscab
select :new_control
, null
, CGC
, SERIE
, ID_TRANSPO
, ID_TRANSTIPO
, ID_BANCO
, ID_CONDPAG
, ID_OPERACAO
, ID_AGENCIA
, ID_CONTA
, ID_TIPONF
, PLACA
, MARCA
, DATA_EMISSAO
, NUMERO
, DATA_SAIDA
, OUTRAS_DESPESAS
, VIA_TRANSPORTE
, ESPECIE
, TIPO_FRETE
, PESO_BRT
, VALOR_FRETE
, VALOR_SEGURO
, QTDE_VOLUME
, PESO_LIQ
, STATUS
, OBSERVACAO
, EMITE_DUPL
, SITUACAO_DUPL
, SITUACAO
, EMITE_BOL
, SITUACAO_BOL
, TAXA_FINANC
, DESCR_SERVICO
, VARUFESP
, VALOR_ISS
, VALOR_SERVICOS
, FECHAMENTO
, DATA_CAD
, VENDEDOR
, PEDIDO
, DUPLICATA
, OBS_DESTINAT
, STR_FLAGTERCEIROS_NFSCAB
, STR_CNPJCLIENTE_NFSCAB
, INT_ID_IUC
, STR_RELACIONANFE
, NFDEPOSITANTE
, SERIENFDEPOSITANTE
, DT_EMIS_NFDEPOSITANTE
, OBSERVACAO_2
, STR_LIVRO_SAIDA
from nfscab
where controle = :nr_controle;
end
/* Altera os itens do controle principal e joga o numero do novo controle */
update nfsitem
set item = :cont1
, controle = :new_control
where controle = :var_controle_item_nf
and item = :var_item_nf;
/* Se o contador for = 10, passa para 1, para criar novo controle */
if (cont1 = 10 ) then
cont1 = 1;
else
cont1 = cont1 + 1;
suspend;
end
end
suspend;
end


Renatotm

Renatotm

Responder

Posts

24/05/2005

Ronaldo.cutu

EU TESTEI A SEGUINTE PROCEDURE E DEU CERTO


CREATE PROCEDURE DIVIDE_CONTROLE (
NR_CONTROLE INTEGER)
AS
DECLARE VARIABLE CONT1 INTEGER;
DECLARE VARIABLE NEW_CONTROL INTEGER;
DECLARE VARIABLE QTD_ITENS INTEGER;
DECLARE VARIABLE VAR_ITEM_NF INTEGER;
DECLARE VARIABLE VAR_CONTROLE_ITEM_NF INTEGER;
begin
/* Verifica se o controle possui mais de 10 itens */
SELECT count(*)
FROM nfsitem
WHERE controle = :nr_controle
INTO :qtd_itens;

/* Se a quantidade de itens for superior a 10, separa em outros controles */
IF (qtd_itens > 10) then
begin
cont1 = 1;
/* Seleciona os itens do controle */
for
SELECT item , controle
FROM nfsitem
WHERE controle = :nr_controle
AND item > 10
INTO :var_item_nf, :var_controle_item_nf
do begin

/* Se o contador for = 1, insere um novo controle */
if (cont1 = 1) then
begin
/* Pega novo controle */
new_control = GEN_ID(NFSCAB_CONTROLE,1);
/* Insere novo controle */
insert into nfscab
select :new_control, *RESTANTES DE SEUS CAMPOS*
from nfscab
where controle = :nr_controle;
end

/* Altera os itens do controle principal e joga o numero do novo controle */
update nfsitem set
item = :cont1
, controle = :new_control
where controle = :var_controle_item_nf
and item = :var_item_nf;

/* Se o contador for = 10, passa para 1, para criar novo controle */
if (cont1 = 10 ) then
cont1 = 1;
else
cont1 = cont1 + 1;
end
end
suspend;
end


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar