AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken In Datenbank(Edit1.Txt) suchen
Thema durchsuchen
Ansicht
Themen-Optionen

In Datenbank(Edit1.Txt) suchen

Offene Frage von "xv300"
Ein Thema von xv300 · begonnen am 13. Jun 2009 · letzter Beitrag vom 17. Jun 2009
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
Popov
(Gast)

n/a Beiträge
 
#51

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 11:53
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;
Angehängte Dateien
Dateityp: zip beispielcsv_184.zip (2,7 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
xv300

Registriert seit: 13. Jun 2009
25 Beiträge
 
#52

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 12:50
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...
Angehängte Dateien
Dateityp: zip dateiverwaltungsprogramm_967.zip (244,8 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 13:02
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#54

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 13:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#55

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 13:43
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
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#56

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 13:52
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#57

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 13:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#58

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 14:08
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
xv300

Registriert seit: 13. Jun 2009
25 Beiträge
 
#59

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 17:58
Popov, das ist einfach große Klasse. Ich danke dir VIELE MALE!
Jetzt hab ich auch das ganze verstanden und wenn ich das so meinem Lehrer "beibringe" dann versteht der das hoffentlich auch

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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#60

Re: In Datenbank(Edit1.Txt) suchen

  Alt 15. Jun 2009, 18:46
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


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 09:06 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