[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