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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.06.2007, 12:45   #1  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Получение последнего номера из номерной серии
Добрый день

Подскажите пожалуйста как из кода получить текущий номер непрерывной номерной серии (генерируется автоматически), и также следующий номер, предпоследний номер, при этом не увеличивает счётчик для этой номерной серии ?

Спасибо
Старый 19.06.2007, 12:48   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Не получилось понять вопрос, но может так ?

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  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Не совсем так.

Например, у меня для производственного заказа был настроена непрерывная номерная серия типа 01_080, последний заказ - номер 24_080. Как можно получить 25_080 и 23_080, при этом следующему заказу будет присвоен номер 25_080.

Если newGetnum использовать, то следующий заказ будет 25_080. Только что попробовал
Старый 19.06.2007, 13:20   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Если номерная серия непрерывная, то откуда уверенность, что следующим номером будет 80? Может система выдаст номер из освободившехся номеров. Кстати, то же и по предыдущему номеру. Что считать предыдущим, если он был выдан из освободившихся?
Если же в качестве следующего выдаваемого устраивает то, что находится в номерной серии в соответствующем поле, а в качестве следующего и предыдущего этот номер +1 и -1, то получите его напрямую из таблицы номерных серий (правда опять же все неоднозначно, вдруг работа идет по грруппе номерных серий - тогда сначала нужно еще и получить конкретную серию)
Старый 19.06.2007, 13:31   #5  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Следующий номер, как я понимаю, это номер, который указывается в поле Следующий в форме настройки номерных серий. Только там цифра не в той форме которая нужна мне. Мне нужна именно 25_080 а не просто 25, "_080" до этого неизвестно поэтому не можем просто добавить "_080", да и если можно то и некрасиво

По предыдущему номеру - правда надо уточнить.
Старый 19.06.2007, 13:40   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
преобразовать его в реальное значение можно так
X++:
NumberSeq::numInsertFormat(323, "УЗСЖ######");
Старый 19.06.2007, 13:41   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А если не секрет, что за задача, в которой требуется получение таких данных?
Кстати, почему _080 не известно? В той же таблице храниться шаблон, смотрите как он используется в классе работы с номерными сериями и делаете что-нибудь подобное. Хотя, на мой взгляд, не совсем корректно что-то делать с номерными сериями помимо API этого функционала.
Старый 19.06.2007, 13:43   #8  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Цитата:
Следующий номер, как я понимаю, это номер, который указывается в поле Следующий в форме настройки номерных серий.
Необязательно. Если у вас стоит настройка непрерывность, а она у вас стоит, и удалили произв заказ 15_080, то в поле следующий будет стоять 25, а в списке очищенных номеров будет болтаться 15. И когда АХ запросит новый номер NumberSeq::newGetNum(), ему выдастся номер 15_080. И этот номер удалится из очищенных номеров
Т.о. следующий - это 15.
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.
Старый 19.06.2007, 13:47   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Угу, а исходя из всего вышесказанного про выдачу номерочков самым правильным будет вариант с получением номера, а потом откатом этого номера, как показано выше. имхо
Старый 19.06.2007, 20:29   #10  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
А если не секрет, что за задача, в которой требуется получение таких данных?
Да у меня задача была преобразование данных из различных программ поэтому много нестандартных проблем возникает и решает его только один раз достаточно. Создал эту тему не только для решения этой задачи, скорее всего хочу узнать есть ли красивое решение.

Цитата:
Сообщение от e@gle Посмотреть сообщение
Необязательно. Если у вас стоит настройка непрерывность, а она у вас стоит, и удалили произв заказ 15_080, то в поле следующий будет стоять 25, а в списке очищенных номеров будет болтаться 15. И когда АХ запросит новый номер NumberSeq::newGetNum(), ему выдастся номер 15_080. И этот номер удалится из очищенных номеров
Т.о. следующий - это 15.
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Угу, а исходя из всего вышесказанного про выдачу номерочков самым правильным будет вариант с получением номера, а потом откатом этого номера, как показано выше. имхо
Спасибо. Т.е вы имеете ввиду что именно метод num.used() запретить использовать этот номер в дальнейшем даже если заказ с этим номером уже когда-то существовал ?

Тогда какой метод система использует для выдачи этого номера (15_080) если бы num.used() не использовали ?
Старый 20.06.2007, 14:07   #11  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
тоже стояла такая задача. Сделал следующим образом (хотя потом все равно пришлось переделывать):
вызываете NewGetNum(), получаете номер Num(), а потом возвращаете его в таблицу методом Abort(). Только имейте ввиду что это почему то работет только для непрерывных номерных серий. То есть перед запуском кода еще необходимо проверять непрерывный ли этот номер и выдавать ошибку, если нет.
Кстати очень странно, что нет метода котрый возвращал бы следующее значение...

Последний раз редактировалось Eldar9x; 20.06.2007 в 14:10.
Старый 20.06.2007, 14:44   #12  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Цитата:
Спасибо. Т.е вы имеете ввиду что именно метод num.used() запретить использовать этот номер в дальнейшем даже если заказ с этим номером уже когда-то существовал ?
Идея такая. Вы создали экземпляр класса NumberSeq, в котором хранится новый номер. В этот момент система сохранила новый номер в список с признаком "Нерешенный".
Теперь если вы запускаете num.used(), то система понимает что номер использован и удаляет его из списка.
А если вы запускаете num.abort(), то система понимает что номер не использован, сохранит его в список с признаком "Свободен" и будет подсовывать его следующий раз.
Т.о. для гарантированного получения следующего номера надо сделать:
X++:
num = NumberSeq::newGetNum();
Id = num.num();
num.abort();
Цитата:
Только имейте ввиду что это почему то работет только для непрерывных номерных серий.
И очень хорошо что такая система реализована ТОЛЬКО для непрерывных номерных серий. Если мне без разницы какой там номер будет у моей закупки, то зачем эта вся тягомутина со списками? Лишние селекты-инсерты? А если взять таблицу потолще?
Таким образом если ты хочеш контролировать "дырки" в номерах, то делай непрерывную номерную серию и трать больше времени на создание-удаление записи. Не хочеш - отключай непрерывность.
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.
Старый 21.06.2007, 13:30   #13  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
Спасибо Это по-моему красивое решение. На самом деле если потребуется много раз это делать можно написать свой метод который включает вышеописанный код.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Очистка номерной серии Anders DAX: Функционал 9 03.12.2010 08:57
Установить следующее значение в номерной серии kitty DAX: Программирование 11 29.02.2008 16:34
получение номерной серии из номера ваучера Axaptus DAX: Программирование 2 25.12.2007 14:32
Непрерывность номерной серии YaHooka DAX: Функционал 7 30.06.2005 18:04
привязка к новой номерной серии delicia DAX: Программирование 2 21.11.2002 11:24

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

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

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