[gnucash-de] Bräuchte da Hilfe beim Schreiben meines ersten Reports
Christian Stimming
stimming at tuhh.de
So Nov 14 14:53:06 EST 2010
Am Sonntag, 14. November 2010 schrieb Martin Kaffanke:
> Mein Report, siehe Anhang 1 crasht, Anhang 2.
DISCLAIMER: Ich schreibe normalerweise nicht solche ausführlichen
Hilfestellungen (zumindest nicht ohne Bezahlung, haha). Aber mir war gerade
kurz langweilig und deshalb schreib ich eine lange Erklärung. Aber bitte jetzt
nicht erwarten, dass ich beim nächsten crash ebenfalls genauso schnell und
genauso ausführlich antworte. OK?
Jedenfalls:
Der backtrace ist hier die wichtigste Info und ja leider meistens auch die
einzige Info. In diesem Fall:
> /usr/share/gnucash/scm/options.scm:1468:8: In expression (options (quote
> lookup)):
> /usr/share/gnucash/scm/options.scm:1468:8: Wrong type to apply:
> #<unspecified>
Der Fehler sagt sinngemäß, dass eine Funktion in options.scm ein Dings
übergeben bekommen hat, was nicht das erwartete komplexe Objekt ist (hier: Das
Objekt, welches die Liste der definierten Optionen enthält), sondern
stattdessen nur was anderes, hier sogar #<unspecified>. Das ist der Scheme-
Fehler, der einem Compilerfehler bei einer strongly typed language entsprechen
würde: Du hast einen Wert an eine Funktion übergeben, der nicht von der
Objektklasse ist, den die Funktion haben will.
Um nun rauszukriegen, welches diese Variable mit der falschen "Objektklasse"
war, musst du im backtrace nach oben gehen, bis man eine Funktion
wiedererkennt:
> 195: 5* [gnc:lookup-option #<unspecified> "General" "Report name"]
> In /usr/share/gnucash/scm/options.scm:
> 1467: 6 (if options ((options (quote lookup)) section name) #f)
> 1468: 7 ((options (quote lookup)) section name)
> 1468: 8* (options (quote lookup))
Der frame #5 sagt's dann: Du benutzt gnc:lookup-option, und das taucht ja in
deinem report-renderer auf (wenn auch indirekt in der Hilfsfunktion "get-
option"). Also kontrolliert man nun, ob die Argumente an gnc:lookup-option
fehlerhaft sein könnten. Das Argument Nr. 2 und 3 wohl kaum, denn das sind
einfache Strings. Bleibt nur das Argument Nr.1, der Wert "options". Der ist
also unerwarteterweise nicht die Liste der definierten Berichtsoptionen.
Nun kann man also nachsehen, wo diese "options" korrekt hätten definiert
werden müssen. Beim Report-framework von gnucash gibt es dazu den options-
generator, bei dir also die Funktion my-overview-options-generator. Die dort
erzeugte Liste von Optionen muss ja irgendwie zum Report-Framework gelangen,
und in Scheme tut sie das tunlichst, indem die Liste von Optionen der
Rückgabewert der options-generator-Funktion ist. Damit ist der Fehler
gefunden: Bei dir fehlt die Angabe des Rückgabewerts des (let ...)-Blocks. Du
musst also schreiben
(define (my-overview-options-generator)
(let* ((options (gnc:new-options))
(add-option
(lambda (new-option)
(gnc:register-option options new-option))))
(add-option
... irgendwas ...)
options) ;; Rückgabewert des let-Blocks und damit der ganzen Funtion
) ;; Ende der Funktion
Gruß
Christian
Mehr Informationen über die Mailingliste gnucash-de