only amount
Derek Atkins
warlord at MIT.EDU
Wed Mar 7 08:28:36 EST 2012
Hi,
Please remember to CC gnucash-devel on all replies so that everyone on
the list can help. I'm not the only person; I was just the first to
respond.
Having said that, you are only getting one error, and the error is that
you are passing a gnc-numeric into a function that only takes a
gnc-monetary. Your issue is the line:
(fmtmoneyNoCurrency rval)
But rval is of the wrong type, hense the error:
77* [fmtmoneyNoCurrency #<num: 1800000 denom: 100>]
32: 78 [xaccPrintAmount ...
33: 79* [gnc:gnc-monetary-amount #< num: 1800000 denom: 100>]
?: 80 (if (eq? # #) (struct-ref obj 1) (%record-type-error # obj)) ...
?: 81 [scm-error wrong-type-arg "%record-type-check" ...]
You cannot use your new API for both types. You will have a similar
problem later, where you try to format the output of gnc-numeric-add
-derek
PS: I would have responded inline and cut most of this message had you
already sent it to the list.. Please rmemeber to send future messages to
the list. Thanks.
ST <smntov at gmail.com> writes:
> thank you Derek!
>
> I tried this, but I still get errors. Here is a portion of slightly
> modified version of taxinvoice.eguile.scm (here I try to print only
> amounts without currency):
>
> [see errors below]
>
> <tbody> <!-- display invoice entry lines, keeping running totals -->
> <?scm
> (let ((tax-total (gnc:make-commodity-collector))
> (sub-total (gnc:make-commodity-collector))
> (dsc-total (gnc:make-commodity-collector))
> (inv-total (gnc:make-commodity-collector)))
> (for entry in entries do
> (let ((qty (gncEntryGetQuantity entry))
> (each (gncEntryGetInvPrice entry))
> (action (gncEntryGetAction entry))
> (rval (gncEntryReturnValue entry #t))
> (rdiscval (gncEntryReturnDiscountValue entry #t))
> (rtaxval (gncEntryReturnTaxValue entry #t))
> (disc (gncEntryGetInvDiscount entry))
> (disctype (gncEntryGetInvDiscountType entry))
> (acc (gncEntryGetInvAccount entry))
> (taxable (gncEntryGetInvTaxable entry))
> (taxtable (gncEntryGetInvTaxTable entry)))
> (inv-total 'add currency rval)
> (inv-total 'add currency rtaxval)
> (tax-total 'add currency rtaxval)
> (sub-total 'add currency rval)
> (dsc-total 'add currency rdiscval)
> ?>
> <tr valign="top">
> <td align="center"><?scm:d (gnc-print-date (gncEntryGetDate
> entry)) ?></td>
> <td align="right"><?scm:d (gncEntryGetDescription entry) ?></td>
> <!-- td align="right">< ?scm:d (gncEntryGetNotes entry) ?></td -->
> <?scm (if units? (begin ?>
> <td align="right"><?scm:d action ?></td>
> <?scm )) ?>
> <?scm (if (or units? qty?) (begin ?>
> <td align="left"><?scm:d (fmtnumeric qty) ?></td>
> <?scm )) ?>
> <?scm (if (or units? qty? discount?) (begin ?>
> <td align="left"><?scm:d (fmtmoneyNoCurrency each) ?></td>
> <?scm )) ?>
> <?scm (if discount? (begin ?>
> <?scm (if (equal? disctype GNC-AMT-TYPE-VALUE) (begin ?>
> <td align="left"><?scm:d (gnc:monetary->string
> (gnc:make-gnc-monetary currency disc)) ?></td>
> <?scm ) (begin ?>
> <td align="left"><?scm:d (fmtnumeric disc) ?>%</td>
> <?scm )) ?>
> <td align="left"><?scm:d (fmtmoneyNoCurrency rdiscval) ?></td>
> <?scm )) ?>
> <?scm (if (and tax? taxtables?) (begin ?>
> <td align="left"><?scm:d (fmtmoneyNoCurrency rval) ?></td>
> <td align="left"><?scm (taxrate taxable taxtable
> currency) ?></td>
> <td align="left"><?scm:d (fmtmoneyNoCurrency rtaxval) ?></td>
> <?scm )) ?>
> <!-- TO DO: need an option about whether to display the
> tax-inclusive total? -->
> <td align="left"><?scm:d (fmtmoneyNoCurrency (gnc-numeric-add rval
> rtaxval GNC-DENOM-AUTO GNC-RND-ROUND)) ?></td>
> </tr>
> <?scm )) ?>
>
> <!-- display subtotals row -->
> <?scm (if (or tax? discount? payments?) (begin ?>
> <tr valign="top">
> <td align="right" class="subtotal" colspan="<?scm:d
> spancols2 ?>"><strong><?scm:d opt-subtotal-heading ?></strong></td>
> <?scm (if discount? (begin ?>
> <td align="left" class="subtotal"><strong><?scm
> (display-comm-coll-total dsc-total #f) ?></strong></td>
> <?scm )) ?>
> <?scm (if (and tax? taxtables?) (begin ?>
> <td align="left" class="subtotal"><strong><?scm
> (display-comm-coll-total sub-total #f) ?></strong></td>
> <td> </td>
> <td align="left" class="subtotal"><strong><?scm
> (display-comm-coll-total tax-total #f) ?></strong></td>
> <?scm )) ?>
> <td align="left" class="subtotal"><strong><?scm
> (display-comm-coll-total inv-total #f) ?></strong></td>
> </tr>
> <?scm )) ?>
>
> <!-- payments -->
> <?scm
> (if payments?
> (for split in splits do
> (let ((t (xaccSplitGetParent split)))
> (if (not (equal? t txn)) ; don't process the entry itself
> as a split
> (let ((c (xaccTransGetCurrency t))
> (a (xaccSplitGetValue split)))
> (inv-total 'add c a)
> ?>
> <tr valign="top">
> <td align="center"><?scm:d (gnc-print-date
> (gnc-transaction-get-date-posted t)) ?></td>
> <td align="right" colspan="<?scm:d (- spancols1 1) ?>"><?scm:d
> opt-payment-recd-heading ?></td>
> <td align="left"><?scm:d (fmtmoneyNoCurrency a) ?></td>
> </tr>
> <?scm ))))) ?>
>
> <!-- total row -->
> <tr valign="top">
> <td align="right" class="total" colspan="<?scm:d
> spancols1 ?>"><strong><?scm:d opt-amount-due-heading ?></strong></td>
> <td align="left" class="total"><strong><?scm
> (display-comm-coll-total inv-total #f) ?></strong></td>
> </tr>
>
> </tbody>
>
>
>
> but I get following 2 errors:
>
> n error occurred when processing the template:
>
> ERROR: In procedure %record-type-check:
> ERROR: Wrong type record (want `"<gnc-monetary>"'): #<<gnc-numeric> num:
> 1800000 denom: 100>
> In current input:
> 4: 63* (let* ((x 42)) (letrec (# #) (if # # ...) ...))
> ?: 64 (letrec (# #) (if # # #) (display "
>
>
>
> "))
> 411: 65* (if (null? opt-invoice) (begin (display #) (display #)) ...)
> 415: 66 (let* ((owner #) (endowner #) (ownertype #)) (if (not #)
> (begin # #) ...))
> ...
> 38: 67 (let* (# # # # ...) (if # #) (for-each # entries) ...)
> 296: 68* (let (# # # ...) (for-each # entries) ...)
> 300: 69* (for entry in ...)
> 300: 70 [for-each # (#)]
> ?: 71* [# #]
> ?: 72* (let (# # # # ...) (begin # # # ...))
> ?: 73 (begin (inv-total # currency ...) (inv-total #
> currency ...) ...)
> ?: 74* (if (and tax? taxtables?) (begin # # # ...))
> ?: 75 (begin (display "
>
>
> and the second error:
>
>
> ") (display #) ...) ?: 76* [display ... ?: 77* [fmtmoneyNoCurrency #<
> num: 1800000 denom: 100>] 32: 78 [xaccPrintAmount ... 33: 79*
> [gnc:gnc-monetary-amount #< num: 1800000 denom: 100>] ?: 80 (if (eq? #
> #) (struct-ref obj 1) (%record-type-error # obj)) ... ?: 81 [scm-error
> wrong-type-arg "%record-type-check" ...]
>
>
> On Tue, 2012-03-06 at 11:41 -0500, Derek Atkins wrote:
>> Hi,
>>
>> ST <smntov at gmail.com> writes:
>>
>> > when I removed "-public" from define it started to work...
>> >
>> > I tried:
>> >
>> > (define (fmtmoneyNoCurrency curr amt)
>> > ;; Format a monetary amount in the given currency as HTML
>> > (nbsp (gnc:monetary->string (gnc:gnc-monetary-amount amt))))
>> >
>> > but it also produced errors...
>> >
>> > So the questions is - how do I rewrite this function so that it prints
>> > only amount without currency?
>>
>> The gnc:monetary->string API expects a <gnc:monetary>. What you want is
>> a modification of that API that passes #f instead of #t into
>> gnc-commodity-print-info. So something like:
>>
>> (define (fmtmoneyNoCurrency value)
>> (xaccPrintAmount
>> (gnc:gnc-monetary-amount value)
>> (gnc-commodity-print-info (gnc:gnc-monetary-commodity value) #f)))
>>
>> Then you can use this instead of gnc:monetary->string
>>
>> > ST
>>
>> -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
warlord at MIT.EDU PGP key available
More information about the gnucash-devel
mailing list