[gelöst] INSERT in Tabelle mit Report

1. März 2010 09:53

Hallo zusammen.

In eine Tabelle für Preislisten, sollen 2 weitere Preislisten für jeden Debitoren eingefügt werden. Bestehende Einträge sollen nicht verändert werden.

Mit folgendem Code habe ich die ersten Schritte realisiert :

DataItem : "Customer"
DataItem : "Customer Price List"
DataItemLink : "Customer No.=FIELD(No.)"

Code:
"Customer Price List".INIT;

"Customer Price List"."Customer No." := Customer."No.";
"Price List Code" := '005';
"Sales Order Type" := 'Verkauf Inland';
IF NOT "Customer Price List".INSERT THEN BEGIN;
END;

"Customer Price List"."Customer No." := Customer."No.";
"Price List Code" := '010';
"Sales Order Type" := 'Verkauf Ausland';
IF NOT "Customer Price List".INSERT THEN BEGIN;
END;


Der Code fängt ab, wenn bereits ein Datensatz mit Preisliste 005 und/oder 010 existiert.
Trifft der Report aber nun auf einen Datensatz der für den jeweiligen Debitor im Feld "Price List Code" einen Wert stehen der größer als die beiden einzufügenden Preislisten ist (z.B. Debitornr. '20000' , mit Preisliste '100'), scheint sich der Report "im Kreis zu drehen". Er bleibt also laut Debugger an diesem Datensatz hängen und trägt die gewünschten Preislisten nicht ein. Der Report muss manuell abgebrochen werden.

Schlüssel der Tabelle "Customer Price List":
Key
Customer No.,Price List Code,Starting Date
Customer No.,Main Pricelist
Customer No.,Starting Date

Frage 1 : Hat jemand eine Idee, wie dieses Problem zu lösen ist ?
Frage 2 : Der Report überspringt auch die Debitoren, die noch keinen Eintrag haben.
Zuletzt geändert von alexanderpetry am 1. März 2010 10:29, insgesamt 1-mal geändert.

Re: INSERT in Tabelle mit Report

1. März 2010 10:09

Frage 1 : Hat jemand eine Idee, wie dieses Problem zu lösen ist ?
Dadurch dass du die DataItem-Instanz der Preisliste (Customer Price List) verwendest und dort Werte einträgst, verwirrst du NAV und gibst dem Record unfreiwillig einen neuen Datensatzzeiger. Der Datensatzzeiger ergibt sich hier aufgrund der Daten, die in den Schlüsselfeldern enthalten sind und wird nicht explizit "im Hintergrund" verwaltet. Verwende eine zweite Instanz des Record, hol dir den zugehörigen Datensatz und korrigier diesen. Beispielsweise so:

Code:
IF NOT CustPriceList.GET(Customer."No.", "Price List Code", 'Verkauf Inland') THEN BEGIN
  CustPriceList.INIT;
  CustPriceList."Customer No." := Customer."No.";
  CustPriceList."Price List Code" := '005';
  CustPriceList."Sales Order Type" := 'Verkauf Inland';
  CustPriceList.INSERT;
END;


Frage 2 : Der Report überspringt auch die Debitoren, die noch keinen Eintrag haben.
Das ergibt sich aus der Struktur deines Reports. Datensätze können natürlich nur durchlaufen werden, wenn es in der Preistabelle auch Daten gibt die der von dir angegebenen Bedingung entsprechen: DataItemLink : "Customer No.=FIELD(No.)". Ohne Daten kann diese Bedingung niemals wahr sein. Ich gebe zu, dass ich etwas rudimentär erklärt, passt aber in diesem Fall.

Ich empfehle dir, eine eigene Funktion zu erstellen und das zweite DateItem zu löschen. Die Funktion sollte dann obiges Konstrukt nutzen und für fehlende Datensätze diese einfügen und vorhandene ggf. korrigieren. Aufgerufen wird das ganze dann aus dem Trigger Customer - OnAfterGetRecord().

Re: [gelöst] INSERT in Tabelle mit Report

1. März 2010 10:39

Falsch herum gedacht.

Vielen Dank für die prompte und vor allem schnelle Hilfe.