Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Ralf26 am Januar 10, 2013, 12:27:26

Titel: VBA Code beim Start ausführen
Beitrag von: Ralf26 am Januar 10, 2013, 12:27:26
Hallo,

kurze Frage :
Ich habe eine Public Sub in einem Modul.
Die Prozedur soll beim Start der DB ausgeführt werden.
Weiß jemand wie das unter Access 2010 funktioniert.
Hier im Forum habe ich bei der Suche leider nichts gefunden. Im Netz gibt es die Lösung, dies mit einem Autoexec-Makro durchzuführen, aber
unter Access 2010 habe ich beim Makros nur das Ausführen einer Funktion, nicht jedoch das Ausführen einer Routine gefunden.

Vorab vielen Dank

Gruß,

Ralf26
Titel: Re: VBA Code beim Start ausführen
Beitrag von: bahasu am Januar 10, 2013, 13:04:51
Hi,

dann mach aus sub eine Funktion.

Harald
Titel: Re: VBA Code beim Start ausführen
Beitrag von: Ralf26 am Januar 10, 2013, 16:31:29
Hallo Harald,

ich bin leider keine große Leuchte in VBA, sowohl was Routinen als auch Funktionen betrifft.
Ich weiss allerdings, dass Routinen abgearbeitet werden und Funktionen Werte zurückliefern.
Ich habe jetzt mal versucht, den Differenzwert, den ich ich eigentlich ermitteln will, in eine Variable einer Funktion zu schreiben und diesen Wert dann an eine Prozedur zu übergeben.

-------------------------------------------------------

Public Function Differenzberechnung()
Dim maxDatum As Date
Dim AktDatum As Date
Dim Differenz As Double
maxDatum = DMax("Datum", "abfr_Basisabfrage")
AktDatum = Date
Differenz = AktDatum - maxDatum
Call Berechnungenstarten(Differenz)
End Function
-------------------------------------------------------
Public Sub Berechnungenstarten(Differenz)
If Differenz <> 0 Then
DoCmd.OpenQuery "abfr_anfuegen", acNormal, acEdit
DoCmd.OpenQuery "abfr_Datensaetze_loeschen", acNormal, acEdit
DoCmd.OpenQuery "abfr_Erstellung_Tageberechnung", acNormal, acEdit
Else
Exit Sub
End If
End Sub


-----------------------------------------------------------------------------------------

Die Funktion wird per autoexec-Makro aufgerufen.
Nach dem Durchlauf erhalte ich immer die Fehlermeldung "Fehlernummer 2001" und das Makro wird angehalten.

Hast Du noch eine Idee woran das liegen könnte, oder wie ich das mit der Funktion besser hinkriege ?

Vorab schon mal Danke.

Gruß,

Ralf
Titel: Re: VBA Code beim Start ausführen
Beitrag von: bahasu am Januar 10, 2013, 18:35:36
Hi Ralf

Zitat von: Ralf26 am Januar 10, 2013, 16:31:29
"Fehlernummer 2001"

