Abfrage in einer Quelltextregel funktioniert nicht

  • Hallo,


    jetzt sitze ich schon seit Stunden an dieser einfachen Abfrage und finde einfach den Fehler nicht. Der im folgenden aufgeführte Codeschnipsel soll anhand eines Ausgangsthemas und dreier verschiedener Benutzerdefinierten Felder ein bestimmtes Zielthema auswählen. Warum auch immer, es funktioniert nicht. Ich glaube es hat etwas mit der Abfrage der Benutzerdefinierten Felder zu tun. Wenn ich die raus nehme, dann klappt es.


    Auch wenn ich mir die Logik im Expertenmodus zusammenklicke klappt es. (Code siehe unten.) Anscheinend sehe ich den Wald vor lauter Bäumen nicht und würde mich daher freuen wenn jemand einen Tipp hat.



    und hier der Expertenmodus-Code:


    Lieben Gruß

  • Hallo,


    ich vermute ein Verschachtelungsproblem. Du hast keine begin..end Blöcke verwendet. Es bietet sich an, äußere Verschachtelungen immer in begin..end Blöcke zusammen zu fassen. So hat man mehr Kontrolle und auch eine bessere Übersicht. Ich habe hier mal einen Ausschnitt aus der leider noch nicht fertigen Skriptsprachen Dokumentation.


    [hr]


    4.3.1. if-Anweisung [anchor=if_anweisung][goto=top]^[/goto][/anchor]


    Es gibt zwei Formen der if-Anweisung: if...then und if...then...else. Die Syntax einer if...then-Anweisung lautet folgendermaßen:


    Code
    1. if Ausdruck then
    2. Anweisung;


    Das Ergebnis von Ausdruck ist ein Wert vom Typ Boolean. Anweisung wird nur ausgeführt, wenn der Ausdruck True ergibt. Ein Beispiel:


    Code
    1. if J <> 0 then
    2. Result := I/J;


    Die Syntax einer if...then...else-Anweisung lautet


    Code
    1. if Ausdruck then
    2. Anweisung1
    3. else
    4. Anweisung2;


    Das Ergebnis von Ausdruck ist ein Wert vom Typ Boolean. Wenn der Ausdruck True ergibt, wird Anweisung1 ausgeführt, andernfalls Anweisung2. Ein Beispiel:


    Code
    1. if J = 0 then
    2. Exit
    3. else
    4. Result := I/J;


    Die then- und else-Klauseln enthalten jeweils nur eine Anweisung. Hinter einer if-Anweisung kann eine Verbundanweisung folgen. Es kann sich hierbei auch um eine strukturierte Anweisung handeln:


    Code
    1. if J <> 0 then
    2. begin
    3. Result := I/J;
    4. Count := Count + 1;
    5. end
    6. else
    7. if Count = Last then
    8. Done := True
    9. else
    10. Exit;


    Zwischen der then-Klausel und dem Wort else darf kein Strichpunkt stehen. Nach einer vollständigen if-Anweisung können Sie einen Strichpunkt verwenden, um sie von der nächsten Anweisung innerhalb des Blocks zu trennen. Zwischen der then- und der else-Klausel wird nur ein Leerzeichen oder ein Wagenrücklaufzeichen benötigt. Das Einfügen eines Strichpunkts vor dem Wort else (in einer if-Anweisung) stellt einen der häufigsten Programmierfehler dar.


    Auch verschachtelte if-Anweisungen bergen die Gefahr von Programmierfehlern. Das Problem besteht darin, daß für bestimmte if-Anweisungen else-Klauseln existieren, für andere jedoch nicht. Ansonsten ist die Syntax für die beiden if-Konstrukte identisch. Wenn in einer Folge von Bedingungen weniger else-Klauseln als if-Anweisungen vorhanden sind, ist möglicherweise die Zuordnung der else-Klauseln zu den if-Anweisungen nicht eindeutig erkennbar. Die Anweisung


    Code
    1. if Ausdruck1 then if Ausdruck2 then Anweisung1 else Anweisung2;


    könnte demnach auf zwei Arten interpretiert werden:


    Code
    1. if Ausdruck1 then [ if Ausdruck2 then Anweisung1 else Anweisung2 ];
    2. if Ausdruck1 then [ if Ausdruck2 then Anweisung1 ] else Anweisung2;


    Der Interpreter verwendet immer die erste Interpretationsart. Dies bedeutet, daß die Anweisung


    Code
    1. if ... { Ausdruck1 } then
    2. if ... { Ausdruck2 } then
    3. ... { Anweisung1 }
    4. else
    5. ... { Anweisung2 } ;


    mit diesem Konstrukt identisch ist:


    Code
    1. if ... { Ausdruck1 } then
    2. begin
    3. if ... { Ausdruck2 } then
    4. ... { Anweisung1 }
    5. else
    6. ... { Anweisung2 }
    7. end;


    Die Interpretation von verschachtelten Bedingungen beginnt immer bei der innersten Bedingung. Dabei wird jedes else dem letzten vorhergehenden if zugeordnet. Wenn der Compiler die zweite Interpretationsart verwenden soll, muß der Quelltext folgendermaßen aussehen:


    Code
    1. if ... { Ausdruck1 } then
    2. begin
    3. if ... { Ausdruck2 } then
    4. ... { Anweisung1 }
    5. end
    6. else
    7. ... { Anweisung2 } ;