Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Damien am November 28, 2016, 10:53:08

Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 10:53:08
Hallo liebe Experten,
ich habe ein Formular zum Anlegen eines Datensatzes/Profils. Die Eingabefelder sind auf mehrere Seiten eines Registersteuerelementes verteilt. Einige der Felder sollen Pflichtfelder sein. Auf der letzten Registerseite soll sich eine Schaltfläche zum speichern des Datensatzes befinden. Bisher habe ich dafür ein Makro angelegt, aber ich würde das gerne mit VBA machen.
Beim Klick auf die Schaltfläche soll folgendes passieren:

1. Prüfung ob Pflichtfelder gefüllt sind -> wenn nicht, soll eine Messagebox (OkOnly) erscheinen "Please fill in all required fields." und der Speichervorgang soll einfach abgebrochen werden.
2. sind alle Pflichtfelder ausgefüllt soll eine Messagebox erscheinen "Save  profile?" (OkCancel) woraufhin beim OK klicken der Datensatz gespeichert wird und bei Cancel der Speichervorgang abgebrochen wird. (logisch ;D)
3. Sobald der Datensatz jetzt gespeichert wird, soll ein neues Formular "frmHome" geöffnet werden und das aktuelle Formular zum Anlagen des DS geschlossen werden.

Ich habe viel probiert, aber ich kriege das irgendwie alles nicht so unter einen Hut, wie ich es gerne hätte.

Private Sub cmdSave_Click()
...
End Sub

und
ZitatPrivate Sub Form_BeforeUpdate(Cancel As Integer)
...
End Sub

Was muss da rein?  ???
Es wäre schön, wenn das ginge ohne, dass ich die Pflichtfelder in der Tabelle auf "Eingabe erforderlich: ja" stellen müsste. Der check in der VBA dürfte reichen.

Danke schon mal, dieses Forum war mir bisher eine große Hilfe!!

Gruß D
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 11:09:28
Hallo,


was alles hast Du denn probiert?

Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!Feld1) Then
Msgbox "Feld1 nicht ausgefüllt",vbOkOnly
Me!Feld1.Setfocus
Cancel=true
End If

If IsNull(Me!Feld2) Then
Msgbox "Feld2 nicht ausgefüllt",vbOkOnly
Me!Feld2.Setfocus
Cancel=true
End If
.
.
.
If Cancel Then
If Msgbox ("Trotzdem speichern?",VbYesNo) =vbyes Then Cancel = False
End If

End Sub



Sub Form_Afterupdate()
Docmd.Close acForm,Me.Name
Docmd.Openform "frmHome"
End Sub

Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: MzKlMu am November 28, 2016, 11:59:21
Hallo,
im Anhang findest Du ein einfaches Beispiel für Pflichtfelder.
In diesem Formular geht gar nix mehr. Man kann noch nicht mal die DB beenden ohne Prüfung.
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 12:14:40
Hey,
danke schon mal für den Code.

ZitatPrivate Sub cmdCreateSave_Click()
DoCmd.Save acForm, "frmCreateNewCompanyProfile"
DoCmd.OpenForm "frmHome"
DoCmd.Close acForm, "frmCreateNewCompanyProfile"
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
MsgBox "Save as new company profile?", vbOKCancel, "save"
End Sub

So sieht es aktuell aus, ich habe mein ursprüngliches Makro zum Speichern jetzt mit den DoCmd. Operationen ersetzt.
Ist der company name nicht eingetragen kommt zwar die Messagebox, aber er schließt das Formular immer, dabei soll das erst passieren, nachdem "Save as new company profile?" OK angeklickt wurde. Sonst möchte ich, dass er den Speichern/Öffnen/Schließen Vorgang einfach abbricht.

Vorher hatte ich die Pflichtfelder als Eingabe erforderlich: ja eingestellt. Hat dann etwas gefehlt, waren die Fehlermeldungen nicht so ersichtlich, wie sie für den einfachen Anwender hätten sein sollen und das Formular ist dann trotzdem immer geschlossen worden.
Dein Code ist schon mal ein Fortschritt, wie sorge ich dafür, dass das Formular nur geschlossen wird wenn die Pflichtfelder ausgefüllt sind und der Speichervorgang bestätigt wurde?  Ich hoffe ihr versteht was ich meine.
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 13:11:50
Hallo,

