Neuigkeiten:

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

Mobiles Hauptmenü

Problem mit Fokus / aktivem Formular

Begonnen von tragger, August 21, 2011, 21:58:07

⏪ vorheriges - nächstes ⏩

tragger

Hallo Leute,

ich habe ein Problem, dass ich mit nicht erklären kann. Dieser Fehler tritt nur manchmal und nicht auf allen PC auf. Manchmal ist das falsche Formular aktiv. Aber warum?

Ich öffne ein Erfassungsformular aus meinem Hauptformular mit folgendem Aufruf:
Private Sub cmdNeues_Mitglied_Click()
    DoCmd.OpenForm "frmMitglieder_Erfassung", , , , acFormAdd, acDialog
    Me.Requery
    DoCmd.GoToRecord , , acLast
End Sub


Wenn alle Felder gefüllt sind, möchte ich die Daten übernehmen und öffne gleichzeitig eine Word-Datei mit folgendem Code:
Private Sub cmdMitglied_uebernehmen_Click()
    If IsNull(Me!Geschlecht) Or IsNull(Me!Anrede) Or IsNull(Me!Ansprache) _
    Or IsNull(Me!Nachname) Or IsNull(Me!Straße) Or IsNull(Me!PLZ) _
    Or IsNull(Me!Ort) Or IsNull(Me!Zahlungsart) _
    Or IsNull(Me!Eintritt) Or IsNull(Me!Mitgliedsstatus) Then
        MsgBox "Es sind nicht alle Pflichtfelder gefüllt.", 64
    ElseIf Me.Geschlecht = "f" And Me.Anrede <> "Damen und Herren" _
    Or Me.Geschlecht = "g" And Me.Anrede <> "Herr und Frau" _
    Or Me.Geschlecht = "m" And Me.Anrede <> "Herr" _
    Or Me.Geschlecht = "w" And Me.Anrede <> "Frau" Then
        MsgBox "Das Geschlecht und die Anrede stimmen nicht überein.", 64
        Geschlecht.SetFocus
    ElseIf Me.Anrede = "Damen und Herren" And Me.Ansprache <> "Firma" _
    Or Me.Anrede = "Herr und Frau" And Me.Ansprache <> "Herrn und Frau" _
    Or Me.Anrede = "Herr" And Me.Ansprache <> "Herrn" _
    Or Me.Anrede = "Frau" And Me.Ansprache <> "Frau" Then
        MsgBox "Die Anrede und die Ansprache stimmen nicht überein.", 64
        Anrede.SetFocus
    ElseIf Me.Zahlungsart = "E" And IsNull(Me.Kontonummer) Then
        MsgBox "Es muss eine Kontonummer hinterlegt werden.", 64
        Kontonummer.SetFocus
    ElseIf Not IsNull(Me.Kontonummer) And IsNull(Me.Kontoinhaber) Then
        MsgBox "Es muss eine Kontoinhaber hinterlegt werden.", 64
        Kontoinhaber.SetFocus
    ElseIf IsNull(Me.BLZ) Then
        MsgBox "Es muss eine Bankleitzahl hinterlegt werden." & vbNewLine & _
        "Alternativ Bankleitzahl 000 000 00 hinterlegen.", 64
        BLZ.SetFocus
    ElseIf Not IsNull(Me.Austritt) And Me.Mitgliedsstatus = "Aktiv" Then
        MsgBox "Ein ausgetretenes Mitglied kann nicht mehr aktiv sein.", 64
        [Mitgliedsstatus].SetFocus
    ElseIf IsNull(Me.Austritt) And Me.Mitgliedsstatus = "ausgetreten" Then
        MsgBox "Es muss ein Austrittsdatum hinterlegt werden", 64
        [Austritt].SetFocus
    Else
        DoCmd.RunCommand acCmdSaveRecord
        Dim db As Database
        Set db = CurrentDb
        Dim objword As Object
        Dim worddoc As Object
        Dim VORLAGE As String
        Dim Titel As String
        Dim zusatz As String
        Dim Datum_Heute As Date
        Dim Datum_Ziel As Date
       
        ' aktuelles Tagesdatum
        Datum_Heute = Date
        ' Mitgliedsnummer ermitteln
        customer = Me.MitgliedsNr
        Set objword = CreateObject("Word.Application")
        ' Öffnen der Vorlagedatei
        VORLAGE = CurrentProject.Path & "/Vorlagen/Begruessung1.0.dotx"
        Set worddoc = objword.Documents.Add(Template:=VORLAGE)
        ' Beginnen, die einzelnen Bookmarks zu füllen
        objword.Visible = True
        With worddoc
            .bookmarks("Mitgliedsnummer").range = customer
            ' Empfängerfeld füllen
            .bookmarks("Anrede").range = Nz(Me.Ansprache, "")
            If IsNull(Me.Titel) Then
                .bookmarks("Vorname").range = Nz(Me.Vorname, "")
            Else
                Titel = Me.Titel & " "
                .bookmarks("Vorname").range = Nz(Titel, "") & Nz(Me.Vorname, "")
            End If
            If Not IsNull(Me.Prädikat) Then
                zusatz = Me.Prädikat & " "
                .bookmarks("Nachname").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
            Else
                .bookmarks("Nachname").range = Nz(Me.Nachname, "")
            End If
            .bookmarks("Straße").range = Nz(Me.Straße, "")
            .bookmarks("Postleitzahl").range = Nz(Me.PLZ, "")
            .bookmarks("Ort").range = Nz(Me.Ort, "")
            .bookmarks("Datum").range = Nz(Datum_Heute, "")
            ' Ansprache definieren
            If (Me.Anrede = "Damen und Herren") Then
                .bookmarks("Ansprache").range = "Sehr geehrte " & Nz(Me.Anrede, "") & ","
            ElseIf (Me.Anrede = "Frau") Then
                .bookmarks("Ansprache").range = "Sehr geehrte " & Nz(Me.Anrede, "") & " " & Nz(Titel, "") & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
            ElseIf (Me.Anrede = "Herr") Then
                .bookmarks("Ansprache").range = "Sehr geehrter " & Nz(Me.Anrede, "") & " " & Nz(Titel, "") & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
            ElseIf (Me.Anrede = "Herr und Frau") Then
                .bookmarks("Ansprache").range = "Sehr geehrter " & Nz(Me.Anrede, "") & " " & Nz(zusatz, "") & Nz(Me.Nachname, "") & ","
            Else
                MsgBox "Fehler! Keine Anrede hierfür formuliert", 16
            End If
            ' Zieldatum ermitteln
            Datum_Ziel = DateAdd("d", 14, Datum_Heute)
            .bookmarks("Zieldatum").range = Nz(Datum_Ziel, "")
            ' Einzugsermächtigung füllen
            If IsNull(Me.Titel) Then
                .bookmarks("Vorname2").range = Nz(Me.Vorname, "")
            Else
                Titel = Me.Titel & " "
                .bookmarks("Vorname2").range = Nz(Titel, "") & Nz(Me.Vorname, "")
            End If
            If Not IsNull(Me.Prädikat) Then
                zusatz = Me.Prädikat & " "
                .bookmarks("Nachname2").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
            Else
                .bookmarks("Nachname2").range = Nz(Me.Nachname, "")
            End If
            .bookmarks("Straße2").range = Nz(Me.Straße, "")
            .bookmarks("Postleitzahl2").range = Nz(Me.PLZ, "")
            .bookmarks("Ort2").range = Nz(Me.Ort, "")
            .bookmarks("Mitgliedsnummer2").range = Nz(customer, "")
            If IsNull(Me.Titel) Then
                .bookmarks("Vorname3").range = Nz(Me.Vorname, "")
            Else
                Titel = Me.Titel & " "
                .bookmarks("Vorname3").range = Nz(Titel, "") & Nz(Me.Vorname, "")
            End If
            If Not IsNull(Me.Prädikat) Then
                zusatz = Me.Prädikat & " "
                .bookmarks("Nachname3").range = Nz(zusatz, "") & Nz(Me.Nachname, "")
            Else
                .bookmarks("Nachname3").range = Nz(Me.Nachname, "")
            End If
            .bookmarks("Straße3").range = Nz(Me.Straße, "")
            .bookmarks("Postleitzahl3").range = Nz(Me.PLZ, "")
            .bookmarks("Ort3").range = Nz(Me.Ort, "")
            .bookmarks("Ort4").range = Nz(Me.Ort, "")
        End With
        objword.Visible = True
        Set worddoc = Nothing
        Set objword = Nothing
        DoCmd.Close
    End If
