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 ;