Januar 18, 2021, 08:03:23

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


ufor_bei Datenerfassen nicht anklickbar wegen Speichern_Button

Begonnen von 45457, Mai 04, 2013, 22:52:40

⏪ vorheriges - nächstes ⏩

45457

In einem Formular erfasse ich Personendaten.
Leider kann ich das Unterformular wo ich die Kategorie anwählen möchte nicht anwählen weil sich jedesmal der Datensatz löscht bevor ich auf das ufor klicke. Nehme an es liegt am Me.Undo, wenn ich das jedoch ausschalte wird immer vorzu abgespeichert was ich nicht möchte. Anbei mein Speichern-Button.:)

Dim bolsichern As Boolean

Private Sub cmdsave_Click()
   bolsichern = True
DoCmd.RunCommand acCmdSaveRecord
    DoCmd.Close ',,acSaveNo
    DoCmd.OpenForm "for_Personen_Verwaltung"
   
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Not bolsichern Then
        Me.Undo
    End If
End Sub
Private Sub Form_AfterUpdate()
    bolsichern = False
End Sub

Liebe Grüsse

database

Hallo,

also dass sich Datensätze von alleine löschen ist mir eigentlich noch nie begegnet. :-\

Me.Undo bewirkt, dass noch nicht gespeicherte Daten aus Eingabefeldern entfernt werden (unter Anderem).

Wenn du Daten erfassen möchtest, die nicht sofort beim Verlassen eines Formulars (und das wird hier der Fall sein) gespeichert werden,
musst du mit ungebundenen Formularen arbeiten. In diesen bleiben die Daten ungespeichert auch wenn das Form verlassen wird.
Und BeforeUpdate und AfterUpdate treten auch beim Schließen des Forms in Erscheinung.
deine Var bolsichern hat keinen Anfangswert - daher wird auch jedesmal Me.Undo ausgeführt wenn du das Form verlassen willst

Mir scheint aber das Problem eher im Konzept verwurzelt.

Deiner Beschreibung nach willst du Personendaten erfassen - was bitte kategorisierst du dabei in einem Unterformular?
Warum wählst du eine Kategorie nicht am HaFo, dort wo auch die Daten erfasst werden?
Und was verstehst DU unter einem Unterformular - nicht aber dein 'for_Personen_Verwaltung' - das wäre nämlich kein Unterformular im Sinne von Access.

Insgesamt verstehe ich nämlich dieses da nicht recht:

DoCmd.RunCommand acCmdSaveRecord
    DoCmd.Close ',,acSaveNo
    DoCmd.OpenForm "for_Personen_Verwaltung"

Speicherst du den begonnen Datensatz, schließt du danach das Form und öffnest es gleich wieder oder was passiert da konkret?

45457

- Was bitte kategorisierst du dabei in einem Unterformular?
Ich möchte dort Abfüllen ob die Person Fahrrad oder Mofa fährt da dies eine m zu m Beziehung ist habe ich eine Beziehungstabelle erstellt PersonenXKategorie, da auch eine Person beides fahren kann, habe ich eine Abfr. erstellt mit einem endlosformular, wo ich maximal 2 Felder auswählen kann und nun im for_Pers_erfassen als Unterformular eingefügt.

- Warum wählst du eine Kategorie nicht am HaFo, dort wo auch die Daten erfasst werden? Wegen der m zu m Beziehung und der Auswahl mehrer Felder, ich weiss Access hat die funktion mehrer Felder auszuwählen, jedoch wenn ich einmal auf ein anders Datenbanksystem wechseln möchte kriege ich Probleme.

- Was verstehst DU unter einem Unterformular - nicht aber dein 'for_Personen_Verwaltung' - das wäre nämlich kein Unterformular im Sinne von Access.
Nein das Formular Personen_Verwaltung ist so zusagen ein (Verweisformular), dort kann ich auf verschiedene Buttons klicken welche mich zu weiteren Formularen bringt, z.B. Personen_erfassen; Personen_löschen; Personen_aendern;....

- Insgesamt verstehe ich nämlich dieses da nicht recht:

DoCmd.RunCommand acCmdSaveRecord
    DoCmd.Close ',,acSaveNo
    DoCmd.OpenForm "for_Personen_Verwaltung"

Speicherst du den begonnen Datensatz, schließt du danach das Form und öffnest es gleich wieder oder was passiert da konkret?

Ist nicht das selbe Formular, wie oben beschrieben. ;)

Liebe Grüsse

database

Hallo,

Zitat...Wegen der m zu m Beziehung und der Auswahl mehrer Felder ...


Also das Bestehen einer m:n Beziehung hindert dich nicht daran die Daten dort zu erfassen, wo dies eigentlich erfolgen sollte
Access ist da schon flexibel genug das zu ermöglichen.
Die Mehrfachauswahl hat auch nichts mit dem Datenbanksystem selbst zu tun, das ist ein Feature, welches Access im Umgang mit Formularen bietet. Wenn du das Backend deiner Applikation irgendwann gegen einen SQL-Server tauschen würdest sähe ich da kein Problem auf dich zukommen.

OK, zu deinem Problem zurück ... da hatte ich ein Verständnisproblem ... ich verstehe unter kategorisieren was anderes als du.  ;D
Es sollte dein Vorgehen diese 'Kategorie' in einem UFo zu erfassen durchaus machbar sein.

Wenn du nun Daten zu einer Person erfasst und dieses im Hauptformular passiert, benötigst du um Einträge in die Zwischentabelle (PersonenXKategorie) zu machen nicht nur die ID fürs Fahrrad oder Mofa sondern auch die ID des Datensatzes im HaFo - also die PersonenID.
Soll heißen - die Primärschlüssel ALLER beteiligter Datensätze, die dann als Fremdschlüssl in der Zwischentabelle abgelegt werden, sollen (müssen) verfügbar sein.
Wenn du aber beim Wechsel ins Unterformular das Speichern des HaFo-Datensatzes verhinderst bekommst du das Problem, dass du keine PersonenID fürs Unterformular liefern kannst.
Der Personendatensatz MUSS in der Tabelle aktualisiert werden sonst wird dessen Primärschlüssel nicht erstellt!
Mit dem Undo im Ereignis BeforeUpdate löscht du praktisch alle Feldinhalte, wenn du nicht vorher explizit auf den Speichern-Button klickst.
Zumindest hast du dein Formular so konzipiert, wenn ich das richtig interpretiere.
Nach meinem Dafürhalten solltest du da einfach mal das Schließen und Öffnen des/der Formulare rausnehmen.

Klick dann mal auf den Button - beim Wechsel ins Ufo sollte dann der Personendatensatz stehen bleiben.
Wenn du nun Fahrrad und / oder Mofa im UFo auswählst musst du nur noch dafür sorgen, dass beim Eintrag des Primärschlüssels des gewählten Fahrzeugs GLEICHZEITIG auch der Primärschlüssel der Person in die Zwischentabelle eingetragen wird - und zwar für jede Auswahl, die du da triffst - ob's nun ein Fahrzeug oder zwei sind.

Wenn du das anders regelst, arbeitest du gegen das relationale DB-Konzept, du müsstest an der Beziehung zur Zwischentabelle die ref.Integ. ausschalten, was dann wiederum das Entstehen eines ausgewachsenen Datensalates fördert. Ich hoffe du verstehst was ich meine.

45457

Habe es genau so geregelt wie du es beschreibst.
Aber das mit dem Speichern-Button funktioniert immer noch nicht. :(
Habe nun überlegt beim speichern Button einfach ein wechseln zu einzufügen. D.h. acces speichert fortlaufend und wenn ich speichern klicke wechselt er eifach zum nächsten formular.
Und beim Schliessenbutton einen Befehl kreieren möchte welcher die Datensätze im Unterformular und im Formular löscht und danach zu einem anderen Formular wechselt.
Private Sub cmdclose_Click()
    If Me.Dirty = True Then
    Me.Undo
    End If
    DoCmd.Close acForm, Me.Name
    DoCmd.OpenForm (for_Persoenen_Verwaltung)
End Sub

Liebe Grüsse

database

Hallo,

ich weiß nicht ob du genau weißt was du da tust  :-\  ::)
Oder verstehe ich einfach nicht was du meinst  ???

If Me.Dirty = True Then    ....   Wenn in deinem Formular Daten eingegeben wurden
   Me.Undo                       ....   mach das rückgängig

Zitat...einen Befehl kreieren möchte welcher die Datensätze im Unterformular und im Formular löscht und danach zu einem anderen Formular wechselt


Ich werde aus dieser Logik einfach nicht schlau, sorry, tut leid ...
Warum in aller Welt willst du aus einem Formular NACH der Dateneingabe die Daten wieder löschen?
Ein Formular muss nicht zwangsläufig LEER sein damit man es schließen kann!
Wenn du dieses Formular mit dem Befehlssatz oben schließt, sind die EINGABEN futsch und nix in der Tabelle.
Noch dazu reagiert das Ding aufs Hauptformular und nicht auf Unterformular du würdest so die Daten hinter dem PK entfernen
von dem die Daten des Unterformulars abhängig sind ... *aaaahhhh*

45457

Wäre ne Art abbrechen Button wenn die ID schon erstellt ist, dass ich diese wieder löschen kann. sowie auch sämtliche Unterformulare. Hat sich aber jetzt erledigt.
Danke trotzdem für deine Hilfe.

database

Hallo,

na, dann noch zu deiner weiteren Information über dein Vorhaben.
Wenn du eine bereits erstellte ID des Hauptdatensatzes und dessen untergeordneten Datensätze,
die in einem Unterformular angezeigt werden, löschen wolltest, funktioniert das mit einem UNDO nicht.

Für diesen Fall - vorausgesetzt ist, wie immer, ein richtig aufgebautes Datenmodell - muss zuerst jeder untergeordnete Datensatz
der n - Seite der Beziehungen gelöscht werden und danach der Datensatz der 1 - Seite.
Also der umgekehrte Ablauf des Tabelleneintrags. Erst die Fremdschlüssel und zum Schluss der Primärschlüssel.

Nun wäre es so, dass sich das zwar mittels einer geeigneten Routine auch in das Klick-Ereignis des Schließen-Buttons implementieren ließe,
der Vorgang aber recht umständlich und an sich falsch platziert wäre. Ein eigener Button zum Löschen der Daten mit entsprechender
Sicherheitsabfrage wäre für den Zweck weit besser geeignet.

Was hat dich nun dazu bewegt, dein Vorhaben zu verwerfen, bzw. wodurch hat sich das 'erledigt' ?