AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Suchfunktion in einer Datenbank
Thema durchsuchen
Ansicht
Themen-Optionen

Suchfunktion in einer Datenbank

Ein Thema von gabi · begonnen am 2. Feb 2003 · letzter Beitrag vom 16. Feb 2003
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#11
  Alt 4. Feb 2003, 21:19
Hallo Gabi,

ich hab das Programm jetzt einmal unter D7 compiliert und die Fehlermeldung erhalten, dass loPartialKey ein unbekannter Bezeichner ist. Deshalb habe ich die Unit DB hinzugefügt:

Delphi-Quellcode:
implementation

uses Beschreibung[b], DB[/b];
Dann funktioniert es bei mir fehlerfrei.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
gabi

Registriert seit: 2. Feb 2003
13 Beiträge
 
Delphi 6 Professional
 
#12
  Alt 5. Feb 2003, 19:20
Hallo MrSpock,
besten Dank, wenn ich auch DB so wie von Dir angegeben hinzufüge, klappt das Compilieren. Wenn ich dann aber einen Suchbegriff eingeben und auf Start klicke, bekomme ich wieder ne Fehlermeldung Violation Access usw.
Da muss ich in der Bezeichnung des Feldes in dem ich suchen will noch nen Fehler haben, denn dort springt der Cursor hin. Muss ich mir erst mal in Ruhe anschauen. Vielleicht kannst Du das auch mal testen und bekommst auch die Fehlermeldung. Dann hast Du vielleicht wieder einen guten Tip für mich.
Ich weiß, ich kann noch nicht viel in Delphi, werde auch wenn das Programm funktioniert erst noch mal einige Übungen machen aus meinem Buch:
Borland Delphi 6 Kochbuch.

Vielen Dank und
viele Grüße
Gabi
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#13
  Alt 5. Feb 2003, 20:16
Hallo Gabi,

der Fehler ist der, dass Locate als ersten Parameter den Namen des Feldes der Tabelle benötigt, in dem gesucht werden soll. Dieser steht aber nicht in der ComboBox, deshalb geht es schief.

Noch ein paar Kommentare:

1. Du solltes als DataBaseName nicht mit relativen Pfaden arbeiten, dass kann zu Problemen führen (wir hatten dazu gerade schon einmal einen Thread). Lege einfach einen ALIAS an (z.B. "Wissen"), der auf den Pfad zeigt oder erzeuge den absoluten Pfad im Programm:

DatabaseName := ExtractFilePath(Application.Exename)+'/DB'; 2. Du solltest Feldnamen in Tabellen ohne Leerzeichen und ohne Sonderzeichen (z.B. / oder Umlaute) bilden, das verhindert auch Probleme.

3. Der schwarze Hintergrund in den Fenstern ist ungewöhnlich
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
gabi

Registriert seit: 2. Feb 2003
13 Beiträge
 
Delphi 6 Professional
 
#14
  Alt 5. Feb 2003, 23:41
Hallo MrSpock,

Danke für Deine Tips.
Habe sie folgendermaßen bearbeitet:

1. wo muss ich den Quellcode genau hinschreiben? ich nutze bewußt keinen alias um nicht immer die bde beim Anwender zu installieren, wir wollen das Programm unkompliziert im Netz laufen lassen.

2. Den Feldnamen Software/Geräte hab ich geändert in Software_Hardware und hoffe das macht keine Probleme

3. wieso siehst Du die Fenster mit schwarzem Hintergrund, der ist eigentlich blau?

Bisher hab ich noch keinen Erfolg mit der Ausführung.

Viele Grüße
Gabi
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#15
  Alt 6. Feb 2003, 08:15
Hallo Gabi,

zu 1: da du die Tabellen nicht in ein eigenes Datenmodul gepackt hast, solltest du die Zuweisung in der OnCreate Methode des Formulars einfügen, das das entsprechenden Dataset enthält.

