Fórum Problema na Stored Procedure #52200
14/08/2005
0
Está calculando tudo certo, o problema é que ela deveria trabalhar com todos os dados da tabela, pouco mais de 3000 registros, mas só está utilizando os 157 primeiros.
Por que isso acontece?
Como resolver?
Catunda
Curtir tópico
+ 0Posts
15/08/2005
Gandalf.nho
Gostei + 0
15/08/2005
Afarias
T+
Gostei + 0
15/08/2005
Catunda
1-Seleciona os dados de uma tabela ( no caso todos os registros ).
2-Seleciona dados de outras 3 tabelas relacionados com o registro corrente da primeira tabela.
3-Executa alguns calculos.
4-Grava os resultados obtidos nos calculos em determinados campos da primeira tabela.
obs: Fiz um outro teste agora, sem mudar nada na procedure, e ela só utilizou os primeiros 72 registros.
Gostei + 0
15/08/2005
Catunda
SET TERM ^ ;
CREATE PROCEDURE NEW_CALC_IPTU (
E_MIN NUMERIC(15,2),
E_MAX NUMERIC(15,2))
RETURNS (
V_IPTU NUMERIC(15,2),
V_VVT NUMERIC(15,2),
V_VVE NUMERIC(15,2),
V_MT NUMERIC(15,2),
V_ME NUMERIC(15,2),
SFAT_T NUMERIC(15,2),
SFAT_E NUMERIC(15,2))
AS
DECLARE VARIABLE SEQX INTEGER;
DECLARE VARIABLE A_T NUMERIC(15,2);
DECLARE VARIABLE A_E NUMERIC(15,2);
DECLARE VARIABLE VAR1 INTEGER;
DECLARE VARIABLE VAR2 INTEGER;
DECLARE VARIABLE VAR3 NUMERIC(15,2);
DECLARE VARIABLE V_D INTEGER;
DECLARE VARIABLE V_S INTEGER;
DECLARE VARIABLE V_Q INTEGER;
DECLARE VARIABLE V_SC INTEGER;
DECLARE VARIABLE V_LOG INTEGER;
DECLARE VARIABLE V_26 NUMERIC(15,2);
DECLARE VARIABLE V_27 NUMERIC(15,2);
DECLARE VARIABLE V_28 NUMERIC(15,2);
DECLARE VARIABLE V_29 NUMERIC(15,2);
DECLARE VARIABLE V_30 NUMERIC(15,2);
DECLARE VARIABLE V_31 NUMERIC(15,2);
DECLARE VARIABLE V_TIPO_E INTEGER;
DECLARE VARIABLE X_IPTU NUMERIC(15,2);
DECLARE VARIABLE X_LOTE INTEGER;
DECLARE VARIABLE X_UNID INTEGER;
begin
/* Procedure Text */
for select a1.sequencial, a1.area_terreno, a1.area_edificacao, a1.logradouro,
a1.distrito, a1.setor, a1.quadra, a1.secao, a1.iptu, a1.lote, a1.unidade
from bci a1
order by a1.sequencial
into :seqx,:a_t,:a_e,:v_log,:v_d,:v_s,:v_q,:v_sc,:x_iptu,:x_lote,:x_unid do
begin
sfat_t=1;
for select b1.imovel, b2.fator from bci_caract b1, fatores b2
where b1.subitem>0 and b1.subitem is not null and
b1.subitem = b2.subitem and b2.tipo=´T´ and b1.imovel=:seqx and
b2.fator > 0 and b2.fator is not null
into :var1,:var3 do
sfat_t=:sfat_t*:var3;
select c0.subitem from bci_caract c0 where c0.imovel=:seqx and
c0.subitem in (26,27,28,29,30,31) into v_tipo_e;
select c1.imovel, sum(c2.fator) from bci_caract c1, fatores c2
where c1.subitem>0 and c1.subitem is not null and
c1.subitem = c2.subitem and c2.tipo=´E´ and c1.imovel=:seqx
group by c1.imovel into :var2,:sfat_e;
select d1.vm2t, d1.ve26, d1.ve27, d1.ve28, d1.ve29, d1.ve30,
d1.ve31 from setores d1
where d1.codigo=:v_log and d1.distrito=:v_d and d1.setor=:v_s and
d1.quadra=:v_q and d1.secao=:v_sc
into :v_mt, :v_26, :v_27, :v_28, :v_29, :v_30, :v_31;
if (v_tipo_e=26) then v_me=v_26;
if (v_tipo_e=27) then v_me=v_27;
if (v_tipo_e=28) then v_me=v_28;
if (v_tipo_e=29) then v_me=v_29;
if (v_tipo_e=30) then v_me=v_30;
if (v_tipo_e=31) then v_me=v_31;
if ((a_e is null)or(a_e=0)) then v_me=0;
v_vvt = :a_t * :v_mt * :sfat_t;
v_vve = :a_e * :v_me * (:sfat_e / 100);
if (:a_e>0) then v_iptu=(:v_vvt+:v_vve)*0.005;
if (:a_e<=0) then v_iptu=(:v_vvt+:v_vve)*0.01;
if (:v_iptu>:e_max) then v_iptu=:e_max;
if (:v_iptu<:e_min) then v_iptu=:e_min;
suspend;
update bci set iptu=:v_iptu,vvt=:v_vvt,vve=:v_vve,vlrm2t=:v_mt,vlrm2e=:v_me,
pontos_t=:sfat_t,pontos_e=:sfat_e where sequencial=:seqx;
end
end
^
SET TERM ; ^
GRANT SELECT,UPDATE ON BCI TO PROCEDURE NEW_CALC_IPTU;
GRANT SELECT ON BCI_CARACT TO PROCEDURE NEW_CALC_IPTU;
GRANT SELECT ON FATORES TO PROCEDURE NEW_CALC_IPTU;
GRANT SELECT ON SETORES TO PROCEDURE NEW_CALC_IPTU;
GRANT EXECUTE ON PROCEDURE NEW_CALC_IPTU TO SYSDBA;
Gostei + 0
15/08/2005
Afarias
T+
Gostei + 0
15/08/2005
Catunda
como vc sabe q apenas N (157 primeiros) registros foram processados??
Antes de executar a procedure eu zero todos os campos que serão recalculados por ela, depois de executa-la Seleciono os registros que tenham os campos recalculados diferentes de zero, pois vc deve ter notado que no fim da procedure o valor assume um minimo ou maximo conforme seja o caso, assim se o registro foi lido não há como voltar valor zero.
obs: agora ele ta fazendo só com os 72 primeiros registros.
Gostei + 0
16/08/2005
Afarias
vc pode verificar isso facilmente adicionando um campo ´flag´ na tabela e atualizando ele com um valor qualquer apenas para indicar q o registro foi processado.
outra coisa q dá pra notar rapidamente é q v_me e v_vve podem ser 0 (mas não sei se é desses valores q está falando)
T+
Gostei + 0
16/08/2005
Catunda
Pode ver pelo final dos calculos, antes do comando suspend, que o valor do parametro v_iptu vai obrigatoriamente assumir um valor diferente de zero, pois ele inicia como zero e depois é comparado a um valor maximo e um minimo, ambos sempre maior que zero, logo se ele fosse igual a zero automaticamente assumiria o valor minimo.
if (:v_iptu>:e_max) then v_iptu=:e_max;
if (:v_iptu<:e_min) then v_iptu=:e_min;
Gostei + 0
16/08/2005
Sremulador
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)