Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Eine weitere Access-Datei öffnen wenn...

Begonnen von Torsten., Februar 22, 2018, 09:13:39

⏪ vorheriges - nächstes ⏩

Torsten.

Hallo zusammen,
folgende Situation:
Auf dem Rechner habe ich eine Access-Datei (DB1) geöffnet in der per Anfügeabfrage in Verbindung mit einer Funktion Daten generiert werden.
Dieser Vorgang dauert tlw. bis zu 36 Std.
Mein Problem ist, dass ich währendessen keine weitere Access-Datei (DB2, DB3...) öffnen kann,
praktisch ist Access in der Zeit nicht nutzbar.
Zu öffnen versuche ich über den Explorer und dann die db2.accdb zu klicken - nichts passiert.
Gibt es eine Möglichkeit irgendwie weitere Dateien zu öffnen?

Hat jemand eine Idee oder geht das techn. garnicht.

Gruß Torsten.

DF6GL

Hallo,


36 Std??

Was für einen Rechner hast Du denn?    ;)

Ernsthaft:  Ich würde mal an der Performance der Datengenerierung arbeiten und die Indizierungsverhältnisse in den beteiligten Tabellen prüfen.

Zeige mal die Prozedur und den SQL-String der Anfügeabfrage.


Eine andere DB kann vermutlich mit einer weiteren Access-Instanz geöffnet werden. D. h.,  die andere DB mit  Doppelklick darauf öffnen und nicht die "blockierte" Instanz zum Öffnen benutzen.




Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Torsten.

Moin Franz,
neue Instanz hat funktioniert.

Das mit dem Zeitfaktor sehe ich auch als ein Problem, der Rechner ist ok.
Ich gehe davon aus, dass es an der Menge der Datensätze liegt - um die 800Tsd.

Gruß Torsten

MzKlMu

Hallo,
Zitatum die 800Tsd.
Bei korrektem, normalisiertem Aufbau der Datenbank mit sinnvollen Indizierungen sind 800Tsd kein Problem.
Auch dann sollte die Verarbeitung im Sekundenbereich liegen.

Was wird denn in der Abfrage mit Funktionen gemacht ?
Gruß Klaus

ebs17

ZitatIch gehe davon aus, dass es an der Menge der Datensätze liegt
Ja. Wenn es nur 30 Datensätze wären, würde es sicher anders aussehen, da überspielt die Kraft der Maschine jede eigenverursachte Ungeschicklichkeit.
Zur Performance bei richtigen Datenmengen muss dann etwas Entwicklerintelligenz hinzugefügt werden.

36 Stunden sind unakzeptabel. Womöglich läuft das nicht einmal im Rahmen einer Transaktion ab, was dann bei einem unerwarteten Abbruch die Integrität der Daten in Frage stellt.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Hallo,
Vermutlich werden die DS einzeln angefügt, und da werden nach jedem DS
die Indices neu einsortiert. Das fängt dann nach ein paar 10k DS an immer
langsamer zu werden. Und wenn's dann noch mehrere Indices gibt, - gute Nacht.  ;)
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Torsten.

@Beaker
Ja gut möglich, was ich leider nicht beurteilen kann...

Ich habe hier nochmal meine Demo_db angehängt, da ist Struktur auf wenige Testdaten runtergebrochen.
In der Tabelle "tbl" sind in echt die ca. 840Tsd DS enthalten.

ebs17

#7
Ja, die gute alte SQLListe: Sie tut, was sie soll, aber auf Performance ist sie nicht getrimmt. Sie enthält systematische Fehler (Neuinstanzierung CurrentDb pro Aufruf, Textzusammensetzung per VBA), die sich in benötigte Zeit umsetzen und bei genügender Wiederholung dann zeitlich anstrengend sind.

Alternative:
Public Function ADOConcatColumn(ByVal strSQL As String, _
                                Optional ByVal strSeparator As String = ", ") _
                                As Variant

   Const adOpenForwardOnly = 0
   Const adCmdText = 1
   Const adLockReadOnly = 1
   Const adUseClient = 3


   Static rs As Object   'ADODB.Recordset nur 1x erstellen

   On Error GoTo x

   If rs Is Nothing Then
      Set rs = CreateObject("ADODB.Recordset")
      rs.ActiveConnection = CurrentProject.Connection
      rs.CursorLocation = adUseClient
   End If

   rs.Open strSQL, , adOpenForwardOnly, adLockReadOnly, adCmdText

   If Not (rs.EOF And rs.BOF) Then
      ADOConcatColumn = rs.GetString(, , , strSeparator)
      ADOConcatColumn = Left$(ADOConcatColumn, Len(ADOConcatColumn) - Len(strSeparator))
   End If

   rs.Close
   Exit Function