End Sub


In der vorletzten Zeile habe ich den Befehl "doCmd.close", der manchmal leider das falsche Formular schließt. Ist der Aufruf nicht sauber geschrieben, oder warum kann das passieren, oder ist das ein MS-Problem???

DF6GL

Hallo,


benutze besser:

DoCmd.Close acForm, Me.Name

wenn dasjenige Formular geschlossen werden soll, in dem der akt. Code abläuft. ,  ( Prozedur "cmdMitglied_uebernehmen_Click" in Form "frmMitglieder_Erfassung")


btw:  die NZ()-Funktion kann/braucht nur auf Variablen von Datentyp Variant angewendet werden.  "Datum_Ziel" hat den Datentyp "Datum/Uhrzeit" , ähnlich bei "zusatz" vom Datentyp "Text" , was u. U. zu einem Laufzeitfehler führt.


weiterhin kann
DoCmd.GoToRecord , , acLast
den falschen Datensatz (nicht das soeben erfasste Mitglied ) liefern, je nachdem, wie die  Datenherkunft des Hautforms gestaltet ist. Besser wäre, die neu erstellte MitgliedNr zur Positionierung auf den richtigen  DS heranzuziehen.

tragger

#2
Hallo,

vielen Dank für die Tipps erst einmal, werde das erste mal testen und das zweite gleich abändern.

zu Drittens: muss ich das über findFirst machen, oder wie?

Also z.B.
Forms.frmMitglieder.Recordset.FindFirst "[MitgliedsNr]=" & Den_aus_der_Erstellung_übergebenen_String

Edit:

entfernt

DF6GL

Hallo,

ja, wenn Du den Datensatzzeiger positioneren willst.


Aber dann so:

in einem Standardmodul:
Public plngMitgliedNr as Long

im Form "frmMitglieder_Erfassung":

.
.
.
        Set objword = Nothing
plngMitgliedNr  = Me!MitgliedNr       
DoCmd.Close  acForm, Me.Name
End If



Private Sub cmdNeues_Mitglied_Click()   
DoCmd.OpenForm "frmMitglieder_Erfassung", , , , acFormAdd, acDialog   
Me.Requery   
Me.Recordset.Findfirst "MitgliedsNr= " & plngMitgliedNr
End Sub