[gelöst] Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 15:19

Hallo Nav gemeinde,

ich muss mich wieder ratsuchend an euch wenden :-(

Ich möchte mir nur die Kunden anzeigen lassen, welche über keine Wertposten verfügen.
Verbunden sind diese über die Kundennummern, so dachte ich mir:

Code:
customerlist.SETRANGE(customerlist."No."<> wertposten."Customer No.")
FORM.RUN(22,customerlist);



Nur kann man wohl nicht <> in einem Filter verwenden, da er von mir vor dem <> Zeichen eine ) zum Schließen fordert.
Mein Problem ist nun, dass ich nicht weiß, wie ich so ein Filter formulieren muss, damit er mir nur die gewünschten Daten ausgibt...

Nachtrag:
Auch mit der Hilfe von http://msdn.microsoft.com/en-us/library/dd354955.aspx konnte ich nur maximal einen Fehler produzieren, das es nun 0 Kunden ohne Wertposten gäbe, was aber nicht der Tatsache entspricht

Code:
customerlist.SETFILTER("No.",'%1&<>%2',customerlist."No.", wertposten."Customer No.");
FORM.RUN(22,customerlist);


Bitte um Hilfe.


Gruß,
Heiko_D
Zuletzt geändert von Heiko_D am 27. November 2009 16:46, insgesamt 1-mal geändert.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 15:44

Hatten wir sowas nicht erst letztens? Lass mich raten: den Artikel, in dem Natalie die Verwendung von SetRange/SetFilter erklärt, hast du super aufmerksam gelesen, hm? :wink:

Du nimmst fast genau den Code, den ich dir schon mal geschrieben habe:
Code:
CustLedgerEntry.SetCurrentKey("Customer No."); // bevor Mikka wieder meckert
if Customer.find('-') then repeat
  CustLedgerEntry.SetRange("Customer No.",Customer."No.");
  if CustLedgerEntry.isempty then
    //AnzahlKundenOhnePosten+=1; das nicht, stattdessen:
    Customer.mark(true);
until Customer.next=0;

und danach:
Code:
Customer.markedonly(true);
form.runmodal(0,Customer);

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 15:52

Ich fühle mich verfolgt :lol:

Danke erstmal für deine Hilfe. Ich habe den Text gelesen und dies auch sogleich getestet, wobei ich wenn ich ehrlich bin nicht auf den Key geachtet habe :oops:
Jedoch das mit der .mark Funktion ist neu für mich, und ich wusste nicht das soetwas von nöten ist.
Ich bin davon ausgegangen, dass ich einen Filter setzen muss, wo nur die Daten aus Customer angezeigt werden sollen, die nicht in der Wertepostentabelle vorkommen.

Wie unschwer zu erkennen, habe ich erst wenig Ahnung mit dem Umgang von Nav...

Also danke nocheinmal, versuch gleich mal die Funktion einzubinden.
Zuletzt geändert von Heiko_D am 27. November 2009 16:23, insgesamt 2-mal geändert.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:10

Heiko_D hat geschrieben:Jedoch das mit der .mark Funktion ist neu für mich, und ich wusste nicht das soetwas von nöten ist.

Es ist nur ein möglicher Weg, und es war am Wenigsten zum tippen :wink:
Nur: falls man das in deinem letzten Thread mit einem einfachen SetFilter hätte lösen können, hätte ich das wohl da hin geschrieben. Man muss schon einzeln für jeden Debitor nachsehen ...

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:14

McClane verwendet in seinem Quelltext die Debitorenposten, Heiko spricht am Anfang von Wertposten.
Was genau ist nun gemeint?

Die Alternative zu der MARK-Lösung wäre übrigens die Erstellung eines Exists-FlowFields in der Tabelle Customer. Auf dieses neue FlowField könnte man dann "einfach" filtern - wäre aber genauso inperformant wie die MARK-Lösung.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:22

Natalie hat geschrieben:McClane verwendet in seinem Quelltext die Debitorenposten, Heiko spricht am Anfang von Wertposten.
Was genau ist nun gemeint?

Der Unterschied war schon letztes Mal, aber da waren die Debitorenposten gemeint, deswegen.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:24

Danke dass ihr euch so große Mühe gibt mir zu helfen, jedoch habe ich noch Verständnisfragen:


CustLedgerEntry.SetCurrentKey("Customer No.");
//Das Feld "Customer No." zum temporären Primärkey machen, da dieser ein "alleinstehender" Key sein muss, und ansonsten mit anderen Feldern zusammen einen Key bildet.

CustLedgerEntry.SetRange("Customer No.",Customer."No.");
//Auswahl des zu durchsuchenden Bereiches. Von CustLedgerEntry."Customer No." bis Customer."No."

if CustLedgerEntry.isempty then Customer.mark(true);
//Wenn CustLedgerEntry leer ist, soll der Datensatz gemerkt werden? (This function tells you whether the table is empty or not if you have not applied filters to the record. Aber woran merkt er nun, dass der momentane nicht in der Table Customer vorkommt?)

