Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: unie am August 13, 2022, 09:20:03

Titel: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: unie am August 13, 2022, 09:20:03
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!
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: ebs17 am August 13, 2022, 14:29:19
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.
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: unie am August 14, 2022, 07:44:22
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.
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: ebs17 am August 14, 2022, 10:00:01
ZitatVBA-Modul mit den Funktionen
... und Datenmakro sind sehr unterschiedliche Welten. Da bin ich etwas irritiert.
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: markusxy am August 14, 2022, 13:49:56
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.
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: unie am August 20, 2022, 09:26:12
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.
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: ebs17 am August 20, 2022, 10:53:16
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.

Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: unie am August 21, 2022, 07:06:48
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."
Titel: Re: Datenmakro im Backend wird nicht ausgelöst
Beitrag von: ebs17 am August 21, 2022, 08:03:30
Statt
INSERT INTO Tabelle (...) VALUES (...)... womit nur jeweils ein Datensatz angelegt wird, so etwas
INSERT INTO Tabelle (...) SELECT ... FROM AndereTabelle