x:
   ADOConcatColumn = CVErr(6001)
End Function


Die Abfrage dann:
SELECT DISTINCT
   T.gruppe,
   ADOConcatColumn("SELECT beschr_wert FROM tbl WHERE gruppe = '" & T.gruppe & "' ORDER BY sortnr", ";") AS liste
FROM
   tbl AS T


Zusätzlich sollte auf sortnr ein Index gesetzt werden.


// Nachtrag:
Ich bin mir nicht sicher, ob in der gezeigten Abfrage zuerst gruppiert wird und erst danach mit der verringerten Zeilenanzahl die Textzusammensetzung erfolgt, oder ob erst Textzusammensetzung und dann Gruppierung erfolgt. Der erste Fall wäre zu bevorzugen, und sicherheitshalber könnte man die Abfrage  so formulieren:
SELECT
   T.gruppe,
   ADOConcatColumn("SELECT beschr_wert FROM tbl WHERE gruppe = '" & T.gruppe & "' ORDER BY sortnr", ";") AS liste
FROM
   (
      SELECT DISTINCT
         gruppe
      FROM
         tbl
   ) AS T

Mit freundlichem Glück Auf!

Eberhard

Torsten.

Hallo Eberhard,
ich habe testweise 160Tsd DS in die Tabelle "tbl" importiert und Feld "sortnr" indiziert.
Habe soeben nach 2 Std. abgebrochen, da die Anzeige unten rechts unter "Abfrage ausführen" bei ca. 1/5 Stand.
Gefühlt ist es schneller als mit dem alten Code, aber hast Du da noch einen Ansatz wie es schneller geht?

Gruß Torsten

ebs17

Das Arbeiten an einer Lösung ist doch erst der dritte Schritt.
Vorher sollte man einen Überblick haben,
- warum das stattfindet,
- wo die Daten herkommen,
- wo (welches Backend) das stattfindet,
- wie oft das stattfindet (über alle 800k Datensätze),
- wieviel Beschreibungen maximal zu verketten wären
?

Ein Weg leitet sich von Ausgangssituation und eigentlichem Ziel ab, also nicht zwingend von einem Weg, den man gerade kennt.
Mit freundlichem Glück Auf!

Eberhard

Torsten.

Gut, wie kann ich Dir den Überblick geben?

Beaker s.a.

Manchen muss man tatsächlich manchmal erst die deutsche Sprache verständlich machen
Zitat- warum das stattfindet,  ??
- wo die Daten herkommen, ??
- wo (welches Backend) das stattfindet, ??
- wie oft das stattfindet (über alle 800k Datensätze), ??
- wieviel Beschreibungen maximal zu verketten wären ??
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Torsten.

Hallo Eberhard,
kurze Zwischeninfo:
Dein "Nachtragscode"
SELECT
   T.gruppe,
   ADOConcatColumn("SELECT beschr_wert FROM tbl WHERE gruppe = '" & T.gruppe & "' ORDER BY sortnr", ";") AS liste
FROM
   (
      SELECT DISTINCT
         gruppe
      FROM
         tbl
   ) AS T


ist es. Da werden die Testdaten (160Tsd) innerhalb 1 Std. generiert.
Jetzt muß ich sehen das ich weitere Daten der Tabelle in die Zieltabelle mit übergeben bekomme.
Da werde ich sicherlich noch Fragen haben.
Bis hierhin schonmalvielen Dank für Deine Hilfe.

Gruß Torsten.

Torsten.

Ich habe die Demo-DB aktualisiert.
Darin ist zu sehen, dass wenn ich den "Nachtrag-Code" in der Abfrage verwende,
es keine Möglichkeit gibt weiteren Felder der Tabelle in die Abfrage zu ziehen um die Daten an die Zieltabelle zu übergeben.
Ich habe unter Funktion jeweils "Ausdruck" und "Gruppierung" ausprobiert.

Gibt es da eine Möglichkeit?

ebs17

Eine Abfrage kann nur die Felder verwenden, die im FROM-Teil (=> Unterabfrage) bereitgestellt werden:
ZitatINSERT INTO tblErgebnis ( gruppe, [-liste-so soll es werden], textfeld1 )
SELECT
   T.gruppe,
   ADOConcatColumn("SELECT beschr_wert FROM tbl WHERE gruppe = '" & T.gruppe & "' ORDER BY sortnr",";") AS liste, [textfeld1] AS test,
   T.textfeld1
FROM (SELECT DISTINCT gruppe, textfeld1 FROM tbl)  AS T;
Mit freundlichem Glück Auf!

Eberhard