Показать сообщение отдельно
Старый 03.12.2010, 08:57   #10  
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.