Neuigkeiten:

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

Mobiles Hauptmenü

Access 2013; VBA; Unterformular stürzt ab

Begonnen von Crashbreaker, Oktober 01, 2015, 14:50:21

⏪ vorheriges - nächstes ⏩

Crashbreaker

Zitat von: MaggieMay am Oktober 02, 2015, 16:27:49
Hi,

dann hast du dies hier wohl überlesen:
Zitatich habe für die Unterformular im "Eigenschaftenblatt -> Daten -> Herkunftsobjekt" die entsprechende Tabelle dafür auserwählt. Daher kommen die Daten ins Unterformular an.

Es ist doch so, dass das Hauptformular ungebunden ist, das Unterformular aber nicht. Nun soll auf Button-Klick der aktuelle DS aus dem UF ins HF geholt und dort geändert werden können. Von dieser Vorgehensweise weiterhin abzuraten, wo es doch der erklärte Wunsch des TE ist, finde ich wenig sinnvoll.

Ich warte jetzt auf eine Beispiel-DB mit Bedienungsanleitung. Das muss man jetzt einfach mal mit eigenen Augen sehen.

Okay ich baue sie gerade in abgespeckter Version nach. Hoffe ihr habt soweit etwas Geduld.

MfG
Daniel

Crashbreaker

Hallo Leute,

nun füge ich in die Anlage eine abgespeckte Version meiner Access-DB.
Da werdet ihr die Ursache entdecken und mich vielleicht besser verstehen.
Leider musste ich die Datei Zippen, da sie knapp 2000 kb groß war und hier ist nur die hälfte erlaubt. Hoffe es macht euch keine umstände.

Da nun auch das Zippen hier noch mehr beschränkt ist (wie dämlich), habe ich die Zipdatei in 2 Dateien gesplittet. Ich lade zuerst die 1. und danach folgt die 2. Datei. Bitte beides erst runter laden und danach entpacken.

Allerdings ist mir bei der Erstellung ein kleiner Fehler unterlaufen, den ich vergebens gesucht habe. Und zwar, wenn man im UF einen DS selektiert hat und dann die Schaltfläche "Bearbeiten" klickt, werden die Uhrzeiten nicht korrekt übernommen. Woher die Uhrsache nun entstanden ist, konnte ich nicht herraus finden.

Ich hoffe ihr könnt mir nun helfen.

MfG
Daniel

Crashbreaker

Hier ist die 2. Datei zum runter laden.

habe den Format manipuliert. Normalerweise hieß die datei "Datenbank2.z01" und ich musste sie nun in "Datenbank2.zip" umbenennen. Also auch bitte hier drauf achten ...

Wie bescheuert von diesem Forum gemacht, wirklich ... !!!

Bedanke mich im Voraus für euren Verständnis.

MfG
Daniel

ebs17

Zitat von: MaggieMayVon dieser Vorgehensweise weiterhin abzuraten, wo es doch der erklärte Wunsch des TE ist, finde ich wenig sinnvoll.
Nun, zwischen erklärtem Wunsch und (Irr-)Glauben  könnte man wohl differenzieren:
http://www.ms-office-forum.net/forum/showpost.php?p=1697555&postcount=33
Zitat von: CrashbreakerWenn man aber in der Tabelle einige Datensätze ändern möchte, dann soll es nicht im Unterformular passieren, sondern in den jeweiligen Textfeldern (ungebundene Feldern) ...

Weil sonst hätte man direkt alles in der entsprechenden Tabellen gemacht. Das ist aber nicht der Sinn eines Formulars. Man nimmt Datensatz / Datensätze, man bearbeitet die und speichert die wieder in die jeweilige Tabelle(n) ...
Freunde: Ihr (ich eingeschlossen) habt den Sinn eines Formulars nicht verstanden! Wenn man nicht umständlich alles hin und her schiebt, programmiert man nicht, sondern betreibt allenfalls Firlefanz ...

Ein Hinweis darauf, dass, wenn man im aktuellen Anzeigeformular nicht editieren will, man statt dessen ein (gebundenes) Anfügen-/Editierformular verwenden könnte, an das man nur die ID des ausgewählten Datensatzes übergeben könnte, verpufft dann eben so, weil es ja programmatisch hochintellektuell (und fehlerwahrscheinlich) sein soll.

Viel Spaß dann noch.
Mit freundlichem Glück Auf!

Eberhard

Crashbreaker

Zitat von: ebs17 am Oktober 02, 2015, 18:24:42
Freunde: Ihr (ich eingeschlossen) habt den Sinn eines Formulars nicht verstanden! Wenn man nicht umständlich alles hin und her schiebt, programmiert man nicht, sondern betreibt allenfalls Firlefanz ...

Ein Hinweis darauf, dass, wenn man im aktuellen Anzeigeformular nicht editieren will, man statt dessen ein (gebundenes) Anfügen-/Editierformular verwenden könnte, an das man nur die ID des ausgewählten Datensatzes übergeben könnte, verpufft dann eben so, weil es ja programmatisch hochintellektuell (und fehlerwahrscheinlich) sein soll.

Viel Spaß dann noch.

Öhm, jetzt bitte noch einmal für Access-Anfänger?
Wie würde das aussehen mit:
Zitatstatt dessen ein (gebundenes) Anfügen-/Editierformular verwenden könnte, an das man nur die ID des ausgewählten
Datensatzes übergeben könnte,

Bitte um Erklärung!

MfG
Daniel

Crashbreaker

Übrigens:

Hier könnt ihr meine Access-Datei direkt runterladen.
http://i-sa.de/access/Datenbank2.accdb

Das obige war sehr lästig.

MfG
Daniel

ebs17

#21
ZitatWie würde das aussehen ...

Du verwendest das Formular, das Du als Unterformular verwendest, oder ein ähnliches mit der gleichen Datenherkunft, bzw. bei Vorliegen einer nicht aktualisierbaren Abfrage als Datenherkunft die Tabelle, für die es zu Datensatzeditierungen kommen soll:
' Editieren bei ausgewähltem Datensatz => über ID
DoCmd.OpenForm "JenesFormular", , , "ID = " & Me.ID

' Datensatz neu erzeugen
DoCmd.OpenForm "JenesFormular", , , , acFormAdd


Entsprechende Editierungen landen erst in der Tabelle, wenn gespeichert wird, und ganz sicher nicht unmittelbar.

//Edit
unter Reaktion auf Hinweis von MaggieMay (Unterformular ist Tabelle):
Unter Formular/Unterformular verstehe ich genau und wörtlich ein Formular und nicht eine eingeklebte Tabelle.
Mit freundlichem Glück Auf!

Eberhard

MaggieMay

#22
Zitat von: Crashbreaker am Oktober 02, 2015, 18:19:20
Wie bescheuert von diesem Forum gemacht, wirklich ... !!!
Sorry, aber du beherrscht die Grundregeln nicht: Zuerst wird die Access-DB komprimiert und erst dann gezippt!

Du solltest dich also besser informieren, ehe du dich derart weit aus dem Fenster lehnst.

Und was das betrifft:
ZitatIch warte jetzt auf eine Beispiel-DB mit Bedienungsanleitung.
Wo bleibt die Bedienungsanleitung? Gefragt ist nach der Aktionsfolge, die zum Fehler führt.

Nachtrag:
Was als erstes auffällt:
- du setzt kein Formular sondern eine Tabelle als Unterformular ein
- eine modulweit deklarierte Variable kann nicht so ohne weiteres mehrfach verwendet werden
- das Recordset-Objekt sollte nach Benutzung wieder geschlossen werden

- die Auswahl des aktuellen Datensatzes im Unterformular zur Bearbeitung im Hauptformular funktioniert nicht - was hast du da geändert?
Freundliche Grüße
MaggieMay

Josef P.

#23
Hallo!

@MaggieMay: warum soll das Formular-Recordset geschlossen werden?

Bezüglich Datensatz-Auswahl: Wenn man Recordsetclone verwendet, ist dessen Datensatzzeiger meist an erster Stelle.
Der ursprüngliche Code mit Form.Recordset statt Form.RecordsetClone hätte schon gepasst. (Unabhängig vom umständlchen Änderungsablauf ;) - aber man kann ja zuerst den nicht funktionierenden Code richtigstellen und dann trotzdem einen anderen Ablauf verwenden.)

Da die Daten des ausgewählten Datensatzes im Unterformular verwendet werden sollen, könnte man auch direkt auf die Controls zugreifen:
     With Me.frmUnterformular.Form
            Me.txtAuftragID = .Controls("AuftragID")
            Me.txtDatum = .Controls("Datum")
            Me.txtPersonalID = .Controls("PersonalID")
            Me.txtObjektID = .Controls("ObjektID")
            Me.txtSchichtID = .Controls("SchichtID")
            Me.txtUhrzeitBeginn = .Controls("UhrzeitBeginn")
            Me.txtUhrzeitEnde = .Controls("UhrzeitEnde")
            'Ändere die Beschriftung der Schaltfläche "Speichern"
            Me.btnAdd.Caption = "Aktualisieren"
            'Deaktiviere Schaltfläche "Bearbeiten"
            Me.btnEdit.Enabled = False
            ' ...
            Me.txtDatum.Tag = "UPDATE"
        End With



Anm.: der eigentlichen Fehler ist (wie bereits im ms-office-forum erwähnt) das Schließen des Workspace-Objekt, das auch vom Formular-Recordset verwendet wird.


Set wks = DBEngine.Workspaces(0)

...

trans_ExitProcedure:
    'Clean up
    wks.Close ' <--- das darf nicht geschlossen werden, da es verwendet wird
    Set dbC = Nothing
    Set wks = Nothing


mfg
Josef

MaggieMay

#24
Hi,
ZitatDa die Daten des ausgewählten Datensatzes im Unterformular verwendet werden sollen, könnte man auch direkt auf die Controls zugreifen

das ist hier wohl der entscheidende Hinweis.

Aber (sorry) der Vorschlag zum Einsatz eines Workspace-Objekts zur Aktualisierung eines einzelnen Datensatzes ist hier doch wohl ein wenig "überdimensioniert". Eine schlichte Aktualisierungsabfrage sollte genügen.

(Abgesehen davon, dass man das auch ganz anders lösen könnte, aber das wollen wir bitte nicht noch einmal wiederkäuen!)

PS:
Zitatwarum soll das Formular-Recordset geschlossen werden?
Natürlich nicht das Recordset des Unterformulars, sondern das temporäre Recordset-Objekt.

Das scheint aber dasselbe zu sein wie bspw. beiSet db = CurrentDB
...
db.Close
was natürlich auch nicht "funktioniert" im Sinne von "schließe" (=beende) die aktuelle DB.

Zugegeben, ich habe nicht weiter darüber nachgedacht, hatte nur im Sinn, dass man Objekte nach der Benutzung generell wieder freigeben sollte, im Sinne von "sauberer" Programmierung.

Freundliche Grüße
MaggieMay

Crashbreaker

Hallo Leute,

ich danke euch sehr, dass ihr die Datei euch genauer angeschaut habt.
Ihr habt auch schöne Beiträge geleistet, doch nun bin ich etwas durcheinander. Was genau ist nun jetzt die Ursache und wie behebe ich das? Wie muss ich nun vorgehen?

Ja das stimmt, es tut mir leid. Es gab bei der Erläuterung meinerseitsher ein missverständnis. Ich hätte euch erwähnen müssen, dass mein Unterformular eine Tabelle beinhaltet und keine Formularelemente. Das lag an meinem Unerfahrenheit bzgl. Access. Habe mich zu sehr auf meinem Problem fixiert und das tut mir in der Hinsicht leit.


MaggieMay

Hi,

mein Vorschlag wäre: vergiss Workspaces und Recordsets (vorübergehend) und setze den oben geposteten Code von Josef mit dem Direktzugriff auf die Controls des Unterformulars ein.
Freundliche Grüße
MaggieMay

Crashbreaker

Zitat von: MaggieMay am Oktober 05, 2015, 12:59:23
Hi,

mein Vorschlag wäre: vergiss Workspaces und Recordsets (vorübergehend) und setze den oben geposteten Code von Josef mit dem Direktzugriff auf die Controls des Unterformulars ein.

Wow tatsächlich.
Dank Josefs beispiel hat es funktioniert. Aber habe somit die If Anweisung weg gelassen.

Wie kann ich die Überprüfung genau denn machen?

MaggieMay

Was genau willst du denn überprüfen? Ob das Unterformular überhaupt Datensätze enthält? Oder ob der Datensatzanzeiger evtl. auf einem neuen Datensatz steht?
Das kannst du folgendermaßen machen:
If Me.frmUnterformular.Form.RecordSet.RecordCount = 0 OR Me.frmUnterformular.Form.NewRecord Then
    MsgBox "Kein aktueller Datensatz!"
    Exit Sub
End If

Die Verwendung des Else-Zweiges für den restlichen Code wäre dem Exit natürlich vorzuziehen, hier nur der Einfachheit halber.
Freundliche Grüße
MaggieMay

MaggieMay

Sorry, aber ich muss da nochmal etwas loswerden.

Das Thema CrossPosting wurde ja bereits angesprochen, aber du betreibst es munter weiter.

Was ich aber gar nicht verstehe ist, dass du hier eine Lösung präsentiert bekommst (ohne darauf zu antworten!), an anderer Stelle das Thema aber noch stundenlang weiter treibst.
Mein Eindruck dabei ist: Viele Helfer erhöhen nicht unbedingt die Qualität, weil ein Anfänger durch den permanent stattfindenden Input (sowie auch dessen Inhalt) leicht überfordert ist.

Warum also tust du dir das an?
Freundliche Grüße
MaggieMay