|
15.12.2004, 15:49 | #1 |
Гость
|
Очистка номерной серии, когда серия Непрерывная
Как произвести автомтическую очистку номерной серии?
В документации написано: "Вы можете также установите временной интервал для автоматического очищения в поле Интервал. " и "Замечание если вы оставите поле пустым, очистка будет выполнятся каждый раз, когда номерная серия доступна". Все это выполнил, но результата не получил. Очистка производится только при принудительном запуске очистки через кнопочку "Очистить". Где я не прав? И попутно вопрос: при каких условиях удаляются ли автомтатически записи в форме "Статус для серии документов". |
|
02.12.2010, 12:24 | #2 |
Участник
|
Подниму старую тему...
Я окончательно запутался, и ни че не понимаю! Создал непрерывную номерную серию. Создается, очищается, и заново создается она без проблем в ТЕКУЩЕЙ сесии. Стоит мне повторно зайти в 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 |
Участник
|
Не много дополню. Програмную очистку номерной серии делаю через
NumberSeq::release(NumberSequenceCode, num); Наверное зря я "с кодом" в рубрику функционал написал... |
|
03.12.2010, 08:57 | #4 |
Участник
|
В общем я считаю что это бага!
Т.к. изначальной логикой(как мне показалось, поправть если не прав) должно было быть следующие: Есть таблица_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 ) .. Т.е. чтоб решить мою проблему надо перенсти изменения с 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; в момент выполнения, ttsCommit;. ttsCommit вызывает очистку номерной серии см. Рисунок Запись в NumberSequenceList ПОВТОРНО СОЗДАЕТСЯ в момент УДАЛЕНИЯ строки из таблица_1, со статусом FREE(типа готова к повторному использованию). НО есть один минус, нельзя посмотреть какие номера сейчас используются!!!(кнопка список Список в форме Номерные серии) т.к. таблица NumberSequenceList пуста. В ней будут видны только те номера, которые свободны и готовы к использованию. Таким образом Если передаем FALSE то ЗАНЯТЫЕ num не хранятся в базе(NumberSequenceList). Хранятся только СВОБОДНЫЕ со статусом FREE. Если TRUE, то запись постоянно хранится в NumberSequenceList, и только меняет статус с Active на FREE Итого два решения Править код 4ки как в 5ке(пока не уверен) Передавать FALSE(дефалтовое!!!) вторым параметром думаем Последний раз редактировалось Proba; 03.12.2010 в 10:13. |
|