Hallo in die Runde,
ich such schon eine Ewigkeit finde aber nicht den Fehler.
Ich habe eine aufgeteilte Access-Datenbank.
Im Backend befinden sich die zwei Tabellen "tblAbwesenheiten" und "tblAbwesenheitenEinzel"
In der Tabelle Abwesenheiten werden Zeiträume erfasst (DatumAb und DatumBis) und durch Auslösen der jeweiligen Datenmakros werden in der Tabelle AbwesenheitenEinzel Datensätze für jeden einzelnen Tag erzeugt.
Diese Lösung funktioniert auf einem Rechner mit einer Access-32-Bit-Version sowohl direkt im Backend als auch im Frontend aus sehr zuverlässig (einfügen, aktualisieren, löschen).
Verändere ich nun die Daten vom Frontend aus, mit einem anderen Rechner (Access-64-Bit Version) funktioniert es nicht mehr. Wenn ich direkt in der Backendtabelle arbeite, funktioniert die Lösung auch in der 64-Bit Version zuverlässig aber eben nicht mehr in der verknüpften Tabelle.
Hat jemand einen Tipp, woran es liegen könnte?
Danke im Voraus!
Arbeitest Du bei der verknüpften Tabelle mit dem gleichen Backend wie beim Handbetrieb?
Es hat schon mancher woanders nachgeschaut als wo die Aktion erfolgte und sich dann gewundert.
Mit anderen Worten: Erfolgen Deine eigenerzeugten Änderungen in der Tabelle? Dass Datenmakros für sich alleine nicht funktionieren, dürfte undenkbar sein bei auslösenden Ereignissen auf Tabellenebene.
Hallo Eberhard,
Daten-Makros lassen sich nicht so einfach testen. Ich habe keine Möglichkeit gefunden, die SingleStep-Aktion hinzufügen.
Von den Datenmakros werden zwei Funktionen (DSDelete, DSCreate) aufgerufen.
Das VBA-Modul mit den Funktionen muss sowohl im Backend als auch im Frontend hinterlegt sein.
Ich habe meinen Fehler inzwischen gefunden.
Danke für die Hilfe.
ZitatVBA-Modul mit den Funktionen
... und Datenmakro sind sehr unterschiedliche Welten. Da bin ich etwas irritiert.
Zitat von: unie am August 14, 2022, 07:44:22Ich habe meinen Fehler inzwischen gefunden.
Das mindeste wäre jetzt aber mitzuteilen, was das Problem konkret ist und wie du es gelöst hast.
Schließlich sind wir hier in einem Forum.
Hier mal die Einzelheiten meines Aufbaus
In der Tabelle "tblAbwesenheiten" habe ich folgende Makros hinterlegt
Vor Löschung - Festlegen Lokale Variable - Name: abwID - Ausdruck: SetMerkeAbwID([tblAbwesenheiten].[abwID])
Nach Löschung - AusführenDatenmakro - Makroname:tblAbwesenheiten.DSDelete - Parameter: lngID =GetMerkeAbwID()
Nach Einfügung - AusführenDatenmakro - Makroname:tblAbwesenheiten.DSCreate - Parameter Merke_abwID = [abwID], Merke_mrbID = [abwmrbIDRef], Merke_abaID = [abwabaIDRef], Merke_DatumAb = [abwDatumSeit], Merke_DatumBis = [abwDatumBis]
Nach Aktualisierung
FestlegenLokaleVar - Name: Changed - Ausdruck: 0
Wenn Aktualisiert("abwDatumSeit") Dann FestlegenLokaleVar - Name: Changed - Ausdruck: 1 - Ende Wenn
Wenn Aktualisiert("abwDatumBis") Dann FestlegenLokaleVar - Name: Changed - Ausdruck: 1 - Ende Wenn
Wenn [Changed]=1 Dann
AusführenDatenmakro - Makroname:tblAbwesenheiten.DSDelete - Parameter: [tblAbwesenheiten].[abwID]
AusführenDatenmakro - Makroname:tblAbwesenheiten.DSCreate - Parameter Merke_abwID = [abwID], Merke_mrbID = [abwmrbIDRef], Merke_abaID = [abwabaIDRef], Merke_DatumAb = [abwDatumSeit], Merke_DatumBis = [abwDatumBis]
Ende Wenn
Modul mdlAbwesenheiten (Modul ist im Backend und im Frontend abgelegt)
Dim m_AbwID As Long
Function SetMerkeAbwID(lngID As Long) As Boolean
m_AbwID = lngID
End Function
Function GetMerkeAbwID() As Long
GetMerkeAbwID = m_AbwID
End Function
Function AbwesenheitenEinzel_Delete(abwID As Long) As Boolean
Dim strDELETE As String
strDELETE = "DELETE * FROM tblAbwesenheitenEinzel WHERE abeabwIDRef=" & abwID
CurrentDb.Execute strDELETE
End Function
Function AbwesenheitenEinzel_Create(abwID As Long, mrbID As Long, abaID As Long, DatumAb As Date, DatumBis As Date) As Boolean
Dim strINSERT As String
Dim lngDatum As Long
For lngDatum = CLng(DatumAb) To CLng(DatumBis)
strINSERT = "INSERT INTO tblAbwesenheitenEinzel(abeabwIDRef, abemrbIDRef, abeabaIDRef, abeDatum) VALUES ("
strINSERT = strINSERT & abwID & ", " & mrbID & ", " & abaID & ", " & Format(lngDatum, "\#yyyy\-mm\-dd\#") & ")"
CurrentDb.Execute strINSERT
Next lngDatum
End Function
--------------
Schilderung des Problems
Wenn ich direkt in der Tabelle "tblAbwesenheiten" arbeite, funktionieren die Datenmakros zuverlässig und es werden die dazugehörigen Einzeldatensätze in der "tblAbwesenheitenEinzel" abgelegt.
Zum Bearbeiten verwende ich ein ungebundenes Formular. Ich speichere den Datensatz nach Prüfungen wie folgt
Set db = CurrentDb
Set rst = db.OpenRecordset("tblAbwesenheiten", dbOpenDynaset)
With rst
If Me!txtID = 0 Then
.AddNew
Else
.FindFirst "[abwID] = " & Me!txtID
.Edit
End If
!abwmrbIDRef = Me!cboMitarbeiter
!abwabaIDRef = Me!cboAbwesenheitArt
!abwBescheinigungArt = Me!cboBescheinigungArt
!abwDatumBeginn = Me!txtDatumBeginn
!abwDatumSeit = Me!txtDatumSeit
!abwDatumBis = Me!txtDatumBis
!abwDatumAm = Me!txtDatumAm
!abwBemerkung1 = Nz(Me!txtBemerkung1, "")
!abwBemerkung2 = Nz(Me!txtBemerkung2, "")
!abwUnfall = Me!chkUnfall
!abwErledigt = Me!chkErledigt
.Update
End With
Und hierbei kommt es zum Absturz. Ich habe bisher immer noch nicht meinen Fehler gefunden.
Inhaltliche Betrachtung:
ZitatIn der Tabelle Abwesenheiten werden Zeiträume erfasst (DatumAb und DatumBis) und durch Auslösen der jeweiligen Datenmakros werden in der Tabelle AbwesenheitenEinzel Datensätze für jeden einzelnen Tag erzeugt.
Ich würde die Auflösung von Zeiträumen in Einzeltage per Auswahlabfrage vornehmen:
Grundlagen - SQL ist leicht (1) - Hilfstabellen (https://www.ms-office-forum.net/forum/showthread.php?t=298414)
Grundlagen - SQL ist leicht (3) - Kalendertabelle (https://www.ms-office-forum.net/forum/showthread.php?t=298670)
Gerade das verwendete Element Löschen legt nahe, dass man gleich temporär (Auswahlabfrage = virtuelle Tabelle) arbeitet.
Anlegen und Löschen von Daten erzeugt ein Aufblähen des BE, weil Löschen nur das Setzen eines Löschvermerks, nicht aber wirkliche Speicherfreigabe bedeutet. Das ist Dir bewusst?
Ein solches Problem wird in ernsthaften Anwendungen mit Massendaten dann zum spürbaren Problem führen und ist daher möglichst schon an der Ursache zu vermeiden.
Falls man doch die Einzeltage fixiert in einer Tabelle benötigen würde, könnte man den Inhalt der Auswahlabfrage in einer Anfügung verwenden (im Stück, nicht tröpfchenweise per Schleife). Aus dem FE heraus geht das also mit einfacher und bewährter Technik, fehlerfrei und performant.
Technisch:
Dein Konstrukt ist eine Spielwiese, die ich noch nicht richtig verstehe, weil mir dazu die Praxis fehlt, obwohl ich schon mal reingerochen habe: Änderungen protokollieren per Datenmakro (https://www.ms-office-forum.net/forum/showthread.php?t=365653)
Hier werden vergleichsweise Datensätze in einer weiteren Tabelle angelegt, aber in purer DataMacro-Welt.
Die von Dir vorgenommene Mischung verschiedener Welten (Datenmakro => DB-Maschine, VBA inkl. DAO) sehe ich äußerst kritisch, weil für mich an der Stelle nicht vorgesehen und daher extrem fehleranfällig, oder ich verstehe es einfach nicht.
Insofern ist der eingeschrittene Weg einer für technische Tests und Spielereien, aber eher nicht praxistauglich.
Insgesamt aber ist die Verwendung von Datenmakros sehr selten, wenn man sich nach Forenbeiträgen orientiert. In professionellen Bedingungen wird man für das Backend ein aktives DBMS (SQL Server uva.) verwenden, die an der Stelle Trigger bieten. Ein Dienst (aDBMS ist ein laufendes Programm) bietet sehr viel mehr Möglichkeiten als ein "dummes" File-Backend.
Trotzdem gibt es vielleicht Spieler, die sich mit Deinem Fall beschäftigen könnten. Vielleicht magst Du eine abgemagerte Demo hier hochladen, weil nachbauen auf Zuruf würde ich mir so etwas nur bei extremsten Interesse und vorhandener Langeweile.
Technisch Nr. 2:
Ein Absturz einer Recordsetaktion über ein Formular (WO?) und eine Nichtausführung von irgendwas können zusammenhängen, sind aber recht unterschiedliche Dinge und getrennt zu beobachten.
Ein FindFirst ist eine Absichtserklärung. Man sollte aber immer für möglich halten, dass das Gesuchte nicht gefunden wird. Ein unmittelbarer Versuch, etwas nicht vorhandenes zu editieren, dürfte Grund genug für eine Fehlerreaktion sein.
Hallo Eberhard,
Zitat von: undefinedFalls man doch die Einzeltage fixiert in einer Tabelle benötigen würde, könnte man den Inhalt der Auswahlabfrage in einer Anfügung verwenden (im Stück, nicht tröpfchenweise per Schleife). Aus dem FE heraus geht das also mit einfacher und bewährter Technik, fehlerfrei und performant.
kannst Du mir bitte etwas auf die Sprünge helfen, wie eine Anfügung im Stück und nicht tröpfchenweise erfolgen kann.
Bei meiner Fehlersuche bin ich inzwischen etwas weiter gekommen, es erscheint folgende Fehlermeldung
"
Es ist ein Fehler aufgetreten - Fehlernummer 3624(Der Datensatz konnte nicht gelesen werden, da er momentan von einem anderen Benutzer gesperrt wird.) in der Prozedur AbwesenheitenEinzel_Create of VBA mdlAbwesenheiten."
Statt
INSERT INTO Tabelle (...) VALUES (...)
... womit nur jeweils ein Datensatz angelegt wird, so etwas
INSERT INTO Tabelle (...) SELECT ... FROM AndereTabelle