AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Anzahl der Datensätze einer Tabelle ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl der Datensätze einer Tabelle ermitteln

Ein Thema von f4k3 · begonnen am 16. Jan 2008 · letzter Beitrag vom 21. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von f4k3
f4k3

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

Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 16:35
Datenbank: Paradox • Version: 7 • Zugriff über: BDE, Datasource, TTable
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
Sascha
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 16:44
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 16:45
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 17:28
Hallo,

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


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 17:42
IMHO sinnvoller wäre allerdings ein tMandant.DisableControls am Anfang und ein tMandant.EnableControls am Ende.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 17:58
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
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#7

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 22:49
sag mal, weshalb frägste nicht einfach die datenbank???

select count(*) from deinetabelle where irgendwas = kriterium;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 22:51
Zitat von grenzgaenger:
sag mal, weshalb frägste nicht einfach die datenbank???
Weil er die Anzahl eigentlich gar nicht braucht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#9

Re: Anzahl der Datensätze einer Tabelle ermitteln

  Alt 16. Jan 2008, 23:10
Zitat von DeddyH:
Zitat von grenzgaenger:
sag mal, weshalb frägste nicht einfach die datenbank???
Weil er die Anzahl eigentlich gar nicht braucht.
tja, warum einach, wenn es umständlich auch geht ...
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz