The following is something that I have used in MySQL.
MySQL statement:
CREATE TABLE IF NOT EXISTS autonumbering
( Year char(4) not null default '',
Type varchar(10) not null default '',
ID int(11) not null auto_increment,
Notes varchar(64) not null default '',
CreatedOn timestamp not null default current_timestamp,
PRIMARY KEY (Year, Type, ID)
) ENGINE=MyISAM AUTO_INCREMENT=1;
Code in a model:
autoNumbering.define_table('autonumbering',
Field('Year', 'string', length=4, notnull=True, default='', required=True, label='Year', readable=True, writable=True),
Field('Type', 'string', length=10, notnull=True, default='', required=True, label='Type', readable=True, writable=True),
Field('id', 'id'),
Field('Notes', 'string', length=64, notnull=True, default='', required=False,label='Notes', readable=True, writable=True),
Field('CreatedOn', 'datetime', notnull=True, default=datetime.datetime.now(), required=False,label='Created On', readable=True, writable=True),
migrate=False
)
Code in a module:
def getWorkOrderNumber(Year): # Year is 4-digits, as in 2015
r = autoNumbering.autonumbering.insert(Year=Year, Type='WorkOrder')
autoNumbering((autoNumbering.autonumbering.Year == Year) & (autoNumbering.autonumbering.Type == 'WorkOrder') & (
autoNumbering.autonumbering.id == str(r - 1))).delete()
return Year[2:] + str(r).rjust(5, '0')
This returns a unique, sequential 5-digit number prefixed by the last two digits of the provided year.