Hallo!
Ich habe da ein Problem mit einem unter Formular
ich habe ein Formular erstellt das an die Tabelle für die Informationen zur Übergabe an Word gebunden habe
darin enthalten ist 1 Unterformular das 2 Unterformulare enthält und 1 davon noch ein Unterformular
diese nütze ich um die Daten die für den Export an ein Word Dokument benötige werden über Buttons in den Unterformularen ins Hauptformular zu transferieren
klappt alles super
Speicher und Navigation Buttons werden im Hauptformular erst freigegeben wenn die Pflichtfelder ausgefüllt sind
Damit der Datensatz nicht gespeichert wird wenn die Pflichtfelder nicht gefüllt sind habe ich eine Prüf Funktion erster die das kontrolliert und sie in das Hauptformular so eingetragen
Private Sub Form_BeforeUpdate(Cancel As Integer)
Cancel = Not fncPruefenBeforeupdate()
End Sub
Da das Speichern ja unweigerlich beim Wechseln in das Unterformular eintritt führt das dazu wenn im Hauptformular ein Textfeld manuell geändert wurde das das Unterformular bzw. die Buttons gesperrt werden
Meine einzige Idee wäre jetzt das binden des Hauptformulars an ein Recordset gewesen
Wäre für jede Idee dank bar Gruß Frank
P.S. Unterformular ist Ungebunden
Hallo Frank,
Warum zeigst Du uns nicht den Code, der da wirklich arbeitet?
Nur zu wissen, dass die Function einen Booleanwert zurückgibt
ist nicht gerade dazu angetan etwas Hilfreiches sagen zu können.
Also poste mal den Code von "fncPruefenBeforeupdate()".
gruss ekkehard
Hi! Beaker s.a.
Hab das einfach so gemacht das wenn eins der Pflichtfelder leer ist das Cancel einsetzt damit die Felder nicht gelöscht werden sondern der wert behalten wird und es mit speichern übernommen werden kann
Hinter dem Speicher Button frage ich das ganze zusammen mit einer MsgBox ab
Als 2. Ansatz habe ich versucht das Hauptformular zusammen mit den Unterformular in ein ungebundenes Formular zu setzen also beide als Unterformular
War aber auch nichts
Wenn Canceln einsetzt wird das navigieren im anderen Unterformular gesperrt bis der Datensatz mit Me.Undo abgebrochen wird dann ist das navigieren in unterform wieder aktiviert
Private Function fncPruefenBeforeupdate()
fncPruefenBeforeupdate = True
If IsNull(Me!TxtBewerbungsVorlage) Or IsNull(Me!CboVeranstaltungDatumIDRef) Or IsNull(Me!TxtBewerbungFirma) Or _
IsNull(Me!TxtBewerbungAdresse) Or IsNull(Me!TxtBewerbungOrt) Or IsNull(Me!TxtBewerbungDatum) Or _
IsNull(Me!TxtBewerbungZeichen) Or IsNull(Me!TxtBewerbungBetreff) Or IsNull(Me!TxtBewerbungsVeranstaltung) Then
fncPruefenBeforeupdate = False
End If
End Function
Hallo Frank,
ZitatHab das einfach so gemacht das wenn eins der Pflichtfelder leer ist das Cancel einsetzt damit die Felder nicht gelöscht werden sondern der wert behalten wird und es mit speichern übernommen werden kann
Hinter dem Speicher Button frage ich das ganze zusammen mit einer MsgBox ab
So ganz klar ist mir das immer noch nicht :(
Da stimmt doch die Reihenfolge nicht; - Form_BeforeUpdate wird doch
erst durch das Speichern ausgelöst. Da ist aber keine MsgBox.
Fehlt also immer noch ein Schnipsel Code.
Wie wär's evtl. mir eine Beispiel-DB?
Unabhängig vom Problem ist mir noch aufgefallen,
1.
Private Function fncPruefenBeforeupdate()
gibt einen Wert vom Typ Variant zurück. Das verursacht
zwar keinen Fehler, da aber doch ein Boolean-Wert erwartet
wird, sollte auch ein solcher zurück gegeben werden, also:
Private Function fncPruefenBeforeupdate() As Boolean
2.
Cancel = Not fncPruefenBeforeupdate()
Wozu eine Negation? Du erwartest doch True, dann kann die
Function das ja auch so zurückgeben, also:
Cancel = fncPruefenBeforeupdate()
und
Private Function fncPruefenBeforeupdate() As Boolean
fncPruefenBeforeupdate = False
If IsNull(Me!TxtBewerbungsVorlage) Or IsNull(Me!CboVeranstaltungDatumIDRef) Or IsNull(Me!TxtBewerbungFirma) Or _
IsNull(Me!TxtBewerbungAdresse) Or IsNull(Me!TxtBewerbungOrt) Or IsNull(Me!TxtBewerbungDatum) Or _
IsNull(Me!TxtBewerbungZeichen) Or IsNull(Me!TxtBewerbungBetreff) Or IsNull(Me!TxtBewerbungsVeranstaltung) Then
fncPruefenBeforeupdate = True
End If
End Function
Ist doch auch viel logischer, wenn die Bedingung zutrifft
muss Form_BeforeUpdate auf True gesetzt werden.
gruss ekkehard
Hallo Frank,
Habe jetzt dieses gerade noch gesehen
ZitatWenn Canceln einsetzt wird das navigieren im anderen Unterformular gesperrt bis der Datensatz mit Me.Undo abgebrochen wird dann ist das navigieren in unterform wieder aktiviert
Das ist logisch, wenn Du vom HFo zum UFo wechselst
wird natürlich auch Form_BeforeUpdate ausgelöst, weil
der DS dor erst gespeichert werden muss. Was willst Du
aber im UFo naviegieren, wenn die Validitätsprüfung im
HFo ergibt, dass da noch Werte fehlen.
Das Me.Undo bricht die Eingabe im HFo komplett ab, inkl.
Leeren aller Felder. D.h. aber auch, dass Du nicht zum
UFo wechseln kannst ohne die bereits erfassten Daten
zu verlieren.
Übrigens wieder: Me.Undo ist im gezeigten Code nicht
sichtbar.
gruss ekkehard
Hallo Beaker s.a.!
Danke für die Erklärung mit der Deklaration
Das andere hab ich wohl nicht so verständlich erklärt was ich da vor hatte deshalb habe ich 2 Screenshots angehängt
(http://s7.directupload.net/images/120526/temp/summ8rnv.jpg) (http://s7.directupload.net/file/d/2902/summ8rnv_jpg.htm)
(http://s14.directupload.net/images/120526/temp/khmtww4n.jpg) (http://s14.directupload.net/file/d/2902/khmtww4n_jpg.htm)
Im linken Teil des Formulars befindet sich der Dateiexplorer in Form eines Listenfeldes (Wertliste, Ortner Inhalt)
Im mittleren Teil des Formulars befinden sich dann die Daten die zum Erstellen des Word Dokuments benutzt werden
An diesen Teil wollte ich das Formular binden wo mir wohl der weitere Aufbau des Formulars einen Strich durch die Rechnung gemacht hat da Access das nicht als Option vor sieht
Rechten Teil des Formulars befindet sich dann das Unterformular
Dieses liefert dann die hierarchischen Daten die ich zu Erstellung des Word Dokuments benötige
Das Unterformular hat also keinen direkten Bezug zum Hauptformular
Ich habe also versucht irgendwie den stattfindenden Wechsel zwischen Hauptformular, speichern der Daten und den Unterformular auszutricksen
was sich wohl in dieser Form nicht realisieren lässt
Daher habe ich das Hauptformular über ein Recordset gespeist und konnte das dann realisieren
Hier der Code dazu falls das einer brauchen kann :
Option Compare Database
Option Explicit
Private db As DAO.Database
Private rst As DAO.Recordset
Private Anzahl As Long ' Anzahl Datensätze
Public newFlagBewerbung As Boolean ' ist True bei neuem Datensatz,
' Public wegen Unterform zugriff
Private Sub Form_Load()
Set db = CurrentDb()
Set rst = db.OpenRecordset("TblBewerbungenVeranstaltung", dbOpenDynaset)
If Not rst.EOF Then
rst.MoveLast
Anzahl = rst.RecordCount
rst.MoveFirst
Else
Anzahl = 0
End If
newFlagBewerbung = False
Call Anzeigen
Mk_Dir "aktVerzBewerbungen"
CmdRefreshListe_Click
End Sub
Private Sub Anzeigen()
If Not rst.EOF Then
If Not IsNull(rst!BewerbungsVorlage) Then Me!TxtBewerbungsVorlage.Value = rst.Fields("BewerbungsVorlage") Else Me!TxtBewerbungsVorlage.Value = ""
.
.
.
Me!CrkBewerbungGedrucken.Value = rst.Fields("BewerbungGedrucken")
.
.
.
End If
Bezeichnungsfeld110.Caption = str$(Anzahl)
End Sub
Private Sub CmdMitNeu_Click()
Dim Doc As String
If rst.Updatable And rst.EditMode = dbEditNone Then
newFlagBewerbung = True
Me!TxtBewerbungsID.Value = ""
.
.
.
Me!CrkBewerbungEmail.Value = False
.
.
.
End If
End Sub
Private Sub CmdSpeichernMit_Click()
On Error GoTo Err_ErrHandler
If fncPruefen = True Then
If rst.Updatable And rst.EditMode = dbEditNone Then
If newFlagBewerbung Then rst.AddNew Else rst.Edit
If Me!TxtBewerbungsVorlage.Value <> "" Then rst!BewerbungsVorlage = Me!TxtBewerbungsVorlage
rst.Update
rst.Bookmark = rst.LastModified
Call Anzeigen
Else
MsgBox "Kein Editieren möglich!"
End If
End If
newFlagBewerbung = False
End Sub
Private Sub CmdVorheriger_ Click()
rst.MovePrevious
If rst.BOF Then rst.MoveFirst
End Sub
Private Sub CmdNaechster_Click()
rst.MoveNext
If rst.EOF Then rst.MoveLast
End Sub
Private Sub CmdMitAbbrechen_Click()
If Not rst.EOF Then
rst.MoveLast
Call Anzeigen
Call Bottons_One
newFlagBewerbung = False
End If
End Sub
Private Sub CmdVeranstaltungDelete_Click()
Dim Msg As String
If rst.Updatable And rst.EditMode = dbEditNone Then
Msg = "Möchten Sie Datensatz und das Dokument wirtklich löschen ?" & vbCr & "" & vbCr & ""
If MsgBox(Msg, vbQuestion Or vbOKCancel Or vbDefaultButton2, "Löschen ?") = vbOK Then
rst.Delete ' OK
rst.MoveNext ' zum nächsten Datensatz ...
If rst.EOF And Not rst.BOF Then rst.MoveLast ' nur wenn Tabelle nicht leer ist
Call Anzeigen
Else
Exit Sub ' Abbrechen
End If
Else
MsgBox "Datensatz kann momentan nicht gelöscht werden !", vbExclamation Or vbOKOnly, "Fehler!"
End If
End Sub
Gruß Frank
Hallo Frank,
ZitatDanke für die Erklärung mit der Deklaration
Das war ja nur so am Rande, ohne Bezug zum Problem.
Von dem verstehe ich immer weniger, aber wenn ich Dich
recht verstehe hast Du ja eine Lösung gefunden.
gruss ekkehard