Re: Group BY and Chart of Accounts - Mailing list pgsql-general
From | justin |
---|---|
Subject | Re: Group BY and Chart of Accounts |
Date | |
Msg-id | 49090483.5060304@emproshunts.com Whole thread Raw |
In response to | Group BY (WaGathoni <is.mundu@gmail.com>) |
Responses |
Re: Group BY and Chart of Accounts
|
List | pgsql-general |
There was a number of code mistakes in my examples as i was just doing it off the top of my head, just went through it and got it all working. I had to change the function around as it was double dipping accounts just run this and it does work. -------------------------------------------------------------- Create table coa ( coa_id serial not null, parent_id int not null default 0, doIhaveChildren boolean default false, account_name text null ); Create Table general_ledger_transactions( transaction_id serial not null, coa_id integer, accounting_period integer, debit numeric(20,10) , credit numeric(20,10), transaction_date timestamp); Create table accounting_periods ( accounting_period serial not null, start_date date, end_date date, accounting_period_Open boolean); Insert into coa values (10, default, True, 'ParentAccount1'); Insert into coa values (11, 10, True, 'ChildAccount1'); Insert into coa values (12, 11, false, 'ChildAccount2'); Insert into coa values (13, default, false, 'ChildAccount3'); Insert into Accounting_Periods values ( 1, '2008-10-01', '2008-10-31', true ); Insert into Accounting_Periods values ( 2, '2008-11-01', '2008-11-30', true ); Insert into general_ledger_transactions values( default, 11, 1, 30.0, 0.0, current_timestamp); Insert into general_ledger_transactions values( default, 11, 1, 20.0, 0.0, current_timestamp); Insert into general_ledger_transactions values( default, 12, 1, 10.0, 0.0, current_timestamp); Insert into general_ledger_transactions values( default, 12, 1, 50.0, 0.0, current_timestamp); Insert into general_ledger_transactions values( default, 11, 1, 1.0, 0.0, current_timestamp); Insert into general_ledger_transactions values( default, 13, 1, 0.0, 111.0, current_timestamp); Insert into general_ledger_transactions values( default, 11, 2, 0.0, 30.0, current_timestamp); Insert into general_ledger_transactions values( default, 11, 2, 0.0, 20.0, current_timestamp); Insert into general_ledger_transactions values( default, 12, 2, 0.0, 10.0, current_timestamp); Insert into general_ledger_transactions values( default, 12, 2, 0.0, 50.0, current_timestamp); Insert into general_ledger_transactions values( default, 11, 2, 0.0, 1.0, current_timestamp); Insert into general_ledger_transactions values( default, 13, 2, 111.0, 0.0, current_timestamp); CREATE OR REPLACE FUNCTION GetChildAccountDebits(PassedAccountID integer, PassedPeriodID integer) RETURNS NUMERIC AS $FunctionCode$ DECLARE retval NUMERIC = 0.0 ; begin return (SELECT coalesce ( (select Sum(general_ledger_transactions.debit ) from general_ledger_transactions where general_ledger_transactions.coa_id = coa.coa_id and general_ledger_transactions.accounting_period = PassedPeriodID), 0 ) + (CASE WHEN coa.doIhaveChildren THEN GetChildAccountDebits(coa.coa_id, PassedPeriodID ) ELSE 0.0 END) FROM coa WHERE coa.parent_id = PassedAccountID); end; $FunctionCode$ LANGUAGE 'plpgsql' VOLATILE ; select 10, getchildaccountdebits(10,1) union select 11, getchildaccountdebits(11,1) union select 12, getchildaccountdebits(12,1); -------------------------------------------------- WaGathoni wrote: > Justin was recommending a solution to the Chart of Accounts Problem > posted by jamhitz: > > MQUOTE> > One has you chart of Accounts > Create table coa ( > coa_id serial not null, > parent_id int not null default 0, > doIhaveChildren boolean default false > account_name text null ) > primary key(coa_id) > > Create Table general_ledger_transactions( > transaction_id serial not null > coad_id integer, > accounting_period integer, > debit numeric(20,10) , > credit numeric(20,10), > transaction_date datestamp) > primary key (transaction_id) > > ... > > Create table accounting_periods ( > accounting_period serial not null, > start_date date, > end_date date, > accounting_period_Open boolean) > > </QUOTE> > > Would someone please assist me. Why is the following function:... > > > CREATE OR REPLACE FUNCTION GetChildAccountDebits(PassedAccountID > integer, PassedPeriodID integer) RETURNS NUMERIC AS > $FunctionCode$ > DECLARE retval NUMERIC :=0.0; > begin > SELECT Sum(gl_transactions.debit) + > CASE WHEN coa.doIhaveChildren THEN > GetChildAccountDebits(coa.coa_id, PassedPeriodID ) > ELSE > 0.0 > END > INTO retval > FROM gl_transactions, coa > WHERE gl_transactions.coa_id= coa.coa_id > AND coa.parent_id = PassedAccountID > AND gl_transactions.period_id = PassedPeriodID; > > RETURN retval; > end; > $FunctionCode$ > LANGUAGE 'plpgsql' VOLATILE ; > > ....failing with an error to the effect that that that > coa.doaIhaveChildren and coa.coa_id must be included in the GROUP BY > clause.... and what is is the recommended course of action. > > I have limited Internet access, so forgive me when I raise the same > question 8 days later. > > Thanks > >
pgsql-general by date: