Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Paradox Tabelle durchsuchen. (https://www.delphipraxis.net/67365-paradox-tabelle-durchsuchen.html)

EDatabaseError 13. Apr 2006 16:29

Datenbank: Paradox • Version: 7 • Zugriff über: BDE - TTable

Paradox Tabelle durchsuchen.
 
:| Ich stehe gerade vor einem Problem. Ich möchte ALLE Einträge in einer Datenbank finden die speziellen kriterien entsprechen. Da es mehrere Kriterien sind und ab und zu auch manche leer sind findet er dann mit Locate nichts.

Delphi-Quellcode:
procedure TForm1.suchen;
var
   i: Integer;
begin
for i := 1 to 10000 do
begin
 Progressbar1.Position := i;
 if Table1.Locate('Position;Artikelgruppe;Artikelname', VarArrayOf([i, '', 'Testartikel']), [loPartialKey]) = true then
  begin
   showmessage(IntToStr(i));
  end;
end;
end;
bei diesem bsp findet er nichts obwohl Testartikel in der DB unter Artikelname eingetragen ist.

Gibt es noch andere Suchmethoden als Locate mit denen es funktionieren würde die DB zu durchsuchen und ich trotz eines leeres Suchwortes alle einträge die den anderen entsprechen finde?


mfg
Tobi

mkinzler 13. Apr 2006 18:07

Re: Paradox Tabelle durchsuchen.
 
Warum die Schleife? Und warum so eine große Grenze? Wieviel Datensätze passen zu diesem Kriterium? Welcher typ hat Arikelgruppe?

Bei Verwendung einet Tabel würde ich in diesem fall dann .Filter verwenden,

Ich würde aber zu einem Query raten:

Select * from <tabelle> where Position = :pos and :artikelgruppe = :artgrp and Artikelname like :artikel;

EDatabaseError 14. Apr 2006 12:28

Re: Paradox Tabelle durchsuchen.
 
Zitat:

Zitat von mkinzler
Warum die Schleife? Und warum so eine große Grenze? Wieviel Datensätze passen zu diesem Kriterium? Welcher typ hat Arikelgruppe?

Bei Verwendung einet Tabel würde ich in diesem fall dann .Filter verwenden,

Ich würde aber zu einem Query raten:

Select * from <tabelle> where Position = :pos and :artikelgruppe = :artgrp and Artikelname like :artikel;

sodele mal zum erstenm die schleife durchsucht die Position auch Laufende Nummer brauch ich nämlich wenn ich alles mit ... herausfinden will. Große Grenze da es mal ein Mittelständiges Lager managen soll. typ alle bis auf position sind strings. Position ist ein Integer.

Von Filter und Query hab ich 0 Ahnung aber hier mal ein Beispiel was ich überhaupt machen will.

Die Datenbank:
Position---------------Artikelname-------------------Artikelgruppe----und die anderen...
1----------------------Testartikel 1-----------------A Artikelgruppe
2----------------------Testartikel 2-----------------B Artikelgruppe
3----------------------Testartikel 3-----------------A Artikelgruppe
4----------------------kein Testarti-----------------A Artikelgruppe
...

In der Suche gebe ich jetzt ein:
Artikelname : Testartikel
Artikelgruppe : A Artikelgruppe

Als Ergebnis will ich nun die Einträge aus Position 1 u. 3 in ein bsp. Array oder so einfügen.


Geht das?



Mfg
Tobi

mkinzler 14. Apr 2006 12:46

Re: Paradox Tabelle durchsuchen.
 
Locate findet doch den Datensatz mit dem Kriterium, du mußt also nicht für jeden Datensatz in der Tabelle ein Locate ausführen.

Ich würde Artikelgruppe in eine eigene Tabelle auslagern.
Ein Filter blendet alle Datensätze eines DataSets( TTable, TQuery) aus welche nicht dem Filter entsprechen.
Delphi-Quellcode:
Table.Filter := '<Filterbedingung>';
Table.Filtered := True;
Ein Query kappselt eine SQL-Abfrage auf einen Datenbestand ( Kann Daten aus mehreren Tabellen) mit einbeziehen.

Zitat:

Als Ergebnis will ich nun die Einträge aus Position 1 u. 3 in ein bsp. Array oder so einfügen.
Geht das?
Ja,
-als Table mit Filter =: T
Delphi-Quellcode:
able.Filter := 'Artikelname='''Testartikel''' and Artikelgruppe='''A Artikelgruppe''' and ( Position = 1 or Position = 3)';
-Als Query:
Delphi-Quellcode:
Query.SQL.Text := 'Select * from <tabelle> where :artikelgruppe = :artgrp and Artikelname = :artikel' and Position in ( :pos)';
  Query.ParamByName( 'artgrp') := 'A Arikelgruppe';
  Query.ParamByName( 'artikel') := 'Testartikel';
  Query.ParamByName( 'artgrp') := '1,3';
  Query.Open;

EDatabaseError 14. Apr 2006 18:33

Re: Paradox Tabelle durchsuchen.
 
Zitat:

Zitat von mkinzler
Locate findet doch den Datensatz mit dem Kriterium, du mußt also nicht für jeden Datensatz in der Tabelle ein Locate ausführen.

Ich will eben auch ähnliche Datensätze. Da Locate auf PatialKey ist findet man auch wenn in der DB Testartikel 5 ist und wenn man nach Testartikel sucht.

Zitat:

Ich würde Artikelgruppe in eine eigene Tabelle auslagern.
Das wäre nicht so gut denn es kommen ja zu diesen drei Feldern noch einige dazu. (Es sind insgesammt 23) 23 Tabellen sin net so schön...


Zitat:

Ein Filter blendet alle Datensätze eines DataSets( TTable, TQuery) aus welche nicht dem Filter entsprechen.
Delphi-Quellcode:
Table.Filter := '<Filterbedingung>';
Table.Filtered := True;
Ein Query kappselt eine SQL-Abfrage auf einen Datenbestand ( Kann Daten aus mehreren Tabellen) mit einbeziehen.
Könntest du zu meinem obrigen Suchbsp. mal so eine Filterbedingung schreiben.

Zitat:

Zitat:

Als Ergebnis will ich nun die Einträge aus Position 1 u. 3 in ein bsp. Array oder so einfügen.
Geht das?
Ja,
-als Table mit Filter =: T
Delphi-Quellcode:
able.Filter := 'Artikelname='''Testartikel''' and Artikelgruppe='''A Artikelgruppe''' and ( Position = 1 or Position = 3)';
-Als Query:
Delphi-Quellcode:
Query.SQL.Text := 'Select * from <tabelle> where :artikelgruppe = :artgrp and Artikelname = :artikel' and Position in ( :pos)';
  Query.ParamByName( 'artgrp') := 'A Arikelgruppe';
  Query.ParamByName( 'artikel') := 'Testartikel';
  Query.ParamByName( 'artgrp') := '1,3';
  Query.Open;

[/quote]

Das vergessen wir mal ich glaub du hast mich falsch verstanden. 1 u. 3 entsprechen halt den Bedingungen. Wenn ich 3 u. 4 verstauche möchte ich 1 u. 4 als ergebnis.

Kurz: Ich möchte ALLE Datensätze die den eingegebenen Bedingungen nur zum Teil oder Ganz entsprechen anzeigen.


Mfg
Tobi

mkinzler 14. Apr 2006 18:50

Re: Paradox Tabelle durchsuchen.
 
Zitat:

Zitat von EDatabaseError
Zitat:

Zitat von mkinzler
Locate findet doch den Datensatz mit dem Kriterium, du mußt also nicht für jeden Datensatz in der Tabelle ein Locate ausführen.

Ich will eben auch ähnliche Datensätze. Da Locate auf PatialKey ist findet man auch wenn in der DB Testartikel 5 ist und wenn man nach Testartikel sucht.

dann nimmt man ststt '=' 'like'
Zitat:

Zitat:

Zitat von mkinzler
Ich würde Artikelgruppe in eine eigene Tabelle auslagern.

Das wäre nicht so gut denn es kommen ja zu diesen drei Feldern noch einige dazu. (Es sind insgesammt 23) 23 Tabellen sin net so schön...
Du hast mich total falsch verstanden. Ich wollte ja aus diesem Grund(Vermeidung Redundanz) alles was sich auf die Artikelgruppe bezieht in eine eigene Tabelle auslagern, und in der Artikeltabelle nur die ID auf die Gruppe ablegen.

Tabelle Artikelgruppe
ID--------------------Gruppenname---------<weitere Felder zur Artikelgruppe>
1 A Artikelgruppe
2 B Artikelgruppe

Tabelle Artikel

Die Datenbank:
Position---------------Artikelname-------------------Artikelgruppe----und die anderen...
1----------------------Testartikel 1-----------------1
2----------------------Testartikel 2-----------------2
3----------------------Testartikel 3-----------------1
4----------------------kein Testarti-----------------1

Wenn später viele Datensätze in der Artikeldatenbank sind, würde ich die sehr Raten keine Table sondern eine Query-Komponente zu nehnen. Da in einer TTable-Komponente immer alle datensätze enthalten sind, auch wenn diese gefiltert ist. (DS nur ausgebelndet).

Delphi-Quellcode:
Query.Sql.Text := 'select * from artikel a, artikelgruppe g where a.Artikelname like :artikel and g.id = a.Artikelgruppe and g.gruppenname = :artgrp';
Query.ParamByName('artgrp').asString := 'A Artikelgruppe';
Query.ParamByName('artikel').asString := '%Test%';
Query.Open;

marabu 14. Apr 2006 20:33

Re: Paradox Tabelle durchsuchen.
 
Hallo Tobi,

Markus hat in seinem ersten Beitrag den wertvollsten Rat gegeben. Auch wenn die BDE keine vollwertige relationale Datenbank darstellt, so gewinnst du doch durch den Einsatz von TQuery in Verbindung mit LocalSQL jede Menge Flexibilität. Auch wenn du schreibst, dass du dich mit Queries nicht auskennst, rate auch ich dir zur Auseinandersetzung mit SQL. Betrachte es einfach als zukunftssichere Investition. Gerade bei großen Datenmengen vereinfacht der mengentheoretische Ansatz die Programmlogik ungemein. Und da ich mir gut vorstellen kann, dass dein Projekt bei ernsthaftem Betreiben kurz- bis mittelfristig auf eine Client-Server-Architektur umgestellt werden wird, bist du mit LocalSQL und TQuery schon nahe dran. Alles andere (Filter, Ranges, etc,) führt momentan nur weg von der Ideallinie.

Freundliche Grüße vom marabu

EDatabaseError 15. Apr 2006 08:15

Re: Paradox Tabelle durchsuchen.
 
Zitat:

Zitat von marabu
Hallo Tobi,

Markus hat in seinem ersten Beitrag den wertvollsten Rat gegeben. Auch wenn die BDE keine vollwertige relationale Datenbank darstellt, so gewinnst du doch durch den Einsatz von TQuery in Verbindung mit LocalSQL jede Menge Flexibilität. Auch wenn du schreibst, dass du dich mit Queries nicht auskennst, rate auch ich dir zur Auseinandersetzung mit SQL. Betrachte es einfach als zukunftssichere Investition. Gerade bei großen Datenmengen vereinfacht der mengentheoretische Ansatz die Programmlogik ungemein. Und da ich mir gut vorstellen kann, dass dein Projekt bei ernsthaftem Betreiben kurz- bis mittelfristig auf eine Client-Server-Architektur umgestellt werden wird, bist du mit LocalSQL und TQuery schon nahe dran. Alles andere (Filter, Ranges, etc,) führt momentan nur weg von der Ideallinie.

Freundliche Grüße vom marabu

OK. Ich hab nur ein wenig erfahrung mit MySQL u. PHP. Gibt es irgentwo ein Tutorial wo das LocalSQL erklärt wird?

Mfg
Tobi

mkinzler 15. Apr 2006 09:51

Re: Paradox Tabelle durchsuchen.
 
Also, wenn du etwas Erfahrung in mysql hast, dann kannst du ja die Grundlagen von sql. Dann dürfte das Problem eigentlich schnell gelöst sein. LocalSQL ist nur ein Feaure der BDE, welches es dir ermöglicht SQL-Befehle auf Datenbanken anzuwenden, die das von sich aus nicht unterstützen (dbase, Paradox).

marabu 15. Apr 2006 10:16

Re: Paradox Tabelle durchsuchen.
 
Eigentlich ist ein Tutorium zu LocalSQL auch entbehrlich. Die Online-Hilfe LOCALSQL.HLP im Installationsverzeichnis der BDE erklärt die (zahlreichen) Einschränkungen und (spärlichen) Erweiterungen zum SQL Standard ganz gut.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:34 Uhr.
Seite 1 von 2  1 2      

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