Um Licht ins Dunkel zu bringen ... werd ich etwas ausholen müssen ...
Und da ich nicht der Delphi Pro mit meinen bescheidenen 19 Jahren bin, bitte ich auch um ein wenig Verständnis für evtl. aus eurer Sicht nicht logische Rückschlüsse meinerseits, dazu fehlt mir einfach noch die Erfahrung in der Programmiersprache ... und ein paar Basics ...
Problem ist nur dass das Programm jetzt benötigt wird, und ich danach mit meinem schönen Büchlein "Borland Delphi 7 - Grundlangen, Profiwissen, Kochbuch" anfangen kann Delphi von A - Z mir zu verinnerlichen ...
----
Unsere Firma hat entwickelt und vertreibt ein Dealer-Management-System.
Da es als auszubildender Fachinformatiker / Systemintegration eigentlich nicht zu meinen Aufgaben gehört Applikationen zu entwickeln, es aber dennoch erwünscht wurde,
wurde ich mit Null Vorkenntnissen und einem "Delphi für Einsteiger" Buch ins kalte Wasser geschmissen.
Was auch der Grund dafür ist, dass ich eben über simple Verfahren zum Ziel komme die der Optimierung eines frisch installiertem Windows XP entsprechen
Was ich noch dazu sagen sollte, dass ich im Prinzip mit der Entwicklung nix am Hut hab, da die 1. nen andern Standort hat und 2. ich im Support bin.
Nun denn ... zu Programm selbst ...
Das Programm is ein kleines "Zusatzmodul" für unsere Kunden, dass allerdings im Stand-alone-Betrieb ausgeführt wird, und somit mehr oder weniger unabhängig von unserem eigentlich Produkt ist.
in unserem DMS befindet sich ein Planer, indem unsere Kunden Termine festhalten. Mein Zusatzmodul liest diese Termine aus der Datenbank raus, und ermöglicht es, eben diese Termine auf einem Großen Flatscreen im Verkaufsraum anzeigen zu lassen. (Mit ensprechendem Design etc.)
in unserem DMS gibt es verschiedene Mandanten (nicht zu verwechseln mit unterschiedlichen Benutzern). Da es einen "scharfen" (aktiven) Mandant gibt, auf dem der Kunde all seine Aufträge etc. bearbeitet, muss ich den aktiven Mandant in erfahrung bringen. Alle Mandanten werden hierzu in eine Datenbank gespeichert.
Dank der Registry bekomme ich zumindest das Verzeichnis, indem das Programm auf dem Server liegt. Nun brauch ich nur noch den Mandanten.
die Mandanten Datenbank liegt glücklicherweise in meinem Verzeichnis, dass in der Registry eingetragen ist.
Also stelle ich eine Verbindung zu dieser Datenbank her, lese die verschiedenen Mandanten aus und schreibe sie in die ComboBox.
In dieser ComboBox möchte ich den Kunden wählen lassen, welcher Mandant bei ihm der "scharfe" Mandant ist. Da nirgends bei uns im Programm hinterlegt ist, welcher Mandant der scharfe ist, zumindest finde ich dazu keine Information in der Dokumentation.
Wenn dies getan ist, erweitere ich meinen ermittelten Pfad um den ermittelten Mandant, da die Mandanten nur unterschiedliche Ordnernamen im Verzeichnis haben (0 , 20 , 50, etc.). In diesem Pfad liegen nun die eigentlichen Datenbanken, die ich benötige um die Termine in mein Programm zu "importieren".
Das ist eben nötig da das Produkt jeweils mit dem DMS fungieren können soll, sowie im Stand-Alone-Betrieb.
Je nach Wunsch des Kunden.
Deswegen gehe ich auch ein paar Umwege, weil das für mich die schlüssigsten Lösungen sind.
----
Nun zu einem erneuten Problem ...
Andem "Baustein" andem ich momentan hänge, wird ein Setup-Assistent. Dieser wird ausgeführt wenn das Programm zum ersten mal startet.
Der Kunde muss dann im Prinzip den Mandant nur noch auswählen in der ComboBox damit das Programm weiß aus welchem Verzeichnis er die Daten "importieren" soll.
Ich habe eine globale Variable ... (und ja ich weiß, dass es im allgemeinen als unschöne Lösung gesehen wird) ein Array deklariert.
Delphi-Quellcode:
var
fSetup: TfSetup;
aIndex : array[1..100] of Integer;
im FormCreate habe ich folgendes stehen.
Delphi-Quellcode:
procedure TfSetup.FormCreate(Sender: TObject);
var regist : TRegistry;
sDatenpfad : String;
iCounter : Integer;
begin
// In der Registry den "Net Dir" Pfad raussuchen und in dbeKFZPfad reinschreiben
regist:=TRegistry.Create;
regist.RootKey:=HKEY_LOCAL_MACHINE;
regist.OpenKey('SOFTWARE\Eichner Systems\KFZ\2.1', true);
sDatenpfad:=regist.ReadString('Net Dir');
regist.Free;
// Wenn in S nichts drin steht, also kein Pfad hinterlegt wurde soll folgendes getan werden ...
if sDatenpfad = '' then
begin
ShowMessage('Pfad nicht gefunden');
end
{ Wenn in S etwas reingeschreiben wurde, soll der sSetup in den Edit-Modus springen,
dann in dbeKFZPfad.Text der Pfad von S reingeschrieben werden und sSetup in den
Post-Modus wechseln, damit der Pfad in der Setup.db gespeichert wird }
else
begin
sSetup.DataSet.First;
sSetup.DataSet.Edit;
dbeKFZPfad.Text := sDatenpfad;
sSetup.DataSet.Post;
{ der Table tMandant, soll der Pfad + \Mandant.db als Tablename zugewiesen werden
danach wird die Table auf Active = true gesetzt}
tMandant.TableName := sDatenpfad + '\Mandant.db';
tMandant.Active := true;
sMandant.DataSet.First;
// iCounter wird initialisiert mit 0
iCounter := 0;
{ Schleife läuft solange bis Mandant.db aus dem ermittelten Verzeichnis
beim letzten Datensatz angelangt ist}
while not tMandant.EOF do
begin
{ Die Inhalte aus der Mandant.db "Mandantennummer" und "Bezeichnung"
werden in die Combobox geschrieben im Format Mandantennummer - Bezeichnung}
cbMandant.Items.Add(Format('%d - %s',
[tMandant.FieldByName('Mandantennummer').AsInteger,
tMandant.FieldByName('Bezeichnung').AsString]));
{ Der Index wird in einem Array gespeichert! Ist für spätere Prozedur notwendig
siehe cbMandantChange}
aIndex[iCounter] := tMandant.FieldByName('Mandantennummer').AsInteger;
{ In der Mandant.db wird ein Datensatz weiter gesprungen für den nächsten
Durchlauf, so wie iCounter um 1 erhöht, damit das nächste Feld im Array
beim nächsten Durchlauf verwendet wird}
tMandant.Next;
iCounter := iCounter + 1;
end;
end;
end;
Hoffe erklärt sich von selbst, bei Fragen einfach nachfragen ...
mein nächster Step ist nun aus meinem aktuellen ItemIndex mit der gespeicherten Mandantennummer in meinen Array Feldern abzugleichen.
Sprich ich habe den 3 Eintrage in der Combobox ausgewählt klicke auf den Button btnMandant (Mandant auswählen) und dann soll folgendes passieren.
Delphi-Quellcode:
procedure TfSetup.btnMandantClick(Sender: TObject);
begin
sSetup.DataSet.Edit;
tSetup.FieldByName('Mandant').AsString := IntToStr (aIndex[cbMandant.ItemIndex]);
sSetup.DataSet.Post;
end;
Ich setze meinde Datenbank auf Edit, speicher den String in meine Setup.db hinein und "speichere" dies in der Datenbank.
Ich bekomm jedoch eine Zugriffsverletzung, und weiß nicht wirklich wo die her rührt ...
such etz schon seit heut morgen und komm einfach nicht drauf was ich falsch gemacht haben könnte ... deshalb meine bitte nun an euch ...
ob ihr was findet, das womöglich zu einem konflikt führt.
Ich weiß es ist viel Text, im Sorry
Vielen dank, Euer f4k3