Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   In Datenbank(Edit1.Txt) suchen (https://www.delphipraxis.net/135577-datenbank-edit1-txt-suchen.html)

mkinzler 14. Jun 2009 19:19

Re: In Datenbank(Edit1.Txt) suchen
 
Zitat:

Zitat von xv300
Inwiefern meinst du das?

Du darfst nur die Sätze zählen, welche du ins Grid einträgst
Was genau soll ich ändern, aber eigentlich hilft mir das ja auch (noch) nicht bei meinem jetzigen Problem[/quote]
Doch (auch in Verbindung mit Franks Antwort).

xv300 14. Jun 2009 19:56

Re: In Datenbank(Edit1.Txt) suchen
 
Möchtet ihr einem auf dem Schlauch stehenden vöölig überforderten Newbie mal kurz in gaaaaaaanz langsamen Schritten erklären, wo der Fehler liegt und am besten auch noch wie er zu beheben ist?


LiEbE GrÜßE

jfheins 14. Jun 2009 19:59

Re: In Datenbank(Edit1.Txt) suchen
 
Versuchs mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
  Form2 := TForm2.Create(Form1);
  Form2.Show;
  Form2.Tabelle.Cells[0,0] := ' ';
  Form2.Tabelle.Cells[1,0] := 'Name';
  Form2.Tabelle.Cells[2,0] := 'Vorname';
  Form2.Tabelle.Cells[3,0] := 'Strasse';
  Form2.Tabelle.Cells[4,0] := 'PLZ';
  Form2.Tabelle.Cells[5,0] := 'Ort';
  Form2.Tabelle.Cells[6,0] := 'Telefon';


  while not eof(f) do
    begin
      read(f,Adresse);
      Satznummer := Satznummer + 1;

      with Adresse do
      begin
        if (pos(Form1.SUCHFELD.Text, Name) > 0) or (pos(SUCHFELD.Text, Vorname) > 0) then
        begin // Suchtext im Feld suchen, nicht umgekehrt
          Form2.Tabelle.Cells[0,Satznummer] := IntToStr(Satznummer);
          Form2.Tabelle.Cells[1,Satznummer] := Name;
          Form2.Tabelle.Cells[2,Satznummer] := Vorname;
          Form2.Tabelle.Cells[3,Satznummer] := Strasse;
          Form2.Tabelle.Cells[4,Satznummer] := PLZ;
          Form2.Tabelle.Cells[5,Satznummer] := Ort;
          Form2.Tabelle.Cells[6,Satznummer] := Telefon;
        end;
      end
      end
end;
end;

DeddyH 14. Jun 2009 20:02

Re: In Datenbank(Edit1.Txt) suchen
 
Ist f eigentlich eine globale Variable? Da das so aussieht, wo wird denn sichergestellt, dass immer vom Dateianfang aus gelesen wird?

xv300 14. Jun 2009 20:16

Re: In Datenbank(Edit1.Txt) suchen
 
Geht leider auch ned!

DeddyH 14. Jun 2009 20:18

Re: In Datenbank(Edit1.Txt) suchen
 
Ignoriert mich ruhig :?

mkinzler 14. Jun 2009 20:37

Re: In Datenbank(Edit1.Txt) suchen
 
Zitat:

Zitat von DeddyH
Ignoriert mich ruhig :?

Er ignoriert alle Antworten, welche er nicht versteht. Ist einfacher als sich damit zu beschäftigen

himitsu 14. Jun 2009 20:56

Re: In Datenbank(Edit1.Txt) suchen
 
AnsiLowerCase+Pos ginge ja och noch :angel2:

Jens Hartmann 14. Jun 2009 21:33

Re: In Datenbank(Edit1.Txt) suchen
 
Hallo,

ich hoffe du hast den Quellcode aus #43 nich nur kopiert. Weil dann kann es eventuell nicht gehen. (doppeltes begin, eventuell fehlendes end;)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
  Form2 := TForm2.Create(Form1);
  Form2.Show;
...
....
Außerdem, solltest du wie DeddyH schon geschrieben hat mal nach der Var. f schauen. Wenn es eine glo. Var. ist, wo wird sie denn mit Daten geladen?

Gruß Jens

mkinzler 14. Jun 2009 21:34

Re: In Datenbank(Edit1.Txt) suchen
 
Ausserdem auch die andere Hinweise beachten

Popov 15. Jun 2009 11:53

Re: In Datenbank(Edit1.Txt) suchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von xv300
Möchtet ihr einem auf dem Schlauch stehenden vöölig überforderten Newbie mal kurz in gaaaaaaanz langsamen Schritten erklären, wo der Fehler liegt und am besten auch noch wie er zu beheben ist?


LiEbE GrÜßE


Ich hab eine Funktion ausgebuddelt die man eventuell für eine csv-artige Datenbank benutzen könnte. Ich hab die Funktion nicht direkt dafür geschrieben, aber bei einer Handvoll Daten wird es schon gehen. csv bedeutet, daß du die Daten in einer Textdatei getrennt mit Komma, bzw. Semikolon speicherst. Ich hab soweit auch deine Beispieldatei geändert, d.h Daten im Sem. getrennt.

Das Beispiel ist kurz, erfüllt aber alle Forderungen, d.h. sucht in der DB und liest den Datensatz ein. Den Rest mußt du selbst machen.

Delphi-Quellcode:
uses
  StrUtils;

var
  DBTextPath: String;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DBTextPath := ExtractFilePath(ParamStr(0)) + 'Datensatz1.csv';
  Memo1.Lines.LoadFromFile(DBTextPath);
end;

//Gibt den n'ten Text aus einem mit Trennzeichen getrennten String, zB. A|B|C
//N = 0 für ersten Text
function GetTextN(Text: String; N: Word; Delimiter: Char): String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    while Trim(Text) <> '' do
    begin
      if Pos(Delimiter, Text) = 0 then Text := Text + Delimiter;
      sl.Add(Trim(Copy(Text, 1, Pos(Delimiter, Text) - 1)));
      Delete(Text, 1, Pos(Delimiter, Text) + Length(Delimiter) - 1);
    end;

    if sl.Count >= (N + 1) then Result := sl[N] else Result := '';
  finally
    sl.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  D = ';';
var
  i: Integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(DBTextPath);

    for i := 0 to sl.Count - 1 do
    begin
      if AnsiContainsText(sl[i], Edit1.Text) then
      begin
        Edit2.Text := GetTextN(sl[i], 0, D);
        Edit3.Text := GetTextN(sl[i], 1, D);
        Edit4.Text := GetTextN(sl[i], 2, D);
        Edit5.Text := GetTextN(sl[i], 3, D);
        Edit6.Text := GetTextN(sl[i], 4, D);
        Edit7.Text := GetTextN(sl[i], 5, D);

        Break;
      end;
    end;
  finally
    sl.Free;
  end;
end;

xv300 15. Jun 2009 12:50

Re: In Datenbank(Edit1.Txt) suchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Leute Leute^^

Ich habe jetzt mal meinen Lehrer gefragt und er hat mir gesagt, dass er das ganze mit POS machen möchte, bzw. dass ich darüber ein Referat halten soll in Verbindung mit diesem Programm.

--> Ich beschäftige mich im MOment sicherlich nicht mit anderem, für EUCH einfacherm Zeug!


Natürlich bin ich für jede Hilfe sehr sehr dankbar, doch bitte versteht mich auch.

Ich lade euch mal das Programm hoch, damit ihr seht, wie das funktioniert...

himitsu 15. Jun 2009 13:02

Re: In Datenbank(Edit1.Txt) suchen
 
Es ist nicht nur "einfach für uns", sondern insgesamt einfacher, optimaler und vorallem übersichtlicher ...

Wenn es sein muß, können wir auch anders.
z.B.:
Delphi-Quellcode:
B := False;
For i := 1 to Length(S) - Length(C) + 1 do
  If Copy(AnsiLowerCase(S), i, Length(C)) = AnsiLowerCase(C) Then
    B := True;
If B Then ...

// oder

If Pos(AnsiLowerCase(C), AnsiLowerCase(S)) > 0 Then ...

// statt einfach nur

If AnsiContainsText(S, C) Then ...
Diese Codes machen im Prinzip alle das Gleiche und es gibt noch tausende andere und noch viel schlimmere Möglichkeiten.

Popov 15. Jun 2009 13:37

Re: In Datenbank(Edit1.Txt) suchen
 
AnsiContainsText ist einfacher als Pos. Vielleicht erkennt dein Lehrer das Problem nicht, aber es ist ein Problem.

Die Funktion Pos ist einfach, effektiv, aber man muß auch sehr aufpassen, denn es kann dir andere Ergebnisse liefern als du möchtest. Pos verzeiht keine Fehler. Hier paar Beispiele:

Die Abfrage

if Pos('maier', 'Hans Maier') > 0 then ...

oder

if Pos('Maier', 'Hans MAIER') > 0 then ...

wird nichts finden, denn für Pos ist "maier" und "Maier" nicht gleich. Der Nutzer des Programms muß den Suchtext also genau eingeben. Der Nutzer weiß aber nicht wie der Name in der Datenbank gespeichert ist. Hier gibt es also eine mögliche Fehlerquelle. Es ist deshalb in solchen Fällen üblich solche Fehlerquellen bei der Überprüfung abzufangen. Man erreicht es in dem man beide Texte upper oder lower case überprüft, d.h. man überprüft beide Texte eintweder in Groß- oder Kleinbuchstaben, z.B.,

if Pos('MAIER', 'HANS MAIER') > 0 then ...

oder

if Pos('maier', 'hans maier') > 0 then ...

Und wie erreicht man das? Man packt beide Texte in eine Funktion, z.B. UpperCase().

if Pos(UpperCase('maier'), UpperCase('Hans Maier')) > 0 then ...

Jetzt ist es egal wie die Texte geschrieben sind, denn UpperCase macht sie gleich.

Allerdings macht UpperCase nur die Ascii-Zeichen groß. Damit die deutschen Umlautzeichen, also ä, ö, Ü usw. berücksichtigt werden, macht man das mit der neueren Funktion AnsiUpperCase. Hier werden auch ä, ö und Ü berücksichtigt. Die Abfrage sieht dann so aus:

if Pos(AnsiUpperCase('müller'), AnsiUpperCase('Hans Müller')) > 0 then ...

Da ist also nichts kompliziertes dabei, sondern man denkt bei der Programmierung mit und hat nicht die Einstellung von wegen: was interessiert mich wenn der Nutzer den Namen falsch eingibt. Es ist dann sein Problem.

Wenn du das nicht machen wirst weil es dir zu kompliziert ist, dann geh zu deinem Lehrer und sag, daß du nicht den Draht zu Programmierung hast und möchtest lieber in den Kochkurs gehen. Denn wenn du nicht bereit bist es besser als ausreichen zu machen, dann solltest du es lassen. Ausreichend, das ist die 4 als Note.

Ok, und was hat es dann mit AnsiContainsText auf sich? AnsiContainsText ist nicht besser als Pos mit AnsiUpperCase, aber etwas kürzer.

if AnsiContainsText ('Hans Müller', 'müller') then ...

Diese Abfage bedeutet: prüfe ob sich 'müller' in dem Text 'Hans Müller' befindet. Ignoriere dabei die Groß- und Kleinschreibung und beachte dabei alle Zeichen, also auch Umlautzeichen.

Übrigens, das Beispiel was ich oben gepostet habe, also noch einfacher geht es nicht. Erstens ist csv Standard, d.h. diese csv Datenbank kannst du mit jedem anderen Datenbankprogramm auch öffnen, also auch mit Access oder Excel. Und es sucht im ganzen Datensatz. Und es ist kurz.

Ein Tipp: werde offener, denn du verbringst lieber das ganze Wochenende damit anderen zu sagen was du nicht verstehst, also dir fünf Minuten lang eine Funktion in der Delphi-Hilfe anzusehen. Sehr effizient.

Jens Hartmann 15. Jun 2009 13:43

Re: In Datenbank(Edit1.Txt) suchen
 
Hallo,

nochmal gefragt!! Wie schon mehrmals erwähnt.
Wo wird den, und wie die Var. f geladen.

Ob du das Problem mit POS oder anders lösen willst, ist erstmal egal. Die anderen Varianten wären zwar besser, aber wenn mit POS, dann mach das. Aber wichtig zu wissen wäre doch erstmal, wie und womit die Var. f geladen wird.

Hast du dein Programm mal im Debugmodus laufen lassen, und nach gesehen, welchen Wert f bei der Abfrage hat?

Gruß Jens

Popov 15. Jun 2009 13:52

Re: In Datenbank(Edit1.Txt) suchen
 
Da gibt es den Button "Vorhandene Datei öffnen". Nur aufpassen, du mußt den ganzen Pfad bis Datei angeben. Also speichere den Ordner am besten direkt unter C, sonst hast du viel zu tippen.

Popov 15. Jun 2009 13:59

Re: In Datenbank(Edit1.Txt) suchen
 
Also ich hab mir den Quelltext noch mal angesehen und ... ok, der Lehrer scheint hier eher Pascal zu lehren. Eigentlich spricht auch nichts gehen AssignFile & Co, denn bevor mal laufen will sollte man erst vernünftig gehen können, aber ich hab das Gefühl der Lehrer hat noch die Unterlagen von 1980. Das erinnerte mich gleich an diese South Park Episode:

http://www.southparkstudios.com/episodes/210813

Die ersten 60 Sekunden ist das was ich meine.

DeddyH 15. Jun 2009 14:08

Re: In Datenbank(Edit1.Txt) suchen
 
Nun hab ich auch mal in die Unit1 geschaut. Die Datei ist die ganze Zeit geöffnet und es wird darin herumnavigiert. Wenn Du darin suchen willst, musst Du zuerst an den Dateianfang springen, da sonst nicht sichergestellt ist, dass Du auch wirklich alle Datensätze zwecks Vergleich durchläufst. Zu den globalen Variablen und dem o.a. Umstand, dass die Datei immer offen ist sage ich jetzt mal nichts.

xv300 15. Jun 2009 17:58

Re: In Datenbank(Edit1.Txt) suchen
 
Popov, das ist einfach große Klasse. Ich danke dir VIELE MALE! :firejump:
Jetzt hab ich auch das ganze verstanden und wenn ich das so meinem Lehrer "beibringe" dann versteht der das hoffentlich auch :P

Nur ich habe noch eine Frage dann versteh ich auch alle 100%
Zitat:

if AnsiContainsText ('Hans Müller', 'müller') then ...
Diese Abfage bedeutet: prüfe ob sich 'müller' in dem Text 'Hans Müller' befindet. Ignoriere dabei die Groß- und Kleinschreibung und beachte dabei alle Zeichen, also auch Umlautzeichen.


Ich verstehe das fast so, nur wie stelle ich denn jetzt den Bezug zu mir her. Hier ist es ja:

Wenn MÜLLER in dem Text "Hans MÜller" ist, dann mache irgendwas...
MÜLLER ist hier der Inhalt des SUCHedits
Hans Müller ist irgendein Inhalt, odeR?

Wie krieg ich es nun hin, dass er dieses MÜLLER in dem kompletten Datensatz sucht?
Sehe ich das Richtig, dass dann (bei mir!!!) in dem Record NAme z.B. gesucht würde?


Liebe Grüße

Popov 15. Jun 2009 18:46

Re: In Datenbank(Edit1.Txt) suchen
 
Im Record wind nichts automatisch gesucht. Wenn du den ganzen Datensatz durchsuchen willst, dann mußt du jeden einzelnen String durchsuchen. Ich hab dir oben das Beispiel mit csv gemacht. Da wird komplett der ganze Datensatz durchsucht, weil da der ganze Datensatz komplett geladen wird. Du dagegen lädst jedes Feld einzeln, also mußt du auch einzeln prüfen. Allerdings sind es nur sechs Felder, also auch keine Katastrophe. Dennoch, einzeln.

xv300 15. Jun 2009 18:51

Re: In Datenbank(Edit1.Txt) suchen
 
MMh. Das Problem ist, nachdem ich meinen Lehrer gefragt habe, meint der, dass ich das anders lösen MUSS. Das heißt, auch wenn die Lösung oben einfach und besser ist, ich "aufgrund des Lehrplans" es jetzt so "einfach"(schuleinfach) wie möglich machen muss, damits der ganze Kurs versteht...

Ist es nicht möglich, dass ich das einfach umgehe indem ich die Editfelder doppelt benutze?

Also Datensatz eingeben, als auch als Suchfelder?


LG

DeddyH 15. Jun 2009 19:38

Re: In Datenbank(Edit1.Txt) suchen
 
Was haben denn jetzt die Edits mit Deinem Record zu tun?

xv300 15. Jun 2009 19:54

Re: In Datenbank(Edit1.Txt) suchen
 
Naja, ich hab z.B.:

Das Edit1 für den Namen
Das Edit2 für den Vorname


Nun gebe ich im Edit1 was ein und schon wirds angezeigt.
Dafür muss ich ja das was ich eingegeben hab auch in diesem Record suchen!


Lg

DeddyH 15. Jun 2009 19:56

Re: In Datenbank(Edit1.Txt) suchen
 
Aus Anwendersicht würde ich doch annehmen, dass, wenn ich im Edit für den Nachnamen "Meier" eingebe, auch nur nach dem Nachnamen "Meier" gesucht wird und nicht z.B. in der Telefonnummer.

xv300 15. Jun 2009 20:01

Re: In Datenbank(Edit1.Txt) suchen
 
Wäre also das hier theoretisch möglich?


Delphi-Quellcode:
if Pos(AnsiUpperCase(Name), AnsiUpperCase(EdName.Text)) > 0 then
  begin
    ShowMessage('asd');
  end;

DeddyH 15. Jun 2009 20:04

Re: In Datenbank(Edit1.Txt) suchen
 
Wenn die Parameter andersherum wären, sähe das schon ganz brauchbar aus ;)

