[gelöst] Form Filterung

16. Dezember 2009 15:46

Hallo alle,

wie kann man in einer Tabellenform die Daten so filtern, das nur Datensätze angezeigt werden die Dupletten haben bzw. mehrmals gleiche Feldinhalte haben.

Beispiel:

Tabelle hat zwei Felder. Vor und Nachname. In der Tabelle sind folgende 6 Datensätze gespeichert

Klaus Müller
Peter Lustig
Markus Müller
Joachim Keller
Alfred Dach
Heiner Lustig

Nun will ich die Tabelle filtern das nur Datensätze wo der Nachname mehrmals vorkommt.
Nach der Filterung soll die Tabelle so sein:

Klaus Müller
Peter Lustig
Markus Müller
Heiner Lustig

Wie kann ich das machen? Und am besten per Code, Da ich vorhabe die Tabellenansicht per Menübutton zu filtern
Zuletzt geändert von dai am 17. Dezember 2009 10:28, insgesamt 1-mal geändert.

Re: Form Filterung

16. Dezember 2009 16:17

Was soll denn passieren, wenn Klaus Müller mehrfach vorkommt? Laut deiner Vorgabe müsste der dann ja auch übrig bleiben und steht dann n-fach da.

Wenn das so sein soll, kannst du die Datensätze, deren Nachname mindestens ein weiteres Mal vorkommt, markieren und danach auf die Markierten filtern.

Btw: Wozu braucht man sowas?

Re: Form Filterung

16. Dezember 2009 16:30

Wenn Klaus Müller mehrmals vorkommt dann soll Klaus Müller auch mehrmals angezeigt werden.

Wir brauchen sowas um eventuell Dupletten, Tripletten etc. herauszufinden.

Dein Vorschlag ist nicht praktikabel. Ich weiss ja nicht welcher Nachname mehrmals vorkommt. Durch den Filterung will ich ja dies herausfinden. Nachdem ich gefiltert habe dann kann ich eventuell nach den Nachname sortieren. Dann sehe ich sortiert welche nachname mehrmals gibt.

Ich habe vor dies eventuell mit eine tmp tabelle zu machen. Ich durchlaufe die originaltabelle mit einer schleife. Bei jeden datensatzdurchlauf schaue ich nach ob der Feldinhalt in mehreren Datensätze vorkommt. Wenn ja schreibe ich den gefundenen Satz in die Temp-Tabelle. In der Form trage ich als SourceTable die tmptabelle ein.

Eine andere idee wäre von mir das ich beim durchlaufen der tabelle einen filter baue, und diesen filter im code setze. im meinen beispiel wäre mein Filter folgends. Müller|Lustig auf das Feld nachname.

ich habe nur gedacht das man dies irgendwie auch mit den filterkriterien machen kann. geht das?

Re: Form Filterung

16. Dezember 2009 17:00

Es geht aber nicht zufällig um die Kontakte? Da bietet nämlich der Standard schon eine Dublettensuche.

dai hat geschrieben:Dein Vorschlag ist nicht praktikabel. Ich weiss ja nicht welcher Nachname mehrmals vorkommt. Durch den Filterung will ich ja dies herausfinden. Nachdem ich gefiltert habe dann kann ich eventuell nach den Nachname sortieren. Dann sehe ich sortiert welche nachname mehrmals gibt.

Und was davon kann mein Vorschlag nicht? :wink:

dai hat geschrieben:Ich habe vor dies eventuell mit eine tmp tabelle zu machen. Ich durchlaufe die originaltabelle mit einer schleife. Bei jeden datensatzdurchlauf schaue ich nach ob der Feldinhalt in mehreren Datensätze vorkommt. Wenn ja schreibe ich den gefundenen Satz in die Temp-Tabelle. In der Form trage ich als SourceTable die tmptabelle ein.

Hätte ich auch vorgeschlagen, aber du wolltest ja per Button filtern können.

dai hat geschrieben:Eine andere idee wäre von mir das ich beim durchlaufen der tabelle einen filter baue, und diesen filter im code setze. im meinen beispiel wäre mein Filter folgends. Müller|Lustig auf das Feld nachname.

Dürfte nicht viel helfen, da du - je nach Datenmenge - an die Grenzen des Filterstrings stoßen kannst.

dai hat geschrieben:ich habe nur gedacht das man dies irgendwie auch mit den filterkriterien machen kann. geht das?

Nein.

dai hat geschrieben:Wir brauchen sowas um eventuell Dupletten, Tripletten etc. herauszufinden.

Auf die Art findest du aber nur Dubletten, die auch wirklich gleich geschrieben sind. "Meier" und "Meyer" fällt durch den Rost. Wie man vernünftig Dubletten findet, steht hier: viewtopic.php?f=8&t=8662

Re: Form Filterung

16. Dezember 2009 17:11

Eine Schleife über die Tabelle machen, die jeden DS 1x aufruft, mit diesem dann alle DS durchlaufen und mit MARK markieren, wenn Feld 1 und Feld 2 identisch sind und zusätzlich eine integer variable hochzählen (wenn grösser 1 = MARK, wenn neuer Name Integer =0)

Wenn die erste Schleife fertig ist, mit MARKEDONLY die Dubletten anzeigen. Damit würden alle Mehrfach vorkommenden angezeigt werden.
Ist allerdings bei sehr vielen DS nicht gerade schnell, da die anzahl Datensätze quadriert wird, sprich aus 10.000 Zeilen werden 100.000.000 Schleifendurchläufe!

Re: Form Filterung

16. Dezember 2009 17:12

Hi McClane