Zu 2: Der Feldname ist OK. (_) ist erlaubt und verursacht auch keine Probleme.

Zu 3: Gute Frage!? Kann ich nicht beantworten.

Wie sieht denn jetzt die Locate - Anweisung aus? Hast du den korrekten Feldnamen als ersten Parameter eingetragen?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
gabi

Registriert seit: 2. Feb 2003
13 Beiträge
 
Delphi 6 Professional
 
#16
  Alt 6. Feb 2003, 16:48
Hallo MrSpock,

zu 1.: in dem Formular Suchen find ich keine onCreate-Methode. Soll ich die dort erstellen? dachte eigentlich das macht wenig Sinn.
Im Main Formular finde ich eine bei dem Button Beschreibung, wenn ich die Anweisung dann aber dort einsetze erhalte ich nur Fehlermeldungen.

Meine Locate-Anweisung sieht so aus:

Code:
BeschreibungForm.TbNrBeschr.Locate(BeschreibungForm.DBLookupComboBox1.Text, EdSuchen.Text, [loPartialKey]);
Habe aber auch probiert wirklich den Namen des Feldes was ich durchsuchen will aus der Tabelle zu nehmen, aber da beschwert sich Delphi wieder über reichlich undeklarierte Variablen.

Code:
BeschreibungForm.TbNrBeschr.Locate(Software_Hardware.Text, EdSuchen.Text, [loPartialKey]);
Irgendwie bekomm ich das einfach nicht hin.

Viele Grüße
Gabi
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#17
  Alt 7. Feb 2003, 06:47
Hallo Gabi,

wähle das Suchen-Formular im Objektinspektor auf und klicke auf den Reiter "Ereignisse", dort findest du in der linken Spalte das "OnCreate" Event. Führe eine Doppelklick auf die rechte Spalte neben diesem Ereignis aus. Es wird dann die OnCreate Methode erstellt, in die du den DatbaseName setzen kannst.

Die richtige Locate Anweisung lautet:

BeschreibungForm.TbNrBeschr.Locate('Software_Hardware', EdSuchen.Text, [loPartialKey]);
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
gabi

Registriert seit: 2. Feb 2003
13 Beiträge
 
Delphi 6 Professional
 
#18
  Alt 11. Feb 2003, 21:32
Hallo MrSpock,
habe Deine Antwort vom 07.02.2003 erst jetzt eben gesehen. Wollte nochmal was nachfragen bei Dir und da hab ich sie gesehen. Vorher war sie in der Liste nicht zu sehen und ne Mail, dass ne Antwort für mich da ist, hab ich leider auch nicht bekommen.
Deshalb melde ich mich jetzt erst.

Habe mich nach Deinen Answeisungen gerichtet, aber beim Suchen erhalte ich immer noch die Meldung: Access violation at address usw.

Ich sende Dir nochmal mein Programm, dann kannst Dir einen besseren Überblick verschaffen, was ich da verzapft habe. Da der Compiler mir gemeldet hat, dass DatabaseName undeklariert ist, nehme ich an ich muss es als String deklarieren?

