Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: asiat am Februar 12, 2011, 15:30:20

Titel: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: asiat am Februar 12, 2011, 15:30:20
Hallo,

meine DB ist jezt etwas größer geworden und deswegen möchte ich mehr Übersicht verschaffen in meinem VBA Code.

also, wenn ich in einem Formular meherere Funktionen und Prozeduren habe, kann ich da mehr Übersicht verschaffen um nicht so viel scrollen zu müssen ?

Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: database am Februar 12, 2011, 15:46:05
Hallo,

die Zauberformel für dein Ansinnen heißt: Wiederverwendbarer Code

Dabei handelt es sich um Codes, also Funktionen und Prozeduren, die mit identem Code in mehreren Formularen vorhanden sind.
Diese kann man in ein Standardmodul als Public Function bzw. Public Sub auslagern und dort wo man sie benötigt
mit der Zuweisung(Function)

Dim x as Long
x = Funktionsname(Übergabeparameter)


bzw. dem Call (Sub)

Call DeineRoutine

aufrufen.

Ansonsten rate ich eher dazu Code, der in einem Formular - und nur in diesem - eingesetzt wird, auch in diesem zu belassen.

HTH

p.s. Vorsicht wenn in den Codes zuvor das Me-Schlüsselwort eingesetzt wurde - das funktioniert danach nichtmehr!
      d.h. Formularfelder sind dann entsprechend so anzusprechen ....  Forms!DeinFormular!DeinSteuerelement
Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: asiat am Februar 12, 2011, 23:54:14
genau das Me-Schlüsselwort benutze ich so gerne  :)

ich habe einige "Große" DBs angeguckt und da war eigentlich auch alles in einem Code Fenster. anscheinend werde ich weiter  scrollen müssen..
Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: Josef P. am Februar 13, 2011, 12:22:31
Hallo!

Zitatanscheinend werde ich weiter  scrollen müssen..
Nicht zu schnell aufgeben! ;)
Dein Vorhaben "nicht zu viel scrollen zu müssen" hat den positiven Nebeneffekt, dass dein Code übersichtlicher und damit besser wird - ein typische Aufgabe von Refactoring.


Ich bin ein Freund von kleinen übersichtlichen Prozeduren und Klassen mit klaren Aufgaben (Single Responsibility Prinzip).

Angenommen du hast Code, der in einem Formular verwendet wird und sonst nirgends benötigt wird.
Im ersten Schritt könntest du jene Prozeduren überarbeiten, die dir am unübersichtlichsten erscheinen. Du suchst dir z. B. in diesen Prozeduren die Code-Blöcke heraus, die eine eigenständige Aufgabe abdecken und steckst sie in eine Hilfsprozedur. (Die Prozedur lässt du noch im Formular - ob du die dann später in eine Klasse oder ein Standardmodul auslagerst, soll an dieser Stelle egal sein.)

Wenn du dann den Code betrachtest, wirst du zwar immer noch scrollen müssen, um den gesamten Code zu lesen, falls dich aber nur ein bestimmte Prozedur interessiert, wirst du den Ablauf dieser Prozedur schnell erkennen, da sie nur noch aus wenigen Zeilen besteht. Die verwendeten Hilfsprozeduren in dieser Prozedur sollten natürlich einen Nahmen haben, der deren Aufgabe beschreibt, damit du zum Lesen der einen Prozedur nicht in den Hilfsprozeduren nachschlagen musst, um zu erkennen, was dort passiert.

BTW: Falls du im Formular dann Prozeduren hast, die du auslagerst, um sie in anderen Formularen zu nutzen, mach bitte nicht den Fehler und übergib als Parameter den Namen des Formulars mit dem die allgemein verwendbare Prozedur arbeiten soll, sondern übergib die Formularreferenz.

Beispiel (nur Prinzip-Code):
Public Sub FarbenEinstellen(Byval FormName as String)
  dim frm as Form
  set frm = Forms(FormName)
  frm.Section(0).BackColor = ...
  ...
End Sub


=> Dies Prozedur würde z. B. nicht mehr mit Unterformularen funktionieren.

Public Sub FarbenEinstellen(Byval frm as Form)
  frm.Section(0).BackColor = ...
  ...
End Sub

=> Diese Prozedur funktioniert für jede Art von Formularverwendung, da mit der Refernzübergabe immer exakt angegeben wird, welche Formular-Instanz betroffen ist.

mfg
Josef

Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: asiat am Februar 14, 2011, 18:41:28
Josef P.
Danke für deine Erklehrung aber da ich ein Accessanfänger  bin, verstehe ich das nicht so ganz,
köntest du eine kleine Beispiel (*.mdb) erstellen?
Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: Josef P. am Februar 14, 2011, 20:11:00
Hallo!

Ich wüsste jetzt nicht, wie ich mit einer Beispiel-Datei die Umgestaltung von Code zeigen könnte. Ich könnte damit zwar die Ausgangsbasis und das Endergebnis zeigen, das wird dir aber nicht besonders viel bringen. ;)

Wenn du beschreibst, was im vorigen Text von mir nicht verständlich war, versuche ich das aber gerne noch einmal zu erklären.

Ein kleines Beispiel mit dem Code aus "Stundenkonto BSP EXPO.accdb" (Thread http://www.access-o-mania.de/forum/index.php?topic=13803):

Im Formular UFOsammelMA steht in den Prozeduren Datum_Click, Form_Click und Mitarbeiter_Click 3x der identische Code.
Das kannst du relativ schnell vereinfachen, wenn du aus den 3 Prozeduren 3x die gleiche Hilfsprozedur startest.

=>
Private Sub Datum_Click()
   MitarbeiterFinden
End Sub

Private Sub Form_Click()
   MitarbeiterFinden
End Sub

Private Sub Mitarbeiter_Click()
   MitarbeiterFinden
End Sub

Private Sub MitarbeiterFinden()

  Dim rs As DAO.Recordset
  Set rs = Forms![MA Sammeleingabe].RecordsetClone
 
  'im RecordsetClone von Formular2 die Id aus dem aktuellen Formular finden
  rs.FindFirst "Mitarbeiter='" & Nz(Me!Mitarbeiter, "") & "'"
  If Not rs.NoMatch Then
    'Anzeige im Formular2 mit dessen RecordsetClone synchronisieren
    Forms![MA Sammeleingabe].Bookmark = rs.Bookmark
  End If

  Set rs = Nothing
  Me.[I/O Anwesend].SetFocus

End Sub


Jetzt könntest du noch überlegen, ob du die Recordsetsuche mit FindFirst und Bookmark-Zuweisung vielleicht öfter in mehreren Formularen benötigst und diese Funktionalität in ein Standardmodul auslagerst.

Beispiel:
Wir kopieren die Prozedur MitarbeiterFinden und machen sie unabhängig vom Formularnamen und vom Filterausdruck.
Dafür übergeben wird diese beiden Informationen als Prozedurparameter:
Public Sub FindRecordInForm(ByVal frm As Form, ByVal FilterString As String)
 
  Dim rs As DAO.Recordset
  Set rs = frm.RecordsetClone
 
  rs.FindFirst FilterString
  If Not rs.NoMatch Then
    frm.Bookmark = rs.Bookmark
  End If

  Set rs = Nothing

End Sub


Diese Prozedur können wir nun innerhalb der Prozedur MitarbeiterFinden einsetze, womit diese wieder etwas übersichtlicher wird:
Private Sub MitarbeiterFinden()

  Dim FilterAusdruck As String

  FilterAusdruck = "Mitarbeiter='" & Nz(Me!Mitarbeiter, "") & "'"
  FindRecordInForm Forms![MA Sammeleingabe], FilterAusdruck

  Me.[I/O Anwesend].SetFocus

End Sub


Ich hoffe das war einigermaßen verständlich beschrieben.

Anm.: Bitte obiges nur als Beispiel für die Vorgehensweise betrachten und nicht zu sehr auf das Ergebnis bezüglich "stabiler Code" eingehen. Die Prozedur FindRecordInForm würde ich nämlich nicht so lassen, da sie zu Laufzeitfehlern führt, falls man diese Prozedur nutzt und im Formular ein ADODB statt einem DAO-Recordset verwendet wird. => Als Abhilfe könnte man in der Prozedur eine Weiche einbauen, die ich aber an dieser Stelle nicht weiter beschreiben will, das meiner Meinung nach sonst nur verwirrend wird.

mfg
Josef
Titel: Re: Quellcode auslagern, verwalten, Übersicht verschaffen ?
Beitrag von: michelig am Februar 14, 2011, 22:23:32
WOW

so sieht das also  aus , wenn einer das kann. Nun versteh sogar ich besser, was ich da zusammengeklaut habe.
Nicht schlecht mit Übersicht.

Dank  nochmals  ;D