Woher solll ich wissen welche Datensätze es sind,wo deren Nachname mindestens ein weiters mal vorkommt? Ohne zu wissen welche Datensätze es sind kann ich die ja nicht markieren oder?

Ich denke ich werde mit der tmp-Tabelle probieren.

Re: Form Filterung

16. Dezember 2009 17:15

dai hat geschrieben:Woher solll ich wissen welche Datensätze es sind,wo deren Nachname mindestens ein weiters mal vorkommt? Ohne zu wissen welche Datensätze es sind kann ich die ja nicht markieren oder?

Oh, ich dachte, dass die sich von selbst markieren, wenn man sie scharf ansieht :wink:

Re: Form Filterung

16. Dezember 2009 17:32

Naja wenn ich Euch richtig verstanden habe kann Navision die "Scharf" ansehen :-)

Ungefähr so:
(Wenn es um zwei Felder geht, müsste entsprechend verschachtelt werden)
Code:
// Prüfen auf Doppelte Einträge

// Wichtig: In der Tabelle das Zielfeld sortieren (z.B. nach Name)
KopSourceRec.SETCURRENTKEY(Deine_SortierReihenfolge);

IF KopSourceRec.FINDSET THEN BEGIN
  REPEAT
  IF KopSourceRec.name <> '' THEN BEGIN
    MerkeName :=  KopSourceRec.Name;
    IF (KopSourceRec.NEXT(1)) = 1 THEN BEGIN
      IF KopSourceRec.name = MerkeName THEN BEGIN
        KopAnzRec.GET(KopSourceRec."No.");
        KopAnzRec.MARK(TRUE);

        KopSourceRec.NEXT(-1);
        KopAnzRec.GET(KopSourceRec."No.");
        KopAnzRec.MARK(TRUE);
      END ELSE BEGIN
        KopSourceRec.NEXT(-1);
      END;
    MerkeName :=  KopSourceRec.name;
    END;
  END;
  UNTIL KopSourceRec.NEXT=0;
END;

// DeineForm könnte z.B. die Debitorübersicht sein (je nach Quelltabelle)
KopAnzRec.MARKEDONLY(TRUE);
IF KopAnzRec.COUNT > 0 THEN BEGIN
  IF CONFIRM('Es sind Dubletten vorhanden, Datensätze anzeigen?',TRUE) THEN BEGIN
    CLEAR(DeineForm);
    DeineForm.CAPTION('Doppelt vergebene Namen');
    DeineForm.SETTABLEVIEW(KopAnzRec);
    DeineForm.RUNMODAL;
  END;
END;

Re: Form Filterung

16. Dezember 2009 17:43

Huch sieht das wieder kompliziert aus :shock:

Also ich hätte das jetzt (vereinfacht) so (auf der Form, also mit Rec) gelöst:

Code:
IF FINDSET THEN BEGIN
  REPEAT
    DeinRec2.SETFILTER(Vorname, '<>%1', Vorname);
    DeinRec2.SETRANGE(Nachname, Nachname);
    IF NOT DeinRec2.ISEMPTY THEN
      MARK(TRUE);
  UNTIL NEXT = 0;
  MARKEDONLY(TRUE);
END;

Re: Form Filterung

17. Dezember 2009 09:33

Hallo,

ich habe es mit MARK probiert. Es klappt wunderbar. Danke euch.
Nun ist da nur ein kleines schönheitsproblem. Nach dem ausführen von MARKEDONLY(TRUE) werden ja nur die satzmarkierte Datensätze angezeigt. Man will nun wieder alle Datensätze anschauen. Dazu geht man ja auf Alle anzeigen. Die Daten werden zwar wieder alle angezeigt, aber die Satzmarke ist noch da bzw. der Punkt ganz links in der Tabellenform. Wie kann ich die Satzmarke aufheben?
Die Form verlassen und wieder aufrufen ist ein wenig unkomfortabel.

Wie kann ich weiterhin bei markedonly abprüfen ob überhaupt datensätze markiert worden sind? Also ich will ja eine message ausgeben wenn keine Dupletten, tripletten usw. gefunden wird.

Re: Form Filterung

17. Dezember 2009 10:12

dai hat geschrieben:Wie kann ich die Satzmarke aufheben?

Schau doch mal in den C/SIDE Reference Guide zum Thema MARK. Dies ist die eine Möglichkeit.
Die andere Möglichkeit ist ein RESET. Schaue auch hier in den ersten Satz der Onlinehilfe zu RESET.

Wie kann ich weiterhin bei markedonly abprüfen ob überhaupt datensätze markiert worden sind?

So wie bei "normalen" Filtern auch:
Code:
...
MARKEDONLY(TRUE);
IF ISEMPTY THEN
  MESSAGE('Nix gefunden!');

Sollte dies wieder Erwarten nicht funktionieren, weil statt keinem Datensatz alle gefunden werden (habs jetzt nicht ausprobiert), kannst du direkt nach dem MARK(TRUE) eine Boolean-Variable auf TRUE setzen und diese am Ende abfragen.

Re: Form Filterung

17. Dezember 2009 10:27

Hi Natalie,

es klappt wunderbar. Vielen Dank für deine Hilfe. Aber auch an den anderen. Vielen Dank

Re: [gelöst] Form Filterung

17. Dezember 2009 13:18

Auch wenns schon gelöst ist... ihr macht euch das reichlich kompliziert...

Ein einfaches Flowfield häts auch getan: Count(Tabellenname WHERE (Nachname=FIELD(Nachname))) :wink:

Somit sieht man gleich, wie oft der Nachname vorkommt, und kann (wenn auch nicht sehr performant bei vielen Datensätzen) drauf filtern.

mfg
Phae