PDA

Vollständige Version anzeigen : Geöffnete Abfragen aus dem Speicher entfernen.


Rabec
28.06.2001, 08:39
Hallo ACCESS-Freunde,

ich versuche schon seit 3 Tagen einen Fehler zu korregieren:
Meine Textfelder mit DomAnzahl-Anweisung öffnen offenbar beim Aktualiseiren viele Abfragen, die danach nicht geschlossen werden.
Weiss jemand, wie ich die nicht benutzten geöffneten Abfragen aus dem Speicher wieder entfernen kann? Ich denke, dass sie erst nach einiger Zeit automatisch von ACCESS entfernt werden.
Wegen grosser Anzahl an Textfeldern kommt aber nach einiger Zeit eine Fehlermeldung. Und wenn ich versuche, die Abfrage manuell zu öffnen bringt ACCESS folgende Fehlermeldung: Can´t open any more Databases.

Ich würde mich über jeden Ratschlag freuen.

MfG Denis

A.S.
28.06.2001, 08:56
Hallo Denis,

warum sind denn die vielen Domain-Funktionen notwendig? Währe es nicht ratsamer die entsrpechenden Daten im vorhinein in einer Tabelle zu generieren und diese zu nutzen?

------------------
HTH

Arno

Rabec
28.06.2001, 09:26
Hallo Arno,
ich könnte die Anzahl natürlich auch anders berechnen lassen. Alle anderen Möglichkeiten sind aber viel langsamer.
Ich frage mich nur, wieso DomAnzahl solche Fehler bringt. Es gibt 6 Textfelder mit Anzahl-Berechnung. Sie sind alle wichtig und laufen einigermaßen schnell. Habe ich vielleicht die Formel falsch erstellt? So sieht eine meiner Formeln aus:
=Wenn([Formulare]![hfrm_alle]![Kombifeld]>1;DomAnzahl("[Fahrzeuge_ID]";"abfr_alle";"[HauptGat_Nr] = " & [Formulare]![hfrm_alle]![Kombifeld]))

Die Strukturierung sollte eigentlich stimmen. Ich muss die Werte aus der Abfrage entnehmen, weil diese durch einen Suchformular gefiltert wird. Auf die Abfragen von den Formularen kann man ja direkt nicht zugreifen, oder etwa doch?
Wie hast du das mit den Tabellen gemeint? Habe ich da vielleicht etwas falsch verstanden?

Danke für deine schnelle Antwort.

MfG Denis

Birgit Dannenberg
28.06.2001, 09:35
Hallo Denis,

ich habe erst kürzlich einen Bericht (Statistik) erstellt, in dem ich eine Vielzahl von Dom-Funktionen eingesetzt habe, was überraschend problemlos und relativ fix läuft.

Bist Du sicher, daß Du nicht (an anderer Stelle) selbst den Fehler verursachst? Arbeitest Du irgendwo mit DB-Objekten, die Du nicht wieder schließt?

Gruss Birgit

Rabec
28.06.2001, 10:15
Hallo Birgit,
danke für deine Aufmunterung, aber...
alle DB-Objecte werden standardmäßig geschlossen.
Ich schließe nur Variablen mit dem Typ:
Object, Database und Recordset.
Habe ich da vielleicht noch etwas vergessen?
Meine Vorgehensweise beim schliessen:
Set obj = Nothing
rs.close
Set db = Nothing
Mache ich da vielleicht etwas falsch?
Wenn ich alle Textfelder mit der DomAnzahl-Berechnung lösche, kommt keine Fehlermeldung mehr.
Hast du da einen Fehler gefunden, oder hast du einen anderen Vorschlag?
Ich würde mich über jeden Tipp freuen.
MfG Denis

Birgit Dannenberg
28.06.2001, 10:19
Was meinst Du mit 'standardmäßig', wann machst Du das?

Aber davon ab, wenn ohne die Textfelder alles klappt, ist das schon seeehr verdächtig! ;)

Welche Access-Version setzt Du denn eigentlich ein?

Birgit

