Warning, /office/kmymoney/contrib/functions.mysql is written in an unsupported language. File is not indexed.

0001 /*                     functions.mysql
0002    Some functions for use with a KMyMoney MySql database.
0003    Load them into your database with command:
0004    mysql KMyMoney < this_file
0005    To preserve them in backups, remember to add the -R flag to mysqldump.
0006 */
0007 
0008 delimiter //
0009 
0010 DROP FUNCTION IF EXISTS toDecimal//
0011 CREATE
0012  FUNCTION toDecimal(mymoneymoney VARCHAR(32))
0013  RETURNS DECIMAL(12,6)
0014   BEGIN
0015    /* Converts a MyMoneyMoney numerator/denominator string to a decimal number */
0016    DECLARE result DECIMAL (12,6);
0017    SELECT SUBSTRING_INDEX(mymoneymoney, '/', 1) / SUBSTRING_INDEX(mymoneymoney, '/', -1) INTO result;
0018    RETURN result;
0019   END
0020 //
0021 delimiter ;
0022 
0023 delimiter //
0024 DROP FUNCTION IF EXISTS cashBalance//
0025 CREATE
0026  FUNCTION cashBalance(acctId VARCHAR(32))
0027  RETURNS DECIMAL(12,2)
0028   BEGIN
0029   /* Returns the cash balance as of today of an account specified by internal id.*/
0030   /* to determine id - SELECT id FROM kmmAccounts WHERE accountName = 'whatever';
0031      Sample usage - SELECT cashBalance('A000001');  */
0032    DECLARE result DECIMAL (12,2);
0033      SELECT SUM(toDecimal(shares)) INTO result
0034        FROM kmmSplits
0035          WHERE accountId = acctId
0036           AND postDate <= NOW()
0037           AND txType = 'N';
0038    RETURN result;
0039   END
0040 //
0041 delimiter ;
0042 
0043 delimiter //
0044 DROP PROCEDURE IF EXISTS listBalances//
0045 CREATE
0046  PROCEDURE listBalances(IN parent varchar(32))
0047  BEGIN
0048   /* Lists the balances of all accounts subsidiary to a named account. NOTE: not recursive 
0049      Sample usage: - CALL listBalances('Asset'); */
0050   SELECT accountName, cashBalance(id) FROM kmmAccounts where parentId = 
0051     (SELECT id from kmmAccounts WHERE accountName = parent)
0052    ORDER by 1;
0053  END
0054 //
0055 delimiter ;
0056 
0057 delimiter //
0058 DROP FUNCTION IF EXISTS latestPrice//
0059 CREATE
0060  FUNCTION latestPrice(secId VARCHAR(32))
0061  RETURNS DECIMAL(12,6)
0062   BEGIN
0063    /* Returns the latest price for a security identified by internal id. */
0064    /* to determine id - SELECT id FROM kmmSecurities WHERE name = 'whatever'; */
0065    DECLARE result DECIMAL (12,6);
0066    SELECT toDecimal(price) INTO result
0067      FROM kmmPrices WHERE fromId = secId AND priceDate =
0068       (SELECT MAX(priceDate) FROM kmmPrices WHERE fromId = secId);
0069    RETURN result;
0070 END
0071 //
0072 delimiter ;
0073 
0074 delimiter //
0075 DROP FUNCTION IF EXISTS shareBalance//
0076 CREATE
0077  FUNCTION shareBalance(acctId VARCHAR(32))
0078  RETURNS DECIMAL(12,6)
0079   BEGIN
0080   /* Returns the share balance for an Stock account identified by internal id.
0081      NOTE: similar to cashBalance but with greater precision */
0082    DECLARE result DECIMAL (12,6);
0083    SELECT SUM(toDecimal(shares)) INTO result
0084      FROM kmmSplits WHERE accountId = acctId AND txType = 'N';
0085    RETURN result;
0086   END
0087 //
0088 delimiter ;
0089 
0090 delimiter //
0091 DROP FUNCTION IF EXISTS valuation//
0092 CREATE
0093  FUNCTION valuation(acctId VARCHAR(32))
0094  RETURNS DECIMAL(12,2)
0095   BEGIN
0096    /* Returns the current value of a Stock account identified by internal id */
0097    DECLARE result DECIMAL(12,2);
0098    DECLARE secId VARCHAR(32);
0099    SELECT currencyId FROM kmmAccounts WHERE id = acctId INTO secId;
0100    SELECT shareBalance(acctId) * latestPrice(secId) INTO result;
0101    RETURN result;
0102   END
0103 //
0104 delimiter ;
0105 
0106 
0107 delimiter //
0108 DROP PROCEDURE IF EXISTS listValues//
0109 CREATE
0110  PROCEDURE listValues(IN parent varchar(32))
0111  BEGIN
0112   /* Lists the current values of all stocks subsidiary to a named Investment account. NOTE: not recursive */
0113   SELECT parent AS 'Portfolio';
0114   SELECT accountName, valuation(id) AS 'Value' FROM kmmAccounts where parentId = 
0115     (SELECT id from kmmAccounts WHERE accountName = parent)
0116    ORDER by 1;
0117   SELECT SUM(valuation(id)) AS 'Total Value' FROM kmmAccounts where parentId = 
0118     (SELECT id from kmmAccounts WHERE accountName = parent);
0119  END
0120 //
0121 delimiter ;