Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Anzahl der Datensätze einer Tabelle ermitteln (https://www.delphipraxis.net/106777-anzahl-der-datensaetze-einer-tabelle-ermitteln.html)

f4k3 16. Jan 2008 15:35

Datenbank: Paradox • Version: 7 • Zugriff über: BDE, Datasource, TTable

Anzahl der Datensätze einer Tabelle ermitteln
 
Seid gegrüßt liebe DPler ;)

hab folgendes problem ...

ich möchte die Anzahl der Datensätze ermitteln. Dafür hab ich ein Code-Schnipsel von Delphi-Treff
mir geholt und an meine Wünsche angepasst.

Ich erzähl euch mal im groben was ich tun möchte ...

1. Datensätze einer Tabelle ermitteln
2. Counter (Variable vom Typ Integer) auf null setzten
3. Schleife beginnt. Solange mein Counter nicht größer als meine ermittelten Datensätze ist, soll in einer Variable eine Mandantennr (Integer) und in einer Variable die Mandantenbezeichnung(S : String) gespeichert werden
4. Dann möchte ich aus mit ich das in die Variable Mandantenbez (String) (Mandantenbezeichnung die beiden Variablen zusammenführen (bei der Mandantennr(= Integer) über IntToStr)
5. soll in meine ComboBox diese Mandantenbez über ADD in die Items hinzugefügt werden
6. Das solange eben die Schleife läuft (Counter nicht >= meiner ermittelten Datensätze)
7. Schleife wird beendet

mein Quellcode sieht folgendermaßen dafür aus ...
Delphi-Quellcode:
          DatenG := tMandant.RecordCount;
          Counter := 0;

          while not Counter >= DatenG do
          begin

            MandantenNr := tMandant.FieldByName('Mandantennummer').AsInteger;
                       S := tMandant.FieldByName('Bezeichnung').AsString;

            Mandantenbez := IntToStr (MandantenNr) + ' - ' + S;



            with cbMandant.Items do
            begin
               ADD (Mandantenbez);
            end;

            Counter := Counter + 1;

          end;
        end;
nur wenn ich mein programm Compiliere bekomm ich keine Fehler, ergo Programm findet keinen Fehler.
Wenn ich das Programm starte ist meine ComboBox jedoch leer.

Wisst ihr was ich falsch mach?
Ich hab irgendwie den verdacht, dass die Schleife erst gar nicht ausgeführt wird ... weiß aber nicht, wie ich das wiederlegen könnte ...

Ich hoffe ihr wisst, wie immer Rat ;)

Vielen dank scho mal ;) Euer f4k3

Bernhard Geyer 16. Jan 2008 15:44

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Vergiss den Counter und prüfe auf EOF

Delphi-Quellcode:
while not tMandant.EOF do
begin
   ...
  tMandant.Next;
end;

Du schaltest auch nicht den aktuellen Record weiter und liest deshalb immer den ersten (Textuell leeren) Datensatz ein.

DeddyH 16. Jan 2008 15:45

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Geht doch einfacher:
Delphi-Quellcode:
tMandant.First;
while not tMandant.EOF do
  begin
    cbMandant.Items.Add(Format('%d - %s',
                        [tMandant.FieldByName('Mandantennummer').AsInteger,
                         tMandant.FieldByName('Bezeichnung').AsString]));
    tMandant.Next;    
  end;
[edit] Etwas zu spät, dafür ausführlicher ;) [/edit]

hoika 16. Jan 2008 16:28

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Hallo,

ausserdem sollte hinter cbMandant.Items.Add
noch ein Application.ProcessMessages stehen.


Heiko

DeddyH 16. Jan 2008 16:42

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
IMHO sinnvoller wäre allerdings ein tMandant.DisableControls am Anfang und ein tMandant.EnableControls am Ende.

marabu 16. Jan 2008 16:58

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Hallo,

eine wichtige Frage ist vielleicht, wozu die Einträge in eine ComboBox eingetragen werden. Ich habe den unguten Verdacht, dass die verfügbaren Werte nicht nur zum Anschauen dort hinterlegt werden sollen. Zur Unterstützung der Eingabe wäre vielleicht eine DBLookupComboBox geeigneter, wobei dann die Iteration über die Tabelle ganz entfallen würde.

Grüße vom marabu

grenzgaenger 16. Jan 2008 21:49

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
sag mal, weshalb frägste nicht einfach die datenbank???

SQL-Code:
select count(*) from deinetabelle where irgendwas = kriterium;

DeddyH 16. Jan 2008 21:51

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Zitat:

Zitat von grenzgaenger
sag mal, weshalb frägste nicht einfach die datenbank???

Weil er die Anzahl eigentlich gar nicht braucht. :mrgreen:

grenzgaenger 16. Jan 2008 22:10

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von grenzgaenger
sag mal, weshalb frägste nicht einfach die datenbank???

Weil er die Anzahl eigentlich gar nicht braucht. :mrgreen:

tja, warum einach, wenn es umständlich auch geht ... :zwinker:

f4k3 21. Jan 2008 13:16

Re: Anzahl der Datensätze einer Tabelle ermitteln
 
:P

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 :P

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 :coder:

Vielen dank, Euer f4k3


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz