Autor |
Beitrag |
Flash106
      
Beiträge: 234
D7 Ent
|
Verfasst: Sa 25.09.04 15:52
Hallo.
Ich habe eine SQL DB mit mehreren Tabellen und möchte jetz aus einer Tabelle alle Felder auslesen und in das dazugehörige Feld im Formular eintragen. Das habe ich schon geschafft der Hacken ist das das seeeehr lange dauert...  ... Es sind rund 120 Felder in der Tabelle.
Der Code funktioniert so das er sich im Formular das erste Feld schnapp z.b. ein Editfeld names edName dann schneidet er das ed ab und hängt ein v vorne ran das also rauskommt vName. Sooo dann guck er in der Tabelle nach dem Feld vName guckt was drinn steht und schreibt es in edName rein.
Die Abfrage erfolt wie folgt:
Quelltext 1: 2: 3:
| SQLQuery1.SQL.Clear; SQLQuery1.Sql.Add('SELECT '+ dbFeldName+' FROM vTeilnehmerTabelle WHERE vPersNr = ' + vDatensatzNr); SQLQuery1.ExecSQL; |
Ich wäre seeehr dankbar wenn jemand nen vorschlag hat das zu optimieren. DAAANKE!! =)
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 25.09.04 16:33
Das was du da machst klingt aber sehr aufwendig. Wäre es nicht einfacher, datenbanksensitive Elemente zu verwenden?
Na gut, wenn du es aber so machen willst, OK.
Du solltest aber nicht für jedes Datenbankfeld die Query aktivieren. Bei großer Datensatzanzahl, wird das selbstverständlich sehr langsam.
Das beste wäre, wenn du die Query mit allen Feldern öffnest, wenn möglich mit nur einem (oder keinem) Datensatz. Mit der Fields-Property kannst du dann durch alle Felder gehen:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| SQLQuery1.SQL.Clear; SQLQuery1.Sql.Add('SELECT * FROM vTeilnehmerTabelle WHERE vPersNr = ' + vDatensatzNr); SQLQuery1.ExecSQL; for zaehler := 0 to SQLQuery1.FieldCount - 1 do begin // Ob das wirklich FieldCount heißt, musst du nochmal nachschauen // Was du dann mit Fields[zaehler] machst, ist dann deine Sache end; |
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Sa 25.09.04 17:02
Flash106 hat folgendes geschrieben: | Hallo.
..
Quelltext 1: 2: 3:
| SQLQuery1.SQL.Clear; SQLQuery1.Sql.Add('SELECT '+ dbFeldName+' FROM vTeilnehmerTabelle WHERE vPersNr = ' + vDatensatzNr); SQLQuery1.ExecSQL; | |
Hi,
vier dinge
1. Gibt es einen Index über dem Feld vPersNr? Wenn nein, schleunigst anlegen.
2. Ansonsten muss ich jasocul recht geben.
3. Es heißt SQLQuery.Fields.Count und nicht FieldCount
4. Ansonsten würde ich aber auch nicht ExecSQL nehmen, sondern Open.
Gruß
ken
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 25.09.04 17:09
CenBells hat folgendes geschrieben: |
4. Ansonsten würde ich aber auch nicht ExecSQL nehmen, sondern Open.
|
Uuups. Hatte ich glatt übersehen.
|
|
Flash106 
      
Beiträge: 234
D7 Ent
|
Verfasst: Sa 25.09.04 17:11
Ok danke erstmal.. das von jasocul hat gut geklappt.. ähm wegen dem Index... ich hab mal was darüber gelesen aber wozu ich sowas brauche hab ich nich wirklich gefressen... mag mir das jemand erklären? was macht denn son index? bzw was kann ich damit anfangen?
=) daaaaanke
Bianca
UPS!! ich hab da was übersehen.. mit FieldCount liefert mir null!!  .. und zwar beide Fieldcount sowie fields.count... *schnief* ... häää?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 25.09.04 17:18
Früher in der EDV-Steinzeit war ein Index gut zu Sortieren.
Heute sind SQL-DBs ohne Index nahezu undenkbar. Jede größere Tabelle sollte ein Primary-Key (Hauptindex) besitzen. Dieser MUSS eindeutig sein. Alle anderen Indexe greifen dann über eine Index-Tabelle (oder ähnlich Konstrukte) auf den Primär-Index zu, der dann genau weiß, welcher Datensatz (am besten über die physikalische Adresse) aus der Daten-Tabelle geholt werden soll.
Wie dieses organisiert wird, ist sehr datenbankabhängig und würde hier auch wohl zu weit führen. Wenn es dich wirklich interessiert, solltest du dich um entsprechende Nachschlagewerke bemühen. Wenn du schon auf eine DB festgelegt bist, dann am besten gleich die Literatur für eben diese DB.
|
|
Flash106 
      
Beiträge: 234
D7 Ent
|
Verfasst: Sa 25.09.04 17:23
aahh Index = Key!! ja klar den hab ich drinn  hehe.. ja ok... ähm was mach ichn jetz wegen dem fieldcount problem? dachte erst es funkt super aber ich krieg 0 zurück für die anzahl der felder... 
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 25.09.04 17:26
Hast du schon die Korrektur von ExecSQL zu Open gemacht?
|
|
Flash106 
      
Beiträge: 234
D7 Ent
|
Verfasst: Sa 25.09.04 17:30
ah ja gut danke.. geht so .. aber die felder sind alle leer.. die edit felder etc...
hier mal der komplette source:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| SQLQuery1.SQL.Clear; SQLQuery1.Sql.Add('SELECT * FROM tbTeilnehmerTabelle WHERE vPersNr = ' + vDatensatzNr); SQLQuery1.Open; for zaehler := 0 to SQLQuery1.Fields.Count - 1 do begin dbFeldName := getFirstValue('SELECT column_name FROM DB.information_schema.columns WHERE table_name = ' + QuotedStr('tbTeilnehmerDuB') + ' and ORDINAL_POSITION = ' + IntToStr(zaehler)); KomponentenName := dbFeldName; delete(KomponentenName,1,1); edKomponentenName := 'ed'+Copy(KomponentenName,1,length(KomponentenName)); chbKomponentenName := 'chb'+Copy(KomponentenName,1,length(KomponentenName)); cmbKomponentenName := 'cmb'+Copy(KomponentenName,1,length(KomponentenName)); for j:=1 to Form.ComponentCount - 1 do begin komponente := Form.Components[j];
if (komponente is TEdit) then if ((komponente as TEdit).name = edKomponentenName) then (komponente as TEdit).text := FeldInhalt else if (komponente is TCheckbox) then if (komponente as TCheckbox).Name = chbKomponentenName then begin if Feldinhalt = 'J' then (komponente as TCheckbox).Checked := true else (komponente as TCheckbox).Checked := false; end; end; end; |
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Sa 25.09.04 17:37
Hast du schon mal die Feldinhalte anzeigen lassen?
Quelltext 1:
| ShowMessage(SQLQuery1.FieldByName('<feldname>').AsString); |
Wenn du dabei Daten angezeigt bekommst, solltest du deine Edit-Felder noch füllen, bzw. DBEdit-Felder verwenden. Vergiss nicht, dass du dann noch eine TDataSource-Kopmonente benötigst, die dann mit der Query verbunden werden muss. Die DBEdit-Felder müssen natürlich auch korrekt mit der TDataSource verbunden sein und das Datenfeld muss ausgewählt werden. Sorry, wenn ich dir Dinge erzähle, die du schon weißt, aber ich habe keine Ahnung, wie weit du dich auskennst.
Ansonsten versuche es doch erstmal mit einem TDBGrid. Man bekommt dann schneller einen Überblick.
So, bin jetzt mal ne Stunden weg.
|
|