Neuigkeiten:

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

Mobiles Hauptmenü

VBA Projekt als Klassenbibliothek

Begonnen von Milvus, Oktober 23, 2018, 16:33:17

⏪ vorheriges - nächstes ⏩

Milvus

Hallo zusammen,

kurze Frage in die Runde. Es besteht kein Problem direkt, ich möchte eher Erfahrungswerte tauschen.

Problemstellung: Es gibt mehrere Frontends. Einige enthalten "a lot of" Code, bei anderen gehts so. Der Code hat große Schnittmengen, heißt Funktionen etc. sind gleich (manchmal aber auch nicht, da es sich im ein gewachsenes Objekt handelt). Und da bin ich auch schon am Punkt:

Ich will die Redundanz des Codes vermeiden. Ich habe etliche Module mit untershiedlichen Funktionen, Subs, die extrem kaskadiert sind usw. (Stress!)

Meine Idee: Ich möchte sämtlichen Code in ein VBA-Projekt stecken. Mit den Verweisen sollte es keine Knoflikte bei den unterschiedlichen Forntends geben (außer bei Versionen). Soweit es möglich ist, will ich so viel wie möglich in Klassenmodule verfrachten, und somit eine Art "Klassenbibliothek" aufbauen.

Das Projekt will ich dann in die Frontends per VBA Verweis einbinden.

Also in Richtung 3-Schicht Modell (Formularcode bleibt im Frontend, der Rest des Codes wird zentralisiert)

Habt Ihr Erfahrungen damit?
Geht das und taugt die Idee?

Wäre für jede Rückmeldung von Leuten, die sowas schon mal gemacht haben sehr dankbar.

DF6GL

Hallo,

du kannst alle Prozeduren in eine separate DB-(Datei) einbauen und die DB-Datei als Verweis in das FE einbauen.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Wurliwurm

Zitat von: Milvus am Oktober 23, 2018, 16:33:17
Also in Richtung 3-Schicht Modell (Formularcode bleibt im Frontend, der Rest des Codes wird zentralisiert)

Habt Ihr Erfahrungen damit?
Geht das und taugt die Idee?
Mit Access und VBA eine 3-Schicht-Anwendung bauen zu wollen ist gelinde gesagt äußerst kreativ, hart gesagt absurd. Wirklich gehen tut es sowieso nicht, weil eine 3-Schicht-Anwendung in der Middleware einen eigenen Prozess hat. Was Du beschreibst, ist ein Zugriff auf Bibliotheken.
Access ist sehr schön intuitiv und man kann viele schnelle Erfolgserlebnisse damit haben. Aber es hat Gründe, warum es nicht für größere Anwendungen benutzt wird.

Milvus

#3
Zitat von: Wurliwurm
Mit Access und VBA eine 3-Schicht-Anwendung bauen zu wollen ist gelinde gesagt äußerst kreativ, hart gesagt absurd. Wirklich gehen tut es sowieso nicht, weil eine 3-Schicht-Anwendung in der Middleware einen eigenen Prozess hat.

Ich ahne ungefähr, was Du meinst, da wir in VBA keine Vererbung realisieren können. Gut es gibt immerhin Schnittstellen.

Unter 3Schicht meinte ich relativ simpel: Formularlogik ist in den Formularen und alles was sich "als Prozess oder Funktionalität" kapseln lässt kommt in Klassenmodule. Allgemeine Funktionen kommen in normale Module und sind nur in der Peripherie der Architektur. Allgemeine Prozeduren gibt es am besten gar nicht. 
Die Daten befinden sich natürlich im Backend.

Die Klassenmodule können voneinander abhängen, was sich beim intitialisieren bereits festlegen lässt.

Somit wäre damit schon ein relativ hoher Grad an eine Klassenarchitektur erreichbar, wenn auch keine echte.
So meinte ich das. Für meine Fälle jedenfalls absolut ausreichend.


markusxy

Grundsätzlich spricht nichts gegen dein Vorhaben.
Im Detail wird man dann mit zunehmender Erfahrung Konzepte anpassen und verändern.

