[gelöst] - Temporäre Tabelle füllen

12. Januar 2024 17:45

NAV 2017

Hallo zusammen,
ich habe eine Tabelle als Record "tempRecDebitor" in meinen Report eingebunden und ihm die Eigenschaft "Temporary = YES" gegeben. In NAV ist dies wohl der Ersatz für ein leistungsfähiges Array. Soweit so gut.

Anschließen möchte ich den Record über ein Repeat mit Daten wie folgt füllen:

REPEAT
IF locintcounter >=2 THEN BEGIN
tempRecDebitor.INIT;
tempRecDebitor.Nr := locrecDebitor."No.";
tempRecDebitor.Betrag := locintcounter;
tempRecDebitor.INSERT;
COMMIT;
END;
UNTIL....

Ergebnis: die Tabelle wird nicht gefüllt. Stelle ich auf "Temporary = NO" um, wird die Tabelle gefüllt.
Was fehlt?

Vielen Dank!
Zuletzt geändert von Ralph71 am 14. Januar 2024 17:09, insgesamt 1-mal geändert.

Re: Temporäre Tabelle füllen

12. Januar 2024 18:34

Ich würde auf jeden Fall COMMIT weglassen. Ich nehme an tempRecDebitor ist eine temporäre Instanz der Tabelle Customer. Hast du vor dem Repeat auch Deleteall gemacht? Was ist Betrag für ein Feld - normales Dezimalfeld?

Re: Temporäre Tabelle füllen

12. Januar 2024 18:37

Hallo,

was meinst du denn, mit "die Tabelle ist nicht gefüllt"?

Gruß Fiddi

Re: Temporäre Tabelle füllen

12. Januar 2024 20:09

Ich nehme an tempRecDebitor ist eine temporäre Instanz der Tabelle Customer. --> nein ist es nicht. Basis ist hier eine Customer-Tabelle. die ohne Trigger ist, aber in diesem Fall Debitorendaten für die "Array"-Nutzung speichert.
Ein Typkonflikt kann es nicht sein, denn bei "Temporary = NO" wird in die Tabelle geschrieben.
Hast du vor dem Repeat auch Deleteall gemacht? --> nein. Noch nicht. Kommt aber noch... Das sollte aber nicht die Ursache des Problems sein.

was meinst du denn, mit "die Tabelle ist nicht gefüllt"?--> = virtuell gefüllt. Ich habe das am "Code-Ende" über ein REPEAT UNTIL tempRecDebitor.NEXT = 0 gecheckt. Ich habe mich ungenau ausgedrückt, er zeigt mir nur den letzten Wert an. Dh es sieht für mich so aus, dass nur ein einziges Wertepaar geschrieben wird und nicht wie bei "Temporary = NO" 50 Paare. Würde im Umkehrschluss bedeuten, dass er immer in die gleiche Tabellenzeile schreibt und keinen neuen Datensatz erstellt. tempRecDebitor.INSERT; sollte bzw macht aber genau das...

Re: Temporäre Tabelle füllen

12. Januar 2024 21:07

Wie prüfst du denn ob Daten in die temporäre Tabelle geschrieben werden? Da die nur temporär da sind kannst du das nur machen während der Job läuft, also z. B. mit Anhalten im Debugger. Sobald der Job durchgelaufen ist sind die Daten natürlich nicht in der temp. Tabelle vorhanden.

Re: Temporäre Tabelle füllen

12. Januar 2024 21:33

da gibts im REPEAT mehrere Möglichkeiten, zwei habe ich genutzt.

Entweder im Debugger mit Mouseover zb zeiger := tempRecDebitor.Nr ; bzw ohne Debugger mit message(tempRecDebitor.Nr);

Ich stelle also fest, dass die Codierung prinzipiell korrekt ist. Bzgl Konfiguration der Rec-Variablen kann / muss man ja nur auf "Temporary = NO" in den Eigenschaften der Variablen stellen.

Re: Temporäre Tabelle füllen

13. Januar 2024 16:58

Ich habe das Problem jetzt auf einen einfachen Code heruntergebrochen und eine Codeunit geschrieben:

Eigenschafen tempTbl:
Property Value
ID 1000000001
Dimensions <Undefined>
Temporary Yes
SecurityFiltering <Validated>


Code:
OnRun()
counter :=0;
counter2:=0;
locrecDebitor.RESET;
locrecDebitor.SETFILTER("Post Code",'86650');
REPEAT
  tempTbl.INIT;
  counter2 := counter2 + 1;
  tempTbl.LfdNr := counter2;
  tempTbl.DebNr := locrecDebitor."No.";
  tempTbl.INSERT;
UNTIL locrecDebitor.NEXT = 0;

REPEAT
    counter := counter + 1;
UNTIL tempTbl.NEXT = 0;
MESSAGE(FORMAT(counter2));
MESSAGE(FORMAT(counter));


Ergebnis:
Counter2 = 183
Counter = 1

Ich bin echt ratlos.

Re: Temporäre Tabelle füllen

13. Januar 2024 21:34

Hallo,
du musst schon den Datenzeiger wieder an den Anfang deiner temporären Tabelle setzen. Nach dem Füllen deiner temporären Tabelle stehst du immer auf dem zuletzt eingefügten Datensatz.

Code:
IF tempTbl.FINDSET() THEN
  REPEAT
    counter := counter + 1;
  UNTIL tempTbl.NEXT() = 0;

[gelöst] Re: Temporäre Tabelle füllen

14. Januar 2024 17:07

Echt jetzt?
Ich dachte mir so etwas in der Art. Andere Sprachen bieten da Dinge wie movefirst usw.
FINDSET() hatte ich in diesem Zusammenhang nicht im Blick.

1000 Dank. Es funktioniert jetzt!