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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2004, 15:49   #1  
Anders
Гость
 
n/a
Очистка номерной серии, когда серия Непрерывная
Как произвести автомтическую очистку номерной серии?

В документации написано:
"Вы можете также установите временной интервал для автоматического очищения в поле Интервал. " и "Замечание если вы оставите поле пустым, очистка будет выполнятся каждый раз, когда номерная серия доступна".
Все это выполнил, но результата не получил. Очистка производится только при принудительном запуске очистки через кнопочку "Очистить".

Где я не прав?
И попутно вопрос: при каких условиях удаляются ли автомтатически записи в форме "Статус для серии документов".
Старый 02.12.2010, 12:24   #2  
Proba is offline
Proba
Участник
 
60 / 13 (1) ++
Регистрация: 25.06.2007
Адрес: Красноярск\Зеленогорск
Подниму старую тему...

Я окончательно запутался, и ни че не понимаю!
Создал непрерывную номерную серию. Создается, очищается, и заново создается она без проблем в ТЕКУЩЕЙ сесии.
Стоит мне повторно зайти в AX, и удалить строку из таблицы (или нажать кнопку очистить для текущей номерной серии),
то ни чего не происходит!

Смотрю код, и вижу что всему виной один метод, NumberSeqCleanUp::isProcessDead(). Который вызывается 2мя путями:
1. \Classes\NumberSeq\release(Он у меня отрабатывает на момент УДАЛЕНИЯ записи из моей таблицы)
2. \Classes\NumberSeqCleanUp\cleanupDeadProc(Вызывается в момент нажатия кнопки ОЧИСТИТЬ)

Код метода NumberSeqCleanUp::isProcessDead():

public client server static boolean isProcessDead(NumberSequenceList numberSequenceList)
{
xSession xSession = new xSession(numberSequenceList.SessionId);
;
if (xSession)
{
if (xSession.loginDate() == dateNull())
return true;

if (xSession.loginDate() != numberSequenceList.SessionLoginDate)
return true;

if (xSession.loginTime() != numberSequenceList.SessionLoginTime)
return true;
}
return false;
}

Собственно вопрос в следующем: В чем смысл данных сравнений??? Ведь если мы xSession инициализируем из
numberSequenceList.SessionId, значит эти условия НИ КОГДА не выполнятся и метод вернет false!
Или я не прав??? Тогда почему у меня все время
xSession.loginDate() == numberSequenceList.SessionLoginDate
xSession.loginTime() == numberSequenceList.SessionLoginTime

И собственно почему можно спокойно очищать(делать свободным) только в пределах ТЕКУЩЕЙ сесии?

все что нашел по слову isProcessDead это
Number sequnec lock

DAX4(4.0.2503.724)
Старый 03.12.2010, 04:08   #3  
Proba is offline
Proba
Участник
 
60 / 13 (1) ++
Регистрация: 25.06.2007
Адрес: Красноярск\Зеленогорск
Не много дополню. Програмную очистку номерной серии делаю через
NumberSeq::release(NumberSequenceCode, num);
Наверное зря я "с кодом" в рубрику функционал написал...
Старый 03.12.2010, 08:57   #4  
Proba is offline
Proba
Участник
 
60 / 13 (1) ++
Регистрация: 25.06.2007
Адрес: Красноярск\Зеленогорск
В общем я считаю что это бага!

Т.к. изначальной логикой(как мне показалось, поправть если не прав) должно было быть следующие:
Есть таблица_1, с настроенной НЕПРЕРЫВНОЙ номерной серией NumSeq_1.(###; след 1; т.е. вид будет 001 )
Программист(т.е. Я ) генерит номерную серию из кода используя numberSeq = NumberSeq::newGetNumFromCode(numSeq, true);

Дейсвтия происходят в ОДИН день.
1. Заходит User_1 в AX, создает к примеру 3 записи в таблица_1.
001
002
003

2. тут же заходит User_2 в AX, создает к примеру 1 запись в таблица_1.
004

3. User_2 захотел удалить ПЕРВУЮ запись из таблица_1. Запись благополучно удаляется! Но номерная серия не очищается!!!
Т.к. User_1 еще в системе!

4. User_1 создает еще 1 запись в таблица_1.
005, т.к. номерная серия не очисталась(нельзя очистить ЧУЖУЮ номерную серию пока этот чужой ещё в системе!
Кроме случая если это происходит в другой день)

5. User_1 выходит из AX.

6. User_2 захотел удалить запись 005 из таблица_1. Запись благополучно удаляется! И номерная серия становится со
статусом СВОБОДНАЯ. Т.к. User_1 уже вышел из AX!

Но сейчас у меня такого НЕ происходит, и номерная серия НЕ очищается!!!
Посмотрел как это все реализовано в 5ке, там вызывается метод
\Classes\Global\isSessionActive
в котором есть проверка закрыта ли сессия:
X++:
..
select session where session.SessionId == _sessionId;
if ( session && session.Status > 0 )
..
Решение №1
Т.е. чтоб решить мою проблему надо перенсти изменения с 5ки!

Решение №2
Оказывается еще ВАЖНЫМ фактором является что пердается ВТОРЫМ параметром при использовании
numberSeq = NumberSeq::newGetNumFromCode(numSeq, true);

Если передавать TRUE. То каждый раз при создании записи в таблица_1, будет создаваться запись в NumberSequenceList!
Она будет только менять свой статус с Active на Free, после удаления строки из таблица_1. И в результате получаем
проблему описанную в Решение 1
Если передать FALSE(ОБЯЗАТЕЛЬНО нужно использовать ttsBegin и ttsCommit, взял здесь):

X++:
ttsBegin;
numberSeq = NumberSeq::newGetNumFromCode(  , false);
myNum = numberSeq.num();
ttsCommit;
то тогда записи в NumberSequenceList не будет!!! Фактически она создавалась, но потом она удаляется
в момент выполнения, ttsCommit;. ttsCommit вызывает очистку номерной серии

см. Рисунок



Запись в NumberSequenceList ПОВТОРНО СОЗДАЕТСЯ в момент УДАЛЕНИЯ строки из таблица_1, со статусом FREE(типа готова к
повторному использованию).

НО есть один минус, нельзя посмотреть какие номера сейчас используются!!!(кнопка список Список в форме Номерные серии) т.к. таблица
NumberSequenceList пуста. В ней будут видны только те номера, которые свободны и готовы к использованию.


Таким образом Если передаем FALSE то ЗАНЯТЫЕ num не хранятся в базе(NumberSequenceList). Хранятся только СВОБОДНЫЕ со статусом FREE.
Если TRUE, то запись постоянно хранится в NumberSequenceList, и только меняет статус с Active на FREE

Итого два решения
Править код 4ки как в 5ке(пока не уверен)
Передавать FALSE(дефалтовое!!!) вторым параметром

думаем
Изображения
 

Последний раз редактировалось Proba; 03.12.2010 в 10:13.
Теги
isprocessdead

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Получение последнего номера из номерной серии longson DAX: Программирование 12 21.06.2007 13:30
Измнение номерной серии программно..как? YVAS DAX: Программирование 9 18.07.2005 15:59
Непрерывность номерной серии YaHooka DAX: Функционал 7 30.06.2005 18:04
Axapta 2.5 - Система не поддерживает настройку "непрерывности" номерной серии Базо_1 SDA DAX: Администрирование 8 02.10.2003 21:05
привязка к новой номерной серии delicia DAX: Программирование 2 21.11.2002 11:24
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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