Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:17

Hallo zusammen,

ich bastel gerade an einer etwas erweiterten Suchfunktion für Artikel, in welcher ich nacheinander bis zu fünf Suchbegriffe eingeben kann, auf die der Inhalt der Tabelle 27 dann gefiltert wird. Gesucht werden soll über die Felder Description und "Description 2".

Habe hierfür eine Form mit einer Tablebox generiert, SourceTable ist die Tabelle Items (Temporary = Yes). Zusätzlich existiert eine Variable SearchTerm (Text, 50, Dimension = 5) und eine Variable SearchItems (record Items, Temporary = No).

Über der Tablebox sind die fünf Felder für die Suchbegriffe platziert, im OnValidate Trigger wird dann die Filterung durchgeführt und das Resultat der Filderung beider Beschreibungsfelder in Rec kopiert.

Code:
DELETEALL;
IF SearchTerm[1] <> '' THEN BEGIN
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY(Description);
  SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*',SearchTerm[1]));
  IF SearchItems.FINDFIRST THEN BEGIN
    REPEAT
      Rec := SearchItems;
      IF INSERT THEN;
    UNTIL SearchItems.NEXT = 0;
  END;
  SearchItems.SETRANGE(Description);
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY("Description 2");
  SearchItems.SETFILTER("Description 2",STRSUBSTNO('@*%1*',SearchTerm[1]));
  IF SearchItems.FINDFIRST THEN BEGIN
    REPEAT
      Rec := SearchItems;
      IF INSERT THEN;
    UNTIL SearchItems.NEXT = 0;
  END;
  SearchItems.SETRANGE("Description 2");
  FINDFIRST;
END;


Bei Suchbegriff 1 klappt das alles wie geplant. Gebe ich aber bspw. ein Stichwort, welches definitiv in der Trefferliste liegt, in Suchbegriff 2 ein und durchlaufe den unten aufgeführten Code, so ist die Treffermenge leer.

Code:
SearchItems.COPY(Rec);
DELETEALL;
IF SearchTerm[2] <> '' THEN BEGIN
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY(Description);
  SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*&@*%2*',SearchTerm[1],SearchTerm[2]));
  IF SearchItems.FINDFIRST THEN BEGIN
    REPEAT
      Rec := SearchItems;
      INSERT;
    UNTIL SearchItems.NEXT = 0;
  END;
  SearchItems.SETRANGE(Description);
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY("Description 2");
  SearchItems.SETFILTER("Description 2",STRSUBSTNO('@*%1*&@*%2*',SearchTerm[1],SearchTerm[2]));
  IF SearchItems.FINDFIRST THEN BEGIN
    REPEAT
      Rec := SearchItems;
      IF INSERT THEN;
    UNTIL SearchItems.NEXT = 0;
  END;
  IF Rec.FINDFIRST THEN;
  SearchItems.SETRANGE("Description 2");
END;



Hat hier jemand vielleicht eine Idee wo der Fehler liegen könnte?

Danke.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:21

laha2108 hat geschrieben:Hat hier jemand vielleicht eine Idee wo der Fehler liegen könnte?

Jep, im zweiten Codeblock gehört das DELETEALL raus - das löscht alles, was du im ersten Codeblock eingefügt hast.

Übrigens, FINDFIRST und REPEAT gehört niemals zusammen. Nutze stattdessen FIND bzw. FINDSET.

Edit: ich sehe erst jetzt, dass der Ansatz in Codeblock 2 ein anderer ist.
Warum findet diese Änderung statt?
Codeblock 1:
Code:
SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*',SearchTerm[1]));

Block 2:
Code:
SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*&@*%2*',SearchTerm[1],SearchTerm[2]));

Erwartet hätte ich für 2
Code:
SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*',SearchTerm[2]));


Ich würde einen Block in eine Funktion ausglieder mit dem Suchbegriff als Text als Übergabeparameter.

