On Sat, 2009-10-10 at 19:31 +0100, Simon Slavin wrote:
> On 10 Oct 2009, at 5:08pm, David Bicking wrote:
>
> > I have a table:
> > CREATE TABLE Assets
> > ( ControlDate Date
> > , Amt
> > )
>
> There is no such column type as 'Date' in SQLite. You got TEXT,
> INTEGER, REAL. Make sure you know what's going into that field. Also
Yes, I know there is no Date type in Sqlite. I would likely be storing
the date as text in a 'yyyy-mm-dd' format.
> I don't understand your primary key for the Asset TABLE. Is
> 'ControlDate' a primary key ? In other words can you have no more
> than one record for any one day ? Your answer to this changes how the
> TRIGGER has to work.
>
I haven't entirely decided what the primary key would be. Possibly an
artificial autoincrement value, but probably a composit key of a half
dozen fields not shown as I didn't think them important to the problem.
The control date likely would be part of the composite key. But
certainly you can have more than one record with a given ControlDate.
> > Now, the business rules are you can INCREASE the Amt if the Current
> > Date
> > is the ControlDate in the record. You can DECREASE the amount if the
> > Current Date is greater than or equal to the ControlDate.
>
> You mean 'greater than or less than', right ? Otherwise you
> contradict yourself.
>
Um... I do believe I have gotten it wrong. There are in fact two
controldates, on controldate #1, you can increase the value. ON or after
controldate #2, which will always be after controldate #1, you can
decrease the amount. I guess controldate#1 would be better called the
creation date, and controldate #2 would be maturity date. They are a
function of each other, but I am not exactly sure about that yet. More
research to do.
> > Can this be enforced via a trigger, or must I enforce that business
> > rule
> > at the application layer?
>
> You can absolutely use a TRIGGER for this, but you need some way of
> making the current date (you mean 'right now' ?) available to SQLite.
> Something like
>
> CREATE TRIGGER Assets_change_amt
> BEFORE UPDATE ON Assets
> FOR EACH ROW BEGIN
> SELECT RAISE(ROLLBACK, 'Amount can only increase on a
> particular day.')
> WHERE (new.amt <= old.amt) AND (new.ControlDate = currentDate);
> END;
>
I'll test if I can do date functions in triggers. But this tells me what
I need to know. Sort of a D'oh! moment as "new.amt <= old.amt" NEVER
occurred to me. Thanks for pointing out what should have been plainly
obvious even to me!
> But I just wrote 'currentDate' in there and you won't be able to use
> that. What I don't know is how you have formatted the contents of the
> ControlDate field. If you have been consistent with SQLite, then you
> can use something like
>
> date('now')
> strftime('%s','now')
>
> That is assuming you can use date functions inside TRIGGERs. I think
> that depends on which version of SQLite you're using. For that you
> need someone more expert than I am.
>
> Simon.
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users