Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: micmen am Oktober 19, 2018, 18:28:07

Titel: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: micmen am Oktober 19, 2018, 18:28:07
Hi,
ich habe ein seltsames und für mich völlig neues Problem:

Wenn ich so etwas habe und im angedeuteten Code-Teil oft auf die beiden DB-Variablen zugreife, dann brauchen die beiden Close-Anweisungen unten je 2 Minuten. Insgesamt also bleibt Access ca. 4 Minuten lang stehen, in denen es so aussieht, als wäre es abgestürzt und würde gar nicht mehr zurückkommen.

Dim dbQuelle As Database, dbZiel As Database
Set dbQuelle = DBEngine(0).OpenDatabase(DbPfad1)
Set dbZiel = DBEngine(0).OpenDatabase(DbPfad2)
...
code
...
dbQuelle.Close
dbZiel.Close
Set dbQuelle = Nothing
Set dbZiel = Nothing

Im Code-Teil werden die Tabellen-Objekte durchlaufen, um die Tabellen der Quell-DB in der Ziel-DB anzulegen (leer, nur die Entwürfe quasi), exakt nach der Vorgabe, so wie die Funktion hier bei Microsoft (https://answers.microsoft.com/en-us/msoffice/forum/msoffice_access-mso_other-mso_2010/function-copytabledef-in-access-2010/619cf03f-f4cc-4bff-b577-193ef58d9be7?messageId=054f5d08-361f-45b2-b356-8dd41858dcd0) beschrieben ist (das ist jetzt ein Fehlerbehandlungs-Artikel, die Adresse des nackten Codes habe ich jetzt nicht, aber es ist der dort beschriebene MS-Code).
Wenn ich in meinen Code-Teil Bedingungen setze, die dafür sorgen, daß nur auf eine Tabelle zugegriffen wird, besteht das Problem nicht, die Close-Befehle werden dann ohne erkennbare Bearbeitungszeit abgearbeitet.

Also Grund für das Problem ist, daß so oft (ca. 40 Tabellen) auf die DB-Objekte zugegriffen wird.

Hätte da jemand einen Rat?

danke!
Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: Lachtaube am Oktober 19, 2018, 20:00:16
Hast Du Deine Datenbanken denn einmal exklusiv geöffnet?

   Set dbQuelle = OpenDatabase(DbPfad1, True)

PS:... und wie steht's mit Beziehungen zwischen Tabellen?
Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: Milvus am Oktober 19, 2018, 21:12:51
Eine Idee dazu:

Einige Datensätze in den 40 Tabellen befinden sich womöglich im Nutzerzugriff (edit)!

Was die Jet dann macht... sie will das ja sicherlich ordentlich machen. Und ob die dann schnallt, dass Du nur die Struktur willst?

Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: micmen am Oktober 20, 2018, 13:05:08
Danke für die Anregungen, ich prüfe das!
Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: Milvus am Oktober 23, 2018, 21:19:45
Ich habe mir den Code von deinem Link mal angeschaut.

Der ist ja ellenlang für einen simplen Sachverhalt.
Du willst nur die Struktur von Tabellen aus A kopieren in neue Tabellen gleicher Struktur in B?


Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: micmen am Oktober 24, 2018, 16:19:42
Hi,
ja, ist richtig, die Funktion dient ausschließlich dazu, eine Tabellenstruktur zu kopieren, also Tabellen 1:1 zu kopieren, ohne die Daten mitzunehmen. Ist doch aber ein Microsoft-Code, der da benutzt wird?

Und die Anregungen liefen ins Leere, beides nicht der Fall.

Und ich habe eine Lösung gefunden, die ich aber nicht verstehe und die mir auch nicht gefällt - aber sie funktioniert halt...
Und zwar bin ich einfach auf die Idee gekommen, die 4 Set-Befehle und die 2 Close-Befehle aus dem "Rahmen" raus und in den Code selbst zu ziehen. Jetzt werden die also alle 6 pro Tabelle einmal ausgeführt...
Das funktioniert dann ganz normal schnell, nach außen alles super jetzt.
Habe ich ja schon im Eröffnungspost geschrieben, daß das Problem nicht auftritt, wenn der Code nur für eine Tabelle ausgeführt wird.

Warum aber diese DB-Objekte ein "Close-Problem" bekommen, wenn man sie mehrfach für verschiedene Tabellen benutzt, verstehe ich nicht.
Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: Milvus am Oktober 24, 2018, 18:54:30
Also ich würde -  so weit ich das verstanden habe - die Quelldatenbanken erst mal vollständig kopieren, damit du an den produktiven Daten nichts zerhaust.

Dann würde ich diese für deine Operation benutzen.

Wenn Du nicht weißt, wie Du das machen sollst, lass lieber die Finger davon.

Titel: Re: db.Close benötigt 2 Minuten Arbeitszeit
Beitrag von: micmen am Oktober 26, 2018, 16:26:58
Zitat von: Milvus am Oktober 24, 2018, 18:54:30
Also ich würde -  so weit ich das verstanden habe - die Quelldatenbanken erst mal vollständig kopieren, damit du an den produktiven Daten nichts zerhaust.
Dann würde ich diese für deine Operation benutzen.
Wenn Du nicht weißt, wie Du das machen sollst, lass lieber die Finger davon.
Danke für den Tipp!  ;D 
Die Funktionalität wird dort seit über 10 Jahren verwendet und da wurde nie was zerhauen. Es wurde lediglich die Art der Umsetzung mehrfach verändert, die alten Methoden hatten Nachteile. Die Funktionalitäten wurden immer und werden auch jetzt noch von den Anwendern auf Knopfdruck aufgerufen. Und es gibt nur eine Quelldatenbank und die Zieldatenbank ist eine neu erstellte, leere, die eben mit einem Teil der Tabellen der Quelldatenbank gefüllt wird, die zuerst leer sind und hinterher bestimmte, gezielt ausgewählte Datensätze bekommen (nicht alle Datensätze der Quelldatenbank).
Also erstens käme das mit dem Finger davon lassen mehr als 10 Jahre zu spät  ;) und zweitens hatte ich ja, wie geschrieben, bereits eine Lösung gefunden für das Problem, daß es minutenlang dauert, bis die beiden DB-Objekte geschlossen sind.

Mit der Funktionalität selbst, einen Teil der Daten in neu angelegte Tabellen einer separaten Datenbankdatei zu kopieren, gab es ja gar keine Schwierigkeiten.