Autor Beitrag
SnergleTheDwarf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 23.07.02 15:30 
für ein kleines projekt müssen listen erstellt werden ... daher datensätze aus db filtern !!!

hab versucht SetRangeStart und Co. zu nutzen ... habe aber nichts gefunden, wie dies mit platzhaltern funktioniert.

als nächstes habe die filter-property der ttable verwendet ...
aber mir ist es nicht gelungen verschiedene Datentypen im Filter zu kombinieren ...

mein letzter versuch war dann TQuery ... hat auch alles gefunzt ... nur mußte ich feststellen, daß zur laufzeit kleine dateien erstellt werden (im progpfad) und da die queryy ziemlich oft durchgeführt wird ist die anzahl so groß, daß ich mit der anzahl (>150) erlaubter offener Dateien probleme kriege, leider kann ich die files auch nicht löschen ... da diese erst zur laufzeit-ende des progs freigegeben werden ...

hat jemand ne IDEE was ich da machen kann ?
SnergleTheDwarf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 23.07.02 16:19 
Titel: als Nachtrag ...
- mir würde es helfen, wenn ich verhindern könnte, da query die vielen dateien erstellt

- oder mit würde es helfen wenn rausbekommen könnte wie man mit setrangestsart und setrangeend mit platzhaltern arbeitet
vorallem wenn dabei mehrere felder in grenzen gesetzt werden
(keyexclusive hab ich probiert führt aber nicht zu dem ergebnis, oder ich mache was falsch)

- oder es würde helfen, wenn ich mit table1.filter es hinbekommen würde die folgende konstellation aufzubauen
(Feld1 = 'String') AND (Feld2 < Datum2) AND (Feld2 > Datum1)
die antwort die ich ständig bekomme ist: "die Operator ist auf diese Operanden nicht anwendbar" (so oder so ähnlich)

Wenn jemandem dazu was einfallen sollte !!! Herr im Himmel ... naja die Füsse wird ich nicht küssen ... , aber ich wäre DANKEBAR !!! ;-)
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 23.07.02 17:23 
Hallo,

mit den kleinen Dateien kann ich dir nicht helfen, da müssen die BDE Spezialisten ran. In den Allermeisten Fällen würde ich Querys einer Filteranweisung vorziehen.
Dennoch möchte ich dir hier eine Weitere Alternative des tTable Objektes vorstellen. Wenn du ein Problem hast, das du mit einem Einfacen Filter nicht lösen Kannst, dann steht dir noch das Ereignis OnFilterRecord verwenden. Dieses wird bei für jeden Datensatz ausgeführt wenn ein Filter gesetzt ist und erlaubt dir weitere Ausschlüsse.
In deinem Fall musst du z.B. den Filter auf Feld1='String' setzen und in dem Ereignis dan folgendes Implementieren:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Table1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  IF (Dataset.FieldByName.AsDateTime > Datum1) AND (Dataset.FieldByName.AsDateTime < Datum2) THEN
    Accept := TRUE
  ELSE
    Accept := FALSE;
end;


Gruß
Klabautermann
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Di 23.07.02 17:34 
Also dein Fehler beim TTable ist, das bei deiner Angabe "Feld > Datum" Datum als Feld und nicht als Variable, Wert gewertet wird. Das kannst du dadurch umgehen, dass du "...Feld > ''' + Datum + ''' ..." schreibst. Komplette Demo dazu findest du hier:www.faqsen.de/find.j...524850494952555254;2

Jetzt zu deinen 150 Dateien.
Die Query legt lokale Dateien an. Normalerweise im PrivateDir. Ist keins angegeben, in deinem Application-Dir. Die bleiben auch erhalten, wenn es deine Anwendung "raushaut".
Aber die sollten eigentlich nicht schmerzen.
Welche Probleme hast du damit genau? Wie heissen diese Dateien?

_________________
Keine Signatur ...
SnergleTheDwarf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 24.07.02 13:36 
Titel: also folgendes Problem tritt auf ...
Danke erstmal für die Hilfe habe es mit dem Filter hinbekommen ...

Achso ich arbeite mit dbaseIV - Files ... (hatte ich bisher vergessen zu erwähnen)

zur Query-Sache ist zu sagen, daß folgende Dateien erstellt werden

_qsql000.dbf
_qsql274.dbf
...
...
...

Nach jeder Abfrage unterschiedlich ...
Nach einer Vielzahl von Abfragen kommt dann diese Meldung:
"Merkmal nicht verfügbar".

Nach Beenden der Anwendung sind mal alle Temp-Dateien weg oder nur eine Anzahl. Was die Bedingung dafür ist ... konnte ich nicht ermitteln ...
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Mi 24.07.02 13:45 
Diese Dateien sind temp. Dateien.
Wird deine Anwendung ordentlich beendet, und auch die Abfrage nicht abgebrochen, sind dieses anschliessend wieder weg.

