2016-03-09 3 views
0

Я пытаюсь создать купон в следующем формате:Генерация последовательного кода купона в Java

{месяц}/{дата}/{SERIALNUMBER}

Я выбора месяца и даты от UI, поэтому я получаю месяц и дата правильно, но моя проблема:
SERIALNUMBER должен автоматически Increment и
Он должен снова начать с нуля для новой даты

то, что я попытался это:

private static Integer srNumber = 000; 
public Coupon CouponCreation(Coupon coupon) { 

    String voucherNumber; 

    srNumber += srNumber + 001; 

    voucherNumber = (coupon.getTransactionDate().getMonth() + 1) 
      + "/" + coupon.getTransactionDate().getDate() 
      + "/" + srNumber; 

    coupon.setVoucherNumber(voucherNumber); 

    return coupon; 
} 

Класс купона содержит все методы получения и установки
В приведенных выше коде я хочу, чтобы генерировать srNumber как: 001, 002, 003 и так далее
Но если coupon.getTransactionDate().getDate() изменилось, то srNumber начнет снова от 001, 002 и номер ваучера должен быть
08/02/001, 08/02/002 и так далее

+0

Вы сохраняете свои сгенерированные купоны где-то? –

+0

yes Я сохраняю 'voucherNumber' в базе данных mysql –

+0

, затем сделайте одно, получите последний сохраненный купон no из базы данных, проанализируйте его, а затем проверьте дату/месяц, если он изменился, а затем просто сбросите счетчик. –

ответ

0

Любой простой способ сделать это было бы создать 2D массив Int, 12x31 и еа ch cell сохранит серийный номер. Поэтому, когда вы получаете свою дату, конвертируйте ее день и месяц и используйте серийный номер и прирост. Так что если ваш купон - Ян, 10. Вы получите serialArray[0][10], чтобы получить Серийный номер. и приращение после присвоения ему ваучера.

Если вы хотите, чтобы вы сделали это 3D, в течение года тоже.

Для 2D, месяц и дата, она будет выглядеть следующим образом при условии, getMonth() и GetDate() возвращают Интс:

int[][] serialArray = new int [12][31]; 

int srNumber=serialArray[coupon.getTransactionDate().getMonth()][coupon.getTransactionDate().getDate()]++; 

Последовательный массив будет инициализировать значение 0 в начале программы. Или, может быть, вы даже можете прочитать файл. Так будет, если вам нужен отдельный серийный код для каждой даты.

EDIT Этот код предназначен для, если ваши ваучеры будут возвращаться и четвёртым между датами и вы не хотите, чтобы сбросить свой серийный номер. Если вы просто хотите сбросить свой серийный номер каждый раз, когда вы встретите новую дату. Вы можете сохранить предыдущую дату.

Также вы можете добавить третье измерение, чтобы сохранить год слишком [YY] [MM] [DD].

+1

, пожалуйста, продумайте его каким-то кодом? потому что я думаю, что нужно. не так уж сложно –

+0

обновил его, чтобы показать, что я имею в виду. –

+0

таким образом вы всегда должны заполнять таблицу при запуске программы, потому что коды хранятся в mysql db. я бы предложил использовать правильный sql-запрос, чтобы извлечь этот номер вместо этого. –

2

MySQL подход

определение таблицы

CREATE TABLE v (
    month int, 
    day int, 
    orderNum int); 

некоторые стартап значения

INSERT INTO v VALUES (1,1,1); 
INSERT INTO v VALUES (1,1,2); 
INSERT INTO v VALUES (1,1,3); 
INSERT INTO v VALUES (1,2,1); 
INSERT INTO v VALUES (1,2,2); 
INSERT INTO v VALUES (1,3,1); 

Теперь inputing значения с автоматической генерации

INSERT INTO v SELECT month,day,COUNT(orderNum)+1 FROM v WHERE month=1 AND day=1; 
INSERT INTO v SELECT month,day,COUNT(orderNum)+1 FROM v WHERE month=1 AND day=1; 
INSERT INTO v SELECT month,day,COUNT(orderNum)+1 FROM v WHERE month=1 AND day=1; 

но выше пример превратит нашу жизнь в кошмар, если будет еще несколько столбцов.

INSERT INTO v VALUES(1,1,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=1)); 
INSERT INTO v VALUES(1,2,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=2)); 
INSERT INTO v VALUES(1,3,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=3)); 
INSERT INTO v VALUES(1,4,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=4)); 
INSERT INTO v VALUES(1,4,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=4)); 
INSERT INTO v VALUES(1,1,(SELECT COUNT(orderNum)+1 FROM v AS v2 WHERE month=1 AND day=1)); 

пример выше - это то, что вы ищете. Не забудьте указать псевдоним таблицы (v2 в примере выше), иначе вставка не будет выполнена.

если вы сейчас выполнить

SELECT * FROM v ORDER BY month, day 

, то вы увидите, что он также работает для запуска новой последовательности для каждого следующего дня

Если вы храните эти символы в виде одной строки, то вы должны сделайте несколько струн, чтобы выработать его. Чтобы избежать этого, я предлагаю изменить его на 3 поля, чтобы сделать их лучше, а затем присоединить их к строке в приложении

+0

Хорошо, я попробую это, и надеюсь, что это будет не так уж сложно –

+0

Я заметил одну ошибку, так как она потерпит неудачу при размещении ваучеров на день с 0 ваучерами. Я исправлю это через минуту –