Rabec
28.06.2001, 10:39
Hallo Birgit,
ich benutze A97.
Die DB-Objecte schliesse ich immer am Schluss od. nach Exit-Befehlen.
Noch etwas: Man kann nach der Fehlermeldung alle Abfragen ausser "abfr_alle" öffnen und benutzen.
Hast du vielleicht noch einen Rat für mich?

MfG Denis

Birgit Dannenberg
28.06.2001, 10:48
Also, ich schließe meine Objekte, welche auch immer ich verwende, stets nachdem sie ihren Zweck - im aktuellen Kontekt (Modul bzw. Klassenmodul) - erfüllt haben.

Mir scheint aber nun Deine Abfrage (abfr_alle) evtl. 'verdächtig' zu sein.
Kannst Du die mal posten?

Birgit

Rabec
28.06.2001, 11:22
Hallo Birgit,
hier ist meine Abfrage:
SELECT DISTINCTROW Haupttabelle.*, Abgegeben_an.*, BaBr.*, Ist_NL_ZNL_Bh_BstName.*, Ist_RB_GmbH_BstName.*, Lfd_Nr_Bez.*, NebenGat.*, fuer_Nachruestung.*, HauptGat.*
FROM (HauptGat INNER JOIN (NebenGat INNER JOIN (Lfd_Nr_Bez INNER JOIN (Ist_RB_GmbH_BstName INNER JOIN (Ist_NL_ZNL_Bh_BstName INNER JOIN (BaBr INNER JOIN (Abgegeben_an INNER JOIN Haupttabelle ON Abgegeben_an.Abgegeben_an_ID = Haupttabelle.Abgegeben_an_Nr) ON BaBr.BaBr_ID = Haupttabelle.BaBr_Nr) ON Ist_NL_ZNL_Bh_BstName.Ist_NL_ZNL_Bh_BstName_ID = Haupttabelle.Ist_NL_ZNL_Bh_BstName_Nr) ON Ist_RB_GmbH_BstName.Ist_RB_GmbH_BstName_ID = Haupttabelle.Ist_RB_GmbH_BstName_Nr) ON Lfd_Nr_Bez.Lfd_Nr_ID = Haupttabelle.Lfd_Nr_Nr) ON NebenGat.NebenGat_ID = Haupttabelle.NebenGat_Nr) ON HauptGat.HauptGat_ID = Haupttabelle.HauptGat_Nr) INNER JOIN fuer_Nachruestung ON Haupttabelle.fuer_Nachruestung_Inf_Nr = fuer_Nachruestung.fuer_Nachruestung_ID
WHERE geloescht = FALSE
ORDER BY Ist_RB_GmbH_BstName.Ist_RB_GmbH_BstName, Haupttabelle.Fahrzeuge;

Ich hoffe, das du damit was anfangen kannst.

MfG Denis

Birgit Dannenberg
28.06.2001, 11:40
Das sieht allerdings ziemlich 'wuchtig' aus. Du verknüpfst 9 komplette Tabellen miteinander - wieviel Felder kriegst Du denn dann zurück??

Und das Feld 'gelöscht' ist ohne Tabellenbezug - kommt das nur einmal vor??

Meinst Du nicht, das sich das vereinfachen ließe??? ;) Ist ein Mords-Overhead für eine 'simple' Anzahlberechnung...

Gruss Birgit

A.S.
28.06.2001, 12:03
Hallo Denis,

wenn ich mal so dreist bin und Deine Angaben hochrechne

6 DLookUps x 9 Tabllen = 45 Tabellen

Dann hast Du 45 Tabellen gleichzeitig offen. Ob und wie häufig Acc den DLookUp erneut ausführt bzw. aktualisiert, weiss ich nicht. Im Hintergrund hast Du aber noch, wenn ich Dich richtig verstehe, ein Filterformular offen, auf dem die Abfrage basiert. Wenn das auch noch auf allen 9 Tabellen basiert, hast Du locker unter umständen 54 Tabellen gleichzeitig offen.

Das ist für meinen Geschmack wirklich etwas happig, wie Birgit auch schon bemerkte ;)

