AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfunktion

Ein Thema von MisterSonic · begonnen am 20. Jan 2018 · letzter Beitrag vom 21. Jan 2018
Antwort Antwort
MisterSonic

Registriert seit: 4. Jan 2004
Ort: Sachsen-Anhalt
40 Beiträge
 
Delphi 7 Enterprise
 
#1

Suchfunktion

  Alt 20. Jan 2018, 18:08
Halli Hallo,

ich habe folgendes Problem. Ich habe ein ListView in dem jedes Item ein SubItem hat. Dazu habe ich ein Edit. Ich möchte nun, dass beim OnChange des Edit's jedes SubItem im ListView nach jedem einzelnen Wort aus dem Edit durchsucht wird und die höchste Übereinstimmung dann zurück gegeben wird. Hier ein Beispiel:

Caption SubItem-0
38745612 11380 L apple green
23049572 521EG ivory
04569242 11380 L deep black

Nun habe ich mir folgenden Code zurechtgebastelt ...

Code:
var Bestand: Double;
    Ts    : TStrings;
    S,S2   : String;
    I,I2   : LongInt;
    Fnd   : Integer;
begin
 If Pos(' ',Form1.Barcode.Text) = 0 then DbItem := Form1.BarCode.Text
                                    else
  Begin
   TS := TStringlist.Create;
   S := Form1.BarCode.Text;
   While Pos(' ',S) > 0 do
    Begin
     S2 := Copy(S,1,Pos(' ',S)-1);
     Delete(S,1,Pos(' ',S));
     TS.Add(UpperCase(S2));
    end;
   If length(S) > 0 then TS.Add(S);

   For I := 0 to Form1.ArtikelView.Items.Count-1 do
    Begin
     Fnd := 0;
     For I2 := 0 to TS.Count-1 do
      Begin
       If (I2 = 0) or (I2 = TS.Count) then
        Begin
         If Pos(Ts[I2],UpperCase(Form1.ArtikelView.Items[I].SubItems[0])) > 0 then Fnd := Fnd + 1;
        end;
       If (I2 > 0) and (I2 < TS.Count) then
        Begin
         If Pos(Ts[I2]+' ',UpperCase(Form1.ArtikelView.Items[I].SubItems[0])) > 0 then Fnd := Fnd + 1;
        end;
      end;
     If Fnd = Ts.Count then
      Begin
       DbItem := Form1.ArtikelView.Items[i].Caption;
       Break;
      end;
    end;
   TS.Free;
  end;
Das funktioniert allerdings nicht. Suche ich jetzt z.B. nach 11380 L black ..... krieg ich das Ergebnis 11380 L apple green. Eine einfach "if Pos(Form1.Barcode.Text,Form.ArtikelView.Items[i].SubItems[0]" kommt als Lösung leider nicht in Frage, da ich nicht sicher sein kann das die Sucheingabe exakt so eingegeben wird, wie der Artikel hinterlegt ist.

Ich hoffe auf eure Hilfe....

Vielen Dank, Patrick.
Niveau ist keine Cremè.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Suchfunktion

  Alt 20. Jan 2018, 18:41
Ich würde in der zugrundeliegenden Datenstruktur suchen und nicht im Anzeigeelement. Jeder Datensatz hat eine eindeutige ID, die kann man dann ganz einfach im Listview wieder finden. Sie muss nicht mal angezeigt werden, sondern kann "versteckt" mit dem Item verknüpft sein.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MisterSonic

Registriert seit: 4. Jan 2004
Ort: Sachsen-Anhalt
40 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Suchfunktion

  Alt 20. Jan 2018, 19:08
Hallo Luckie, erst mal danke für deine Antwort. Ich habe leider keine Ahnung wie genau ich das anstellen soll ...

Das Hauptproblem ist allerdings auch nicht die Suche im ListView, sondern das die Suchfunktion ein falsches Resultat liefert.
Niveau ist keine Cremè.