vermutlich hast Du meinen Code nicht vollständig gelesen/umgesetzt...
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 13:54:40
Zitat von: DF6GL am November 28, 2016, 13:11:50
Hallo,

vermutlich hast Du meinen Code nicht vollständig gelesen/umgesetzt...
-.-' scrollen müsste man können.
Das funktioniert schon mal sehr gut, danke bis hier!
Eine "trotzdem speichern" Funktion soll es allerdings nicht geben.
Also:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
MsgBox "Company name required", vbOKOnly
Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
End Sub


Was jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll. Also nachdem Access gemerkt hat, dass alle Pflichtfelder vollständig sind eine Nachfrage vor dem speichern, sonst Abbruch und wieder im Formular, damit der Anwender, nachdem er auf speichern geklickt doch noch die Möglichkeit hat Änderungen vorzunehmen.

Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: MzKlMu am November 28, 2016, 14:48:51
Hallo,
ZitatWas jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll.
In meiner Beispieldb in #2 ist das alles drin, nicht gesehen ?
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 14:49:32
Hallo,

dann schreib halt:

.
.
If not Cancel Then
Cancel =Msgbox ("Speichern?",vbYesNo) =vbNo 
End If
.
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 16:03:12
Zitat von: MzKlMu am November 28, 2016, 14:48:51
Hallo,
ZitatWas jetzt noch fehlt ist eine Messagebox, die vor dem speichern auftaucht und noch ein mal fragt ob gespeichert werden soll.
In meiner Beispieldb in #2 ist das alles drin, nicht gesehen ?

Danke für deine Hilfe, ich habe:


Private Sub Form_BeforeUpdate (Cancel As Integer)
If Cancel = False Then
    If MsgBox("Speichern?", vbYesNo) = vbNo Then
        Me.Undo
    End If
End If
End Sub

übernommen, allerdings löscht Me.Undo alle Einträge in den Feldern, das darf nicht passieren, die Einträge die gemacht wurden sollen noch stehen bleiben um bei einem Abbruch des Speichervorgangs Ergänzungen machen zu können.

ZitatHallo,

dann schreib halt:

.
.
If not Cancel Then
Cancel =Msgbox ("Speichern?",vbYesNo) =vbNo 
End If
.

Klicke ich auf "Ja" speichert er und schließt das Formular, bei "nein" kommt eine Fehlermeldung:

"Einzelschritt"
"frmCreateNewCompanyProfile : cmdSave1 : OnClick : Eingebettetes Makro" Fehlernummer 3021

Bisher habe ich für den Savebutton ein Makro angelegt "Datensatz speichern", den VBA Code dafür habe ich bisher nicht rausfinden können.
Private Sub cmdSaveVBA_Click()
DoCmd.Save acForm, "frmCreateNewCompanyProfile"
End Sub

ist es jedenfalls nicht.  :-\

Danke für eure Geduld  :)
Titel: Schaltfläche zum Textfelder überprüfen, DS speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 16:12:53
Hallo,

Zitatallerdings löscht Me.Undo alle Einträge in den Feldern

Und um welche Maßnahme dagegen konnte es sich wohl handeln ??

Lass das Me.Undo einfach weg....



Einen Speichern-Button brauchst Du nicht.

Um das Speichern von Daten(sätzen) durchzuführen, reicht der Wechsel zu einem anderen DS oder das Schließen des Forms.

Per VBA ginge es so:

Docmd.Runcommand accmdSaveRecord

oder

Me.Dirty=false

Docmd.Save hat einen anderen Hintergrund. (sichert die Einstellungen eines Forms.)






Weiterhin:  Wirf das Makro beim Klick-Ereignis des Buttons "cmdSave1" heraus.

Titel: Re: Schaltfläche zum Textfelder überprüfen, DS speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 16:39:18
Okay also ich habe jetzt am Schluss einen "Close" Button.

Private Sub cmdClose_Click()
DoCmd.RunCommand acCmdSaveRecord
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
    MsgBox "Company name required", vbOKOnly
    Me!txtCreateCompanyName.SetFocus
Cancel = True
End If

If Not Cancel Then
Cancel = MsgBox("Speichern?", vbYesNo) = vbNo
End If
End Sub

Sub Form_Afterupdate()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "frmHome"
End Sub


