AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Suche über mehrere Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

Suche über mehrere Tabellen

Ein Thema von BW19 · begonnen am 27. Jun 2007 · letzter Beitrag vom 28. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
BW19

Registriert seit: 14. Sep 2005
Ort: Bopfingen
14 Beiträge
 
Delphi 6 Professional
 
#1

Suche über mehrere Tabellen

  Alt 27. Jun 2007, 12:07
Datenbank: BDE /Paradox • Zugriff über: Query
Hallo

Ich habe folgendes Problem:
Bisher war es in meinem Projekt so das es eine Tabelle gab (Protokoll.db) aber da nach nich mal einem Jahr diese komplett voll war also das Programm streubte sich weiter in die Tabelle zuspeichern da "Datenspeicher voll" ist, so die Meldung.
Musste was neues her:
Nun wird jeden Monat eine Tabelle generiert die sich "Prot_6_2007" die 6 steht natürlich für den Monat und 2007 erklärt sich von alleine. nächsten Monat wird sie dann Prot_7_2007 usw.

Gleichzeitig soll aber das Suchen zwischen einem Bestimmten Zeitraum möglich sein. Der Zeitraum wird eingestellt mit einen DatetimepickerVon und DatetimepickerBis.

Ich hab mir schon soviel kopfzerbrechen darüber gemacht das ich überhaupt nicht weiter komm.
Aus älteren Programmen hab ich die einsicht wie es mit nur Jahren gemacht wurde.
Hier das Quellcodebsp
Delphi-Quellcode:
const
  cs_Protokoll = 'Pr';
  cs_ProtokollTrennzeichen = '_';
  cs_ProtokollAlt = 'glob';
  ci_UnterstesJahr = 1980;
var
  wYear,
  wMonth,
  wDay : Word;

  Present : TDateTime;
begin
  Present:= Now;
  // bei direketer Übergabe von "now" -> Gleitkommafehler
  DecodeDate(Present, wYear, wMonth, wDay);

    // --- begin -- Suche über mehrere Tabellen starten
      for iDateiSuchen := wYear downto ci_UnterstesJahr do
      begin
        {--- Suchen der Protokolle z.B.: Pr_1999 ... Pr_2000 ---}
        sDateiSuchen := cs_Protokoll + cs_ProtokollTrennzeichen + IntToStr(iDateiSuchen) + '.DB';

        if FileExists(PfadErweiternAllgemein(acDataDir_g, True) + sDateiSuchen) then
        begin
          if SQL.Count = 0 then
            SQL.Add('SELECT * FROM "' + sDateiSuchen + '"')
          else
          begin
            SQL.Add('UNION');
            SQL.Add('SELECT * FROM "' + sDateiSuchen + '"')
          end;
        end
        else
          Break;
      end;
Wobei dies ja nachfolziehbar ist. Nur muss sollt das ganze ja auch noch mit Monaten funktionieren und Ich komm einfach nicht drauf wie ich das am einfachsten mache das auch allen fehleingaben vom Bediener richtig behandelt werden...

Ich hatte mal so angefangen :
das ich den Zeitraum eingrenzen kann, wobei mich wDay überhaupt nicht interessiert.
Delphi-Quellcode:
          DecodeDate(DateTimePickerVon.Date, wYearVon, wMonthVon, wDayVon);
          DecodeDate(DateTimePickerBis.Date, wYearBis, wMonthBis, wDayBis);

          sTabNamebis := UpperCase(cs_ProtBuch + cs_ProtBuchTrennzeichen + IntToStr(wMonthBis) + cs_ProtBuchTrennzeichen + IntToStr(wYearBis) +'.DB');
Ich bin am verzweifeln, wie kann ich das am besten und einfachsten realisieren?

Es sollte halt so sein das Nach drücken des Suchen Buttons sich das Programm als erstes die entsprechenden Tabellen zusammen kopiert.

Gruss BW

[edit=sakura] "******HILFFFEEEE******" braucht hier fast jeder der postet... Mfg, sakura[/edit]
B. W.
  Mit Zitat antworten Zitat
BW19

Registriert seit: 14. Sep 2005
Ort: Bopfingen
14 Beiträge
 
Delphi 6 Professional
 
#2

Re: Suche über mehrere Tabellen mit Datetimepicker

  Alt 27. Jun 2007, 13:45
Will mir denn keiner helfen?

Oder ist etwas unklar?
Bitte sagen....
B. W.
  Mit Zitat antworten Zitat
Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Suche über mehrere Tabellen ******HILFFFEEEE******

  Alt 27. Jun 2007, 13:50
Pushen ist erst nach 24 Stunden erlaubt!

Es wird schon noch jemand antworten!

*Mecker* und das ******HILFFFEEEE****** muss ja auch net unbedingt sein
Richard Mahr
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Suche über mehrere Tabellen ******HILFFFEEEE******

  Alt 27. Jun 2007, 13:55
Schon mit einer UNION-Abfrage versucht?
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Suche über mehrere Tabellen ******HILFFFEEEE******

  Alt 27. Jun 2007, 14:03
Hallo,

du suchst bestimmt nach Extract

select datum from tab where extract(month from datum)=1
z.B. für Januar


Übrigens.
Bei dem "Tabelle ist voll" hast du bestimmt nicht das Internet
oder mich <-hier gefragt.

Paradox kann2 Mrd. Einträge in eine Datenbank packen,
dazu musst du allerdings die Blockgrösse der Tabelle auf 16384 (oder waren es 32767 ??)
setzen. Das geht glaube ich über DBD und umstrukturieren oder
ein Tool von Borland(Code Gear), was mir um Moment nicht einfällt
oder durch Neuanlegen der Tabelle mit genannter Blockgrösse und DataPump.

