[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