Bezüglich Klassen in eingebundenen Access Dateien:
Das hat auch diverse Vorteile.
Da es in Access keine Konstruktoren gibt, kann man dann Factory Funktionen einsetzen.
Man kann genau steuern ob Klassen im Frontend mittels New Operator, Factory Funktionen, beiden Methoden oder gar nicht erstellt werden können.
Abgesehen davon - das Friend Schlüsselwort kann man nur in solchen Konstruktionen einsetzen und das bietet dann eine Reihe zusätzlicher Möglichkeiten, wenn Klassengruppen zusammenwirken.
LG Markus

Milvus

Zitat von: markus888 am Oktober 24, 2018, 08:45:20
Grundsätzlich spricht nichts gegen dein Vorhaben.
Man kann genau steuern ob Klassen im Frontend mittels New Operator, Factory Funktionen, beiden Methoden oder gar nicht erstellt werden können.
Abgesehen davon - das Friend Schlüsselwort kann man nur in solchen Konstruktionen einsetzen und das bietet dann eine Reihe zusätzlicher Möglichkeiten, wenn Klassengruppen zusammenwirken.
LG Markus

Da hab ich meinen Meister gefunden. Keine Idee, wovon Du sprichst. Hört sich aber so an, als dass ich es wissen will. Einen Vorschlag, wo ich mich da einlesen kann?
Ich hab so'n Buch mit >1000 Seiten, da werde ich aber bestimmt nichts finden, sonst wäre ich schon drüber gestolpert.


Milvus

Ich habe soeben folgendes versucht:

Expernes Projekt einbinden: OK
Ein Klassenmodul aus dem fremden Projekt deklarieren: FAILED!

Hat einer eine Idee, ob/wie man sowas machen kann?

Lachtaube

Lege ein Modul in der Library-DB an und erstelle eine Funktion, die eine Klassen-Instanz erzeugt und aus jedem Frontend, das diese Library-DB verknüpft, aufgerufen werden kann.

Public Function CreateMyClass() As MyClass
   Set CreateMyClass = New MyClass
   'ggf. weiter über Argumente initialisieren
End Function
Grüße von der (⌒▽⌒)

markusxy

Zitat von: Milvus am Oktober 24, 2018, 18:58:17
Einen Vorschlag, wo ich mich da einlesen kann?

Nein, aber durch das Forum, das www bzw. eigenes Überlegen sollten sich alle Punkte klären lassen.
Was verstehst du denn konkret nicht?

Um Klassen aus externen Bibliotheken nutzen zu können sollte man die VB Attribute entsprechend ändern.
Bei der Standard Einstellung kann man kein Objekt einer Klasse erstellen.
Dazu erstellst du eine neue Klasse und exportierst sie in ein Textfile.
Das geht per VBA mittels der versteckten Application.SaveAsText Methode - Import dann mittels LoadFromText. Oder eben mittels Datei importieren/exportieren.

Dann musst du die Attribute ändern und die Datei wieder importieren.
Im Prinzip sind die Namen der Attribute schon selbsterklärend.
Ansonsten findet sich alles im www, bzw. teste einfach selbst und schau wie weit du selbst kommst.
Dazu möchte ich noch anfügen, dass man zwar alle Attribute ändern kann, Access beim importieren aber manche Änderungen wieder zurücksetzt. Du wirst also nur durch erneutes exportieren erfahren wie die Einstellungen tatsächlich aussehen.

Lachtaube hat jetzt mal ein Beispiel für eine Factory Methode geliefert.
Zu etwa 60% übergebe ich an eine solche Methode auch Argumente um das Objekt zu initialisieren.
Die Sub erstelle ich nicht Public sondern mit Friend.
Dann kann das Objekt tatsächlich nur über diese Factory Funktion initialisiert werden.

Das geht aber auch ohne Factory Funktion, indem man über die Attribute gleich festlegt, dass ein Objekt erzeugt werden darf. Das kann man nach belieben einsetzen.

Viel Erfolg. Markus

Milvus

