19.06.2007, 12:45 | #1 |
Участник
|
Получение последнего номера из номерной серии
Добрый день
Подскажите пожалуйста как из кода получить текущий номер непрерывной номерной серии (генерируется автоматически), и также следующий номер, предпоследний номер, при этом не увеличивает счётчик для этой номерной серии ? Спасибо |
|
19.06.2007, 12:48 | #2 |
Участник
|
Не получилось понять вопрос, но может так ?
X++: num = NumberSeq::newGetNum(purchParameters::numRefPurchId()); tmpPurchId = num.num(); if (PurchTable::exist(tmpPurchId)) { num.abort(); checkFailed("@SYS19304"); checkFailed(strfmt("@SYS24176", tmpPurchId)); throw error("@SYS23020"); } purchTable.purchId = tmpPurchId; num.used(); |
|
19.06.2007, 12:59 | #3 |
Участник
|
Не совсем так.
Например, у меня для производственного заказа был настроена непрерывная номерная серия типа 01_080, последний заказ - номер 24_080. Как можно получить 25_080 и 23_080, при этом следующему заказу будет присвоен номер 25_080. Если newGetnum использовать, то следующий заказ будет 25_080. Только что попробовал |
|
19.06.2007, 13:20 | #4 |
Участник
|
Если номерная серия непрерывная, то откуда уверенность, что следующим номером будет 80? Может система выдаст номер из освободившехся номеров. Кстати, то же и по предыдущему номеру. Что считать предыдущим, если он был выдан из освободившихся?
Если же в качестве следующего выдаваемого устраивает то, что находится в номерной серии в соответствующем поле, а в качестве следующего и предыдущего этот номер +1 и -1, то получите его напрямую из таблицы номерных серий (правда опять же все неоднозначно, вдруг работа идет по грруппе номерных серий - тогда сначала нужно еще и получить конкретную серию) |
|
19.06.2007, 13:31 | #5 |
Участник
|
Следующий номер, как я понимаю, это номер, который указывается в поле Следующий в форме настройки номерных серий. Только там цифра не в той форме которая нужна мне. Мне нужна именно 25_080 а не просто 25, "_080" до этого неизвестно поэтому не можем просто добавить "_080", да и если можно то и некрасиво
По предыдущему номеру - правда надо уточнить. |
|
19.06.2007, 13:40 | #6 |
Участник
|
преобразовать его в реальное значение можно так
X++: NumberSeq::numInsertFormat(323, "УЗСЖ######"); |
|
19.06.2007, 13:41 | #7 |
Участник
|
А если не секрет, что за задача, в которой требуется получение таких данных?
Кстати, почему _080 не известно? В той же таблице храниться шаблон, смотрите как он используется в классе работы с номерными сериями и делаете что-нибудь подобное. Хотя, на мой взгляд, не совсем корректно что-то делать с номерными сериями помимо API этого функционала. |
|
19.06.2007, 13:43 | #8 |
MCTS
|
Цитата:
Следующий номер, как я понимаю, это номер, который указывается в поле Следующий в форме настройки номерных серий.
Т.о. следующий - это 15.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
19.06.2007, 13:47 | #9 |
Участник
|
Угу, а исходя из всего вышесказанного про выдачу номерочков самым правильным будет вариант с получением номера, а потом откатом этого номера, как показано выше. имхо
|
|
19.06.2007, 20:29 | #10 |
Участник
|
Цитата:
Цитата:
Сообщение от e@gle
Необязательно. Если у вас стоит настройка непрерывность, а она у вас стоит, и удалили произв заказ 15_080, то в поле следующий будет стоять 25, а в списке очищенных номеров будет болтаться 15. И когда АХ запросит новый номер NumberSeq::newGetNum(), ему выдастся номер 15_080. И этот номер удалится из очищенных номеров
Т.о. следующий - это 15. Цитата:
Тогда какой метод система использует для выдачи этого номера (15_080) если бы num.used() не использовали ? |
|
20.06.2007, 14:07 | #11 |
MCTS
|
тоже стояла такая задача. Сделал следующим образом (хотя потом все равно пришлось переделывать):
вызываете NewGetNum(), получаете номер Num(), а потом возвращаете его в таблицу методом Abort(). Только имейте ввиду что это почему то работет только для непрерывных номерных серий. То есть перед запуском кода еще необходимо проверять непрерывный ли этот номер и выдавать ошибку, если нет. Кстати очень странно, что нет метода котрый возвращал бы следующее значение... Последний раз редактировалось Eldar9x; 20.06.2007 в 14:10. |
|
20.06.2007, 14:44 | #12 |
MCTS
|
Цитата:
Спасибо. Т.е вы имеете ввиду что именно метод num.used() запретить использовать этот номер в дальнейшем даже если заказ с этим номером уже когда-то существовал ?
Теперь если вы запускаете num.used(), то система понимает что номер использован и удаляет его из списка. А если вы запускаете num.abort(), то система понимает что номер не использован, сохранит его в список с признаком "Свободен" и будет подсовывать его следующий раз. Т.о. для гарантированного получения следующего номера надо сделать: X++: num = NumberSeq::newGetNum(); Id = num.num(); num.abort(); Цитата:
Только имейте ввиду что это почему то работет только для непрерывных номерных серий.
Таким образом если ты хочеш контролировать "дырки" в номерах, то делай непрерывную номерную серию и трать больше времени на создание-удаление записи. Не хочеш - отключай непрерывность.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
21.06.2007, 13:30 | #13 |
Участник
|
Спасибо Это по-моему красивое решение. На самом деле если потребуется много раз это делать можно написать свой метод который включает вышеописанный код.
|
|