Bei "Ja" funktioniert alles, bei "Nein" kommt "Laufzeitfehler '3021': Kein aktueller Datensatz."

Ich hab das Gefühl ich bin fast am Ziel.  ;D
Titel: Re: Schaltfläche zum Textfelder überprüfen, Ds speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 16:47:43
Hallo,


probier mal:

Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 17:48:17
Zitat von: DF6GL am November 28, 2016, 16:47:43
Hallo,


probier mal:

Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub

Wenn ich Daten eingebe und auf "Speichern -> Ja" gehe kommt Laufzeitfehler '2501' "Die Aktion Close wurde abgebrochen."
Bei "Nein" schließt er das Formular einfach. :/
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: DF6GL am November 28, 2016, 17:54:40
Hallo,

bei Nein ist es doch ok...


Für ja schreib noch
On Error Resume Next vor den Code...


Ansonsten lad die DB mal hier hoch..  debuggt und gezippt....


Oder schau Dir den Vorschlag vom Klaus an, ob er Deine Vorstellung trifft.
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 28, 2016, 18:30:52
Bei "Nein" soll er im Formular bleiben, mit allem was darin steht, also quasi einfach nur die Messagebox schließen, als wäre der Close-Button nicht gedrückt worden.

Nachdem ich "Error Resume Next" eingegeben habe kommt "Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Beim Klicken eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Außerhalb einer Prozedur ungültig."

Ich wünsche noch einen schönen Abend, ich schaue morgen wieder hier rein.

Grüße und noch mal danke für die Hilfe heute!
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: DF6GL am November 29, 2016, 09:51:51
Hallo,

etwa so:

Option Compare Database
Option Explicit



Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "frmHome"
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)

If IsNull(Me!txtCreateCompanyName) Then
    MsgBox "Company name required", vbOKOnly
    Me!txtCreateCompanyName.SetFocus
Cancel = True
End If

If Not Cancel Then
Cancel = MsgBox("Speichern?", vbYesNo) = vbNo
End If


End Sub


Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 30, 2016, 09:19:46
Hey,

nach wie vor schließt sich das Formular, wenn ich auf Speichern? -> Nein klicke.   :-\
Titel: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: MzKlMu am November 30, 2016, 09:26:01
Hallo,
das Schließen des Formulars musst Du aktiv verhindern. Und dazu kann nur das Ereignis "Beim Entladen" verwendet werden, weil es nur dort den Parameter Cancel gibt.

Das kannst Du alles in meinem Beispiel in #2 nachvollziehen.
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 30, 2016, 10:46:01
Also wenn ich das richtig verstanden habe, sorgt die Form_Unload Funktion dafür, dass der Anwender Access nicht versehentlich schließen kann.
Das ist aber nicht mein Ziel, ich werde leider aus dem #2 nicht all zu schlau, meine VBA Kenntnisse sind ziemlich begrenzt.

Private Sub cmdClose_Click()
DoCmd.RunCommand acCmdSaveRecord
End Sub


Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!txtCreateCompanyName) Then
    MsgBox "Company name required", vbOKOnly
    Me!txtCreateCompanyName.SetFocus
Cancel = True
End If
End Sub


Sub Form_Afterupdate()
DoCmd.Close acForm, Me.Name
MsgBox "Profile has been saved successfully", vbOKOnly
DoCmd.OpenForm "frmHome"
End Sub


Das ist jetzt mein Code, ich habe mich jetzt gegen die Messagebox (vbYesNo) vor dem speichern entschieden und dafür eine vbOkOnly eingebaut, die das speichern nach dem schließen bestätigt.
Das Problem ist, dass wenn das Pflichtfeld nicht ausgefüllt ist, der Laufzeitfehler 3021 auftaucht.

Wie kann ich den Close-Vorgang abbrechen um das entsprechende Pflichtfeld zu ergänzen und den Laufzeitfehler umgehen?
Es fällt mir schwer das aus deiner, auf meine DB zu übertragen Klaus.  :-\


Edit: Ich habe "On error resume next" an allen möglichen Stellen eingebaut, aber das hat nicht funktioniert.
Titel: Re: Schaltfläche zum Textfelder überprüfen, Datensatz speichern, Formularoperation
Beitrag von: Damien am November 30, 2016, 11:35:00
Ich habs raus! Danke euch beiden!!