11.11.2005, 16:53 | #1 |
Moderator
|
Есть интересная задача - "Просмотр будущих проводок".
Суть задачи - добавляется новый пункт меню в кнопку "УЧЕТ" к счету, заказу и т.д, который при его выборе выводит будущие проводки (записи, которые должны появится в 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 |
Участник
|
единственное что пришло вголову, это найти уже учтеный документ, с похожими реквизитами шапки и строк. Затем дернуть его проводки и подставить свои значения кво и суммы.
помоему криво , но обдумать такой вариант можно. |
|
11.11.2005, 17:36 | #3 |
Участник
|
Мда.. что только из Navision не делают
|
|
11.11.2005, 17:41 | #4 |
Moderator
|
Цитата:
Сообщение от anatoliy
единственное что пришло вголову, это найти уже учтеный документ, с похожими реквизитами шапки и строк. Затем дернуть его проводки и подставить свои значения кво и суммы.
помоему криво , но обдумать такой вариант можно. |
|
11.11.2005, 17:46 | #5 |
NavAx
|
Тупая идея: сделать еще одну фирму, копировать документ туда, там учитывать, смотреть на результат
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|
11.11.2005, 17:50 | #6 |
Участник
|
Другого выхода кроме как обвешать кодеюниты учета вставкой в свои/временные таблицы на каждый insert (поиск ".Insert" рулит) не вижу.
Либо учитывать в специальной созданной для этого фирме и результаты учета тянуть оттуда. В варианте перед учетом придеться синхронизировать настроечные табллицы и справочники |
|
11.11.2005, 17:52 | #7 |
Участник
|
Цитата:
Сообщение от tyrex
Пока есть такие идеи:
1) лезем в 12 кодюнит, заводим там временную таблицу, в которую скидываем проводки, в триггере FinishCodeunit пишем ERROR('') для отката транзакций. Перед еррором выводим форму с будущими проводками - недостаток: если в таблицу 17 у нас попадут записи не из 12 кодюнита, а из какого-нибудь друго, то этих проводок мы не отследим Только получившиеся проводки копируются, транзакция откатывается, форма показывается. Минусы - вероятность блокировок возрастает. Цитата:
Сообщение от tyrex
2) лезем в 17 таблицу, вешаем на триггер OnInsert заполнение своей собственной таблицы (дублера таблицы 17). в кодюните 12 заменяем INSERT на INSERT(TRUE). В триггер FinishCodeunit добавляем ERROR('').
Перед еррором выводим форму с будущими проводками. - недостаток: после того как сработает еррор, транзакция откатится и соотственно наша собственная таблица тоже подчистится Где-то в глубинах Навижина может быть создание проводок на основании текущей в этой или в других таблицах. Например, создание проводки округления возможно только после создание всех проводок с данным номером документа. Поэтому вариант 2 не годится в общем случае. |
|
11.11.2005, 18:00 | #8 |
Moderator
|
Цитата:
Сообщение от Дуд
Тупая идея: сделать еще одну фирму, копировать документ туда, там учитывать, смотреть на результат
|
|
11.11.2005, 18:08 | #9 |
Moderator
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от tyrex
А затем сворачивает форму (не закрывает, а сворачивает!), открывает другой счет и снова смотрит будущие проводки.
Еще одно НО: одновременно будущие проводки могут смотреть несколько пользователей и где-то надо хранить флаг "будущности" для каждого юзера В Аксапте используется механизм временных таблиц для хранения промежуточных итогов. Оставлять ТОЛЬКО на экране - принципиально неправильно. |
|
11.11.2005, 18:20 | #11 |
Участник
|
Может я чего не понимаю... но в 12 и 80/90 задействована не только 17 таблица.. А как же 21,25 измерения в конце концов?
|
|
11.11.2005, 18:22 | #12 |
Moderator
|
Цитата:
Сообщение от mazzy
В Аксапте используется механизм временных таблиц для хранения промежуточных итогов.
Оставлять ТОЛЬКО на экране - принципиально неправильно. Не думаю что это неправильно - т.к. задача показать проводки реализуется. Тут проблема в том, как отследить появление записей в G/L минуя 12 кодюнит "Gen. Jnl.-Post Line" - слишком много функционала надо перелопатить. Пахнет коммерческой разработкой :-) |
|
11.11.2005, 18:23 | #13 |
Участник
|
Сорри за предыдущий пост ... недопонял вариант решения.
|
|
11.11.2005, 18:24 | #14 |
Moderator
|
Цитата:
Сообщение от rmv
Может я чего не понимаю... но в 12 и 80/90 задействована не только 17 таблица.. А как же 21,25 измерения в конце концов?
|
|
11.11.2005, 18:26 | #15 |
Участник
|
Мы когда-то сталкивались с подобной задачей - сделать тестовый отчет по 17 таблице. Решение было довольно сложным - почти полное дублирование процесса учета. Почему нельзя все обрабатывать только в 12-м кодеюните - его вызов происходит в нескольких местах (это первое) и для нескольких строк он может вызываеться соотв. кол-во раз.
В этом нелегком деле остается только пожелать удачи! |
|
11.11.2005, 18:29 | #16 |
Участник
|
Если делать через error можно попробовать совершенно извратский способ:.
1. Перед учетом лочим 17 таблицу и запоминаем номер последний операции. 2. После учета все проводки после запомненной операций пишем к примеру в файл. 3. Мягко вызываем ошибку if ErrorCodeunit.run (в теле - error). 4. Восстанавливаем данные из файла в свою таблицу. |
|
11.11.2005, 18:33 | #17 |
Moderator
|
2rmv: насчет файла - оч.хорошая идея
|
|
11.11.2005, 18:49 | #18 |
Участник
|
Ну в общем случае решение можно сформулировать так.
1. Провести учет. 2. Положить результаты учета куда-нить, откуда они не удаляться при откате транзакции. 3. Мягко откатить транзакцию. 4. Восстановить результаты учета в свои таблицы. Куда класть - в файл, в массив rec17[10000] может быть даже в поток - это дела вкуса Дерзайте |
|
11.11.2005, 18:53 | #19 |
Moderator
|
попробую класть в файл.
кстати имя для файла придется придумывать в зависимости от ника пользователя и номера транзакции :-) |
|
11.11.2005, 18:59 | #20 |
Участник
|
Чтобы не заморачиваться - проще положить в массив.
После отката транзакции восстановить во временную таблицу (ту же 17 - какая экономия клиенту на лишней таблице ) и показать на форме. Если пойти дальше - объявить двухмерный массив recoredref'ов, анализировать не только 17 таблицу но и все книги операций - и рисовать Виртуальный Навигатор ))... |
|