Customer.markedonly(true);
form.runmodal(0,Customer);
//einfügen der gemerkten Datensätze in die Tabelle 0. (Wieso Tabelle 0?)

Ich hoffe jemand findet die Zeit mir beim Verständnis zu helfen, damit ich nicht immer wieder für die gleiche Sache das Forum zu Rate ziehen muss.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:43

Heiko_D hat geschrieben:CustLedgerEntry.SetCurrentKey("Customer No.");
//Das Feld "Customer No." zum temporären Primärkey machen, da dieser ein "alleinstehender" Key sein muss, und ansonsten mit anderen Feldern zusammen einen Key bildet.

Nein: das nimmt den erstbesten Key, der mit "Customer No." beginnt. Ist ja egal, welcher das ist. Aber ein Schlüssel muss nicht zwingend vollständig angegeben werden, nach hinten kann man den abschneiden.

Heiko_D hat geschrieben:CustLedgerEntry.SetRange("Customer No.",Customer."No.");
//Auswahl des zu durchsuchenden Bereiches. Von CustLedgerEntry."Customer No." bis Customer."No."

Nein: Das Feld "Customer No." der Recordvariable CustLedgerEntry wird auf die Kundennummer gefiltert. Und wenn es nun keinen Datensatz gibt, in dessen Feld "Customer No." die Nummer des Kunden steht, den die Schleife gerade durchläuft ...

Heiko_D hat geschrieben:if CustLedgerEntry.isempty then Customer.mark(true);
//Wenn CustLedgerEntry leer ist, soll der Datensatz gemerkt werden? (This function tells you whether the table is empty or not if you have not applied filters to the record. Aber woran merkt er nun, dass der momentane nicht in der Table Customer vorkommt?)

... ist das Record CustLedgerEntry leer. Dh: kein Posten, also merken wir uns den.

Heiko_D hat geschrieben:Customer.markedonly(true);
form.runmodal(0,Customer);
//einfügen der gemerkten Datensätze in die Tabelle 0. (Wieso Tabelle 0?)

Nein. Wir rufen Form Null mit dem Record Customer auf, das auf die vorher markierten gefiltert ist. Form Null bedeutet, dass die Form gestartet wird, die in der Definition der Tabelle als LookupFormID hinterlegt ist. In dem Fall (wie so meist) die Übersichtsform.

Lies dir bitte endlich den Beitrag durch, den ich dir schon mehrfach empfohlen habe.

Re: Vergleich 2er Tabellen, anzeigen der Unterschiede

27. November 2009 16:44

Im Prinzip hast du es fast selbst beschrieben:
Heiko_D hat geschrieben:CustLedgerEntry.SetCurrentKey("Customer No.");
//Das Feld "Customer No." zum temporären Primärkey machen, da dieser ein "alleinstehender" Key sein muss, und ansonsten mit anderen Feldern zusammen einen Key bildet.
Nicht zum Prim Key machen, sondern die Tabelle nach diesem Feld sortieren, damit die Debitoren schön der Nummer nach sortiert abgearbeitet werden können. Dieses erhöht die Verarbeitungsgeschwindigkeit enorm (Wenn die Sortierung auf die zu filternden Felder abgestimmt ist).
Heiko_D hat geschrieben:CustLedgerEntry.SetRange("Customer No.",Customer."No.");
//Auswahl des zu durchsuchenden Bereiches. Von CustLedgerEntry."Customer No." bis Customer."No."
Nicht aus Auswahl, sondern eingrenzen auf diesen Bereich (quasie der Server kann nur noch die gefilterten Daten sehen)
Heiko_D hat geschrieben:if CustLedgerEntry.isempty then Customer.mark(true);
//Wenn CustLedgerEntry leer ist, soll der Datensatz gemerkt werden? (This function tells you whether the table is empty or not if you have not applied filters to the record. Aber woran merkt er nun, dass der momentane nicht in der Table Customer vorkommt?)
Ja, Mark = markieren oder Merken.
Heiko_D hat geschrieben:Customer.markedonly(true);
form.runmodal(0,Customer);
//einfügen der gemerkten Datensätze in die Tabelle 0. (Wieso Tabelle 0?)
Nicht Tabelle 0, sondern Form 0. Das ist die StandardlookupForm, die im Tabellendeign hinterlegt wird (unter den Properties)
Bei Customer ist das "Customer List" = Form 22.

Der Aufruf form.runmodal(0,Customer), ist ungefähr so Übersetzt zu lesen form.runmodal("Customer List",Tabelle.Customer);

**Edit by Mikka**
Ok, McClane war schneller :-)

**Edit2 by Mikka**
McClane hat geschrieben:CustLedgerEntry.SetCurrentKey("Customer No."); // bevor Mikka wieder meckert

Das habe ich gerade gelesen, schön das du meine Ratschäge auch annimmst :lol:
Nee, mal ernst. Auch wenn es selbstverständlich ist due Sortierreihenfolge zu setzten, gerade Newbees vergessen dieses gerne mal.
Später wird sich geärgert, warum Navision so langsamm ist.