Popov 15. Jun 2009 20:11

Re: In Datenbank(Edit1.Txt) suchen
 
@xv300

Wieso mußt du in Edits suchen? Was in Edits ist das sieht der Nutzer. Du mußt in deiner Datenbank suchen, bzw. die komplett Datensatz für Datensatz laden und jedes Feld prüfen.

Aber, hast du schon was von Funktionen gehört? Du schreibst eine Funktion und benutzt sie bei jedem Feld.

xv300 15. Jun 2009 20:15

Re: In Datenbank(Edit1.Txt) suchen
 
Kenn ich, führen wir aber erst später im Unterricht ein ;)

Nur wie such ich denn jetzt speziell in dieser Datenbank? Den Fehler hab ich verstanden!


LG

Jens Hartmann 17. Jun 2009 06:15

Re: In Datenbank(Edit1.Txt) suchen
 
Hallo nochmal,

so ich habe mir jetzt mal die Funktion von Popov aus #51 angesehen. In dieser Funktion, ist alles enthalten, was Du benötigen tust.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DBTextPath := ExtractFilePath(ParamStr(0)) + 'Datensatz1.csv';   //Datenbank in Var. laden
  Memo1.Lines.LoadFromFile(DBTextPath);                            //Datenbank in Memo anzeigen
end;
Beim Form.Create, wird die Datenbank geladen und in einem Memo zur anzeige gebracht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  D = ';';
var
  i: Integer;
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(DBTextPath); //Der Inhalt der Datenbank, wird in eine Stringliste geladen

    for i := 0 to sl.Count - 1 do
    begin
      if AnsiContainsText(sl[i], Edit1.Text) then //Vergleich der Stringliste mit deiner Suchanfrage im Edit1
      begin
        Edit2.Text := GetTextN(sl[i], 0, D);     //Wenn suche Erfolgreich, dann wird der Datensatz über die Funktion
        Edit3.Text := GetTextN(sl[i], 1, D);     //GetTextN geladen
        Edit4.Text := GetTextN(sl[i], 2, D);
        Edit5.Text := GetTextN(sl[i], 3, D);
        Edit6.Text := GetTextN(sl[i], 4, D);     //Hier zum Beispiel, Teil 5 des Strings, bis zum nächsten ';'
        Edit7.Text := GetTextN(sl[i], 5, D);     //Hier String 6, da D=';'

        Break;
      end;
    end;
  finally
    sl.Free;
  end;
end;
Probier diese Funktion doch mal aus, und du wirst sehen, das es eigendlich ganz einfach ist.

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz