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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.11.2005, 16:53   #1  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Есть интересная задача - "Просмотр будущих проводок".

Суть задачи - добавляется новый пункт меню в кнопку "УЧЕТ" к счету, заказу и т.д, который при его выборе выводит будущие проводки (записи, которые должны появится в General Ledger Entry (таблица 17)). Документ при этом конечно не учитывается.

Наверняка кто-нибудь сталкивался - посоветуйте оптимальный подход.

Пока есть такие идеи:
1) лезем в 12 кодюнит, заводим там временную таблицу, в которую скидываем проводки, в триггере FinishCodeunit пишем ERROR('') для отката транзакций.
Перед еррором выводим форму с будущими проводками
- недостаток: если в таблицу 17 у нас попадут записи не из 12 кодюнита, а из какого-нибудь друго, то этих проводок мы не отследим

2) лезем в 17 таблицу, вешаем на триггер OnInsert заполнение своей собственной таблицы (дублера таблицы 17). в кодюните 12 заменяем INSERT на INSERT(TRUE). В триггер FinishCodeunit добавляем ERROR('').
Перед еррором выводим форму с будущими проводками.
- недостаток: после того как сработает еррор, транзакция откатится и соотственно наша собственная таблица тоже подчистится

Как лучше сделать?
Старый 11.11.2005, 17:35   #2  
anatoliy is offline
anatoliy
Участник
 
107 / 10 (1) +
Регистрация: 08.06.2004
единственное что пришло вголову, это найти уже учтеный документ, с похожими реквизитами шапки и строк. Затем дернуть его проводки и подставить свои значения кво и суммы.

помоему криво , но обдумать такой вариант можно.
Старый 11.11.2005, 17:36   #3  
Галина is offline
Галина
Участник
 
1,132 / 28 (3) +++
Регистрация: 01.07.2003
Мда.. что только из Navision не делают
Старый 11.11.2005, 17:41   #4  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Цитата:
Сообщение от anatoliy
единственное что пришло вголову, это найти уже учтеный документ, с похожими реквизитами шапки и строк. Затем дернуть его проводки и подставить свои значения кво и суммы.
помоему криво , но обдумать такой вариант можно.
А если похожих документов просто нет? Неее, тут надо подумать
Старый 11.11.2005, 17:46   #5  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Тупая идея: сделать еще одну фирму, копировать документ туда, там учитывать, смотреть на результат
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 11.11.2005, 17:50   #6  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Другого выхода кроме как обвешать кодеюниты учета вставкой в свои/временные таблицы на каждый insert (поиск ".Insert" рулит) не вижу.
Либо учитывать в специальной созданной для этого фирме и результаты учета тянуть оттуда. В варианте перед учетом придеться синхронизировать настроечные табллицы и справочники
Старый 11.11.2005, 17:52   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от tyrex
Пока есть такие идеи:
1) лезем в 12 кодюнит, заводим там временную таблицу, в которую скидываем проводки, в триггере FinishCodeunit пишем ERROR('') для отката транзакций.
Перед еррором выводим форму с будущими проводками
- недостаток: если в таблицу 17 у нас попадут записи не из 12 кодюнита, а из какого-нибудь друго, то этих проводок мы не отследим
Примерно так сделано в русской Аксапте.
Только получившиеся проводки копируются, транзакция откатывается, форма показывается.
Минусы - вероятность блокировок возрастает.

Цитата:
Сообщение от tyrex
2) лезем в 17 таблицу, вешаем на триггер OnInsert заполнение своей собственной таблицы (дублера таблицы 17). в кодюните 12 заменяем INSERT на INSERT(TRUE). В триггер FinishCodeunit добавляем ERROR('').
Перед еррором выводим форму с будущими проводками.
- недостаток: после того как сработает еррор, транзакция откатится и соотственно наша собственная таблица тоже подчистится
Это не единственный недостаток.
Где-то в глубинах Навижина может быть создание проводок на основании текущей в этой или в других таблицах. Например, создание проводки округления возможно только после создание всех проводок с данным номером документа.

Поэтому вариант 2 не годится в общем случае.
__________________
полезное на axForum, github, vk, coub.
Старый 11.11.2005, 18:00   #8  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Цитата:
Сообщение от Дуд
Тупая идея: сделать еще одну фирму, копировать документ туда, там учитывать, смотреть на результат
Вот если бы фирмы можно было создавать динамически, а потом удалять - вариант имел бы право на жизнь. Но тут технически еще сложнее - надо синхронизировать кучу таблиц
Старый 11.11.2005, 18:08   #9  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Цитата:
Сообщение от mazzy
Цитата:
Сообщение от tyrex
Пока есть такие идеи:
1) лезем в 12 кодюнит, заводим там временную таблицу, в которую скидываем проводки, в триггере FinishCodeunit пишем ERROR('') для отката транзакций.
Перед еррором выводим форму с будущими проводками
- недостаток: если в таблицу 17 у нас попадут записи не из 12 кодюнита, а из какого-нибудь друго, то этих проводок мы не отследим
Примерно так сделано в русской Аксапте.
Только получившиеся проводки копируются, транзакция откатывается, форма показывается. Минусы - вероятность блокировок возрастает.
Попробовал сделать такой вариант. Работает.
Сразу всплыли недочеты:
- как я и предполагал, проводки в G/Ledger попадают не только через 12 кодюнит :-( - форма показывает не все будущие проводки
- блокировок нет, потому что форма показывается в немодальном режиме и транзакция успевает откатиться (однако данные из формы не пропадают). НО: есть сложность в синхронизации пользовательских действий. Например пользователь может открыть счет и посмотреть его будущие проводки. А затем сворачивает форму (не закрывает, а сворачивает!), открывает другой счет и снова смотрит будущие проводки.
Еще одно НО: одновременно будущие проводки могут смотреть несколько пользователей и где-то надо хранить флаг "будущности" для каждого юзера

Цитата:
Сообщение от mazzy
Цитата:
Сообщение от tyrex
2) лезем в 17 таблицу, вешаем на триггер OnInsert заполнение своей собственной таблицы (дублера таблицы 17). в кодюните 12 заменяем INSERT на INSERT(TRUE). В триггер FinishCodeunit добавляем ERROR('').
Перед еррором выводим форму с будущими проводками.
Это не единственный недостаток.
Где-то в глубинах Навижина может быть создание проводок на основании текущей в этой или в других таблицах. Например, создание проводки округления возможно только после создание всех проводок с данным номером документа. Поэтому вариант 2 не годится в общем случае.
Верно. Потому и ломаю голову...
Старый 11.11.2005, 18:14   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от tyrex
А затем сворачивает форму (не закрывает, а сворачивает!), открывает другой счет и снова смотрит будущие проводки.
Еще одно НО: одновременно будущие проводки могут смотреть несколько пользователей и где-то надо хранить флаг "будущности" для каждого юзера
Обрати внимание: я писал слово "записывает".
В Аксапте используется механизм временных таблиц для хранения промежуточных итогов.

Оставлять ТОЛЬКО на экране - принципиально неправильно.
__________________
полезное на axForum, github, vk, coub.
Старый 11.11.2005, 18:20   #11  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Может я чего не понимаю... но в 12 и 80/90 задействована не только 17 таблица.. А как же 21,25 измерения в конце концов?
Старый 11.11.2005, 18:22   #12  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Цитата:
Сообщение от mazzy
В Аксапте используется механизм временных таблиц для хранения промежуточных итогов.
Оставлять ТОЛЬКО на экране - принципиально неправильно.
В Navision, в форму можно передать временную таблицу, после чего код, вызвавший открытие формы может преспокойно завершиться и временную переменную типа record убить. Но в форме содержимое останется.
Не думаю что это неправильно - т.к. задача показать проводки реализуется.

Тут проблема в том, как отследить появление записей в G/L минуя 12 кодюнит "Gen. Jnl.-Post Line" - слишком много функционала надо перелопатить.

Пахнет коммерческой разработкой :-)
Старый 11.11.2005, 18:23   #13  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Сорри за предыдущий пост ... недопонял вариант решения.
Старый 11.11.2005, 18:24   #14  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Цитата:
Сообщение от rmv
Может я чего не понимаю... но в 12 и 80/90 задействована не только 17 таблица.. А как же 21,25 измерения в конце концов?
Будущие проводки вне таблицы 17 меня не интересуют.
Старый 11.11.2005, 18:26   #15  
TarasNBV is offline
TarasNBV
Участник
 
28 / 10 (1) +
Регистрация: 23.07.2005
Адрес: Ukraine
Мы когда-то сталкивались с подобной задачей - сделать тестовый отчет по 17 таблице. Решение было довольно сложным - почти полное дублирование процесса учета. Почему нельзя все обрабатывать только в 12-м кодеюните - его вызов происходит в нескольких местах (это первое) и для нескольких строк он может вызываеться соотв. кол-во раз.

В этом нелегком деле остается только пожелать удачи!
Старый 11.11.2005, 18:29   #16  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Если делать через error можно попробовать совершенно извратский способ:.
1. Перед учетом лочим 17 таблицу и запоминаем номер последний операции.
2. После учета все проводки после запомненной операций пишем к примеру в файл.
3. Мягко вызываем ошибку if ErrorCodeunit.run (в теле - error).
4. Восстанавливаем данные из файла в свою таблицу.
Старый 11.11.2005, 18:33   #17  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
2rmv: насчет файла - оч.хорошая идея
Старый 11.11.2005, 18:49   #18  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Ну в общем случае решение можно сформулировать так.
1. Провести учет.
2. Положить результаты учета куда-нить, откуда они не удаляться при откате транзакции.
3. Мягко откатить транзакцию.
4. Восстановить результаты учета в свои таблицы.
Куда класть - в файл, в массив rec17[10000] может быть даже в поток - это дела вкуса
Дерзайте
Старый 11.11.2005, 18:53   #19  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
попробую класть в файл.
кстати имя для файла придется придумывать в зависимости от ника пользователя и номера транзакции :-)
Старый 11.11.2005, 18:59   #20  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Чтобы не заморачиваться - проще положить в массив.

После отката транзакции восстановить во временную таблицу (ту же 17 - какая экономия клиенту на лишней таблице ) и показать на форме.

Если пойти дальше - объявить двухмерный массив recoredref'ов, анализировать не только 17 таблицу но и все книги операций - и рисовать Виртуальный Навигатор ))...
 


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

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

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