[GELÖST] BelegNr. aus Serie automatisch erhöhen?

13. Oktober 2010 20:18

EDIT: INCSTR(Rec.Code_Field);

Hallo allerseits,

Ich hab für ein Fibubuchblatt eine automatische Belegnr. Serie eingerichtet SLVOR, die bei SLVOR-001 als Startnummer beginnt.

Nun möcht ich das Fibubuchblatt per INIT und INSERT befüllen.
Dabei soll bei jedem Durchgang die nächst höhere Nummer gegriffen werden. Nur wie inkrementiere ich eine Variable von Typ Code mit Inhalt SLVOR-001 um 1, damit ab der zweiten Zeile, die eingefügt wird SLVOR-002 steht und ab der dritten SLVOR-0000003 etc. etc. Bei Pascal gibt es den Befehl INC(Variable). Und in C/AL?
Zuletzt geändert von Freestyler am 11. November 2010 10:15, insgesamt 2-mal geändert.

Re: [GELÖST]BelegNr. aus Serie automatisch erhöhen?

13. Oktober 2010 22:30

Nicht mit INCSTR manuell hochzählen!
Wenn du eine Nummernserie hinterlegt hast, dann müssen die Funktionen aus dem NoSeriesManagement auch verwendet werden, damit diese auch im Takt bleibt und u.a. die "Letzte Nr. verwendet" gefüllt wird.
Code:
"Document No." := NoSeriesMgt.TryGetNextNo(GenJnlBatch."No. Series","Posting Date");

Re: [GELÖST]BelegNr. aus Serie automatisch erhöhen?

13. Oktober 2010 23:35

Kowa hat geschrieben:Nicht mit INCSTR manuell hochzählen!
Wenn du eine Nummernserie hinterlegt hast, dann müssen die Funktionen aus dem NoSerieManagement auch verwendet werden, damit diese auch im Takt bleibt und u.a. die "Letzte Nr. verwendet" gefüllt wird.
Code:
"Document No." := NoSeriesMgt.TryGetNextNo(GenJnlBatch."No. Series","Posting Date");


D.h. das hier würde tatsächlich funktionieren?

Code:
IF ImpCust.FINDFIRST THEN BEGIN //ImpCust ist eine Tabelle > 50.000 mit importierten Daten
  REPEAT
    GenJnlLine.INIT;
    GenJnlLine."Line No." := ImpCust."Line No.";
    GenJnlLine."Journal Template Name" := 'ALLGEMEIN';
    GenJnlLine."Journal Batch Name" := 'SALDEB06';
    GenJnlLine."Posting Date" := ImpCust.Date;
    GenJnlLine."Document Date" := ImpCust.Date;

    NoSerLine.GET('SLDEB06',10000);
    //MyCode := INCSTR(NoSerLine."Last No. Used");
    //GenJnlLine."Document No." := MyCode;
    GenJnlLine."Document No." := NoSerMng.TryGetNextNo(GenJnlBatch."No. Series","Posting Date");
   //... etc. etc.
   GenJnlLine.INSERT;
UNTIL ImpCust.NEXT = 0;


Ich frage deshalb nach dem "funktionieren" da ich schon manuell zu Fuß und per INCSTR mein Problem gelöst habe und die Daten schon mit F11 verbucht sind ;)

Re: [GELÖST]BelegNr. aus Serie automatisch erhöhen?

14. Oktober 2010 09:22

Es ging nicht ums verbuchen, sondern darum, die Konsistenz zwischen generierten Nummern und der Nummernserie zu wahren. Wenn die richtigen Parameter in die Funktion gegeben werden (also der Code der zum Buchblattnamen gehörigen Serie und das Buchungsdatum), dann kommt auch die richtigen Nummern zurück. Nummernserien haben auch ein Startdatum und ein Intervall, ggf.müssen sie chronologisch sein. Nichts davon wird berücksichtigt, wenn man die Funktionen nicht nutzt.

Re: [GELÖST]BelegNr. aus Serie automatisch erhöhen?

11. November 2010 08:44

Kowa hat geschrieben:Es ging nicht ums verbuchen, sondern darum, die Konsistenz zwischen generierten Nummern und der Nummernserie zu wahren. Wenn die richtigen Parameter in die Funktion gegeben werden (also der Code der zum Buchblattnamen gehörigen Serie und das Buchungsdatum), dann kommt auch die richtigen Nummern zurück. Nummernserien haben auch ein Startdatum und ein Intervall, ggf.müssen sie chronologisch sein. Nichts davon wird berücksichtigt, wenn man die Funktionen nicht nutzt.


Hallo Kowa,

Ich krieg leider folgende Errormeldung:


Die Verwendung der unten aufgeführten C/AL-Funktionen ist innerhalb von Schreibtransaktionen, die eine oder mehrere Tabellen gesperrt haben, eingeschränkt (da eine oder mehrere Tabelle gesperrt sein werden).
Form.RunModal() ist in Schreibtransaktionen nicht erlaubt.
CodeUnit.Run() ist in Schreibtransaktionen nur dann erlaubt, wenn der Rückgabewert nicht benutzt wird. Nicht erlaubt ist zum Beispiel 'OK := CodeUnit.Run()'.
Report.RunModal() ist in Schreibtransaktionen nur dann erlaubt, wenn 'RequestForm = FALSE'. Erlaubt ist zum Beispiel 'Report.RunModal(...,FALSE)'.
DataPort.RunModal() ist in Schreibtransaktionen nur dann erlaubt, wenn 'RequestForm = FALSE'. Erlaubt ist zum Beispiel 'DataPort.RunModal(...,FALSE)'.
Verwenden Sie COMMIT, um die Änderungen abzuschließen, bevor Sie die Funktion aufrufen, oder strukturieren Sie Ihren Code anders.