So was bei Paradox natürlich nicht fehlen darf ...
Wech damit
Kein normaler Mensch würde 2 Mrd. Einträge in ein Pdx-DB packen.


Zu deiner Abfrage würde ich erst mal alle vorhandenen Tabellen laden (GetTableNames)
entweder in einer StringList oder besser in eine eigene Klasse,
die schon den Monat decodiert hat und dann in den einzelnen Tabellen einzeln suchen,
die Ergebnisse wieder in eine eigene Klassestruktur.

Zum Schluss alles in eine normale StringList ausgeben.


Heiko
Heiko
  Mit Zitat antworten Zitat
BW19

Registriert seit: 14. Sep 2005
Ort: Bopfingen
14 Beiträge
 
Delphi 6 Professional
 
#6

Re: Suche über mehrere Tabellen

  Alt 27. Jun 2007, 14:35
Sorry.... ich machs ja nicht mehr


Zitat von mkinzler:
Schon mit einer UNION-Abfrage versucht?
Das es mit Union sein soll weis ich schon... ich hab viel mehr das problem das ich nich weis wie ich anfangen soll....
das ding auszuwerten... Wenn der Bediener eine Datumsauswahl trifft sagen wir vom 12.03.2006 bis 1.1.2007 dann wärem das ja 11 Tabellen... und dann die ganzen abfragen gibts die tabellen... das geht doch bestimmt in 2 geschachtelten schleifen oder?



Zitat von hoika:
Hallo,
So was bei Paradox natürlich nicht fehlen darf ...
Wech damit
Kein normaler Mensch würde 2 Mrd. Einträge in ein Pdx-DB packen.
Heiko
Das Liegt dann wohl eher an meinem Arbeitgeber

Zitat von hoika:
Hallo,
Zu deiner Abfrage würde ich erst mal alle vorhandenen Tabellen laden (GetTableNames)
entweder in einer StringList oder besser in eine eigene Klasse,
die schon den Monat decodiert hat und dann in den einzelnen Tabellen einzeln suchen,
die Ergebnisse wieder in eine eigene Klassestruktur.

Zum Schluss alles in eine normale StringList ausgeben.
Heiko
Mit stringlist hab ich schon probiert das is nich so das wahre.... Das mit den Klassen versteh ich ned Klassen sind auch ein blödes Thema 2.Lehrjahr nicht aufgepasst

Da waren sie wieder meine 3probleme

Aber danke für eure schnelle Antwort und sorry fürs "pushen" was das auch immer ist.... Und mein HILFFE titel.... Sorrrry
B. W.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Suche über mehrere Tabellen

  Alt 27. Jun 2007, 14:59
Hallo,


Probier erst mal aus, ob Paradox überhaupt Union kann



with Query do
begin
SQL.Clear;
SQL.Add('Select Prot_6_2007.Datum, Prot_6_2007.Name');
SQL.Add('From Prot_6_2007 ');
SQL.Add('Where ((Prot_6_2007>=:StartDate) And (Prot_6_2007<=:EndDate)) ');
SQL.Add('Union');
SQL.Add('Select Prot_7_2007.Datum, Prot_7_2007.Name');
SQL.Add('From Prot_7_2007 ');
SQL.Add('Where ((Prot_7_2007>=:StartDate) And (Prot_7_2007<=:EndDate)) ');

ParamByName('StartDate').AsDateTime := tdtStartDate; // vom Picker
ParamByName('EndDate').AsDateTime := tdtEndDate; // vom Picker
end;

Dann baue die Query dynamisch auf,
mein Prot_6_2007, Prot_7__2007 stehen z.B. in einer TStringlist,
über die du dann per for-Schleife die Query zusammenbaust.

Als Optimierung wäre halt zu überdenken, ob bestimmte Tabellen
überhaupt nicht benutzt werden müssen.
Wenn z.B. 1.3. bis 1.4 als Suche eingegeben werden,
macht es keinen Sinn, die 6er Tabelle hier zu verwenden.

Zu den Parametern.
Ich weiss jetzt nicht, ob der Parameter zweimal verwendet werden kann,
wenn nicht nimm halt StartDate0, StartDate1 usw.


Heiko
Heiko
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Suche über mehrere Tabellen

  Alt 27. Jun 2007, 16:56
Schon mal daran gedacht, eine Löschfunktion einzubauen, die alle Daten, die älter als ein bestimmtes Datum (oder älter als X Tage) sind, löscht?

Alle 6 Monate wird dann die komplette Datenbank in ein eigenes Verzeichnis kopiert und anschliessend die Löschfunktion angeworfen.

Wenn jemand unbedingt die alten Daten einsehen möchte, muss er eben die Datenbank umschalten.
Auf die Idee, die Daten auf unterschiedliche Tabellen gleicher Struktur zu verteilen, würde ich mich keinesfalls einlassen!!
Tust du es trotzdem, zerstörst du klare Programmstrukturen; Ärger und unstabiles Verhalten ist die Folge.
Andreas
  Mit Zitat antworten Zitat
BW19

Registriert seit: 14. Sep 2005
Ort: Bopfingen
14 Beiträge
 
Delphi 6 Professional
 
#9

Re: Suche über mehrere Tabellen

  Alt 28. Jun 2007, 08:37
Morgen zusammen

Danke für eure Hilfe hab eine Lösung gefunden!
B. W.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Suche über mehrere Tabellen

  Alt 28. Jun 2007, 08:39
Hallo,

na dann bedanke dich mal fein
durch ein paar Zeilen Code.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:21 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