Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Frank77 am Mai 24, 2012, 12:13:53

Titel: Cancel sperrt Unterformular
Beitrag von: Frank77 am Mai 24, 2012, 12:13:53
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
Titel: Re: Cancel sperrt Unterformular
Beitrag von: Beaker s.a. am Mai 24, 2012, 20:41:01
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
Titel: Re: Cancel sperrt Unterformular
Beitrag von: Frank77 am Mai 25, 2012, 22:16:57
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

Titel: Re: Cancel sperrt Unterformular
Beitrag von: Beaker s.a. am Mai 26, 2012, 01:14:34
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
Titel: Re: Cancel sperrt Unterformular
Beitrag von: Beaker s.a. am Mai 26, 2012, 01:22:57
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
Titel: Re: Cancel sperrt Unterformular
Beitrag von: Frank77 am Mai 27, 2012, 00:46:14
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
Titel: Re: Cancel sperrt Unterformular
Beitrag von: Beaker s.a. am Mai 27, 2012, 18:51:00
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