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> 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', lambda row: 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 (Source code)
> - 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.
> To unsubscribe from this group and all its topics, send an email to
> 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.

Reply via email to