Autor |
Beitrag |
Morpheus1572
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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 Christian 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
      
Beiträge: 128
Erhaltene Danke: 1
WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
|
Verfasst: Mi 16.04.08 07:40
Ja mit einer Selectabfrage
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 Christian S.: Delphi- durch SQL-Tags ersetzt
|
|
Morpheus1572 
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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
      
Beiträge: 128
Erhaltene Danke: 1
WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
|
Verfasst: Mi 16.04.08 08:21
Delphi-Quelltext 1:
| Query.fieldbyname('ANZ').asinteger |
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: 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 ...
Delphi-Quelltext 1: 2: 3: 4: 5:
| var i : integer; begin I := 0; if (i = 0) then ... |
ist sicherer als einfach ein
Delphi-Quelltext 1: 2: 3: 4:
| var i : integer; begin if (i = 0) then ... |
Moderiert von Klabautermann: 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 
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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:
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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 08:32
Fast richtig, aber knapp daneben ist auch vorbei
versuch's mal so:
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 
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: Mi 16.04.08 08:36
Okay, aber ich als Anfänger werde dir jetzt noch mal vorlaut (okay eher kleinlaut) eine Korrektur schicken...
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
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 16.04.08 08:51
Morpheus1572 hat folgendes geschrieben: | Okay, aber ich als Anfänger werde dir jetzt noch mal vorlaut (okay eher kleinlaut) eine Korrektur schicken...  |
mutig, mutig ...
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
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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).
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| ADOQuery1.Active := False; ADOQuery1.SQL.Text := 'SELECT count([AG-ID]) as ANZ FROM AG'; ADOQuery1.Active := True; DatZaehler := ADOQuery1.FieldByName('ANZ').AsString; 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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 :
Delphi-Quelltext 1: 2: 3: 4: 5:
| Dataset.Close; Dataset.SelectSql.Text := 'SELECT * FROM TABELLE'; Dataset.Open; if Dataset.IsEmpty then ... |
_________________ Gruß
Hansa
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 16.04.08 15:14
Hallo Morpheus1572,
an der Stelle möchte ich dir dieses mini Tutorial ans Herz legen. Vielleicht schnappst du da noch was hilfreiches auf.
Gruß
Klabautermann
|
|
Morpheus1572 
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mi 16.04.08 22:05
Hi,
Morpheus1572 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
|
Verfasst: Do 17.04.08 18:39
hansa hat folgendes geschrieben: | Wird die Anzahl überhaupt gebraucht ? Falls nur auf leere Tabelle geprüft werden muss, dann geht es noch einfacher :
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 
      
Beiträge: 157
Win XP
Delphi 7
|
Verfasst: 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.
|
|