![]() |
Verschiedene Kundenversionen in einem Programm pflegen??!
Hallo zusammen,
ich habe da mal wieder eine Frage, habe auch versucht über die SuchFkt. erfolgreich zu sein, was aber nicht geklappt hat. Ich habe da ein Projekt was bei verschiedenen Kunden eingesetzt wird. Viele kennen es vielleicht, der eine Kunde möchte noch dieses, der andere noch das.... :stupid: Wie bekomme ich nun eine vernünftige Verwaltung hin, ohne mit 10 verschiedenen Kundenvarianten arbeiten zu müssen. Denn wenn nun bei einer grundlegenden Fkt. etwas geändert werden muß, muß ich immer in 10 Versionen die gleiche Änderung durchführen! Mir schwebt da eine Lösung vor, in der ich ein Compilat habe bei dem ich auf einer Supervisorseite, die Einstellungen mache, wie es denn nun bei dem Kunden auszusehen hat und wie das Programm reagiert. Doch hier wird es auch schon wieder tricky und verdammt kompiliziert!??! :gruebel: Wie macht ihr denn soetwas!??! Gruß und schon mal Vielen Dank für die Hilfe.. Polarwar |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
hrm.. spontan würde mir einfallen, die Funktionen die pro Kunde unterschiedlich sind, in dll's auszulagern. Somit definierst Du einmalig die schnittstelle, ziehst die orginialimplementierung in eine allgemein DLL und lieferst dies an alle Kunden aus. Der spezial-Kunde mit der Änderung bekommt seine persönliche eigene DLL ausgeliefert.
Bei weiteren Änderungen muss Du dann nur an der dll für den einen Kunden arbeiten, eine grundlegende Änderung in dem Modul wird in die orginal-DLL eingepflegt und an alle Kunden mitverteilt. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Gedacht habe ich auch schon daran, nur konnte ich mich mit dem Gedanken nicht anfreunden.
Es geht nicht nur um funktionalität, auch der Aufbau der Form kann unter Umständen unterschiedlich sein, weil bei einem Kunden das Hauptaugenmerk auf etwas gaaanz anderem liegt, oder viel mehr vertieft wird. (Datenbanktechnisch, Abfragen, etc...) Desweiteren versuche ich immer meine Programme komplett in der Entwicklungsumgebeung auch bedienbar zu halten, damit ich zu jeder Zeit alles Testen kann. Naja, mit gewissen Vorgaben natürlich. Gibt es denn noch andere denkbare Alternativen?!? |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Wir haben dafür eine Art Db-Gestützte "Registry" verwendet (Selbstreferenzierte Tabelle mit Parent/Child). Diese lässt sich dann über Funktionen abfragen / setzen.
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Auch Forms kann man ohne weiteres in DLL's auslagern... Und eigentlich ist das der Königsweg.
Hrm.. andere Alternativen... Sehr, sehr, sehr unschön: Alle Funktionalitäten in ein Programm einbauen und je nach Konfiguration im Programmverlauf eben anstelle von Form X halt Form Y laden... Problematisch wird es, wenn sich tatsächlich grundlegende Funktionalitäten ändern und man auch nur eine kleine Sonderbehandlung bei Kunde xyz vergisst: Das führt zu ganz unschönen Bugs, die extrem schwer zu lokalisieren sind und schlimmstenfalls sogar den Datenbestand gefährden. Bevor man das anfängt ist es wirklich besser: Ein Build pro Kunde. Das kann man noch relativ gut mit automatisierten Build-prozessen handhaben, wenn man eine gemeinsame Codebasis hernimmt und die Änderungen für einen bestimmten Kunden per DIFF integriert. Will heissen: Originalsourcen nehmen - Kundenänderung einbauen - diff gegen Original fahren und ablegen. Beim Build-Prozess dann immer Originalsourcen hernehmen, build, diff Kunde 1 laufen lassen, build, originalsourcen hernehmen, diff Kunde 2 laufen lassen, build... Dauert etwas länger, und man muss natürlich aufpassen dass man wenn man den originalstand ändert auch alle diff's zu aktualisieren und ggf. in einigen Ständen nochmal von Hand nachzuarbeiten, aber das ist deutlichst weniger Buganfällig als alles in ein Projekt einzubauen. *brrr* Da schaudert es mir schon bei dem Gedanken sowas verwalten zu müssen... Nein: Die richtige und sichere und am einfachsten zu verwaltende Methode ist sicher die mit den in Module ausgelagerte DLL's. Und natürlich kannst Du auch in eigene DLL's reindebuggen und das aus der IDE raus lauffähig zu haben. Haben wir mit einem Projekt mit einem Gesamtumfang von ca. 1,6 Million Zeilen damals auch gehabt. Alles andere wäre projekttechnischer Selbstmord. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Man könnte auch mit Compiler-Switches Arbeiten. Da sollte man aber aufpassen, dass man da nicht die Übersicht verliert.
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Es gibt eben zunehmend mehr Optionen, die steuern wie sich das Programm verhalten soll. Allerdings wird von uns nicht jeder Firlefanz eingebaut, sondern vorher nachgebohrt, warum ein Kunde diese oder jene Funktion haben möchte. Wenn man verstanden hat, warum ein Kunde etwas haben möchte, kommt man häufig auf eine allgemeingültige Lösung. Beispiel: der Kunde möchte in einem DB-Grid ein bestimmtes Feld nicht sehen; es stört ihn. die allgemeine Lösung: ALLE DBGrids lassen sich nun konfigurieren auf Sichtbarkeit und Reihenfolge der Felder. Die Konfiguration wird in einer INI-Datei gespeichert. Für ganz "krumme Dinger" kann der Endkunde seine Spezialitäten in VB- oder Javascript abhandeln. Dazu wird der Windows Scripting Host verwendet. Es gibt vordefinierte Script-Funktionen mit Übergabeparametern. Wenn die Scriptfunktion in der Datei vorhanden ist, dann wird sie ausgeführt. Die Übergabeparameter sind COM/DCOM-Interfacezeiger; damit kann man relativ komplexe Dinge erledigen.
Code:
' VB-Script Beispiel
' Kunde möchte Lieferschein-Nr eingeben und mit der Orginal-Lieferscheinnummer vergleichen ' falls unterschiedlich muss ein Freigabepasswort eingegeben werden ' oder der Vorgang wird geblockt Function NachAuftragLaden2(Application, Auftrag, AuftragDetail) Input = InputBox("Bitte Lieferscheinnr. eingeben", "Lieferscheinnr-Eingabe") ' MsgBox "NachAuftragLaden (Eingabe: "& Input &")" if Auftrag.LieferNr <> Input then if Application.QueryUnlockPW = False then 'Freigabepasswort OK ? ' err.Raise 99, "User Script", "Lieferscheinnummer und Passwort falsch!" Application.Exception.Init "Lieferscheinnummer und Freigabe-Passwort falsch!" end if end if |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Also wir haben hier alle aufgelistenten wege schon versucht und sind dann am Ende ednlich bei DLLs angekommen.
Ich kann dazu nur saagen mit CompilerSwitches zu arbeiten bringt die IDE zu durcheinander weil sie nicht merh weis wass Sie debugen soll. BPL mag schön sein hab aber mich leider nie richtig mit beschäftigt(werd ich wohl auch nie). Für jeden Kunden ein eigenes Build (vergiss es) das bringt nur Ärger, änderst du was im MainProg und alle sollen es haben kannste alles ändern. DLLs geht auch mit MDI man kann alles machen damit genau wie mit BPL, einzigster nachteil die DLLs sind recht gross weil alles in jeder DLL ist. der Grosse Vorteil ist es ist einfach man muss nicht gucken das alle Delphi BPLs da sind die man braucht und man hat alles getrennt. Und nun was wir gemacht haben wir haben 2 Wegen in einem also einmal die DLLs und dann noch für kleine änderungen Switches im Code (keine Compiler Switches) eben für kleine anpassungen z.b. eine zusätzliches Feld im Kundenstamm dafür lohnt sich nicht der aufwand ein Extra Modul für den Kunden zu machen. Und die DB da haben wir einen SQL Parser Geschrieben der Lokale SQL Files liest und dann die DB den Fiels anpasst. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Wie habt Ihr MDI aus Dll in den Griff bekommen? Gruß Peter |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Wir (und andere...) haben bisher keine vernünftige Lösung hierfür gefunden. Mit Delphi 4 ging das noch wunderbar :-) |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Moin, moin,
wir machen es schon seit sehr langer Zeit so, dass die Funktionen in einem allgemeinem Programm abgehandelt werden. Alles, was kundenspez. sein könnte liegt in Scripten. Je nach dem, an welcher Stelle sich das Prog. befindet, lädt es Script a, b, c, usw. Auf diese Weise kann man auch ohne Compiler direkt vor Ort schnell etwas anpassen. Wenn das richtig durchdacht ist, hat man nur wenige Scripts und je Kunden nur 1 kundenspez. Script. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Skripte unter Delphi :gruebel:
BPL's sind im Prinzip wesentlich leichter zu handhaben unter Delphi, allerdings funktionieren die nur bei Programmen die mit gleicher Delphi Version erstellt werden... DLL's sind da unabhängiger. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Ob das aber noch alles performant ist ?
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Und für das String problem habe ich FastMM4 benutzt |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Wir verwenden ebenfalls so eine Art Script. D.h. unsere Lösung basiert auf Oracle und wir versuchen so viel wie nur möglich als PL/SQL zu implementieren.
Somit ruft Delphi die PL/SQL Skripte auf um die DB zu Ändern oder Resultate zu bekommen, etc. Gleichzeitig sind alle SQLs in der DB. Somit können die meisten Änderungen vor Ort ohne Compilieren gemacht werden. Die Formulare selbst werden über einen VisualConfigurator (leider Copyright unserer Firma) geändert. Es gibt aber Komponenten die Freeware sind und fast dasselbe können. Dort kann der Kunde zur Laufzeit das Formular ändern. D.h. er kann Felder verstecken, verschieben, umbenennen, etc. Kolonnen in Tabellen verschieben, vergrössern, etc.pp. Die Änderungen werden wiederum in der DB gespeichert. Viele Formulare haben auch eine Tabcontrol drauf. Auf diesen Tabs können verschiedene Möglichkeiten der Erfassung drauf sein (Detailiert, Schnellerfassung, Änderungen,...) oder zusätzliche Funktionen (Tab1: Erfassung, Tab2: Details, Tab3: Replikation...). Durch DB Einträge wird gesteuert, welche(s) Tab(s) angezeigt werden sollen, pro Mandant, Kunde, Gruppe, etc. Sämtliche Kundenänderungen in der DB werden mit einem "Individualisierungsflag" gekennzeichnet. D.h. wenn wir einen Major Update fahren, so werden alle nicht gekennzeichneten Prozeduren, PL/SQLs, etc. geupdated. Einziges Problem: Wenn das Update eine Änderung in einem SQL erzwingt, welches vom Kunden individualisiert wurde. Dann muss derjenige, der die Individualisierung vorgenommen hat, sich um das manuelle Updaten kümmern. Das ganze Projekt ist in hunderte von DLLs aufgeteilt. (ERP Lösung, daher...) Es ist bei über 800 KMUs im Einsatz und wir können das ganze super verwalten. Und durch die starke Auslagerung aller Funktionen in PL/SQL können wir das ganze Projekt viel einfacher mal in eine andere Sprache umsetzen. Es gibt kein einziges Modul, welches in 2 Versionen (für Kunde A / Kunde B) daherkommt. Nur Module die speziell für einen Kunden geschrieben sind (Funktionen die NUR dieser Kunde braucht). Sobald die Funktion für einen anderen Kunden auch interessant wird, gehts in den Standard über. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
hallo ken_jones,
Zitat:
Zitat:
OK, wem der schnellste Proz immer noch zu langsam ist, für den ist das nichts. Wenn ein Prog so angelegt ist, dass es auch bei <1GHz Proz nocht akzeptabel läuft, sollte man keine Probleme haben, da erst compiliert wird und dann ausgeführt. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Kannst Du denn mit den Skripten auf Klassen und Variablen deines eigentlichen Delphiprogramms zugreifen. Wie sieht es mit Datenbankbindung im Skript aus.
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Zitat:
Sollte aber auch über Wrapper funktionieren. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Warum lagerst Du denn nicht die ganze Funktionalität direkt in eine eigene Klasse aus, anstatt umständlich über Skripte zu verfahren. Denn die Trennung hast Du ja so oder so, und musst kucken dass die einzelnen Module in das richtige Kundenprogramm reinrutschen.
|
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Nicht ganz.
Skripte setzen wir in versch. Bereichen ein: 1.) Konfiguration, weil mehr Möglichkeiten (dynamischer), als bei INI-Dateien. 2.) Sachen, die der Kunde selbst ändern/anpassen darf/soll. 3.) Macro's/Macro-Aufzeichnung 4.) selbstmodifizierender Code Spätestens bei 4.) wird's "hardcoded" ziemlich schwer, unübersichtlich und definitiv nicht mehr zu debuggen. zu 1.): dynamische Strukturen dürfen sich während der Lebenszeit eines Prog's für die versch Releases ändern, Feste nicht. Oder sie wachsen ins Unendliche. |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
![]() At runtime, your application users can do Moving Controls, Resizeing Controls, Deleting Controls, Creating Controls, Changing Property in the Object Inspector, Saving Controls and Loading Controls if you use the Runtime Design System. Gibts wie Sand am Meer bei Torrys: z.B.: ![]() oder ![]() |
Re: Verschiedene Kundenversionen in einem Programm pflegen??
Zitat:
Ich hoffe es is vertretbar mal zwei kleine Kästen daraus zu zitieren. Als Appetitmacher sozusagen. ;) Zitat:
Zitat:
![]() ![]() ![]() ![]() ![]() Viel Spaß damit. Es lohnt sich sicher auch die o.g. Ausgabe - sofern nicht vorhanden - nachzubestellen. Gab auch nen interessanten Artikel über UML-Tools und noch vieles mehr :) mfg, mh166 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz