Saving with new mysql 5.7 triggers in db

Geert Janssens geert.gnucash at kobaltwit.be
Mon May 15 04:41:41 EDT 2017


On zondag 14 mei 2017 18:22:24 CEST Ciarán wrote:
> Hi all,
> 
> I'm using GNUCash for home accounts for several years and I love it! Perfect
> for an old time accountant! Anyway the reporting has always bothered me so
> I've built an OBIEE 11g solution with mysql 5.7
> 
> I have a simple solution which only uses three tables (accounts,splits &
> transactions) and it works like a charm. However building time hierarchies
> in OBI requires some additional db changes in GNUCash to normalize the data
> 
> Year, month, day
> 
> ALTER TABLE gnucash.transactions
> ADD post_year YEAR(4);
> 
> ALTER TABLE gnucash.transactions
> ADD post_day INT(2);
> 
> ALTER TABLE gnucash.transactions
> ADD post_month INT(2);
> 
> UPDATE gnucash.transactions
> SET post_year = year(post_date);
> 
> UPDATE gnucash.transactions
> SET post_month = month(post_date);
> 
> UPDATE gnucash.transactions
> SET post_day = day(post_date);
> 
> This works great and is robust throughout saves.
> 
> Next to automate the updates I created a trigger
> 
> DELIMITER $$
> CREATE TRIGGER ins_transactions
> AFTER INSERT ON gnucash.transactions
> FOR EACH ROW
> BEGIN
>  INSERT INTO gnucash.transactions
>  SET ACTION = 'UPDATE',
> 	post_year = year(post_date),
>     post_month = month(post_date),
>     post_day = day(post_date);
> END$$
> DELIMITER ;
> 
> However from this point onwards GNUcash will not save when new transcations
> are created.
> 
> A msgbox appears with unable to save to database.
> 
> To resolve, I have re-save the db file overwriting the additional columns in
> the transactions table.
> 
> and... back to square one.
> 
> Any ideas how to maintain new mysql triggers on save in gnucash? Is this
> possible?

I don't have much experience with mysql triggers. However it looks to me your 
trigger is a bit odd. You specify that after the new row is inserted the 
trigger should insert something again, but don't specify a full row. I don't 
think you want to insert another row in the same table. You want to alter the 
row being inserted.

Rather than a trigger AFTER INSERT, I'd use a BEFORE INSERT and in your BEGIN/
END block simply set the fields as you want. Something like this (not tested):

DELIMITER $$
CREATE TRIGGER ins_transactions
BEFORE INSERT ON gnucash.transactions 
FOR EACH ROW
BEGIN
   SET NEW.post_year = year(NEW.post_date);
   SET NEW.post_month = month(NEW.post_date);
   SET NEW.post_day = day(NEW.post_date);
END$$
DELIMITER ;

Geert


More information about the gnucash-devel mailing list