From 5af8213951e3a9c9806187d215bc9f00118118b2 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sun, 8 Jan 2023 23:03:15 +0800 Subject: [PATCH] [balsheet-pnl] generate exchange-fn for each date separately and cache its result --- .../report/reports/standard/balsheet-pnl.scm | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/gnucash/report/reports/standard/balsheet-pnl.scm b/gnucash/report/reports/standard/balsheet-pnl.scm index a1d1aaa6669..2c082a7b093 100644 --- a/gnucash/report/reports/standard/balsheet-pnl.scm +++ b/gnucash/report/reports/standard/balsheet-pnl.scm @@ -769,11 +769,17 @@ also show overall period profit & loss.")) (cons acc (map col-datum-get-split-balance-with-closing cols-data)))) accounts-cols-data)) - (exchange-fn (and common-currency - (gnc:case-exchange-time-fn - price-source common-currency - (map xaccAccountGetCommodity accounts) enddate - #f #f))) + ;; generate an exchange-fn for date, and cache its result. + (get-date-exchange-fn + (let ((h (make-hash-table))) + (lambda (date) + (or (hashv-ref h date) + (let ((exchangefn (gnc:case-exchange-time-fn + price-source common-currency + (map xaccAccountGetCommodity accounts) + date #f #f))) + (hashv-set! h date exchangefn) + exchangefn))))) ;; from col-idx, find effective date to retrieve pricedb ;; entry or to limit transactions to calculate average-cost @@ -799,9 +805,9 @@ also show overall period profit & loss.")) (gnc:gnc-monetary-commodity monetary) common-currency)) (has-price? (gnc:gnc-monetary-commodity monetary)) - (exchange-fn - monetary common-currency - (col-idx->price-date col-idx))))) + (let* ((col-date (col-idx->price-date col-idx)) + (exchange-fn (get-date-exchange-fn col-date))) + (exchange-fn monetary common-currency col-date))))) ;; the following function generates an gnc:html-text object ;; to dump exchange rate for a particular column. From the