Viele Grüße
Gabi
Angehängte Dateien
Dateityp: zip wissen.zip (535,2 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#19
  Alt 14. Feb 2003, 19:24
Hallo Gabi,

ich hab mir das Programm noch einmal genau angeschaut und habe zunächst einmal folgende Anmerkungen:

- der Hintergrund ist bei mir schwarz, weil du die Farbe des Hintergrundes auf clBackground gesetzt hast. Ich arbeite z.B. nicht mit der Windows Standardeinstellung und habe durch meine Einstellungen einen schwarzen Hintergrund, der aber nicht als Fensterfarbe benutzt werden sollte.

- die Art und Weise, in der du MDIChilds verwendest ist unüblich. MDI Anwendungen erlauben in der Regel das Öffnen von mehreren Fenstern desselben Typs (z.B. wie ein Texverarbeitungsprogramm). Du hast aber nur 2 Fenster, die es genau einmal gibt, deshalb ist MDI keine gute Wahl.

Das Problem hängt nun auch tatsächlich indirekt an der MDI Wahl. Ein MDI Fenster wird mit dem "Create" auch gleich angezeigt. Ein normales Fenster muss über "Create" erstellt und dann z.B. über ShowModal angezeigt werden.

Das Beschreibungsfenster erstellst du z.B. über:

TBeschreibungForm.Create(Self); Dadurch zeigt aber die Variable BeschreibungForm noch nicht auf das so erzeugte Formular. Es muss heißen:

BeschreibungForm := TBeschreibungForm.Create(Self); Dann kann auch Suchform korrekt auf BeschreibungForm zugreifen.

Ebenso sollte SuchForm erzeugt werden über:
Delphi-Quellcode:
procedure TBeschreibungForm.BtSuchenClick(Sender: TObject);
begin
    SuchForm := TSuchForm.Create(Self);
end;
Zum Thema DatabaseName: Du musst die Eigenschaft "DatabaseName" der beiden TTable Objekte auf den gewünschten Wert setzen. Da nicht auszuschließen ist (oder doch?), dass noch Tabellen oder Queries hinzukommen, kannst du alle TDBDataSet Objekte in einer Schleife setzen:

Delphi-Quellcode:
procedure TBeschreibungForm.FormCreate(Sender: TObject);
var
   compo   : Integer;
begin
   for compo := 0 to ComponentCount-1 do
      if Components[compo] is TDBDataSet then
      begin
         (Components[compo] as TDBDataSet).DatabaseName
                        := ExtractFilePath(Application.ExeName)+'DB';
         (Components[compo] as TDBDataSet).Open;
      end;
end;
Gibt es sicher keine weiteren Tabellen tuts auch:

Delphi-Quellcode:
procedure TBeschreibungForm.FormCreate(Sender: TObject);
begin
  TbNrBeschr.DatabaseName := ExtractFilePath(Application.ExeName)+'DB';
  TbTyp.DatabaseName := ExtractFilePath(Application.ExeName)+'DB';
  TbNrBeschr.Open;
  tbTyp.Open
end;
Wichtig ist, dass du die Eigenschaft "Active" der beiden Tabellenobjekte auf FALSE setzt, sonst kannst du die Eigenschaft DatabaseName nicht setzen. Ich habe deshalb in den beiden Code Beispielen mit "open" die Tabellen geöffnet.

Noch zwei Kommentare:

- mit der DBCombobox wählst du den Wert des Eintrages für den aktuellen Datensatz aus, d.h. wenn du hier einen Wert auswählst, änderst du den aktuellen Datensatz: willst du das wirklich?

- Im Suchenfenster suchst du ja nach einem Datensatz, der im Feld "Software_Hardware" den Suchwert enthält. Beachte aber, dass in diesem Feld nur Zahlen stehen, so findest du z.B. einen Datensatz über den Suchstring "6" aber nicht über "Elfried"

Puuuhh, das solls mal erst sein.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
gabi

Registriert seit: 2. Feb 2003
13 Beiträge
 
Delphi 6 Professional
 
#20
  Alt 15. Feb 2003, 15:44
Hallo MrSpock,

vielen, vielen Dank für Deine ausführliche Anleitung. Ich werde mir die jetzt mal intensiv zu Gemüte führen und schauen wie ich mein Programm entsprechend abändere. Diese Tips bekommt man mit den Büchern einfach nicht. Wie beispielsweise die Erzeugung von neuen Fenstern. Im Buch gibt es nur eine Beschreibung wie man es grundsätzlich macht und damit war es das. Ich find es es ganz toll, dass es Foren wie diese gibt und man dort so hervorragend geholfen bekommt.

Sobald ich weiter gekommen bin, werde ich mich wieder bei Dir melden.

Viele Grüße
Gabi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 16:33 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