Показать сообщение отдельно
Старый 23.01.2007, 16:59   #1  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от NeNavision Посмотреть сообщение
В чем глубокий космический смысл расчета значений BalanceCheckAmount для проверки баланса таким способом?

Код:
 BalanceCheckAmount :=
   BalanceCheckAmount + GLEntry.Amount * ((GLEntry."Posting Date" - 01010000D) MOD 99 + 1);
 BalanceCheckAmount2 :=
   BalanceCheckAmount2 + GLEntry.Amount * ((GLEntry."Posting Date" - 01010000D) MOD 98 + 1);
Значением операции (GLEntry."Posting Date" - 01010000D) является число. Сделано, чтобы не плодить операторы EVALUATE. Заметьте, отнять 0D, 1D нельзя, это вызывает ошибки, поэтому, в рамках синтаксиса Нава 01010000D выбрано за своеобразное начало координат всех чисел, которые получаются в результате разности.

На момент проверки GLEntry.CONSISTENT ((BalanceCheckAmount = 0)...) в базе существуют только строки в 17 таблице, объединенные одной транзакцией. Система позволяет, чтобы в результате ОДНОЙ транзакции, были учтены строки с различными датами учета (другое дело, что соответствующего кода нет, транзакции разделяются по датам учета). MOD используется для того, чтобы не было возможного переполнения буфера , в случае множества строк.

обычно, в результате финучета строк появляются примерные записи

"Entry No." = 1, "Transaction No." = 1, Amount = 500, "Posting Date" = 01012007D, "Account No." = X
"Entry No." = 2, "Transaction No." = 1, Amount = -400, "Posting Date" = 01012007D, "Account No." = Y1
"Entry No." = 3, "Transaction No." = 1, Amount = -100, "Posting Date" = 01012007D, "Account No." = Y2

(01012007D - 01010000D) =733042

В этом случае, по результатам трех сложений, BalanceCheckAmount = 0, а также BalanceCheckAmount2 =0
И так, представьте себе, что в результате ОДНОЙ транзакции, появились строки с разными датами. Допустим

"Entry No." = 1, "Transaction No." = 1, Amount = 500, "Posting Date" = 01012007D, "Account No." = X
"Entry No." = 2, "Transaction No." = 1, Amount = -400, "Posting Date" = 01012007D, "Account No." = Y1
"Entry No." = 3, "Transaction No." = 1, Amount = -100, "Posting Date" = 01012007D, "Account No." = Y2
"Entry No." = 4, "Transaction No." = 1, Amount = 500, "Posting Date" = 12122007D, "Account No." = X1
"Entry No." = 5, "Transaction No." = 1, Amount = -500, "Posting Date" = 12122007D, "Account No." = Y3

Такая проверка также даст по результатам уже ПЯТИ сложений, BalanceCheckAmount = 0, а также BalanceCheckAmount2 =0

Есть и недостаток - вслучае, если разница между датами будет 99*98 = 9702 дня, то данная проверка считает даты одинаковыми, и вероятная ошибка не будет обнаружена..
Но это возможно только теоритически :-)