Einzelnen Beitrag anzeigen

Benutzerbild von f4k3
f4k3

Registriert seit: 15. Aug 2007
Ort: Nürnberg
313 Beiträge
 
Delphi 2007 Architect
 
#10

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 21. Jan 2008, 14:16


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
Sascha
  Mit Zitat antworten Zitat