Received: from localhost (postgresql.org [64.49.215.8]) by postgresql.org (Postfix) with ESMTP id 5B3CF479BC7 for ; Tue, 28 Jan 2003 21:14:45 -0500 (EST) Received: from localhost.localdomain (unknown [216.31.142.3]) by postgresql.org (Postfix) with ESMTP id E2F8C479521 for ; Tue, 28 Jan 2003 19:20:00 -0500 (EST) Received: from larubber.com (server [127.0.0.1]) by localhost.localdomain (8.11.6/8.11.6) with SMTP id h0T0sgP20789 for ; Tue, 28 Jan 2003 16:54:42 -0800 Received: from 216.86.192.34 (SquirrelMail authenticated user ddurst) by www.la-rubber.com with HTTP; Tue, 28 Jan 2003 16:54:42 -0800 (PST) Message-ID: <34281.216.86.192.34.1043801682.squirrel@www.la-rubber.com> Date: Tue, 28 Jan 2003 16:54:42 -0800 (PST) Subject: LONG - Question on dealing w/ numerics From: "David Durst" To: X-Priority: 3 Importance: Normal X-MSMail-Priority: Normal Reply-To: ddurst@larubber.com X-Mailer: SquirrelMail (version 1.2.7) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Virus-Scanned: by AMaViS new-20020517 X-Archive-Number: 200301/448 X-Sequence-Number: 11313 I have a function that is to create a Accounting JOURNAL entry. The strange thing is the function works for simple entries such as: Cash - Debit 100 A/R - Credit 100 But when I try to trick it or break it for testing purposes (IT DOES BREAK WHEN IT SHOULDN'T) on a entry like this: Cash - Debit 100 A/R - Credit 100 Cash - Credit 100 A/R - Debit 100 (Which should have a net affect of 0 on both accounts) But here is the resulting balance on accounts, Cash Debit Balance 200 A/R Credit Balance 200 Here is the function and I can't seem to figure out what is LOGICALLY wrong and would produce these results. create function create_journal_entry_line(integer,integer,integer,numeric(20,2)) returns INTEGER as ' DECLARE eid ALIAS FOR $1; aid ALIAS FOR $2; ltype ALIAS FOR $3; amount ALIAS FOR $4; new_balance NUMERIC(20,2); account_type RECORD; account RECORD; line RECORD; BEGIN select into account * from accounts where account_id = aid; IF NOT FOUND THEN return -1; END IF; IF account.account_active = ''f'' THEN return -1; END IF; insert into journal_lines (entry_id,account_id,line_type,line_amount) values (eid,aid,ltype,amount); select into line * from journal_lines where entry_id = eid AND account_id = aid AND ltype = ltype; IF NOT FOUND THEN return -1; END IF; select into account_type * from account_types where account_type_id = account.account_type; IF account_type.positive_account_balance_type = line.line_type THEN new_balance := account.account_balance + amount; ELSE new_balance := account.account_balance - amount; END IF; UPDATE accounts SET account_balance = new_balance WHERE account_id = account.account_id; return line.entry_id; END;' language 'plpgsql'; P.S. Line type represents 1 = Debit, 2 = Credit. The positive_account_balance_type tells eithier if the account should have a DEBIT or CREDIT balance (Represented the same as line type)