For the trigger ... you could also consider using the web2py support for
on insert / on update callbacks:
http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#callbacks-on-record-insert-delete-and-update
________________________________________
Kiran Subbaraman
http://subbaraman.wordpress.com/about/
On Mon, 06-03-2017 5:39 PM, Paul Ellis wrote:
Hey Brian,
Doing it on the fly won't work because I want the number to be set at
record creation and be a part of the dataset. Also, this is what I am
already doing.
Using a database trigger is something I don't know anything about. So
thank you for the nudge, I will research this option.
Paul
On Mon, Mar 6, 2017 at 1:03 AM, Brian M <bmere...@gmail.com
<mailto:bmere...@gmail.com>> wrote:
First of all, at the risk of asking a silly question - is there
actually a reason to store this secondary ID in the database
rather than just have it calculated on the fly as-needed using a
virtual field? Assuming that you've got a created_date field
already in the table that'll give you the month portion and then
there's definitely an id field to give you that so just let web2py
figure it out for you on-the-fly
|
Field.Virtual('human_id',lambdarow:int(row.your_table.created_date.strftime('%y%m00000'))+row.your_table.id)
|
The above would cause a record created today (2017-03-05) that had
id = 123 to return a human_id of 170300123 which is I think what
you want. Note the extra zeros tacked on to the end of the
strftime they are important so that when you add the ID you don't
accidentally increment your month number - be sure to include
enough to ensure that you can cover the highest realistic record
ID (and then add an extra zero :D). Alternatively, you may wish to
consider changing your human ID format to something like
yymm-###### so that you don't have to worry about inadvertently
messing up your date related portion and it is perhaps slightly
easier for humans to understand which is presumably important
because I don't get why you'd want to include the year and month
if it isn't supposed to mean anything to the user.
db.your_table.human_id =
Field.Virtual('human_id',lambda
row:'{0}-{1}'.format(row.your_table.created_date.strftime('%y%m')
+'-'+ row.your_table.id), table_name = 'your_table')
If you need to actually store it in the database then you'll have
to work more. Sadly, web2py's computed fields won't work because
they don't know the ID before the insert. That leaves you with
doing it DB side. MySQL appears to only lets you have one
auto-increment per table so unfortunately you can't have both your
actual primary key ID and a second human readable monthly ID (that
would intentionally be reset to something like 1703000000 this
month and 1704000000 next). What I'd consider is creating a DB
trigger that would take care of automatically populating your
secondary ID for you all within the database so that there's
nothing for you to manage. So on insert the database could
automatically look at the date (or use an existing created_date
field) and the current auto-increment number and combine as needed
and store it for you.
~Brian
On Sunday, March 5, 2017 at 11:26:51 AM UTC-6, Paul Ellis wrote:
I want to have a numbering system which is 2 digit year, 2
digit month and then an autoincrement number which resets each
month. 1703#####
Currently using SQLite with a view to move to MYSQL in future.
The MYSQL examples I have found suggest using a composite
primary key, which doesn't seem to fit too well with web2py.
The reason I am trying for autoincrement is so the database
ensures the numbers are unique. I am willing to look at
another way if I am sure I won't end up with 2 identical numbers.
At the moment I have it working with
datetime.date.today().strftime('%y%m') + id. So I am half way
there, but can't see how to reset each month. I guess I can
check for the highest number in the database programmatically,
but I am worried about duplicate numbers with a high number of
users. This also seems like if the document with the highest
number was deleted (but possibly already printed), then the
number will be reused.
The program uses the actual primary key for all backend work.
This is just an identifier for humans, but the documents
produced by the program can't afford to have the same number
as another document.
Can someone give me a nudge in the right direction, I am a bit
stuck?
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py
<http://github.com/web2py/web2py> (Source code)
- https://code.google.com/p/web2py/issues/list
<https://code.google.com/p/web2py/issues/list> (Report Issues)
---
You received this message because you are subscribed to a topic in
the Google Groups "web2py-users" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/web2py/hH_O_mUV4rw/unsubscribe
<https://groups.google.com/d/topic/web2py/hH_O_mUV4rw/unsubscribe>.
To unsubscribe from this group and all its topics, send an email
to web2py+unsubscr...@googlegroups.com
<mailto:web2py+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout
<https://groups.google.com/d/optout>.
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google
Groups "web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to web2py+unsubscr...@googlegroups.com
<mailto:web2py+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/d/optout.
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups "web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.