Zitat von: Lachtaube am Oktober 25, 2018, 12:35:57
Lege ein Modul in der Library-DB an und erstelle eine Funktion, die eine Klassen-Instanz erzeugt und aus jedem Frontend, das diese Library-DB verknüpft, aufgerufen werden kann.

Public Function CreateMyClass() As MyClass
   Set CreateMyClass = New MyClass
   'ggf. weiter über Argumente initialisieren
End Function


Perfekt, ja bestätige läuft. Super, herzliches Dankeschön! :D

Hat jemand Erfahrung mit der Perfomance, wenn >30 Forntends darauf zugreifen? Also alle auf das gleiche Projekt in der gleichen Datei verweisen.
Ich würder erwarten, dass das keine Probleme macht, da ich nur Klassenmodule einbinen will und die dienen ja nach Literatur nur als Vorlage für das jew. Objekt, welches dann ja in dem jew. Frontend erzeugt wird (und nicht im eingebundenen Projekt).

Milvus

Hi Marcus,

ich glaube das geht schon weiter als das Einbinden eines VBA-Projekts.
Aber das passt ganz gut in mein Konzept. Ich werde erst mal einige Klassenmodule sammeln und die zentral in einem Projekt zur Verfügung stellen. Dann glaube ich, ist der Schritt in eine echte Bibliothek nicht mehr so groß.

Du sprichts von einer "echten" Klassenbibliothek nehme ich an?

Lachtaube

Theoretisch sollte keine Behinderung auftreten, wenn mehrere Anwender die Bibliothek parallel nutzen-denn der Code wird ja im jeweiligen Frontend ausgeführt. Einen Mehrwert einer zusätzlichen Bibliothek-Datenbank gegenüber zentralem Code im Frontend sehe ich jedoch nicht. Im Mehrbeutzerbetrieb müsste das Ding ja entweder auf einem Netzwerk-Share liegen oder parallel mit dem Frontend verteilt werden.
Grüße von der (⌒▽⌒)

Milvus

Zitat von: Lachtaube am Oktober 26, 2018, 22:39:08
Einen Mehrwert einer zusätzlichen Bibliothek-Datenbank gegenüber zentralem Code im Frontend sehe ich jedoch nicht. Im Mehrbeutzerbetrieb müsste das Ding ja entweder auf einem Netzwerk-Share liegen oder parallel mit dem Frontend verteilt werden.

Es gibt unterschiedliche Frontends und der Code soll nur einmal gepflegt werden. Das ist der Sinn dahinter. Liegt auf dem gleichen Netzwerk, wie die restlichen Frontends auch.

markusxy

Zitat von: Milvus am Oktober 26, 2018, 20:11:43Du sprichts von einer "echten" Klassenbibliothek nehme ich an?

Es geht um Klassenmodule.
Bei einem Standard-Modul gibt es nichts zu verändern.

Milvus

Bin auf ein neues Hindernis gestoßen.

Situation:

Ich habe ca. 20 verschiedene Frontends. Jedes dieser Frontends wird an n (n>1) verschiedene Personen in individuelle Nuterzordner verteilt, als mde-Datei!

Ziel: Für cls-Module soll es nur eine zentrale VB-Projekt-Datei geben, an der "Programmiert" wird. Nun gibt es die Möglichkeit, dass alle Frontends (das werden locker über 100 im tägl. Betrieb) auf diese zentrale Datei einen VB-Verweis haben. Das funktioniert soweit auch im Testbetrieb.

Was ich aber lieber machen würde, wäre, dass bei der Verteilung der Frontends auch die zentrale VB-Projekt-Datei mit verteilt wird (in den gleichen Nutzer-Ordner). Damit das dann funktioniert, muss beim Öffnen der Datei, der VB-Verweise einmalig neu gesetzt werden.

Jetzt zum Problem: Das neu Setzen des Verweises zum VB-Projekt funktioniert zwar bei mdb-Dateien, nicht aber bei einer kompilierten mde-Datei.  >:(

Kann mir da jemand helfen, einen Tipp geben?