AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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 дня, то данная проверка считает даты одинаковыми, и вероятная ошибка не будет обнаружена..
Но это возможно только теоритически :-)
Старый 23.01.2007, 17:36   #2  
NeNavision_imported is offline
NeNavision_imported
Участник
Аватар для NeNavision_imported
 
241 / 10 (1) +
Регистрация: 12.08.2005
В общем, красиво написан механизм контроля баланса на дату.
__________________
Должен остаться только один.
Старый 23.01.2007, 18:05   #3  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от Kashin Посмотреть сообщение
(другое дело, что соответствующего кода нет, транзакции разделяются по датам учета
Извиняюсь, проверил повнимательнее.. Логика работы 12 и 13 кодюнита несколько отличается от того что я написал, и Маркировка записи на Consistent происходит по всем строкам финжурнала, по которым в данный момент идет учет, вне зависимости от транзакции. Т.е. если вы массово учитываете строки финжурнала с различными датами, то сложение BalanceCheckAmount и BalanceCheckAmount2 происходит в рамках всех строк. Т.е. под транзакцией выше не поле "Transaction No.", а весь процесс учета строк, от начала и до конца.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:48.