[Gelöst] export Dataport

7. August 2009 11:23

Hallo zusammen,

ich brauche dringend eure hilfe :'(

ich muss einen Dataport erstellen, dass mir bestimmt Felder exportiert.

Folgende Aufgabe:

OP Daten:

Felder
KD-Nr
OP Summe
Mahnstufe (höchste Belegmahnstufe)
Inkassokennzeichen
Datum letzter ZE

ich habe kann eig alles in ein txt-file exortieren, doch mein problem in dieser Aufgabe ist, die höchste Mahnstufe anzeigen zu lassen.

Wie muss ich es Programmieren, dass er mir pro debitor die höchste Mahnstufe als txt file exportiert?

ich habe schon versucht einen kleinen code zu erstellen, doch irgend wie funktioniert es noch nicht.
(Programmiere erst seit kurzem)


Code:
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::Invoice);
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::"Credit Memo");
DebitorenPosten.SETRANGE(Open,TRUE);

IF DebitorenPosten.FIND('-') THEN BEGIN
  MahnStufe := 0;
END ELSE BEGIN
  Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
  IF Mahnung.FINDLAST THEN BEGIN
    MahnStufe:= Mahnung."Reminder Level";
  END;
END;

stimmt es schon so halber, oder was müsste ich noch ändern, dass er mir auch das richtige exportiert?

Vielen Dank schon mal für eure HILFE!!!

Edit: Bitte Programmcode in Code-Tags einschließen.Gruß,Kai
Zuletzt geändert von escabrosa am 10. August 2009 14:08, insgesamt 4-mal geändert.

Re: export Dataport (OP Daten)

7. August 2009 13:03

Code:
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::Invoice);
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::"Credit Memo");

Das muss auf jeden Fall durch ein Zeile mit SETFILTER mit beiden Werten und ODER d.h. "|" Verknüpfung ersetzt werden. So greift momentan nur die zweite Zeile.

Re: export Dataport (OP Daten)

7. August 2009 13:09

Kowa hat geschrieben:Das muss auf jeden Fall durch ein Zeile mit SETFILTER mit beiden Werten und ODER d.h. "|" Verknüpfung ersetzt werden. So greift momentan nur die zweite Zeile.

oder
Code:
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::Invoice,DebitorenPosten."Document Type"::"Credit Memo");


escabrosa hat geschrieben:IF DebitorenPosten.FIND('-') THEN BEGIN
MahnStufe := 0;
END ELSE BEGIN
Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
IF Mahnung.FINDLAST THEN BEGIN
MahnStufe:= Mahnung."Reminder Level";
END;
END;

Der Else-Case scheint mir sinnlos, da er durchlaufen wird, wenn kein Posten gefunden wird. Somit dürfte das Mahnung.SetRange auf die Entry No. nie ein Ergebnis bringen.

Re: export Dataport (OP Daten)

7. August 2009 13:11

Code:
DebitorenPosten.SETFILTER(DebitorenPosten."Document Type",'%1|%2',
DebitorenPosten."Document Type"::Invoice,
DebitorenPosten."Document Type"::"Credit Memo");


stimmt das so?

Funktioniert es dann schon, oder brauch ich noch andere Filter bzw. Bedingungen, dass er mir die richtige mahnstufe anzeigt ?

Vielen Dank für deine Hilfe Kai :o*

Re: export Dataport (OP Daten)

7. August 2009 13:19

wie könnte man es besser machen?

Code:
IF DebitorenPosten.FIND('-') THEN BEGIN
MahnStufe := 0;
END ELSE BEGIN
Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
IF Mahnung.FINDLAST THEN BEGIN
MahnStufe:= Mahnung."Reminder Level";
END;
END;


kannst du mir da bitte weiterhelfen? *='((

Re: export Dataport (OP Daten)

7. August 2009 13:53

Ich kenne mich mit Mahnungen nicht aus. Wie ist denn da der Zusammenhang? Denn irgendwo hast du ein Logikproblem.
Wenn du einen Debitorenposten findest, soll die Mahnstufe null sein. Existiert jedoch keiner, suchst du anhand der Nummer des (nicht existenten) Debitorenposten eine Mahnung. Kann nicht gehen, oder? :wink:

Hängt das evtl so zusammen:
Wenn ich zu einem Debitorenposten keine Mahnung finde, ist die Mahnstufe Null, und, wenn doch, die höchste Mahnstufe in den Mahnungen?¿

Re: export Dataport (OP Daten)

7. August 2009 14:00

Beziehen kannst du dich da auf die registrierten Mahnungsköpfe (Tabelle 297). Dafür wird dann aber ein zusätzlicher Schlüssel mit Debitornr. und Mahnstufe benötigt , der dann mit SETCURRENTKEY vorher gewählt wird. Nur so steht die höchste Stufe beim FINDLAST dann auch wirklich unten.
Aber : Nur weil ein Debitorenposten existiert, muss die Mahnstufe nicht null sein. Die gibt es immer ab der ersten gebuchten Rechnung oder Gutschrift :wink:

Re: export Dataport (OP Daten)

7. August 2009 14:03

ja genau! wenn keine Mahnung vorhanden, soll er mir eine Null anzeigen, wenn er eine hat, dann soll er mir die höchste mahnstufe anzeigen, dass dieser Debitor schon hat... *rotwerd*

ich mache es leider zum ersten mal :'(

kannst du mir jetzt vllt weiterhelfen? :cry:

Re: export Dataport (OP Daten)

7. August 2009 14:06

Code:
IF DebitorenPosten.FIND('-') THEN BEGIN
  Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
  IF Mahnung.FINDLAST THEN
    MahnStufe:= Mahnung."Reminder Level"
  else
    MahnStufe := 0;
END;

Wenn der Schlüssel auf die Mahnungen und die Beziehungen im Allgemeinen stimmen (siehe Kowas Posting), sollte das klappen.

Re: export Dataport (OP Daten)

7. August 2009 14:24

McClane hat geschrieben:
Kowa hat geschrieben:Das muss auf jeden Fall durch ein Zeile mit SETFILTER mit beiden Werten und ODER d.h. "|" Verknüpfung ersetzt werden. So greift momentan nur die zweite Zeile.

oder
Code:
DebitorenPosten.SETRANGE(DebitorenPosten."Document Type",DebitorenPosten."Document Type"::Invoice,DebitorenPosten."Document Type"::"Credit Memo");

Das würde hier zwar auch funktionieren, weil das in diesem Fall benachbarte Optionswerte sind. Da das aber nicht immer so sein muss, würde ich bei Optionsfeldern nur zu SETFILTER raten. Da kann man auch ohne Prüfung des OptionStrings sicher sein, die richtigen Datensätze zu filtern.

Re: export Dataport (OP Daten)

7. August 2009 14:29

Kowa hat geschrieben:Das würde hier zwar auch funktionieren, weil das in diesem Fall benachbarte Optionswerte sind.

Sonst hätte ich das auch nicht hingeschrieben :wink: Aber ich hätt´s erwähnen sollen, pardon :)

Re: export Dataport (OP Daten)

7. August 2009 14:31

Vielen lieben Dank euch zwei für eure Hilfe ! =o*

@Kai: weist du den schlüssel evtl den ich anlegen muss?
als dataitem gebe ich jetzt den customer an oder die tabelle 297?

grüßle

Re: export Dataport (OP Daten)

7. August 2009 14:48

escabrosa hat geschrieben:als dataitem gebe ich jetzt den customer an oder die tabelle 297?

Wenn ich´s recht verstehe: Tabelle 297, Schlüssel "Customer No.","Reminder Level"

Re: export Dataport (OP Daten)

7. August 2009 14:53

habe ich ausprobiert, jetzt kommt leider die Fehlermeldung

"Die Tabelle Regestrieter Mahnungskopf, hat keinen aktiven Schlüssel der mit folgenden Feldern beginnt: Nr., Mahnstufe"


Was mache ich falsch?

Re: export Dataport (OP Daten)

7. August 2009 14:55

Ja, den musst du noch anlegen :)

Re: export Dataport (OP Daten)

7. August 2009 14:57

okay *rotwerd*

danke McClane :o*

Re: export Dataport (OP Daten)

10. August 2009 08:39

kann mir bitte jemand sagen, was für ein dataitem ich für diesen Dataport brauche?

customer

oder

issued reminder header oder doch beides?

:'(

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 11:49

Ich würde Customer nehmen. Für die Werte, die man aus den anderen Tabellen benötigt, werden Variablen erzeugt, die werden beim Customer-DataItem an der gewünschten Stelle in die Dataport Fields gesetzt. Damit diese dann die richtigen Werte exportieren, muss im OnBeforeExportRecord-Trigger dann der ganze Code rein, der mit der "Customer No." die Werte aus den anderen Tabellen abgreift.

Zwei DataItems gehen grundsätzlich nicht , da sich Dataports nicht wie Reports verschachteln lassen. So könnte man nur Daten nacheinander aus verschiedenen Tabellen exportieren.

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 12:01

hallo kowa, danke für deine antwort *freu*!

ich habe den code in before export record eingefügt, doch leider zeigt er mir immer noch die falsche mahnstufe an, nämlich immer "2"
was mach ich falsch?

Code:
KdNr := Customer."No.";
OpSumme := Customer."Balance (LCY)";
Inkassokennzeichen := Customer.Inkassokennzeichen;
InkassoDatum :=  Customer."Inkassokennzeichen gültig ab";

RegMahnStufe.SETCURRENTKEY(RegMahnStufe."Customer No.",RegMahnStufe."Reminder Level");

DebitorenPosten.SETFILTER(DebitorenPosten."Document Type",'%1|%2',
DebitorenPosten."Document Type"::Invoice,
DebitorenPosten."Document Type"::"Credit Memo");

IF DebitorenPosten.FIND('-') THEN BEGIN
  Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
  IF Mahnung.FINDLAST THEN
    MahnStufe:= Mahnung."Reminder Level"
  ELSE
    MahnStufe := 0;
END;


er zeigt mir leider trotzdem die falsche mahnstufe an :'(

was mach ich falsch?

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 12:16

Die Mahnstufe muss pro Debitor ganz oben zurückgesetzt werden.
In deinem Code bewirkt
Code:
IF DebitorenPosten.FIND('-') THEN BEGIN...

u.a. das der Code nicht mehr ausgeführt wird, wenn gar kein Debitorenposten gefunden wird. Dann ist die letzte ermittelte auch für alle weiteren gültig, bis wieder ein Debitorenposten gefunden wird.

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 12:22

d.h.
Code:
MahnStufe := 0;
???

oder wie soll ich das verstehen...?

... wenn ja, funktioniert es trotzdem nicht, wenn nein wie soll ich es sonst zurücksetzen?

:oops:

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 12:51

Wenn pro Debitor die höchte Mahnstufe exportiert werden soll, muss der Registrierte Mahnungskopf auch auf die Debitorennr. gefiltert werden. Das ist momentan noch nicht der Fall. Auf RegMahnStufe wird zwar ein Schlüssel gesetzt, dann wird die Variable aber nicht weiter verwendet. Hierauf muss FINDLAST angewendet werden.

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 13:00

jetzt bin ich ganz verwirrt :-(

meinst du so :

Code:
RegMahnStufe.SETCURRENTKEY(RegMahnStufe."Customer No.",RegMahnStufe."Reminder Level");

DebitorenPosten.SETFILTER(DebitorenPosten."Document Type",'%1|%2',
DebitorenPosten."Document Type"::Invoice,
DebitorenPosten."Document Type"::"Credit Memo");

IF DebitorenPosten.FIND('-') THEN BEGIN  // <--- hier ein findlast setzen?
  Mahnung.SETRANGE(Mahnung."Customer Entry No.",DebitorenPosten."Entry No.");
  -->// RegMahnStufe.Setrange(RegMahnStufe."Customer No.") <--- und hier filtern?
  IF Mahnung.FINDLAST THEN
    MahnStufe:= Mahnung."Reminder Level"
  ELSE
    MahnStufe := 0;
END;


sry, raff grad garnichts mehr :cry:

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 13:22

Ich habe es mal etwas umgeschrieben :wink:
Code:
MahnStufe := 0;
RegMahnStufe:RESET;
RegMahnStufe.SETCURRENTKEY("Customer No.","Reminder Level");
RegMahnStufe.SETRANGE("Customer No.",Customer."No.");
 
DebitorenPosten.RESET; // sonst bleibt ein  FINDFIRST von letzten beim nächsten Debitor noch aktiv
Debitorenposten.SETCURRENTKEY("Document No".,"Document Type","Customer No.");
DebitorenPosten.SETFILTER(DebitorenPosten."Document Type",'%1|%2',
DebitorenPosten."Document Type"::Invoice,
DebitorenPosten."Document Type"::"Credit Memo");
DebitorenPosten.SETRANGE("Customer No.",Customer."No.");// nur die OP's des aktuellen Debitors sind jetzt relevant

IF DebitorenPosten.FINDFIRST THEN BEGIN  // <--- ohne OP kann es keine mögliche Mahnung geben
  IF RegMahnStufe.FINDLAST THEN
    MahnStufe:= RegMahnStufe."Reminder Level"
  ELSE
    MahnStufe := 0;
END;

Re: höchste Belegmahnstufe anzeigen lassen

10. August 2009 13:35

danke kai =o*

kannst du mir noch was verraten?

wie kann ich jetzt von den Regestrieten Mahnungen die dazugehörige Nr anzeigen lassen?
und was ist mit Datum letzer ZE gemeint? sagt es dir was?
Danke :oops: