Autor Beitrag
Morpheus1572
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Mi 16.04.08 07:07 
Moin,

ich habe eine triviale Frage: wie kann ich am schnellsten herausfinden ob eine Tabelle meiner DB noch jungfräulich ist?

Hintergrund. ich muss dem user aufzeigen, dass das programm noch nicht arbeiten kann, wenn eine bzw. zwei tabellen noch nicht gefüllt sind. es klappt also einfach nicht und das muss er ändern.

nun meine frage: wie mach ich das am schnellsten?

mit einer select abfrage? ich muss wissen ob überhaupt was drin steht. ob das richtige drin steht kann ich dann ja wieder abfragen aber mir ist nicht klar, ob ich das einfacher haben kann oder ob ich mit SELECT ID FROM TabName und dann auswerte ob da was drin steht vorgehen muss.

kommt mir kompliziert vor. gehts einfacher?

Gruß Morph.
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Mi 16.04.08 07:40 
Hallo,

versuchs mal mit SELECT COUNT(*) FROM <Tabelle>

wenn result = 0 dann ist nicht drinnen ;-)

r u

René

Moderiert von user profile iconChristian S.: SQL-Tags hinzugefügt

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
Andreas Schilling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: Mi 16.04.08 07:40 
Ja mit einer Selectabfrage
ausblenden SQL-Anweisung
1:
  select count(ID) as ANZ from Tabelle					


Dann hast du nach dem Öffnen der Query im Feld "ANZ" die Anzahl Datensätze.

Moderiert von user profile iconChristian S.: Delphi- durch SQL-Tags ersetzt
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Mi 16.04.08 07:57 
Klasse Leute!

Ich fühle mich hier richtig wohl. egal mit welchem popelthema man hier aufschlägt, man wird nicht schräg angemacht. und prompt bekommt man hilfe!!! TOP!!!!!!!!!!!!!!!!!!!!!!!!!!

@Andreas Schilling: eine Frage habe ich noch. wie komme ich an den Wert von ANZ ran???

Gruß Morph.

EDIT-Nachtrag: VERGISS MEINE FRAGE BITTE!!!

Wer dumm zum denken ist, sollte lieber 2 bei Kalwas sehen... Gott!!!

Ich habe die Variable deklariert bekomme aber nun einen wert, der mich überrascht. Er beträgt nicht wie erwartet 0, sondern 4589756!!!!!!?????????????????????????

Die Tabelle ist aber leer!!! wie kommt das zustande???
Andreas Schilling
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 1

WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
BeitragVerfasst: Mi 16.04.08 08:21 
ausblenden Delphi-Quelltext
1:
  Query.fieldbyname('ANZ').asinteger					
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 16.04.08 08:23 
mit (queryname).FieldByName('ANZ').AsInteger kannste das Feld abfragen.

wenn dein Query geöffnet wurde, und der Query die eigenschaften
Eof UND Bof gesetzt hat (beide auf True), ist der ebenfalls leer
(zumindest gibt's bei den von mir genutzten Query's (FIB) diese Eigenschaften).
Desweiteren gibt es auch ein query.recordcount, ist der 0 ist ebenfalls nix im Query.

zu deinem Nachtrag:
hast du die Var zuvor initialisiert ? ein Integer uninitialisiert kann merkwürdige Werte enthalten ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var i : integer;
begin
I := 0;
// irgendwelcher code, der eventuell i anfasst, wenn nicht, ist i jedenfalls immer 0
if (i = 0then ...

ist sicherer als einfach ein
ausblenden Delphi-Quelltext
1:
2:
3:
4:
var i : integer;
begin
// irgendwelcher code, der eventuell i anfasst, wenn nicht, ist der Wert in i reiner zufall
if (i = 0then ...


Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Mi 16.04.08 08:28 
Okay Leutz,

jetzt bin ich verwirrt.

Step by Step:

1. ich habe erst mal die Variable ANZ als Integer definiert.
2. Habe ich folgenden Bockmist verzapft:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
      ADOQuery1.Active := False;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'SELECT count([AG-ID]) as ANZ FROM AG';
      ADOQuery1.Active := True;
      ADOQuery1.FieldByName('ANZ').AsInteger;
      DatZaehler := IntToStr(ANZ);
      ShowMessage('Die Anzahl der Datensätze beträgt: ' + DatZaehler);

3. habe ich ein dummes gesicht wegen der unerwartet hohen zahl gemacht. *grmph* (vielleicht doch Kalwas gucken...)


Zuletzt bearbeitet von Morpheus1572 am Mi 16.04.08 08:32, insgesamt 1-mal bearbeitet
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 16.04.08 08:32 
Fast richtig, aber knapp daneben ist auch vorbei ;)

versuch's mal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
      ADOQuery1.Active := False;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'SELECT count([AG-ID]) as ANZ FROM AG';
      ADOQuery1.Active := True;
      DatZaehler :=  ADOQuery1.FieldByName('ANZ').AsInteger;
      ShowMessage('Die Anzahl der Datensätze beträgt: ' + DatZaehler);

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Mi 16.04.08 08:36 
Okay, aber ich als Anfänger werde dir jetzt noch mal vorlaut (okay eher kleinlaut) eine Korrektur schicken... ;-)


ausblenden Delphi-Quelltext
1:
2:
3:
4:
      ADOQuery1.Active := True;
      ANZ := ADOQuery1.FieldByName('ANZ').AsInteger;
      DatZaehler := IntToStr(ANZ);
      ShowMessage('Die Anzahl der Datensätze beträgt: ' + DatZaehler);


ABER: Jetzt KLAPPT es. Ihr seid SPITZE! habe ich das schon erwähnt???


Vielen Dank Leutz. Morph.
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 16.04.08 08:51 
user profile iconMorpheus1572 hat folgendes geschrieben:
Okay, aber ich als Anfänger werde dir jetzt noch mal vorlaut (okay eher kleinlaut) eine Korrektur schicken... ;-)


mutig, mutig ... :mrgreen:

ist anz und datzaehler nicht für das gleiche (Anzahl Datensätze merken) von dir deklariert worden ??
denn dann ist anz ungefähr so nötig wie ein Loch im Kopf ... ;)

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 16.04.08 08:56 
Es ist zwar dein Ding was du für Variablen deklarierst, aber ANZ oder DatZaehler ist überflüssig (eines von beiden).
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
    ADOQuery1.Active := False;
    // ADOQuery1.SQL.Clear; <-- das brauchst du nicht, bei einer Zuweisung an SQL.Text geht das von aleine
    ADOQuery1.SQL.Text := 'SELECT count([AG-ID]) as ANZ FROM AG';
    ADOQuery1.Active := True;
    DatZaehler := ADOQuery1.FieldByName('ANZ').AsString; // das spart eine umwandlung in string
    ShowMessage('Die Anzahl der Datensätze beträgt: ' + DatZaehler);


Eine weitere Variable macht wirklich nur dann Sinn wenn du das Ergebnis noch an anderer Stelle verwenden willst.
(Dann sicherlich auch als Integer, da Stringvergleiche in IF o.ä. langsamer sind)

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 16.04.08 10:29 
Wird die Anzahl überhaupt gebraucht ? Falls nur auf leere Tabelle geprüft werden muss, dann geht es noch einfacher :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Dataset.Close;
Dataset.SelectSql.Text := 'SELECT * FROM TABELLE';
Dataset.Open;
if Dataset.IsEmpty then
...

_________________
Gruß
Hansa
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 16.04.08 15:14 
Hallo user profile iconMorpheus1572,

an der Stelle möchte ich dir dieses mini Tutorial ans Herz legen. Vielleicht schnappst du da noch was hilfreiches auf.

Gruß
Klabautermann
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Mi 16.04.08 18:06 
@zuma: naja, dadurch das ich es mir in meinem beispiel ja als ShowMessage anzeigen lasse, und die nur strings kennen, musste ich ja diese änderung vornehmen... oder bin ich da schon wieder voll aufn holzweg?

@Sinspin: deswegen habe ich derzeit ja die beiden variablen deklariert. später brauch ich die nicht mehr das ist richtig aber für dieses beispiel doch schon... zumindest funzte es bei mir nicht, bis ich deinen codeschnipsel genauer betrachtet habe und mir klar wurde wo der unterschied liegt.

@hansa: jain. vorerst wird die anzahl nicht gebraucht. da sich daraus aber mal eine server/client-aplication ergeben soll/wird ist die anzahl dann wieder von nöten.

@Klabautermann: klasse und danke. ich habe es nur kurz überflogen, fand es aber schon jetzt hilfreich. werde mich am we mal damit genauer befassen, dann kann ich u. U. weniger nerven... ;-)

bin überwältigt von der positiven resonanz. Gruß Morph.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 16.04.08 19:31 
Dann behandele trotzdem das IsEmpty. Wird die Anzahl wirklich gebraucht, dann eben das SelectSQL umbauen und zusätzlich den Output-Parameter auswerten.

_________________
Gruß
Hansa
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 16.04.08 22:05 
Hi,
user profile iconMorpheus1572 hat folgendes geschrieben:
@Klabautermann: klasse und danke. ich habe es nur kurz überflogen, fand es aber schon jetzt hilfreich. werde mich am we mal damit genauer befassen, dann kann ich u. U. weniger nerven... ;-)


es geht nicht um's nerven. Jeder von uns hat mal angefangen und stand vor ähnlichen Problemen wie du. Aber wenn man noch unerfahren ist, kann man aus Tutorials recht schnell (du musst nicht auf Antworten warten) ziemlich viele Informationen ziehen. Außerdem hat es den Vorteil, dass du einen besseren überblick über deine Möglichkeiten bekommst und du so für das eine oder andere Problem einen (besseren) Lösungsansatz finden kannst als es dir ohne diese Informationen möglich währe.

Daher solltest du häufiger mal in unserer Library vorbeischauen oder auch im Delphi Treff (und auf vielen anderen tollen Seiten ;)).

Gruß
Klabautermann
bb1898
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 17.04.08 18:39 
user profile iconhansa hat folgendes geschrieben:
Wird die Anzahl überhaupt gebraucht ? Falls nur auf leere Tabelle geprüft werden muss, dann geht es noch einfacher :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Dataset.Close;
Dataset.SelectSql.Text := 'SELECT * FROM TABELLE';
Dataset.Open;
if Dataset.IsEmpty then
...


So bald die Tabelle ein bisschen größer ist oder das Ganze im Netz stattfindet, dürfte das aber bedeutend länger dauern, weil da ja alle Felder aller Sätze angefasst und ggf. transportiert werden. COUNT(*) ist m.W. optimiert.

Ich würde mir so ein "SELECT * FROM ...", dessen Ergebnis ich nicht wirklich haben will, einfach gar nicht erst angewöhnen.
Morpheus1572 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 157

Win XP
Delphi 7
BeitragVerfasst: Fr 18.04.08 08:22 
@bb1898: ich denke auch, dass die select-anweisung bei größeren Datenmengen eine bremse ist. ich werde count(*) verwenden.