Funktion SammelRecords(ParSuchText : Text50)
Code:
IF ParSuchText <> '' THEN BEGIN // hier Änderung
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY(Description);
  SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*',ParSuchText)); // Änderung
  IF SearchItems.FINDSET THEN BEGIN // Änderung
    REPEAT
      Rec := SearchItems;
      IF INSERT THEN;
    UNTIL SearchItems.NEXT = 0;
  END;
  SearchItems.SETRANGE(Description); // Zeile löschen, ist aufgrund des nachfolgenden RESETs überflüssig
  SearchItems.RESET;
  SearchItems.SETCURRENTKEY("Description 2");
  SearchItems.SETFILTER("Description 2",STRSUBSTNO('@*%1*',ParSuchText)); // Änderung
  IF SearchItems.FINDSET THEN BEGIN // Änderung
    REPEAT
      Rec := SearchItems;
      IF INSERT THEN;
    UNTIL SearchItems.NEXT = 0;
  END;
  SearchItems.SETRANGE("Description 2"); // besser RESET
  FINDFIRST; // weg 
END;


Sie Suche sähe dann so aus:
Code:
DELETEALL;
SammleRecords(SearchTerm[1]);
SammleRecords(SearchTerm[2]);
SammleRecords(SearchTerm[3]);
SammleRecords(SearchTerm[4]);
SammleRecords(SearchTerm[5]);

Wenn du schon unbedingt ein FINDFIRST aufrufen willst, dann hier und fange es mit einem IF ab - sonst Laufzeitfehler, wenn nichts gefunden wurde.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:38

Hallo Natalie,

jetzt liefert die Programmierung zwar kein leeres Ergebnis mehr, aber exakt das Ergebnis aus dem ersten Block - oder es findet keine Aktualisierung statt.

Hatte das DELETEALL eingefügt, nachdem ich den Inhalt von Rec wieder in die SearchItems kopiert hatte (mittels copy) und deswegen das DELETEALL, damit ich nur mit der Menge an Artikeln weiterarbeiten kann, die unter Suchbegriff 1 einen Treffer erzielt haben.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:39

Hab meinen Beitrag komplett überarbeitet; konntest du das schon berücksichtigen?

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:52

Hallo Natalie,

habe deine letzten Änderungen jetzt bedacht und die Suche in eine Funktion ausgelagert.

Das ganze getestet mit den Suchbegriff Puma (1) und Halbschuh (2).

Nach On Validate für Suchbegriff 1 werden brav alle Schuhe Puma gelistet. Gebe ich jetzt Halbschuh in Suchbegriff 2 ein, rödelt das System kurz und zeigt mir dann aber nicht alle Halbschuhe von Puma an, sondern ALLE Artikel, die Halbschuh in den Beschreibungsfeldern stehen haben.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 11:58

Ich habe eine ODER-Suche realisiert, du suchst aber nach einer UND-Suche. Dann vergiss meinen Vorschlag wieder.

Wenn der Halbschuh in Beschreibung 1 drin steht, Puma in Beschreibung 2 - soll der Datensatz trotzdem in die Menge aufgenommen werden?
Wenn ja, dann ist das die Schwachstelle deines ursprünglichen Quelltextes:
Code:
SearchItems.SETFILTER(Description,STRSUBSTNO('@*%1*&@*%2*',SearchTerm[1],SearchTerm[2]));

Hier legst du fest, dass Suchbegriff 1 und 2 im gleichen Feld (Description) vorkommen müssen.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 12:05

Die Suchbegriffe können in Prinzip in jedem der beiden Beschreibungsfelder vorkommen. Im Prinzip alles unter Decription oder beides Description 2 oder verteilt über beide Felder.

Die Treffermenge soll das Resultat einer Filterung auf alle Artikel sein, die in den beiden Beschreibungsfeldern einen der eingegebenen Suchbegriffe als Treffer aufweisen.Dabei soll es irrelevant sein, in welchem Beschreibungsfeld welcher Suchbegriff auftaucht.

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 12:28

Dann lag der Fehler eindeutig in der zuletzt zitierten Codezeile.
Stell dir vor, du wärest Anwender und müsstest den kombinierten Suchbegriff selber, manuell anwenden. Wie würdest du vorgehen? Wie wäre das über Code abzubilden?

Re: Artikelsuche mit mehreren Filterbegriffen

19. Juli 2010 13:03

hmmm ich steh jetzt irgendwie auf dem Schauch. Glaub ich muss mir das mal in Ruhe durch den Kopf gehen lassen und vielleicht drüber schlafen.

Danke erstmal!

Re: Artikelsuche mit mehreren Filterbegriffen

7. September 2010 18:59

