Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Datensatz feldweise ändern
D. Annies - Mi 15.01.14 05:49
Titel: Datensatz feldweise ändern
Moin Delpher,
Das Einlesen in ein Stringgrid mache ich so:
Delphi-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: 25: 26: 27:
| procedure tform7.fsg(var tbx:TTable; Qx:TQuery); var n : integer; gef : boolean; begin gef := false; Tbx.First; Repeat if (Tbx.fieldbyname('Name').asstring = Qx.fieldbyname('NAME').asstring) and (Tbx.fieldbyname('VorName').asstring = Qx.fieldbyname('VorNAME').asstring) and (Tbx.fieldbyname('Klasse').asstring = Qx.fieldbyname('Klasse').asstring) then gef := true else Tbx.Next; until gef or Tbx.eof; if gef then begin stringgrid1.ColCount := Tbx.FieldCount; with stringgrid1 do begin for n := 0 to Tbx.fieldcount-1 do begin cells[n,0] := Tbx.fields[n].FieldName; cells[n,1] := Tbx.Fields[n].asstring; end; end; BuchMain.gridbreite(Stringgrid1, form7.Width, buchDM_Dlg.fontdialog1.Font.size); end else showmessage('Datensatz nicht gefunden'); end; |
Das Abspeichern zurzeit so, weil ein Dazenfeld vom Typ "Date" ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if gef then begin BuchMain.TbSchueler.edit; for n := 0 to 4 do BuchMain.TbSchueler.fields[n].asstring := stringgrid1.cells[n,1]; BuchMain.TbSchueler.fieldbyname('GEBDAT').AsDateTime := strtodate(stringgrid1.cells[5,1]); for n := 6 to stringgrid1.ColCount-1 do BuchMain.TbSchueler.fields[n].asstring := stringgrid1.cells[n,1]; BuchMain.TbSchueler.post; filesetdate(BuchMain.Label30.Caption+extractfilename(BuchMain.TbSchueler.tablename), datetimetofiledate(now)); showmessage('Person aus ' + BuchMain.TbSchueler.tablename + #13 + 'wurde geändert: ' + datetimetostr(now)); |
geht das nicht eleganter?
Mir schwant so etwas wie .asvalue.
Vielen Dank für eine Idee.
LG, Detlef
Tranx - Mi 15.01.14 07:44
Frage:
Warum ein stringgrid? Wenn Du eh eine Datenbank nutzt, dann geht das doch mit DBGrid genauso, wenn nicht besser, oder? Du kannst ja dann (bei TQuery als Datensatzkomponente) in der SQL Deine Vergleichswerte als Auswahlkriterien nehmen. (Gegebenenfalls als Parameter)
Dann benötigst Du keine Einleseprozedur mehr. Und wenn Du die Werte speichern willst, kannst Du das ja dann in einer neuen Tabelle ebenfalls tun. Gleichzeitig kannst Du die aktuellen Auswahldaten ja auch editieren.
jasocul - Mi 15.01.14 08:55
Ja, so ein TDBGrid wäre vermutlich erheblich einfacher.
Zur Frage:
Was du meinst ist "AsVariant". Getestet habe ich das aber nicht.
Deine erste Prozedur ist aber nicht sicher. Was passiert, wenn tbx oder qx leer ist? Dann wirst du in der Repeat-Schleife eine Exception bekommen.
Also entweder eine While-Schleife oder vorher prüfen, ob die DataSets nicht leer sind, bevor es in die Schleife geht.
WasWeißDennIch - Mi 15.01.14 09:07
IIRC nicht AsVariant, sondern Value. Wobei ich mich auch frage, wozu das StringGrid. Und mir ist noch etwas anderes aufgefallen:
Zitat: |
Delphi-Quelltext 1:
| BuchMain.gridbreite(Stringgrid1, form7.Width, buchDM_Dlg.fontdialog1.Font.size); | |
Hier wird auf die benannte Instanz zugegriffen statt auf die eigene. Das kann gutgehen, muss aber nicht. Besser wäre es, das "form7." ganz wegzulassen oder durch "Self." zu ersetzen, dann wird auch garantiert immer die eigene Instanz angesprochen.
jasocul - Mi 15.01.14 09:36
Zitat: |
property Value: Variant read GetAsVariant write SetAsVariant; |
Zitat: |
property AsVariant: Variant read GetAsVariant write SetAsVariant; |
Da scheinen wir wohl beide Recht zu haben. :wink:
AsVariant ist für mich aber klarer, da ich bei Value gedanklich von numerischen Werten ausgehe. Aber das ist natürlich Geschmackssache.
Interessanterweise ist die Beschreibung der beiden Properties in der Delphi-Hilfe aber unterschiedlich. Kann sich dann aber jeder selbst durchlesen.
WasWeißDennIch - Mi 15.01.14 09:54
Stimmt, ich habe auch mal nachgesehen. Da beide Properties exakt dieselben Getter und Setter verwenden, muss es ja auch exakt dasselbe sein, nur eben unter unterschiedlichen Bezeichnern ;)
Tranx - Mi 15.01.14 10:25
Das mit dem AsValue und AsVariant ist ja eigentlich logisch. Denn Variant ist ja - wie der Name schon sagt - ein variabler Typ, der zuweisungskompatibel zu allen anderen Typen sein muss. Es besteht nur ein Problem, wenn die beiden Tabellen unterschiedliche Typendeklarationen der Felder haben. z.B. QX beim Datenfeld String und TX DateTime. Dann könnte es sein, dass Exceptions bei der Zuweisung auftreten. Hier wäre dann sinnvollerweise ein Try .. except .. end-Konstrukt einzusetzen.
D. Annies - So 19.01.14 04:39
vielen Dank, Detlef
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!