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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.11.2005, 17:48   #21  
Kirvisniemi is offline
Kirvisniemi
Moderator
 
342 / 13 (1) ++
Регистрация: 21.12.2004
Если кому интересно, расскажу как все удалось реализовать.

Т.к. в ходе экспериментов выяснилось, что не все кодюниты постят данные в G/L Entry через кодюнит 12, пришлось пойти единственным верным путем - повесится на триггер OnInsert таблицы G/L Entry.

Шаг 1. Поскольку во всех стандартных модулях, работающих с таблицей G/L в коде написан просто INSERT, наш код в триггере OnInsert вызываться не будет. Следовательно везде нужно поменять INSERT на INSERT(TRUE).
Я сделал просто - выгрузил все кодюниты в txt-файл и поиском нашел все переменные, ссылающиеся на G/L (это просто - достаточно поискать строку ":record 17;"). Переменных оказалось не много, а уж кодюнитов, осуществляющих непосредственную работу с G/L и вовсе всего три:
12 (Gen. Jnl.-Post Line),
413 (AnalysisViewEntryToGLEntries) и
432 (Consolidate).
Во всех них я подправил INSERT на INSERT(TRUE)

Шаг 2. Поскольку для отката транзакции нужно было выбрать место до которого уже сформировались все проводки, кодюнит 12 для этих не подошел. Пришлось вставлять тривиальный ERROR('') в четыре кодюнита:
80 (Sales-Post),
90 (Purch.-Post),
5704 (TransferOrder-Post Shipment) и
5705 (TransferOrder-Post Receipt)
Последние два нужны только для учета перемещений.
Имейте ввиду, что 80 и 90 кодюниты напичканы COMMIT'ами и перед каждым нужно поставить проверку флага "Режим будущих проводок". В режиме будущих проводок ничего коммитится не должно.

Шаг 3. Т.к для хранения будущих транзакций нельзя было использовать таблицу (потому что при откате транзакции все записи сразу были бы стерты), пришлось выбирать из двух вариантов - либо использовать кодюнит с SingleInstance=Yes, либо писать проводки в файл. И тот и другой способы имеют свои достоинства и недостатки. Я решил остановиться на кодюните и сохранять данные в массиве. Этот же кодюнит по совместительству выполняет функцию хранению флага "Режим будущих проводок" для текущего юзера.

Шаг 4. Во все нужные документы я добавил новый пункт меню "Просмотр будущих проводок". Код остался точно такое же как и при учете. До него добавил выставление флага "Режим будущих проводок"

Шаг 5. На этом шаге получился полнофункциональный механизм отслеживания будущих проводок, за исключением вывода результатов пользователю. Для вывода я решил использовать REPORT. Репорту пришлось передавать временную таблицу с будущими проводками, а т.к. репорт с врем.таблицами в принципе не работает, таблицу пришлось передавать через функцию, а репорт организовывать через Integer.

Что имеем в результате:
работающий механизм просмотра будущих проводок, не блокирующий работу и даже имеющий поддержку будущего функционала (если будут писать INSERT(TRUE)
Старый 15.11.2005, 10:09   #22  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Очень интересное решение!
Хотя на мой взгляд можно было бы обойтись без .Insert(true) просто обернув вызов учетных кодеюнитов, в этом случае ломка стандартного функционала минимальна. Примерно таким образом:
GLE.loctable;
if GLE.find('+') then LastEntryNo:=GLE."Entry No."
else LastEntryNo:=1;
codeunit80.SetNoCommit(true);
codeunit80.run(SalesHeader)
TransferPostedEntriesToArray(LastEntryNo)
if ErrorCodeunit.run then
TransferPostedEntriesFromArray(tempGLE);
Старый 15.11.2005, 10:26   #23  
anatoliy is offline
anatoliy
Участник
 
107 / 10 (1) +
Регистрация: 08.06.2004
Раскажите о работающем варианте. Очень интересно.
Старый 15.11.2005, 10:27   #24  
anatoliy is offline
anatoliy
Участник
 
107 / 10 (1) +
Регистрация: 08.06.2004
Извините не увидел предыдущий пост.
Старый 26.01.2006, 20:20   #25  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
TO rmv

Попытался сделать по вашему алгоритму Тестовый учет
в ходе написания выеснилось что строчка
if ErrorCodeunit.run then не прокатит в Транзакции Записи в которых нет Commit-ов (система не разришает использовать возврашаемое значение)

Сделал примерно так (я смотрел записи в 17 таблицы после учета журнала оплат)

1) создаем CodeUnit в нем пишем
Код:
OnRun(VAR Rec : Record "Gen. Journal Line")
{  GLEntry.LOCKTABLE;
   IF GLEntry.FIND('+') THEN
	 LastEntry:=GLEntry."Entry No."
   ELSE
	 LastEntry:=1;
   GlPostBach.SetNoCommit(TRUE);
   GlPostBach.RUN(Rec);
   TransferPostedEntriesToArray(LastEntry);
   ERROR('');
}
TransferPostedEntriesToArray(EntryNo : Integer)
{  GLEntry.RESET;
   GLEntry.SETFILTER("Entry No.",'%1..',EntryNo+1);
   IF GLEntry.FIND('-') THEN BEGIN
	 i:=0;
	 REPEAT
	   i+=1;
	   TempArrayGLE[i]:=GLEntry;
	 UNTIL GLEntry.NEXT=0;
   END;
}
TransferPostedEntriesFromArray()
{  tempGLEntry.DELETEALL;
	i:=0;
	EndLoop:=FALSE;
	REPEAT
	  i+=1;
	  IF ArrayGLE[i]."Entry No." <> 0 THEN BEGIN
		 tempGLEntry:=ArrayGLE[i];
		 tempGLEntry.INSERT;
	  END
	  ELSE
		EndLoop:=TRUE;
	UNTIL EndLoop;
	FORM.RUN(20,tempGLEntry);
}
2) В форме фин журнал создаем кнопку "Тестовый Учет"
туда пишем
Код:
  
  IF TestPost.RUN(Rec) THEN;
  TestPost.TransferPostedEntriesFromArray;
TestPost - это CodeUnit созданы в пункте 1
Старый 26.01.2006, 22:58   #26  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Мы смотрим проводки так....
Есть функционал удаления учтенных документов
Бюстгалтер учитывает запись.
Смотрит - какую-то фигню напорол.
Есть функционал восстановления операции из учтенных журналов либо стандартный из счетов покупки-продажи.
Поднял операцию, старую проводку удалил, исправленную учел.
Старый 27.01.2006, 10:07   #27  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Константин! - очень рад что у Вас получилось .
IGHG - можно и так, но цель автора топика - посмотреть будущие проводки, а не провести учет, посмотреть проводки и отменить.
Старый 27.01.2006, 22:26   #28  
Beetlejuice is offline
Beetlejuice
Участник
 
19 / 10 (1) +
Регистрация: 07.08.2005
Граждане! Покажите глупому ламеру, где в кодеюнитах 80-х,90-х, 413 и 432-м формируются записи в 17 таблице, минуя 12-й кодеюнит.

Почему расматривается формирование дублирующих 17-ю таблицу записей в функции финишкодеюнит. Других функций видимо нет???
Старый 27.01.2006, 22:31   #29  
IGG is offline
IGG
Участник
 
665 / 29 (2) +++
Регистрация: 24.08.2005
Адрес: СПб/Москва
Куда приезжать?
 


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

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

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