Die Meldung "Merkmal nicht verfügbar" hat damit nichts zu tun.
Das wird irgend ein Fehler im Source sein.

_________________
Keine Signatur ...
SnergleTheDwarf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 24.07.02 15:09 
Titel: ich glaub da liegst du etwas falsch ...
ich hab mal etwas mit den BDE Einstellungen rumgespielt -> MaxFileHandles in der Registry ... und wie ich es vermutet hatte, hat die
maximale anzahl einen einfluß darauf, wieviele Abfragen ich ausführen kann, bevor die Meldung kommt ...

nun muß es aber nicht unbedingt an der BDE liegen, es kann auch ein Fehler von Delphi sein ... ich nutze derzeit noch delphi 4.0 ...
es ist auch so, das nicht alle tmp-files wieder gelöscht werden, manchmal beleiben einfach welche über ... aber das wäre nicht so schlimm , da könnte man auch manuell aufräumen ...

Nun ist es aber leider so, daß ich die filehandles nicht beliebig hochsetzen, da ich ja nicht weiß wie oft ich die abfrage durchführen muß ... bzw. sich kein entsprechendes verhältnis errechnen läßt ...

bei maxf = 200 werden um die 196 files erstellt (bis der fehler auftritt)
bei maxf = 100 werden um die 98 files erstellt ( --- " ---)
bei maxf = 400 werden um die 300 files erstellt ( --- " ---)

trotzdem danke für die bisherigen ideen ..
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Mi 24.07.02 20:01 
Genau diese Einstellung ist dafür verantwortlich, wieviele Datenbanken du parallel öffnen kannst.
Aus diesem Grunde meine ich ja auch, dass da ein Fehler im Source liegt.
Wer muss schon 150 DBs parallel öffnen. Wenn du es nacheinander machst, sollte es keine Probleme geben.

_________________
Keine Signatur ...
SnergleTheDwarf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 25.07.02 10:37 
Titel: Dann schau doch mal bitte in den quellcode ...
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
  var
    dbname : String;
begin
  dbname := 'E:\ARCHIV\AUF200.DBF';
  with Query1 do
    begin

      SQL.Clear;
      SQL.Add('SELECT * FROM "' + dbname + '"');
      SQL.Add('WHERE (ADATUM > :VON) AND');
      SQL.Add('      (ADATUM < :BIS) AND');
      SQL.Add('      (FIRMA = :HANDW)');
      SQL.Add('ORDER BY FIRMA, OBJEKT');

      Params[0].AsDate := StrToDate('01.06.2002');
      Params[1].AsDate := StrToDate('30.06.2002');
      Params[2].AsString := 'LEHMANN';

      ExecSQL;
      Open;
    end;
end;

und sag mir BITTE wo der fehler liegen könnte ... der einfachheit halber feste daten für die query aber sinn ist denk ich klar ... und nun wird diese Prozedur so oft ausgeführt wie notwendig ...
wwerner
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 185



BeitragVerfasst: Do 25.07.02 10:54 
execSQL ist zu viel Wird nur bei Instert update... gebraucht bei select nur open benutzen

_________________
Gruß

Wolfgang

----------
zu hause ist es doch am schönsten
Steffer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 299



BeitragVerfasst: Do 25.07.02 10:57 
Das machst du so der Reihe nach bei mehreren Datenbanken?
Dann solltest du zuerst auf Active prüfen.
Probier es mal so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Button1Click(Sender: TObject); 
  var 
    dbname : String; 
begin 
  dbname := 'E:\ARCHIV\AUF200.DBF'; 
  with Query1 do 
    begin 
      if Active//neu
      then Close;//neu
      SQL.Clear; 
      SQL.Add('SELECT * FROM "' + dbname + '"'); 
      SQL.Add('WHERE (ADATUM > :VON) AND'); 
      SQL.Add('      (ADATUM < :BIS) AND'); 
      SQL.Add('      (FIRMA = :HANDW)'); 
      SQL.Add('ORDER BY FIRMA, OBJEKT'); 

      Params[0].AsDate := StrToDate('01.06.2002'); 
      Params[1].AsDate := StrToDate('30.06.2002'); 
      Params[2].AsString := 'LEHMANN'; 

//      ExecSQL;  Das raus...
      Open; 
    end; 
end;


P.S.
Die Variable dbName kannst du dir auch schenken.
Auch kannst du dir den Pfad zur DB schenken, wenn du einen Alias verwendest. Ist im Netz recht vorteilhaft.

_________________
Keine Signatur ...
SnergleTheDwarf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 25.07.02 10:58 
Titel: prima problem gelöst ... DANKE EUCH ALLEN
k.T.

mfg SnergleTheDwarf ...

ps: hoffentlich kann ich Euch auch mal behilflich sein ... ;-)