Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Boa tarde,
Estou com um problema que não estou conseguindo identificar o porque acontece.
Tenho o código abaixo:
[Estornos]:
LOAD [Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária] as [ChaveEstornoFiltro]
FROM
Where [Cod. Tipo Movimentação Bancária] = 'ES';
Tabela:
LOAD
*
FROM
Where
Not Exists ([ChaveEstornoFiltro],[Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária]);
Drop Table Estornos;
A ideia deste código é pegar todos os estornos e depois excluir da Tabela quem tem essa Chave (que possui estorno).
Ao rodar apenas esta parte do código, tudo funciona.
E depois tenho um código que pega e cria registros até o saldo ser zerado ou até hoje. (Através deste tópico: Re: Criar registros diários)
O problema está que se uso este "Not Exists" o resultado é esse:
A coluna "teste" é o cálculo ValorLiquidoTitulo - TotalValorMovimentacao, mas como 470,67 - 470,67 resulta em 5,6843418860808e-014 ??
Mas se eu remover a parte do Not Exists da Tabela, tudo funciona normal: (Os valores de movimentação são diferentes pois sem o Not Exists ele está considerando estornos também)
Alguém tem alguma ideia do que pode ser isto?
Me passa o trecho do script do Exists com a lógica e com as associações com as outras partes dos script que faltou.
No objeto texto formate com a função NUM(Campo,'#.##0,00')
A lógica é a seguinte:
No inicio do script criar a seguinte tabela TabelaMovimentacoes com o script abaixo.
E após isto, no seu código substituir tudo que utiliza o FINAN_MovimentacaoBancaria.qvd pelo Resident TabelaMovimentacoes, porque assim teria uma tabela com as movimentações sem estornos.
Estornos:
LOAD [Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária] as [ChaveEstornoFiltro]
FROM
Where [Cod. Tipo Movimentação Bancária] = 'ES';
TabelaMovimentacoes:
LOAD
*
FROM
Where
Not Exists ([ChaveEstornoFiltro],[Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária]);
Drop Table Estornos;
Só que ai vou estar "mascarando" o problema, visto que qualquer objeto em qualquer momento da aplicação que for utilizar tenho que colocar a máscara.. Será que não tem como colocar no script?
E outra, como o número é 5,..... e se eu coloco a máscara NUM(Campo,'#.##0,00') ele fica 0,00 ?
Mario,
Hoje até tentei mudar a lógica para desconsiderar os estornos, fiz da seguinte maneira:
[TabelaTemp]:
LOAD
*,
[Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária] as [ChaveEstornoFiltro]
FROM
Where ChaveTitulosReceber = 'MVN|003498|FT| |01|050813';
Left Join
LOAD
[Filial Tit. Movimentação Bancária]&'|'&[Prefixo Tit. Movimentação Bancária]&'|'&[Número Tit. Movimentação Bancária]&'|'&[Parcela Tit. Movimentação Bancária]&'|'&[Tipo Tit. Movimentação Bancária]&'|'&[Cliente/Fornecedor Tit. Movimentação Bancária]&'|'&[Loja Tit. Movimentação Bancária]&'|'&[Sequência Movimentação Bancária] as [ChaveEstornoFiltro],
1 as [Estorno ?]
FROM
Where [Cod. Tipo Movimentação Bancária] = 'ES'
AND ChaveTitulosReceber = 'MVN|003498|FT| |01|050813';
[Tabela]:
NoConcatenate
LOAD
*
Resident TabelaTemp
Where [Estorno ?] <> 1;
Drop Table TabelaTemp;
E depois sigo o teu script usando a "Tabela" no lugar do QVD de movimentações bancárias.
O problema que deu a mesma coisa, o SaldoDevedor fica em 5,... e não 0.
O estranho é que se eu coloco um objeto de texto com o código:
=sum(ValorLiquidoTitulo)-sum(TotalValorMovimentacao)
O resultado é 5,...
Mas se coloco um objeto de texto com o código:
=NUM(sum(ValorLiquidoTitulo)-sum(TotalValorMovimentacao),'#.##0,00')
O resultado é 0,00
Estou achando que deva ter algo errado no campo ValorLiquidoTitulo gerado no script.
E imagino que os valores do campo [Valor IRRF Título a Receber] deve ter várias casas decimais.
Mas estranho o valor ser '5,..', ou seja, uma diferença considerável para ser só por conta das casas decimais.
Faz o seguinte,
Substitui no script
numsum(num([Valor Título a Receber]),num(-[Valor IRRF Título a Receber])) as 'ValorLiquidoTitulo'
por
Round( Rangesum([Valor Título a Receber],-[Valor IRRF Título a Receber]),'0,01') as 'ValorLiquidoTitulo'
A função Numsum() é obsoleta;
A função Rangesum() também altera o campo para 0 caso não encontre número, que é bom para o seu caso.
Coloquei tudo o que é valor no script para num(CAMPO,'#.##0,00').
Ele até colocou o saldo zerado, mas como é apenas a máscara ele não entendeu que o SaldoDevedor ficou 0 e continuou criando registros até hoje.
Fiz o teu teste de substituir a linha por:
Round( Rangesum([Valor Título a Receber],-[Valor IRRF Título a Receber]),'0,01') as 'ValorLiquidoTitulo'
Porém também não funcionou.
Para testar também, substitui essa linha por:
[Valor Título a Receber] as 'ValorLiquidoTitulo'
Para descartar que o problema fosse no [Valor IRRF Título a Receber] e mesmo assim continuou a criar registros.
O que ainda não consegui entender é como apenas retirar quem é Estorno buga todo o resto do script
Estou achando que esteja tirando algo a mais, necessário para o valor de 'ValorLiquidoTitulo' atingir o valor de
'TotalValorMovimentacao', se isso não ocorrer, é como o cliente ainda estivesse devendo, ou seja, ainda deve correr os dias para até completar o saldo devedor;
Veja que em While eu deixei uma lógica para tratar isso:
While DataEmissao + IterNo() - 1 <= If(MaxDataMov<=DataVencimento, DataVencimento,
If(TotalValorMovimentacao<ValorLiquidoTitulo, Today(), MaxDataMov));
Perceba que se 'TotalValorMovimentacao' for menor que 'ValorLiquidoTitulo', continuará a trazer a data até hoje;
Sua exceção do estorno está com algum erro de lógica de negócio, investigue para tratar corretamente esta regra.
Talvez seja melhor tratar esta exceção com set analysis.
Mario,
Peguei o teu script e coloquei no Inline os valores da minha base (1 título com 2 movimentações) e ele está se perdendo nos valores.
Consegue dar uma olhada?
Acho que assim facilita pra você.
Edit:
Testei alterando só os valores de centavos (200,67 e 470,67) para 200,68 470,68 e 200,65 470,65 funcionou, porém se colocar 200,67 470,67 ou 200,66 470,66 não funciona.
Qual a bruxaria? haha