Mein Code lautet konkret wie folgt, wobei ImpCust eine Tab > 50.000 ist, in der importierte Umsätze drin stehen:
Code:
ImpCust.SETFILTER(Date,'01.11.2009..30.11.2009');
IF ImpCust.FINDSET THEN 
  REPEAT
    GenJnlLine.INIT;
    .... //weitere Zuweisungen von ImpCust zu GenJnlLine
    GenJnlLine."Document No." := NoSeriesMgt.TryGetNextNo(GenJnlBatch."No. Series",ImpCust.Date);
    ....
    GenJnlLine.INSERT;


Die selbe Meldung kommt auch bei
Code:
ImpCust.SETFILTER(Date,'01.11.2009..30.11.2009');
IF ImpCust.FINDSET THEN 
  REPEAT
    GenJnlLine.INIT;
    .... //weitere Zuweisungen von ImpCust zu GenJnlLine
   GenJnlLine."Document No." := NoSeriesMgt.TryGetNextNo('UMSATZ-0911',ImpCust.Date);
   ...
   GenJnlLine.INSERT;


Der Debugger sagt, dass er an folgender Stelle bei CU 396 "zubeißt":
(1)NoSeriesManagement\GetNextNo(NoSeriesCode,SeriesDate,ModifySeries): NoSeries.GET(NoSeriesCode);
(2)NoSeriesManagement\OnRun(): TryNo := GetNextNo(TryNoSeriesCode,TrySeriesDate,FALSE);
(3)NoSeriesManagement\TryGetNextNo(NoSeriesCode,SeriesDate):IF NoSeriesMgt.RUN THEN
EXIT(NoSeriesMgt.GetNextNo2);


EDIT: nun hat es doch funktioniert:

Code:

Zuletzt geändert von Freestyler am 11. November 2010 10:27, insgesamt 1-mal geändert.

Re: BelegNr. aus Serie automatisch erhöhen?

11. November 2010 10:21

Die Meldung hat mit Nummernserien nichts zu tun. Wenn Forms,Reports oder Dataports modal aufgerufen werden, wird zwingend eine Eingabe vom Benutzer erwartet. Wenn das mit einer Schreibtransaktion kombiniert wird (also irgendwo INSERT oder MODIFY stattfindet) dann wäre das System blockiert bis die Eingabe erfolgt. Das ist nicht erlaubt. Also entweder nicht modal starten oder die Schreibtransaktion verlegen oder ein COMMIT dazwischen. Letzteres ist aber besonders bei Transaktionen mit mehreren Tabellen, die entweder ganz oder gar nicht geändert werden müssen, keine gute Lösung und sollte vermieden werden.

Re: BelegNr. aus Serie automatisch erhöhen?

11. November 2010 10:37

Kowa hat geschrieben:Die Meldung hat mit Nummernserien nichts zu tun. Wenn Forms,Reports oder Dataports modal aufgerufen werden, wird zwingend eine EIngabe vom Benutzer erwartet. Wenn das mit einer Schreibtransaktion kombiniert wird (also irgendwo INSERT oder MODIFY stattfindet) dann wäre das System blockiert bis die Eingabe erfolgt. Das ist nicht erlaubt. Also entweder nicht modal starten oder die Schreibtransaktion verlegen oder ein COMMIT dazwischen. Letzeres ist aber besonders bei Transaktionen mit mehreren Tabellen, die entweder ganz oder gar nicht geändert werden müssen, keine gute Lösung und sollte vermieden werden.


Vielen Dank!

Folgender Code hat funktioniert:

Code:

    GenJnlTemplate.GET('ALLGEMEIN');
    GenJnlBatch.GET('ALLGEMEIN','UMSATZ-0911');
    IF GenJnlBatch."No. Series" <> '' THEN BEGIN
      CLEAR(NoSeriesMgt);
      GenJnlLine."Document No.":= NoSeriesMgt.GetNextNo(GenJnlBatch."No. Series",ImpCust.Date,TRUE);
    END;     



Statt TryGetNextNo verwende ich GetNextNo

Ich hab beim vorherirgen Code nix modal aufgerufen, der ganze Code ist im OnPush() Trigger eines Buttons auf einer Form, hinter der sich Tabelle 50000 ImpCust verbirgt.

Re: BelegNr. aus Serie automatisch erhöhen?

11. November 2010 10:53

Lord_British hat geschrieben:Ich hab beim vorherirgen Code nix modal aufgerufen, der ganze Code ist im OnPush() Trigger eines Buttons auf einer Form, hinter der sich Tabelle 50000 ImpCust verbirgt.

Dann war der 2.Satz der Fehlermeldung hier zutreffend. TryGetNextNo hat einen Rückgabewert für das Codeunit, GetNextNo nicht.