Re: [sqlite] controlling changes

2009-10-10 Thread David Bicking
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 '-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
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


Re: [sqlite] controlling changes

2009-10-10 Thread Simon Slavin

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  
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.

> 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.

> 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;

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
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


Re: [sqlite] controlling changes

2009-10-10 Thread David Bicking
Can you show me what the constraint would look like?

Thanks,
David

On Sat, 2009-10-10 at 09:11 -0700, Harold Wood & Meyuni Gani wrote:
> You can do it as a constraint.
> 
> -Original Message-
> From: David Bicking <dbic...@yahoo.com>
> Sent: Saturday, October 10, 2009 9:08 AM
> To: sqlite-users@sqlite.org
> Subject: [sqlite] controlling changes
> 
> I have a table:
> CREATE TABLE Assets
> ( ControlDate Date
> , Amt
> )
> 
> 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.
> 
> Can this be enforced via a trigger, or must I enforce that business rule
> at the application layer?
> 
> Thanks,
> David
> 
> 
> ___
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> 
> ___
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


Re: [sqlite] controlling changes

2009-10-10 Thread Harold Wood & Meyuni Gani
You can do it as a constraint.

-Original Message-
From: David Bicking <dbic...@yahoo.com>
Sent: Saturday, October 10, 2009 9:08 AM
To: sqlite-users@sqlite.org
Subject: [sqlite] controlling changes

I have a table:
CREATE TABLE Assets
(   ControlDate Date
,   Amt
)

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.

Can this be enforced via a trigger, or must I enforce that business rule
at the application layer?

Thanks,
David


___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


[sqlite] controlling changes

2009-10-10 Thread David Bicking
I have a table:
CREATE TABLE Assets
(   ControlDate Date
,   Amt
)

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.

Can this be enforced via a trigger, or must I enforce that business rule
at the application layer?

Thanks,
David


___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users