Kannst Du nicht auf Basis Deiner Abfrage eine Tabellenerstellungsabfrage erstellen, welche nur die Werte enthält, die Du im Formular darstellen mußt?

Dürfte den Speicherbedarf doch "etwas" nach unten schrauben.....

Gruß

Arno

Rabec
28.06.2001, 12:11
Hallo Birgit,
ich benutze diese Abfrage für das ganze Hauptformular.
Sie wird mit Suchformular gefiltert (WHERE-Anweisung).
Deshalb muss ich diese Abfrage auch in den Textfeldern für die Ausrechnung der Anzahl benutzen (damit nur gefilterte Datensätze für die Ausrechnung genommen werden).
Es lässt sich meiner Meinung nach nicht mehr vereinfachen.
Das Feld geloescht steht in der Haupttabelle. Ich habe in der WHERE-Anweisung den Bezug nicht geschrieben (man kann es auch mit Haupttabelle.geloescht ausdrücken).
Es sind insgesamt etwa 20 Felder, die für Eingabe in verschiedenen Text- und Kombinationsfeldern benutzt werden.

Ich denke nicht, dass wegen der Abfrage die Fehlermeldung kommt, denn sie kommt ja erst nach einiger Zeit.

MfG Denis

Birgit Dannenberg
28.06.2001, 12:26
Ich denke doch, gerade weil der Fehler erst nach einer Weile kommt, wie Arno ja schon abzuleiten versucht hat.

20 Datenfelder aus der Kombination von neun Tabellen - das wundert mich dann aber doch etwas... Du kriegst doch schon mindestens 19 durch die Verknüpfungen (je 2 Key-Felder + 'gelöscht').

Also ehrlich, ich meine Du solltest das Ganze noch einmal überdenken.

Nichts für ungut, oder wie sagt man?
Gruss Birgit

Rabec
28.06.2001, 12:37
Hallo Arno und Birgit,
danke für eure Vorschläge. Ich habe noch eine Abfrage erstellt, die nur die benötigten Spalten für die Textfelder enthält. Dies hat die Zeit bis zum Auftreten des Fehlers etwas verzögert. Gibt es da vielleicht einen Höchstwert, den man nicht überschreiten darf? Ich versuche die Datenbank noch etwas zu optimieren. Wird dieser Fehler dann immer noch nach etwas längerer Zeit auftreten od. muss ich nach einer neuen Lösung suchen?
Danke nochmals für eure Mühe.
MfG Denis

Birgit Dannenberg
28.06.2001, 12:49
Denis,
wenn Du willst kannst Du mir die mdb (bzw. einen Auszug daraus) mal zuschicken, damit ich mir einen besseren Ein- und Überblick verschaffen kann.

Ciao bis morgen, Birgit

Rabec
28.06.2001, 14:41
Hallo Birgit,
ich habe ENDLICH die Problemlösung gefunden!!!
Nach der Aktualisierung der Abfrage "abfr_alle" habe ich das Formular mit berechnenden Textfeldern durch die Änderung an dem Recordset aktualisiert. (hfrm.Recordset = "abfr_alle")
Doch wie es aussieht, muss man das Formular zuerst schliessen und dann wieder öffnen, damit die zugrundeliegende Abfrage nicht 1000 mal geöffnet wird.
Ich benutze dazu die Befehle docmd.close und docmd.openform().
Kennst du vielleicht noch eine andere Möglichkeit, um das Formular zu aktualisieren? Der Requery-Befehl funktioniert leider nicht.
Danke im Vorraus.
MfG Denis

Birgit Dannenberg
29.06.2001, 09:03
Hallo Denis,

das habe ich nicht verstanden.
Was hast Du an der Abfrage 'aktualisiert'?
Ich dachte das Form ist an die Abfrage gebunden??

Wenn Du die RecordSource (nicht recordset!) änderst, wird automatisch aktualisiert, es sei denn die Einstellung war vorher schon identisch.

Mehr fällt mir dazu jetzt nicht ein. Mußt Du wohl noch etwas genauer werden.

Gruss Birgit