[gelöst] CC: CASE OF Konstrukt funkt. nicht, warum?

5. November 2010 01:51

Hallo allerseits,

Ich habe mehrere Fibu-Buchblätter, in denen ich entsprechend der Debitornummer auf die Geschäftsbuchungsgruppe referenzieren und dann darauf aufbauend wieder zurück auf das Buchblatt verweisen möchte, um ein Gegenkonto per VALIDATE einzufügen (Inland := 8400, EU := 8315, DRITTLAND := 8120).

Folgender Code bringt aber eine Fehlermeldung, die ich nicht verstehe, denn ich dachte NAV beherrscht CASE OF für alle Datentypen:

Code:

GenJnlLine.SETRANGE("Journal Template Name",'ALLGEMEIN');
GenJnlLine.SETFILTER("Journal Batch Name",'2009_11..2010_09');
GenJnlLine.SETRANGE("Account Type",GenJnlLine."Account Type"::Customer);
IF GenJnlLine.FINDSET THEN
  REPEAT
    CustRec.GET(GenJnlLine."Account No.");
    CASE CustRec."Gen. Bus. Posting Group" OF
      CustRec."Gen. Bus. Posting Group" = 'INLAND':
        BEGIN
          GenJnlLine.VALIDATE("Bal. Account No.",'8400');
          GenJnlLine.MODIFY;
        END;
      CustRec."Gen. Bus. Posting Group" = 'EU O. ID':
        BEGIN
          GenJnlLine.VALIDATE("Bal. Account No.",'8125');
          GenJnlLine.MODIFY;           
        END;
      CustRec."Gen. Bus. Posting Group" = 'EU':
        BEGIN
          GenJnlLine.VALIDATE("Bal. Account No.",'8315');
          GenJnlLine.MODIFY;           
        END;
      CustRec."Gen. Bus. Posting Group" = 'AUSLAND':
        BEGIN
          GenJnlLine.VALIDATE("Bal. Account No.",'8120');
          GenJnlLine.MODIFY;           
        END;
  UNTIL GenJnlLine.NEXT = 0;


FEHLERMELDUNG:

Eine Typkonvertierung kann nicht durchgeführt werden, da eine der Seiten einen ungültigen Typ hat.

Code t_testcase Boolean


=> ich habe mit der Suchfunktion nur das hier im Forum gefunden, darauf hab ich meinen Code aufgebaut, obwohl es sich auf Datentyp Option bezieht:
Code:
CASE SalesHeader."Document Type" OF
  SalesHeader."Document Type"::Invoice:
    BEGIN
      //Rechnungen verbuchen     
    END;
  SalesHeader."Document Type"::"Credit Memo":
    BEGIN
      //Gutschriften verbuchen
Zuletzt geändert von Freestyler am 5. November 2010 10:50, insgesamt 1-mal geändert.

Re: CC: CASE OF Konstrukt funktioniert nicht, warum?

5. November 2010 08:58

Du schreibst ja auch als Case-Optionen einen Bool-Ausdruck: "CustRec."Gen. Bus. Posting Group" = 'INLAND'".
Richtig wäre bei dir:
Code:
CASE CustRec."Gen. Bus. Posting Group" OF
      'INLAND': // statt CustRec."Gen. Bus. Posting Group" = 'INLAND':
        BEGIN
          GenJnlLine.VALIDATE("Bal. Account No.",'8400');
          GenJnlLine.MODIFY;
        END;
      'EU O. ID': // statt CustRec."Gen. Bus. Posting Group" = 'EU O. ID':
       usw.
       

Re: CC: CASE OF Konstrukt funktioniert nicht, warum?

5. November 2010 09:18

Wichtig ist vielleicht auch noch das CASE OF mit einen eigenen END; zu terminieren.

Allgemein:
Code:
CASE var OF
  <value1>: <Anweisung1>;
  <value2>: BEGIN
    <Anweisung2>;
    <Anweisung3>;
  END;
  ELSE <Anweisungx>;
END;


mfg,
winfy

Re: CC: CASE OF Konstrukt funktioniert nicht, warum?

5. November 2010 10:13

McLane + winfy: vielen Dank!

Ich gebe zu, ich habe das CASE OF Konstrukt nicht sehr oft benutzt.

Re: CC: CASE OF Konstrukt funktioniert nicht, warum?

5. November 2010 10:29

Lord_British hat geschrieben:McLane + winfy: vielen Dank!

Ich gebe zu, ich habe das CASE OF Konstrukt nicht sehr oft benutzt.


Ich war früher auch skeptisch bei CASE OF Anweisungen, da andere Programmier- und Skriptsprachen ihre Eigenarten damit haben.

Bei einigen, meist älteren Sprachen, setzt man eine auf- oder absteigende Liste der Werte vorraus.
Bei der Abfrage vom ERRORLEVEL in DOS in Batchdateien oder PHP ist das auch der Fall.

In C/AL gibt es aber keine mir bekannten Probleme damit.

Sprich:
Code:
CASE var OF
  1 : <Anweisung1>;
  2 : <Anweisung2>; 
  3 : <Anweisung3>;
END;

ist das Selbe wie:
Code:
CASE var OF
  3 : <Anweisung3>;
  1 : <Anweisung1>;
  2 : <Anweisung2>;
END;


Doppelte Abfragen des selben Wertes gehen zwar syntaktisch, aber dabei wird nur die Erste ausgeführt.
Code:
var:=3;
CASE var OF
  3 : <Anweisung3>;
  3 : <Anweisung4>;
  2 : <Anweisung2>;
END;

nur <Anweisung3> wird ausgeführt.

Innerhalb der CASE OF Anweisung sollte man den Wert der besagten Variable nicht verändern, zumindestens nicht um die CASE OF Anweisung zu steuern.

Code:
var:=3;
CASE var OF
  3 : BEGIN
    <Anweisung3>;
    var:=1;
  END;
  2 : <Anweisung2>;
  1 : <Anweisung1>;
END;

Es wird nur <Anweisung3> ausgeführt.

mfg,
winfy