[firebase-br] Ajuda com SP
Escovador de Bits
escovadordebits em gmail.com
Sex Fev 6 12:39:40 -03 2009
Bom dia/tarde André.
Grande André, pelas informações que você enviou, e pelo código fonte da
sua SP, o que posso deduzir é o seguinte:
1 - Acredito que falta acrescentar o parâmetro wfilial_entrada na
cláusula WHERE do SELECT for FOR, para que só a filial informada seja
utilizada, mas se a lógica não for essa, então desconsidere esse item aqui.
2 - Acredito que o primeiro SELECT que consulta os dados da tabela
DESPESAS_FILIAIS, e que está gerando os valores para a variável
despesas_jan, esteja se comportando da seguinte forma:
+------------+-----------------------------------------------------------------------------------+
| wfilial_id | Retorno do
SELECT |
+------------+-----------------------------------------------------------------------------------+
| 1 | 10, porque existe um registro da filial 1 em 01/01/2008
com esse valor. |
+------------+-----------------------------------------------------------------------------------+
| 2 | Nenhum, porque não existe qualquer registro da filial 2
em jan/2008, |
| | portanto, o valor 10 que já estava na variável
despesas_jan permanece inalterado. |
+------------+-----------------------------------------------------------------------------------+
| 3 | 20, porque existe um registro da filial 3 em 01/01/2008
com esse valor. |
+------------+-----------------------------------------------------------------------------------+
| 4 | Nenhum, porque não existe qualquer registro da filial 4
em jan/2008, |
| | portanto, o valor 20 que já estava na variável
despesas_jan permanece inalterado. |
+------------+-----------------------------------------------------------------------------------+
| 5 | 30, porque existe um registro da filial 5 em 01/01/2008
com esse valor. |
+------------+-----------------------------------------------------------------------------------+
Para confirmar isso, você poderia atribuir NULL para a variável
despesas_jan antes de executar o respectivo SELECT, o que deveria
retornar os seguintes valores: 10, NULL, 20, NULL e 30.
No caso da variável despesas_jan2, como não existe qualquer registro da
filial 2 em jan/2008, sempre retorna NULL.
Se eu estiver falando besteira, favor me corrigirem.
Espero ter ajudado mais que atrapalhado.
Andrei Luís escreveu:
> Olá a todos,
>
> Preciso de uma luz, tô quase ficando louco.
>
> Estou utilizando FB 1.5.5
>
> Considerem a SP abaixo. Os selects fazem parte de uma outra procedure maior
> (bem maior), e só estou com problema nesse trecho do código, separei numa sp
> menor para testar.
>
>
> CREATE OR ALTER PROCEDURE PROC_TESTE ( ano integer, wfilial_entrada integer)
> returns ( wano integer, wfilial varchar(40), wfilial_id integer,
> despesas_jan numeric(9,2), despesas_jan2 numeric(9,2))
> as
> begin
> for Select registro_id, filial from filiais where boletoavulso='N' and
> boletoterrenos='N'
> into :wfilial_id, :wfilial do
> begin
> wano = :ano;
>
> -- este é o select original que está na SP
> select valor/1000 from despesas_filiais where filial_id=:wfilial_id
> and extract(month from data)=1 and extract(year from data)=:ano into
> :despesas_jan;
>
> -- este select e o insert coloquei somente para testar
> select valor/1000 from despesas_filiais where
> filial_id=:wfilial_entrada and extract(month from data)=1 and extract(year
> from data)=:ano into :despesas_jan2;
>
> insert into tbtmp (ano, filial, filial_id, despesa_jan) values
> (:ano, :wfilial, :wfilial_id, Coalesce(:despesas_jan, 0));
>
> suspend;
> end
> end^
>
>
> Bem, o FOR SELECT, traz o pk da tabela filiais e joga na variável wfilial_id
> pra ser usado depois. O problema é que o select valor.... tá trazendo
> resultado errado.
>
> Tabela filiais
> registro_id filial
> 1 A
> 2 B
> 3 C
> 4 D
> 5 E
>
> Tabela despesas_filiais
> data filial_id valor
> 01/01/2008 1 10
> 01/01/2008 3 20
> 01/01/2008 5 30
>
>
> a procedure acima está retornando o seguinte, entrando com os parametros
> ano=2008 e wfilial_entrada=2:
>
> wano wfilial wfilial_id despesas_jan despesas_jan2
> 2008 A 1 10 null
> 2008 B 2 10 null
> 2008 C 3 20 null
> 2008 D 4 20 null
> 2008 E 5 30 null
>
> Ou seja, qdo não tem um registro lançado em despesas_filiais, despesas_jan
> está mantendo o valor anterior ao inves de armazenar null. Como que é isso?
> Porque os resultados de despesas_jan e despesas_jan2 estão diferentes se a
> cláusula where é igual, só muda o nome do parametro?
>
> Já tentei colocar um coalesce e deu no mesmo:
>
> select Coalesce(valor, 0)/1000 from despesas_filiais where
> filial_id=:wfilial_id and extract(month from data)=1 and extract(year from
> data)=:ano into :despesas_jan;
>
>
> Qualquer ajuda é bem vinda.
>
>
> []s
> Andrei
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
Mais detalhes sobre a lista de discussão lista