Frage 1: Lautet die: "Sie haben die vorherige Operation abgebrochen"
Frage 2: An welcher Stelle erscheint die Meldung? (ist im VBA-Teil durch Setzen eines Haltepunktes {siehe Menü Debuggen} zu ermitteln.
Frage 3: Sollen die Abfragen zur Bearbeitung geöffnet werden oder sollen sie ausgeführt werden?

Zitat
oder wie ich das mit der Funktion besser hinkriege
Dein Code bietet Optimierungsmöglichkeiten, die aber erst nach Einkreisen des Fehlers dran sind.

Harald
Titel: Re: VBA Code beim Start ausführen
Beitrag von: database am Januar 10, 2013, 20:20:11
Hallo,

nur so nebenbei gefragt...

Möchtest du damit andeuten, dass du deine Daten mittels dieser Abfragen bearbeitest, eingibst änderst und/oder löschst?
Titel: Re: VBA Code beim Start ausführen
Beitrag von: Ralf26 am Januar 11, 2013, 12:09:05
Hallo Harald,

zunächst einmal die Antworten auf Deine Rückfragen

Frage 1: Lautet die: "Sie haben die vorherige Operation abgebrochen"
Antwort : Nein. Es erscheint ein Fenster mit dem Hinweis auf die Fehlermeldung (Habe ich als Grafik1 angehängt)

Frage 2: An welcher Stelle erscheint die Meldung? (ist im VBA-Teil durch Setzen eines Haltepunktes {siehe Menü Debuggen} zu ermitteln.
Antwort : Die Meldung erscheint beim Verlassen der Entwicklungsumgebung. Wenn ich diese schließe kommt das Fenster mit dem Hinweis "Dieser Befehl beendet den Debugger".
                Klicke ich hier auf O.K. erscheint das Fenster mit der Fehlermeldung.

Frage 3: Sollen die Abfragen zur Bearbeitung geöffnet werden oder sollen sie ausgeführt werden?
              Die Abfragen sollen nur ausgeführt, jedoch nicht angezeigt werden.

Vielleicht hole ich nochmal ein wenig aus, was ich damit eigentlich bezwecken will.

Eine mit der DB verknüpfte Excel-Tabelle, die exakt 100 Datensätze enthält, wird jeden Tag aus SAP heraus mit aktuellen Daten überschrieben.
Danach gibt es eine Reihe von Abfragen die alle nur das Ziel haben, am Ende eine Tabelle mit den gewünschten Daten zu erstellen, auf die dann verschiedene Abfragen gemacht werden können.
Auf dem Weg zu dieser Tabelle, werden mit den Abfragen Zeitdifferenzen in Tagen errechnet (@ Harald : Du hattest mir da schon letzte Woche mit der Zeitberechnung geholfen) , mit einer Aktionsabfrage veraltete Datensätze gelöscht, wenn sich bestimmte Felder verändert haben und - als finales Ziel - eben die Tabelle erstellt, die dann die Grundlage für viele weitere Abfragen bietet.

Was ich mit dieser Prozedur / Funktion bezwecke ist, dass die Abfragen automatisch beim Start ausgeführt werden. Soweit kein Problem.
Was ich jedoch vermeiden möchte ist, dass wenn die DB zehn mal am Tag geöffnet wird, die ganzen Abfragen zehn mal durchlaufen werden.
Deshalb soll überprüft werden, ob das aktuelle Datum dem Datum einer der Tabellen entspricht. Ist das der Fall, sind alle Daten bereits aktuell und die ganzen Abfragen (Anfügeabfrage, Tabellenerstellungsabfrage, Löschabfrage) müssen nicht nochmal durchlaufen werde.

Heut morgen habe ich die aktuellen Testdaten in der mit der DB verknüpften Tabelle gespeichert.
Beim Öffnen der DB ging gleich die Entwicklungsumgebung auf und zeigte den Code an um den es in diesem Posting geht.
Mit F8 konnte ich das ganze auch abarbeiten. Alle Abfragen wurden durchlaufen und danach, als der Wert von "Differenz" null war, eben nicht mehr durchlaufen. Genau so soll es ja auch sein.
Das was die Prozedur / Funktion macht ist also korrekt.
Was jetzt noch nicht läuft, ist, dass sich beim Starten der DB die Entwicklungsumgebung öffnet und die Funktion / Prozedur mit F8 durchlaufen werden muss.
Schließt man die Entwicklungsumgebung, erscheint das Fenster "Dieser Befehl beendet den Debugger". Klickt man hier auf OK erscheint die Fehlermeldung die ich als Grafik1 angehängt habe.

@ database : selbstverständlich möchte ich damit Daten eingeben und löschen. Dafür sind Anfügeabfragen und Löschabfragen doch schließlich da, oder habe ich da was völlig falsch verstanden ?

Vorab vielen Dank.

Gruß,

Ralf


[Anhang gelöscht durch Administrator]
Titel: Re: VBA Code beim Start ausführen
Beitrag von: DF6GL am Januar 11, 2013, 17:47:09
Hallo,



1) evtl. ist im VBA-Editor in der Funktion noch ein Haltepunkt aktiv..Kompiliere die DB im VBA-Editor (evtl. vorher eine Pseudo-Änderung durchführen)  und speichere das Projekt ab.
2) Aktionsabfragen startet man nicht mit Openquery, allenfalls mit Docmd.RunSQL oder (besser) mit Currentdb.Execute.
3) "selbstverständlich möchte ich damit Daten eingeben und löschen. Dafür sind Anfügeabfragen und Löschabfragen doch schließlich da, oder habe ich da was völlig falsch verstanden ?"   (Einzel) Daten (händisch)  in Auswahlabfragen einzugeben, ist nicht zu empfehlen, dafür sind Formulare da.   Gegen Massenverarbeitung mit Aktionsabfragen  (Anfüge- ,Tabellenerstellungs- und Lösch-Abfragen) ist nichts einzuwenden (siehe dabei Punkt 2)



