Neuigkeiten:

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

Mobiles Hauptmenü

gleichartige Anweisungen auslagern

Begonnen von hajott, Juni 24, 2023, 10:09:31

⏪ vorheriges - nächstes ⏩

hajott

Hallo zusammen,

vielen Dank nochmal für eure Unterstützung, mein Formular ist fertig und funktioniert ;-)

Eine Sache stört die Funktion nicht, macht die Programmierung aber unübersichtlich: Ich habe in den UFOs viele gleichartige Anweisungen, die ich gern in ein separates Modul auslagern möchte. Auf diesem Modul habe ich auch schon das erste Erfolgserlebnis : Eine Auslagerung des Form_Load, das für alle Ufos gleich ist :

Public Sub FormularZurücksetzen(Form)
   Form.Filter = "FALSE"
   Form.FilterOn = True
End Sub
Der Aufruf erfolgt mit Übergabe des Parameters "Me".

Nun gibt es aber auch Prüfungen, die ich auslagern möchte wie dieses hier:

Private Sub Form_BeforeUpdate(Cancel As Integer)
   If IsNull(txtPersonalnummer) Or txtPersonalnummer = "" Then
      Cancel = True
      Exit Sub
   End If   
   Select Case MsgBox("Änderungen an diesem Datensatz speichern?", vbYesNoCancel, "Speichern?")
      Case vbYes
      Case vbNo
         Me.Undo
      Case Else
         Cancel = True
   End Select
End Sub

Hier war mir schon klar, dass das Unterprogramm eine Funktion sein muss, die entweder TRUE oder FALSE zurückgibt. In dem BeforeUpdate stünde nach meinem Verständnis nur
    Cancel = blnUnterprogrammPrüfung (Me, txtPersonalnummer)
Klappt aber so nicht. (Habe den Fehlversuch leider nicht gespeichert). Vermutlich habe ich das System noch nicht richtig verstanden.

Was bei mir leider auch nicht klappt ist, dass das Unterprogramm ein Feld löscht. Ich wollte
btnFilterEntfernen_Click()
   Me.Filter = "FALSE"
   Me.FilterOn = True
   txtFilter = ""
   txtFilter.SetFocus
End Sub
übergeben und dachte, das geht, wenn ich im Unterprogramm das txtFilter mit ByRef versehe, aber auch da habe ich wohl was nicht richtig verstanden.

Letztes Problem - und da spare ich mir den Mustertext: Ich habe auch Zeilen wie
    DoCmd.RunCommand acCmdDeleteRecord
drin, kann ich das auch in ein Sub übergeben?

Vielen Dank!

Hans-Jürgen

Beaker s.a.

@hajott
Zitateine Funktion sein muss, die entweder TRUE oder FALSE zurückgibt.
Den Rückgabewert musst du auch deklarieren
Public Function blnUnterprogrammPruefung (frm As Form, lgPN As Long) As Boolean
    'deine Prüfung(en)
    blnUnterprogrammPruefung = ErgebnisDeinerPruefung
End Function
Anmerkung: Es muss eine Function sein, Subs können keinen Wert zurückgeben.
In der Function musst du dann halt mit frm. statt Me. referenzieren; - gilt auch für
die anderen Routinen.
Zum Löschen
Public Sub DeleteRecord(sTblName As String, lgPK As Long)
    'evtl. Rückfrage einbauen
    CurrentDb.Execute "DELETE FROM " & tblName & " WHERE PKFeld = " & lgPK
End Sub
Um das für verschiedene Formulare verwenden zu können musst du schauen, wo du
"sTblName" beim Aufruf herholen kannst (DS-Herkunft?).

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

hajott

Hallo Ekkehard,

super, vielen Dank! Bei der Funktion war ich ja schon auf dem richtigen Wege, habe nur das "as boolean" vergessen, ärgerlich  :-\ aber jetzt funktioniert es.  8) "Delete" ebenfalls.

Zu meinem Problem
Public Sub FilterEntfernen(frm As Form)
   frm.Filter = "FALSE"
   frm.FilterOn = True
   'txtFilter = ""
   'txtFilter.SetFocus
End Sub
hattest du nichts geschrieben. Ich habe auch spätestens beim SetFocus verstanden: Ich übergebe ja nicht den Variablenwert in das Unterprogramm hin und zurück, sondern das Objekt, mit dem ja was gemacht wird. Und dann habe ich einfach mal probiert:
Public Sub FilterEntfernen(frm As Form, objFilterfeld As Object)
   frm.Filter = "FALSE"
   frm.FilterOn = True
   objFilterfeld = ""
   objFilterfeld.SetFocus
End Sub
...und - klappt ! Herzlichen Dank!