Database Tables Transactions and Accounts

John Ralls jralls at ceridwen.us
Mon Mar 7 16:11:04 EST 2011


On Mar 7, 2011, at 12:04 PM, Matt Riley wrote:

> Hello John,
> 
> Thanks for your help. Here's the final select query that worked for me:
> 
> SELECT *
> FROM gnucash.transactions AS t
> JOIN gnucash.splits AS s
>    ON s.tx_guid = t.guid
> JOIN gnucash.accounts AS a
>    ON s.account_guid = a.guid
> WHERE t.guid = '[my-guid]';
> 
> 
> My next task is to insert data into these tables while maintaining data 
> integrity. I'm building myself a mobile web application that will allow me to 
> enter transaction data. The new transaction data is queued online and my local 
> system will pickup the new data and insert it into my local MySQL into these 
> tables on a scheduled basis.
> 
> Based on my analysis of these tables, here's my thinking on how to insert the 
> data correctly. Please let me know if I'm missing anything obvious.
> 
> First insert a record in 'gnucash.transactions'
> Take the new 'gnucash.transactions.guid' value and insert two records into 
> 'gnucash.splits'
> The value for 'gnucash.splits.tx_guid' maps to new 'gnucash.transactions.guid' 
> value
> The value for 'gnucash.splits.account_guid' maps to an existing 
> 'gnucash.accounts.guid' value for each corresponding account
> Values for 'gnucash.splits.value_num' and 'gnucash.splits.quantity_num' need to 
> correspond to the *_denom value
> For example if *_denom = 100, then a real value of $1.25 will translate to '125'
> Also, while I'm inserting new records I'll need to create my own new guid values
> 
> Does this look good? Are there any other tables I should be concerned about when 
> adding new transactions?
> 
> Your help is greatly appreciated.

Won't work. It's a lot more complicated than that. ***You can't understand how it works from the tables!*** There's a lot of action going on in C; everything important, in fact. Spend a few dozen hours studying all of the code in gnucash/src/engine and you'll eventually see how it fits together.

If it's a web app, then the server can talk to libgnc-engine and do it safely through QOF. Anything else is very unlikely to make transaction that won't either be ignored or crash.

If gnucash interoperablity isn't a goal, then write your own data model. Gnucash's isn't designed correctly for transactional use with an RDB; fixing that is one of the major projects for the next year or three.

Regards,
John Ralls




More information about the gnucash-devel mailing list