Вернуться   Андрей Панько. Заметки про Dynamics NAV > Dynamics NAV (Navision)
Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Dynamics NAV (Navision) Заметки про Dynamics NAV (ранее Navision) и аддон LS Retail

Ответ
 
Опции темы Поиск в этой теме
  #1  
Старый 19.12.2007, 22:54
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Коррекция себестоимости

При проведении исследования ознакомился с внутренностями пакетного задания «Коррекция себестоимости – товарных операций».

В связи, с чем публикую полученные знания.

Начнем с простого.
То, что называется пакетным заданием Коррекция себестоимости товарных операций. На самом деле состоит из двух частей:
Отчет 795 Adjust Cost - Item Entries, который принимает параметры и
Кодеюнита 5895 Inventory Adjustment, в котором и происходит вся процедура коррекции себестоимости.
В четвертой версии параметров в кодеюнит передается два:
1. Дата учета операций закрытого периода.
2. Некий IsOnlineAdjmt типа Boolean.

Если про первый параметр я уже писал, то второй обсудим подробнее чуть ниже.

Итак.
Как известно коррекция себестоимости процедура длительная и ресурсоемкая. Но это не проблема. Проблема в том, что в процессе работы пакетного задания блокируются следующие таблицы (как минимум):
  • 32 Item Ledger Entry.
  • 339 Item Application Entry.
  • 5802 Value Entry.
Что напрочь лишает честных граждан, возможности трудится. Дабы эти граждане не расслаблялись в рабочее время, пакетное задание можно запускать в по ночам. Для этих целей используется Navision Application Server. Одна из особенностей NAS – он не умеет исполнять код с вызовом GUI окон. Поэтому код, который будет выполнять NAS должен быть соответствующим образом подготовлен. Пользователь же напротив, окна любит, т.к. они информируют его о том, что процесс идет, а не завис. Похоже, что для решения этой дилеммы и используется второй параметр.

Если GUI не нужен (например при работе с NAS) параметр IsOnlineAdjmt следует устанавливать в TRUE, при запуске же с помощью отчета 795 (т.е. вручную) данные параметр равен FALSE.


...Странная логика, не правда ли?
Понять ее можно если продолжить исследования....

Но это не все.
Еще параметр IsOnlineAdjmt влияет на выборку товаров, по которым должна выполняться коррекция. Если при ручном запуске коррекция выполняется по всем товарам, то при запуске с параметром IsOnlineAdjmt=TRUE только по тем, у которых значение поля "Allow Online Adjustment" = TRUE.
Вручную изменить значение данного поля не удастся. Система это делает автоматически при учете товарных операций (codeunit 22) согласно полю Автоматическая Коррекция Себестоимости таблицы Товары Настройка (313 Inventory Setup).
А затем из учтеных из учетных кодеюнитов и тоже с оглядкой на поле Автоматическая Коррекция Себестоимости запускается пакетное задание с параметром IsOnlineAdjmt=TRUE . Например Codeunit 90 Purch-Post.
Код:
onRun //учет товарных операций ... InvtSetup.GET; IF InvtSetup."Automatic Cost Adjustment" <> InvtSetup."Automatic Cost Adjustment"::Never THEN BEGIN InvtAdjmt.SetProperties("Posting Date",TRUE); InvtAdjmt.MakeMultiLevelAdjmt; END;


Однако, при значении поля Автоматическая Коррекция Себестоимости = Никогда, поле Allow Online Adjustment = FALSE (Codeunit 22 UpdateAdjmtProp).


Вот такое противоречие. Хочешь запустить коррекцию под NAS: либо товары в выборку не попадают, либо диалоговое окно мешает.



Кстати аналогичные поля (Allow Online Adjustment и Cost is Adjusted) есть и в таблице 5406 Prod. Order Line http://www.apanko.ru/showthread.php?t=31).
Ответить с цитированием
  #2  
Старый 30.06.2008, 12:24
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Чтобы решить проблему для NAS достаточно вставить всего пару строк кода (выделены жирным шрифтом) в функции кодеюнита 5895 Inventory Adjustment:

Функция OpenWindow() //для открытия окна.
Код:
IF GUIALLOWED THEN BEGIN Window.OPEN(Text000 + Text001 + Text002 + Text003 + Text004 + Text005); WindowIsOpen := TRUE; END;

Функция IsTimeForUpdate() //для обновления.
Код:
IF GUIALLOWED THEN IF TIME - WindowUpdateTime >= 1000 THEN BEGIN WindowUpdateTime := TIME; EXIT(TRUE); END; EXIT(FALSE);


Если окажется, что такая мелочь не была сделана в 5SP1, я опечалюсь и буду считать это неуважением к конечным пользователям продукта.
Ответить с цитированием
Ответ


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

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:39.

Контакты: e-mail, телефон: +7(926)1805967 - Архив - Вверх

Microsoft Most Valuable Professional
vBulletin v3.5.4, Copyright ©2000-2018, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co
Права на все материалы, опубликованные на блогофоруме принадлежат Андрею Панько, если в самом материале не указано иное.
Рейтинг@Mail.ru Rambler's Top100