soderle, was lange währt, wird endlich gut - naja fast zumindest. Die Suchfunktion steht und funktioniert auch korrekt, jetzt möchte ich die Form in den Sales Lines einbinden.

Bei Sales Line."No." (OnAfterInput)

Code:
IF (Type = Type::Item) AND (Text <> '') THEN BEGIN
  Item.SETCURRENTKEY("No.");
  IF NOT Item.GET(Text) THEN BEGIN
    Item.RESET;
    Item.SETCURRENTKEY("EAN-Nummer");
    IF NOT Item.GET(Text) THEN BEGIN
      CLEAR(ItemSearch);
      ItemSearch.SetParameter(Text);
      ItemSearch.LOOKUPMODE := TRUE;
      IF ItemSearch.RUNMODAL = ACTION::LookupOK THEN BEGIN
        [b]"No." := ...[/b]
      END;
    END;
  END;
END;


Die Form geht korrekt auf und über SetParameter wird auch die Suche anhand des ersten Suchbegriffs durchgeführt.

Der Record auf der neuen Form ist temporär, daher komme ich über SetSelectionFilter irgendwie nicht weiter, da kommt immer ein leeres Ergebnis zurück. Scheint, dass dies mit einem TempRec nicht funktioniert.

Hat jemand eine Idee, wie ich die durch Doppelklick ausgewählte Zeite auf der Form der Artikelsuche wieder in die Sales Line zurückwerfen kann?

Re: Artikelsuche mit mehreren Filterbegriffen

7. September 2010 23:22

Hallo,

deine Lösung ist leider nur vorläufig. Mit dem RTC von NAV 2009 gibt es den OnAfterInput- Trigger in den Pages nicht mehr :-( .

Du müstest dir im ItemSearch eine Funtion einbauen, die das Ergebnis zurückliefert.

Gruß, Fiddi

Re: Artikelsuche mit mehreren Filterbegriffen

7. September 2010 23:27

denke so weit wird es hier im Hause auch erstmal nicht kommen. Technisch sind wir zwar schon auf 2009, kaufmännisch wird aber 5.01 bleiben. Daher wäre der Punkt des nicht mehr verfügbaren OnAfterInput-Trigger auf den Pages zu vernachlässigen.

Re: Artikelsuche mit mehreren Filterbegriffen

25. März 2013 15:52

Ich knüpfe mal an diesem Thema an...da ich auch eine solche Artikelsuche machen will, die aber vom Aufbau minimal anders ist.
Die Idee war, das ich DropDown Felder habe, die ich von Feld zu Feld mit den Restdatensätzen fülle.
z.B. Filter 1 = Road oder MTB OptionString= " ,Road,MTB"
wird nun Road gewählt würde dann der zweite Filter wie folgt aussehen.
Filter 2 = " ,50,52,54,56,58" und Filter 3=" ,Black,White,Gray"
wird nun die Größe 52 ausgewählt und es gibt in dieser Größe nurnoch schwarz und weiß würde Filter 3 so aussehen.
Filter 3= " ,Black,White"

Ich habe leider noch nicht gefunden, wie ich die DropDown Felder mit den Teilergebnissen füllen kann...habt ihr da evtl. ein Tipp für mich?

Ciao
OcchiX

Re: Artikelsuche mit mehreren Filterbegriffen

26. März 2013 10:22

OcchiX hat geschrieben:Ich knüpfe mal an diesem Thema an...da ich auch eine solche Artikelsuche machen will, die aber vom Aufbau minimal anders ist.
Die Idee war, das ich DropDown Felder habe, die ich von Feld zu Feld mit den Restdatensätzen fülle.
z.B. Filter 1 = Road oder MTB OptionString= " ,Road,MTB"
wird nun Road gewählt würde dann der zweite Filter wie folgt aussehen.
Filter 2 = " ,50,52,54,56,58" und Filter 3=" ,Black,White,Gray"
wird nun die Größe 52 ausgewählt und es gibt in dieser Größe nurnoch schwarz und weiß würde Filter 3 so aussehen.
Filter 3= " ,Black,White"

Ich habe leider noch nicht gefunden, wie ich die DropDown Felder mit den Teilergebnissen füllen kann...habt ihr da evtl. ein Tipp für mich?

Ciao
OcchiX


Mach am besten ein neues Thema dazu auf.