Geändert von MisterSonic (20. Jan 2018 um 19:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#4

AW: Suchfunktion

  Alt 20. Jan 2018, 22:03
Zitat:
Delphi-Quellcode:
     For I2 := 0 to TS.Count-1 do
      Begin
       If (I2 = 0) or (I2 = TS.Count) then
Hab jetzt nicht alles angesehn, aber (I2 = TS.Count) wird niemals treffen.
Meinst bestimmt TS.Count-1 ?

Hier fehlt If length(S) > 0 then TS.Add(S); das UpperCase, wobei man das auch gleich nur einmal beim S:=UpperCase(...) erledigen könnte, anstatt mehrmals nachträglich.

So richtig verseh ich auch nicht, warum du die mittleren Suchwörter anders suchst, als das Erste und Letzte.

Wenn auch Umlaute vorkommen können, dann besser AnsiUpperCase statt UpperCase verwenden, denn Letzeres arbeitet nur mit ASCII-Zeichen, also ausschließlich für A-Z.


Nur als zusätzliche Tipps:
Das If (I2 > 0) and (I2 < TS.Count) then soll doch wohl ein ELSE sein?
Und der Code zum Zerteilen der Suchwörter -> Delphi-Referenz durchsuchenSplitString oder Delphi-Referenz durchsuchenTStringList.DelimitedText mit Delimiter=' ' und StrictDelimiter=True (Delimiter und StrictDelimiter könnte man hier notfalls auch auf Default stehen lassen).

Warum graufst du hier eigentlich ständig auf Form1 zu? Ist das etwa keine Methode von TForm1?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Jan 2018 um 22:12 Uhr)
  Mit Zitat antworten Zitat
MisterSonic

Registriert seit: 4. Jan 2004
Ort: Sachsen-Anhalt
40 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Suchfunktion

  Alt 20. Jan 2018, 23:14
[QUOTE=himitsu;1391489]
Zitat:
[DELPHI] For I2 := 0 to TS.Count-1 do
So richtig verseh ich auch nicht, warum du die mittleren Suchwörter anders suchst, als das Erste und Letzte.
Hallo!

Erstmal danke für deine vielen Anmerkungen. Zur Erklärung warum die mittleren Worte anders gesucht werden:

Es geht hierbei um Artikel die evtl. in verschiedenen Größen vorhanden sind, also könnte es z.B. einen Artikelnamen geben der wie folgt aufgebaut ist:

11380 L black

Das bedeutet Artikel 11380 in Größe L in Farbe black ...

würde ich jetzt nicht nach "L " sondern nach "L" suchen würde ein falsches Ergebnis kommen da ja das "L" auch in "BLACK" vorkommt.
Niveau ist keine Cremè.
  Mit Zitat antworten Zitat
Fukiszo
(Gast)

n/a Beiträge
 
#6

AW: Suchfunktion

  Alt 20. Jan 2018, 23:48
Caption SubItem-0
38745612 11380 L apple green

also ich pers. würde das auch in mehr sub's splitten wie luckie bereits sagte,
bei deiner vorgabe halt 4 einträge pro artikel.

falls 11380 den momentanen vorrat des artikels darstellen soll, würd ich das nach rechts verlagern.

sub[0] sub[1] sub[2] sub[3]
Artikel# Größe Farbe Anzahl <- so würd ich's untergliedern.

das würde alles stark vereinfachen um die suchfunktion (von grund auf neu erschaffen) effektiver arbeiten zu lassen.

suchen würde man dann nach artikelnummer, kann natürlich per suchfunktion erweitert werden um querverweise (S/M/L) oder (Farben) zu berücksichtigen sowie wenn 0 vorrätig sind die gleich rausfiltern.

nur meine meinung dazu.
  Mit Zitat antworten Zitat
MisterSonic

Registriert seit: 4. Jan 2004
Ort: Sachsen-Anhalt
40 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Suchfunktion

  Alt 21. Jan 2018, 02:20
...also ich hole mal etwas aus.

Im ListView in Caption steht eine 8 stellige Zahl. Diese gibt lediglich an, wie genau eine weitere Typisierte Datei heisst ... in der letztendlich die Bestandsbuchungen sind ... +10 .. -3 -2 ....usw.

Diese Informationen stehen nicht in dem ListView und sollen auch nicht durchsucht werden.

Es geht also darum :
Im Edit-Feld soll der Benutzer Artikelinfos (z.B. Name "11380" ... Größe "L" ... Farbe "black") eingeben und das Programm soll damit den zugehörigen Dateinamen (der in Caption) steht ermitteln und vorschlagen.
Niveau ist keine Cremè.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Suchfunktion

  Alt 21. Jan 2018, 09:26
Du solltest Dir zu Herzen nehmen, was Luckie in #2 geschrieben hat. Suche nicht in der Anzeige sondern in der Datenstruktur die angezeigt werden soll. Wenn Deine Daten schon eine Struktur haben sollten (Artikelnummer,Größe...) solltest du auch entsprechend suchen. Dieses zusammenbasteln eines Strings ist schlicht suboptimal.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
MisterSonic

Registriert seit: 4. Jan 2004
Ort: Sachsen-Anhalt
40 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: Suchfunktion

  Alt 21. Jan 2018, 11:22
Dahinter liegt keine Datenstrucktur. An dem zerlegen des Strings führt kein Weg vorbei.
Niveau ist keine Cremè.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz