Op 18-sep-2007, om 15:46 heeft Derek Atkins het volgende geschreven:

Johan van Oostrum <[EMAIL PROTECTED]> writes:
My svn diff does not accept the -x -b switches (svn, version 1.3.2
(r19776)   compiled Jun  5 2006, 13:13:11)
So created the (attached) diff as follows using GNU Diff (on Mac OS X
10.4.10):
svn diff --diff-cmd /usr/bin/diff -x "-b" -r 81:83 ~/Documents/svn/
my_gnucash_reports/branches/advanced-portfolio.scm >
~/Desktop/diff.txt
This results in  < and > indicator instead of the - and + as in svn
diff. Hope this is ok too?
Ahh, could you use "-x -ub" then?  The > and < make it impossible
to apply the patch.
Ok, that option did it! Hope that the attached diff is a useful one.
Index: 
/Users/johan/Documents/svn/my_gnucash_reports/branches/advanced-portfolio.scm
===================================================================
--- 
/Users/johan/Documents/svn/my_gnucash_reports/branches/advanced-portfolio.scm   
    (revision 81)
+++ 
/Users/johan/Documents/svn/my_gnucash_reports/branches/advanced-portfolio.scm   
    (revision 84)
@@ -39,6 +39,7 @@
 (define reportname (N_ "Advanced Portfolio"))
 
 (define optname-price-source (N_ "Price Source"))
+(define optname-sort-column (N_ "Sort Column"))
 (define optname-shares-digits (N_ "Share decimal places"))
 (define optname-zero-shares (N_ "Include accounts with no shares"))
 (define optname-include-gains (N_ "Include gains and losses"))
@@ -64,7 +65,27 @@
      (N_ "Date") "a")
 
     (gnc:options-add-currency! 
-     options gnc:pagename-general (N_ "Report Currency") "c")
+     options gnc:pagename-general (N_ "Report Currency") "b")
+    
+    (add-option
+     (gnc:make-multichoice-option
+      gnc:pagename-general optname-sort-column
+      "c" (N_ "The column on which the report is sorted") '0
+      (list (vector '0 (N_ "Account") (N_ ""))
+            (vector '1 (N_ "Symbol") (N_ ""))
+            (vector '2 (N_ "Listing") (N_ ""))
+            (vector '3 (N_ "Shares") (N_ ""))
+            (vector '4 (N_ "Price") (N_ ""))
+            (vector '5 (N_ "Tick") (N_ "")) ;; use-txn tick
+            (vector '6 (N_ "Basis") (N_ ""))
+            (vector '7 (N_ "Value") (N_ ""))
+            (vector '8 (N_ "Money In") (N_ ""))
+            (vector '9 (N_ "Money Out") (N_ ""))
+            (vector '10 (N_ "Realized Gain") (N_ ""))
+            (vector '11 (N_ "Unrealized Gain") (N_ ""))
+            (vector '12 (N_ "Total Gain") (N_ ""))
+            (vector '13 (N_ "Total Return") (N_ ""))
+            )))
 
     (add-option
      (gnc:make-multichoice-option
@@ -102,7 +123,6 @@
       (N_ "Prefer use of price editor pricing over transactions, where 
applicable.")
       #t))
 
-
     (gnc:register-option 
      options 
      (gnc:make-simple-boolean-option
@@ -110,6 +130,7 @@
       (N_ "Include splits with no shares for calculating money-in and 
money-out")
       #f))
 
+    ;; Show Tab
     (gnc:register-option
       options
       (gnc:make-simple-boolean-option
@@ -144,7 +165,7 @@
        (N_ "Display share prices")
        #t))
 
-    ;; Account tab
+    ;; Account Tab
     (add-option
      (gnc:make-account-list-option
       gnc:pagename-accounts (N_ "Accounts")
@@ -173,7 +194,6 @@
 ;; includes all the relevant Scheme code. The option database passed
 ;; to the function is one created by the options-generator function
 ;; defined above.
-
 (define (advanced-portfolio-renderer report-obj)
   
  (let ((work-done 0)
@@ -277,22 +297,18 @@
        )
     )
 
-  
-(define (table-add-stock-rows table accounts to-date
+    ;; return list with computed values for all selected stocks
+    (define (table-add-stock-rows accounts to-date
                                 currency price-fn exchange-fn 
                                include-empty include-gains show-symbol 
show-listing show-shares show-price
                                 basis-method prefer-pricelist total-basis 
total-value total-moneyin total-moneyout
                                 total-gain total-ugain)
 
-   (let ((share-print-info
-         (gnc-share-print-info-places
-          (inexact->exact (get-option gnc:pagename-display
-                              optname-shares-digits)))))
+      (let ()
     
-    (define (table-add-stock-rows-internal accounts odd-row?)
-      (if (null? accounts) total-value
-          (let* ((row-style (if odd-row? "normal-row" "alternate-row"))
-                 (current (car accounts))
+        (define (table-add-stock-rows-internal accounts)
+          (if (null? accounts) (list) ;; return empty list
+              (let* ((current (car accounts))
                  (rest (cdr accounts))
                  (name (xaccAccountGetName current))
                  (commodity (xaccAccountGetCommodity current))
@@ -301,7 +317,7 @@
                  (unit-collector (gnc:account-get-comm-balance-at-date
                                   current to-date #f))
                  (units (cadr (unit-collector 'getpair commodity #f)))
-;;                 (totalunits 0.0) ;;      these two items do nothing, but 
are in a debug below, 
+                     ;;                 (totalunits 0.0) ;;      these two 
items do nothing, but are in a debug below, 
  ;;                (totalunityears 0.0);;   so I'm leaving it. asw
 
                  ;; Counter to keep track of stuff
@@ -312,7 +328,6 @@
                  (moneyoutcoll  (gnc:make-commodity-collector))
                  (gaincoll      (gnc:make-commodity-collector))
 
-
                  (price-list (price-fn commodity to-date))
                  (price      (if (> (length price-list) 0)
                                 (car price-list) #f))
@@ -329,8 +344,7 @@
                 (txn-units (gnc-numeric-zero))
                 )
 
-
-;;          (gnc:debug "---" name "---")
+                ;;          (gnc:debug "---" name "---")
            (for-each
             (lambda (split)
               (set! work-done (+ 1 work-done))
@@ -376,31 +390,31 @@
                        (lambda (s)
                          (cond
                           ((same-split? s split) 
-;;                       (gnc:debug "amount " (gnc-numeric-to-double 
(xaccSplitGetAmount s))
-;;                                  " acct " (xaccAccountGetName 
(xaccSplitGetAccount s)) )
-;;                       (gnc:debug "value " (gnc-numeric-to-double 
(xaccSplitGetValue s))
-;;                                  " in " (gnc-commodity-get-printname 
commod-currency)
-;;                                  " from " (xaccTransGetDescription 
(xaccSplitGetParent s)))
+                                 ;;                       (gnc:debug "amount " 
(gnc-numeric-to-double (xaccSplitGetAmount s))
+                                 ;;                                  " acct " 
(xaccAccountGetName (xaccSplitGetAccount s)) )
+                                 ;;                       (gnc:debug "value " 
(gnc-numeric-to-double (xaccSplitGetValue s))
+                                 ;;                                  " in " 
(gnc-commodity-get-printname commod-currency)
+                                 ;;                                  " from " 
(xaccTransGetDescription (xaccSplitGetParent s)))
                            (cond
                             ((or include-gains (not (gnc-numeric-zero-p 
(xaccSplitGetAmount s))))
                              (unitscoll 'add commodity (xaccSplitGetAmount s)) 
;; Is the stock transaction?
-;; these lines do nothing, but are in a debug so I'm leaving it, just in case. 
asw.                         
-;;                           (if (< 0 (gnc-numeric-to-double
-;;                                     (xaccSplitGetAmount s)))
-
-
-;;                               (set! totalunits
-;;                                     (+ totalunits
-;;                                        (gnc-numeric-to-double 
(xaccSplitGetAmount s))))
-;;                               )
-
-
-;;                           (set! totalunityears
-;;                                 (+ totalunityears 
-;;                                    (* (gnc-numeric-to-double 
(xaccSplitGetAmount s))
-;;                                       (gnc:date-year-delta 
-;;                                        (car 
(gnc-transaction-get-date-posted parent))
-;;                                        (current-time))))) 
+                                    ;; these lines do nothing, but are in a 
debug so I'm leaving it, just in case. asw.                             
+                                    ;;                       (if (< 0 
(gnc-numeric-to-double
+                                    ;;                                 
(xaccSplitGetAmount s)))
+                                    
+                                    
+                                    ;;                           (set! 
totalunits
+                                    ;;                                 (+ 
totalunits
+                                    ;;                                    
(gnc-numeric-to-double (xaccSplitGetAmount s))))
+                                    ;;                           )
+                                    
+                                    
+                                    ;;                       (set! 
totalunityears
+                                    ;;                             (+ 
totalunityears 
+                                    ;;                                (* 
(gnc-numeric-to-double (xaccSplitGetAmount s))
+                                    ;;                                   
(gnc:date-year-delta 
+                                    ;;                                    (car 
(gnc-transaction-get-date-posted parent))
+                                    ;;                                    
(current-time))))) 
                              (cond 
                               ((gnc-numeric-negative-p (xaccSplitGetValue s))
                                (moneyoutcoll
@@ -425,8 +439,8 @@
               )
             (xaccAccountGetSplitList current)
             )
-;;          (gnc:debug "totalunits" totalunits)
-;;          (gnc:debug "totalunityears" totalunityears)
+                ;;          (gnc:debug "totalunits" totalunits)
+                ;;          (gnc:debug "totalunityears" totalunityears)
 
            ;; now we determine which price data to use, the pricelist or the 
txn
            ;; and if we have a choice, use whichever is newest.
@@ -444,7 +458,6 @@
                                                                          
(gnc-numeric-abs txn-units)
                                                                          100 
GNC-RND-ROUND))
                                  (gnc:make-gnc-monetary commod-currency 
(gnc-numeric-zero))))
-
                  (set! value (if price (gnc:make-gnc-monetary commod-currency 
                                                     (gnc-numeric-mul units
                                                                      
(gnc:gnc-monetary-amount price)
@@ -462,11 +475,11 @@
            (gaincoll 'merge moneyoutcoll #f)
            (gaincoll 'merge moneyincoll #f)
 
-
-
+                (gnc-price-list-destroy price-list)
            
          (if (or include-empty (not (gnc-numeric-zero-p units)))
-           (let* ((moneyin (gnc:monetary-neg
+                    (let*
+                        ((moneyin (gnc:monetary-neg
                            (gnc:sum-collector-commodity moneyincoll currency 
exchange-fn)))
                  (moneyout (gnc:sum-collector-commodity moneyoutcoll currency 
exchange-fn))
                  ;; just so you know, gain == realized gain, ugain == 
un-realized gain, bothgain, well..
@@ -475,13 +488,11 @@
                                                (gnc-numeric-sub 
(gnc:gnc-monetary-amount (exchange-fn value currency))
                                                                 (sum-basis 
basis-list) 
                                                                 100 
GNC-RND-ROUND)))
-                 (bothgain (gnc:make-gnc-monetary currency  (gnc-numeric-add 
(gnc:gnc-monetary-amount gain)
+                         (bothgain (gnc:make-gnc-monetary currency
+                                                          (gnc-numeric-add 
(gnc:gnc-monetary-amount gain)
                                                                              
(gnc:gnc-monetary-amount ugain)
                                                                              
100 GNC-RND-ROUND)))
-
-                 (activecols (list (gnc:html-account-anchor current)))
                  )
-
              (total-value 'add (gnc:gnc-monetary-commodity value) 
(gnc:gnc-monetary-amount value))
              (total-moneyin 'merge moneyincoll #f)
              (total-moneyout 'merge moneyoutcoll #f)
@@ -489,14 +500,65 @@
              (total-ugain 'add (gnc:gnc-monetary-commodity ugain) 
(gnc:gnc-monetary-amount ugain))
              (total-basis 'add currency (sum-basis basis-list))
 
-             ;; build a list for the row  based on user selections
-             (if show-symbol (append! activecols (list ticker-symbol)))
-             (if show-listing (append! activecols (list listing)))
-             (if show-shares (append! activecols (list 
(gnc:make-html-table-header-cell/markup
-               "number-cell" (xaccPrintAmount units share-print-info)))))
-             (if show-price (append! activecols (list 
(gnc:make-html-table-header-cell/markup
-               "number-cell"
+                      ;; build the list with all the computed values
+                      (cons (list current
+                                  ticker-symbol
+                                  listing
+                                  units
                (if use-txn
+                                      price
+                                      (gnc:make-gnc-monetary
+                                       (gnc-price-get-currency price)
+                                       (gnc-price-get-value price))) ;; price 
(used in sort)
+                                  (if use-txn "*" " ") ;; use-txn Tick
+                                  (gnc:make-gnc-monetary currency (sum-basis 
basis-list)) ;; basis
+                                  value
+                                  moneyin
+                                  moneyout
+                                  gain
+                                  ugain
+                                  bothgain                                     
                
+                                  (let ((moneyinvalue (gnc-numeric-to-double
+                                                       
(gnc:gnc-monetary-amount moneyin))))
+                                    (if (= 0.0 moneyinvalue)
+                                        moneyinvalue
+                                        (* 100 (/ (gnc-numeric-to-double
+                                                   (gnc:gnc-monetary-amount 
bothgain))
+                                                  moneyinvalue)))) ;; return
+                                  price
+                                  use-txn
+                                  pricing-txn
+                                  )
+                            (table-add-stock-rows-internal rest)))
+                    (table-add-stock-rows-internal rest)))
+              ))
+        
+        (set! work-to-do (gnc:accounts-count-splits accounts)) ;; #splits as 
progress indicator
+        
+        (table-add-stock-rows-internal accounts)
+        
+        ))
+    
+    
+    ;; add one row with stock-computed values to the HTML table
+    (define (table-add-stock-row-html table share-print-info odd-row?
+                                      show-symbol show-listing show-shares 
show-price
+                                      current ticker-symbol listing units
+                                      rate use-txn-tick basis value money-in 
money-out gain ugain bothgain return price use-txn pricing-txn )
+      ;;                                      use-txn-tick price value 
money-in money-out gain ugain bothgain return txnprice)
+      (let* ((row-style (if odd-row? "normal-row" "alternate-row"))
+             (odd-row? (not odd-row?))
+             (mycols (list (gnc:html-account-anchor current)))
+             )
+        ;; build the table-row (list) based on user selections
+        (if show-symbol (append! mycols (list ticker-symbol)))
+        (if show-listing (append! mycols (list listing)))
+        (if show-shares (append! mycols
+                                 (list (gnc:make-html-table-header-cell/markup
+                                        "number-cell" (xaccPrintAmount units 
share-print-info)))))
+        (if show-price (append! mycols
+                                (list (gnc:make-html-table-header-cell/markup
+                                       "number-cell" (if use-txn
                    (gnc:html-transaction-anchor
                     pricing-txn
                     price
@@ -506,43 +568,77 @@
                     (gnc:make-gnc-monetary
                     (gnc-price-get-currency price)
                     (gnc-price-get-value price)))
-                   )))))
-             (append! activecols (list (if use-txn "*" " ")
-                                       (gnc:make-html-table-header-cell/markup 
-                                        "number-cell" (gnc:make-gnc-monetary 
currency (sum-basis basis-list)))
+                                                         ))))) ;; price
+        (append! mycols (list use-txn-tick
+                              (gnc:make-html-table-header-cell/markup 
"number-cell" basis)
                                        (gnc:make-html-table-header-cell/markup 
"number-cell" value)
-                                       (gnc:make-html-table-header-cell/markup 
"number-cell" moneyin)
-                                       (gnc:make-html-table-header-cell/markup 
"number-cell" moneyout)
+                              (gnc:make-html-table-header-cell/markup 
"number-cell" money-in)
+                              (gnc:make-html-table-header-cell/markup 
"number-cell" money-out)
                                        (gnc:make-html-table-header-cell/markup 
"number-cell" gain)
                                        (gnc:make-html-table-header-cell/markup 
"number-cell" ugain)
                                        (gnc:make-html-table-header-cell/markup 
"number-cell" bothgain)
-                                                                               
-                                                                               
-                                       (gnc:make-html-table-header-cell/markup 
"number-cell" 
-                                           (let ((moneyinvalue 
(gnc-numeric-to-double
-                                                                
(gnc:gnc-monetary-amount moneyin))))
-                                             (if (= 0.0 moneyinvalue)
-                                                 (sprintf #f "%.2f%%" 
moneyinvalue)
-                                                 (sprintf #f "%.2f%%" (* 100 
(/ (gnc-numeric-to-double
-                                                                            
(gnc:gnc-monetary-amount bothgain))
-                                                                           
moneyinvalue))))))
-                                        )
-                       )
-                       
+                              (gnc:make-html-table-header-cell/markup 
"number-cell" (sprintf #f "%.2f%%" return))))
              (gnc:html-table-append-row/markup!
               table
               row-style
-              activecols)
-               
-             (table-add-stock-rows-internal rest (not odd-row?))
-             )
-           (table-add-stock-rows-internal rest odd-row?)
-            )
-            (gnc-price-list-destroy price-list)
-           )))
+         mycols)))
 
-    (set! work-to-do (gnc:accounts-count-splits accounts))
-    (table-add-stock-rows-internal accounts #t)))
+    ;; add all computed values off all stocks selected to the HTML table
+    (define (table-add-stock-rows-html table
+                                       show-symbol show-listing show-shares 
show-price
+                                       account-totals)
+      (let* 
+          ;; get printing related options first
+          ((share-print-info (gnc-share-print-info-places
+                              (inexact->exact (get-option gnc:pagename-display
+                                                          
optname-shares-digits))))
+           (c (get-option gnc:pagename-general
+                          optname-sort-column))
+           (odd-row? #t))
+        (for-each
+         (lambda (l)
+           (apply table-add-stock-row-html table share-print-info odd-row?
+                  show-symbol show-listing show-shares show-price l))
+         ;; sort column (c in sort-list compare-less procedure) offsets are:
+         ;;  0 account
+         ;;  1 symbol
+         ;;  2 listing
+         ;;  3 shares (units)
+         ;;  4 price (rate)
+         ;;  5 use-txn Tick
+         ;;  6 basis
+         ;;  7 value
+         ;;  8 money-in
+         ;;  9 money-out
+         ;; 10 realized gain
+         ;; 11 unrealized gain
+         ;; 12 total gain
+         ;; 13 total return
+         (sort-list account-totals 
+                    (cond 
+                      ((= c 0)
+                       (lambda (list1 list2)
+                         (if (string<? (xaccAccountGetName (list-ref list1 c))
+                                       (xaccAccountGetName (list-ref list2 
c))) #t #f)))
+                      ((or (and (> c 0) (< c 3)) (= c 5))
+                       (lambda (list1 list2)
+                         (if (string<? (list-ref list1 c) (list-ref list2 c)) 
#t #f)))
+                      ((= c 3)
+                       (lambda (list1 list2)
+                         (if (< (gnc-numeric-to-double(list-ref list1 c))
+                                (gnc-numeric-to-double(list-ref list2 c))) #t 
#f)))
+                      ((or (= c 4) (= c 6) (= c 7))
+                       (lambda (list1 list2)
+                         (if (< (if (list-ref list1 c) (gnc-numeric-to-double 
(gnc:gnc-monetary-amount (list-ref list1 c))) 0.0)
+                                (if (list-ref list2 c) (gnc-numeric-to-double 
(gnc:gnc-monetary-amount (list-ref list2 c))) 0.0)) #t #f)))
+                      ((and (> c 6) (< c 13))
+                       (lambda (list1 list2)
+                         (if (< (gnc-numeric-to-double 
(gnc:gnc-monetary-amount (list-ref list1 c)))
+                                (gnc-numeric-to-double 
(gnc:gnc-monetary-amount (list-ref list2 c)))) #t #f)))
+                      ((> c 12)
+                       (lambda (list1 list2)
+                         (if (< (list-ref list1 c) (list-ref list2 c)) #t #f)))
+                      )))))
   
   ;; Tell the user that we're starting.
   (gnc:report-starting reportname)
@@ -581,7 +677,7 @@
         (total-moneyout (gnc:make-commodity-collector))
         (total-gain     (gnc:make-commodity-collector)) ;; realized gain
        (total-ugain (gnc:make-commodity-collector))    ;; unrealized gain
-       ;;document will be the HTML document that we return.
+          ;; document will be the HTML document that we return.
         (table (gnc:make-html-table))
         (document (gnc:make-html-document)))
 
@@ -591,7 +687,7 @@
                (sprintf #f " %s" (gnc-print-date to-date))))
 
     (if (not (null? accounts))
-        ; at least 1 account selected
+          ;; at least 1 account selected
         (let* ((exchange-fn (gnc:case-exchange-fn price-source currency 
to-date))
                (pricedb (gnc-pricedb-get-db (gnc-get-current-book)))
                (price-fn
@@ -613,7 +709,7 @@
               (sum-total-gain (gnc-numeric-zero))
               (sum-total-ugain (gnc-numeric-zero)))
 
-         ;;begin building lists for which columns to display
+            ;; begin building lists for which columns to display
           (if show-symbol 
              (begin (append! headercols (list (_ "Symbol")))
                     (append! totalscols (list " "))))
@@ -646,15 +742,18 @@
            table
           headercols)
           
-          (table-add-stock-rows
-           table accounts to-date currency price-fn exchange-fn
+            (table-add-stock-rows-html table
+                                       show-symbol show-listing show-shares 
show-price
+                                       (table-add-stock-rows accounts to-date
+                                                             currency price-fn 
exchange-fn
            include-empty include-gains show-symbol show-listing show-shares 
show-price 
-          basis-method prefer-pricelist total-basis total-value total-moneyin 
total-moneyout total-gain total-ugain)
-         
+                                                             basis-method 
prefer-pricelist
+                                                             total-basis 
total-value total-moneyin total-moneyout total-gain total-ugain))
 
          (set! sum-total-gain (gnc:sum-collector-commodity total-gain currency 
exchange-fn))
          (set! sum-total-ugain (gnc:sum-collector-commodity total-ugain 
currency exchange-fn))
-         (set! sum-total-both-gains (gnc:make-gnc-monetary currency 
(gnc-numeric-add (gnc:gnc-monetary-amount sum-total-gain)
+            (set! sum-total-both-gains (gnc:make-gnc-monetary currency 
+                                                              (gnc-numeric-add 
(gnc:gnc-monetary-amount sum-total-gain)
                                                                                
      (gnc:gnc-monetary-amount sum-total-ugain)
                                                                                
      100 GNC-RND-ROUND)))
 
@@ -693,22 +792,21 @@
                                                                                
   totalinvalue))))))
                               ))
          
-
           (gnc:html-table-append-row/markup!
            table
            "grand-total"
-           totalscols
-            )
+             totalscols)
 
           (gnc:html-document-add-object! document table)
+            
           (if warn-price-dirty 
               (gnc:html-document-append-objects! document 
                                                  (list (gnc:make-html-text (_ 
"* this commodity data was built using transaction pricing instead of the price 
list."))
                                                       (gnc:make-html-text 
(gnc:html-markup-br))
                                                       (gnc:make-html-text (_ 
"If you are in a multi-currency situation, the exchanges may not be 
correct.")))))
-)
+            )
 
-                                       ;if no accounts selected.
+          ;; if no accounts selected
         (gnc:html-document-add-object!
          document
         (gnc:html-make-no-account-warning 
Regards,
Johan

Testresults not solved / explained:
1. with no pricelist data, I expected the transaction price to be
shown, which didn't. Original report behaviour is same. I guess I
don't quite understand the txn pricing.
2. selecting price source "Most recent to report" results in "337:29:
Wrong type to apply: #<unspecified>". Same in original report
(322:25: Wrong type to apply: #<unspecified>)
That's it for now.
-derek
--
       Derek Atkins, SB '93 MIT EE, SM '95 MIT Media Laboratory
       Member, MIT Student Information Processing Board  (SIPB)
       URL: http://web.mit.edu/warlord/    PP-ASEL-IA     N1NWH
       [EMAIL PROTECTED]                        PGP key available

_______________________________________________
gnucash-devel mailing list
[email protected]
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to