Titel: Re: VBA Code beim Start ausführen
Beitrag von: database am Januar 12, 2013, 12:06:17
Hallo,

Zitat... Gegen Massenverarbeitung mit Aktionsabfragen  ....

Da sich meine Frage darauf bezog ob in dieser DB mit Formularen überhaupt gearbeitet wird - mir schien dem nämlich nicht so - möchte ich
noch hinzufügen, dass optimalerweise dann auch diese Aktionsabfragen aus einem Formular heraus ausgeführt werden sollten.

Warum ich die Annahme hatte - da es nur ganz wenige spezielle DB-Konstrukte gibt bei denen es
von Vorteil oder gar notwendig ist, beim Start Aktionsabfragen auszuführen.
Titel: Re: VBA Code beim Start ausführen
Beitrag von: Ralf26 am Januar 12, 2013, 13:06:06
Hallo Franz,

zu 1 : Genau das war es - danke.

zu 2 : ich habe es jetzt mal mit der CurrentDB.Execute-Anweisung probiert. Das funktioniert leider nicht wie gewünscht.
          Der ursprüngliche Code lautete :

          Public Sub Berechnungenstarten(Differenz)
          If Differenz <> 0 Then
          DoCmd.OpenQuery "abfr_anfuegen", acNormal, acEdit
          DoCmd.OpenQuery "abfr_Datensaetze_loeschen", acNormal, acEdit
          DoCmd.OpenQuery "abfr_Erstellung_Tageberechnung", acNormal, acEdit
          Else
          Exit Sub
          End If
          End Sub

          Wenn ich jetzt die DoCmd.OpenQuery-Anweisungen durch CurrentDB.Execute ersetzte,
          CurrentDB.Execute "abfr_anfuegen"
          CurrentDB.Execute "abfr_Datensaetze_loeschen"
          CurrentDB.Execute "abfr_Erstellung_Tageberechnung"

          erhalte ich die Fehlermeldung "tab_Tageberechnung" ist bereits vorhanden.

          Selbstverständlich ist die Tabelle bereits vorhanden.
          Bei DoCmd.OpenQuery "abfr_Erstellung_Tageberechnung" läuft es zumindest korrekt durch, d.h. die exisitierenden Datensätze werden   
          aus "tab_Tageberechnung" gelöscht und die aktuellen Datensätze aufgrund der Tabellenerstellungsabfrage in die Tabelle geschrieben.
          Wenn Du da noch einen Tipp hättest, wie ich das mit CurrentDB.Execute zum laufen kriege wäre das prima.

@ database : Danke für den Hinweis, die Aktionsabfragen aus Formularen zu starten, aber zur Zeit bin ich noch mit Abfragen und Tabellen beschäftigt, damit das ganze mal halbwegs läuft. Sobald das läuft, kümmere ich mich um die Formulare und werde dann deinen Tipp sicher beherzigen.

Viele Grüße,

Ralf
Titel: Re: VBA Code beim Start ausführen
Beitrag von: database am Januar 12, 2013, 13:31:15
Hallo,

das kommt daher, da bei DoCmdOpenQuery die Abfrage so ausgeführt wird als würdest du im Objektexplorer diese Doppelklicken.
Access startet dann eine 'interne Routine', die dir bei der Ausführung auch den Hinweis gibt, dass die alte Tabelle gelöscht wird.

Bei CurrentDB.Execute ist das nicht so - da musst du für die Löschung der alten Tabelle selbst sorgen:

CurrentDb.Execute ("DROP TABLE tab_Tageberechnung"), dbFailOnError

vor der Erstellungsabfrage in den Code stellen ... sollte funktionieren
(Die Tabelle tab_Tageberechnung sollte aber dabei schon existieren)
Titel: Re: VBA Code beim Start ausführen
Beitrag von: Ralf26 am Januar 12, 2013, 13:54:40
Hallo,

perfekt - funktioniert einwandfrei (und danke auch für die Erklärung).

Gruß,

Ralf