Autor |
Beitrag |
spacemanspiff
      
Beiträge: 53
Erhaltene Danke: 1
|
Verfasst: Mi 07.11.12 08:42
Hallo zusammen,
ich verzweifle ein wenig. Es hapert mal wieder an der schlechten Doku zu den Delphi-Komponenten
Folgendes:
Ich habe eine Datenbank. Auf dieser Frage ich über eine Maske Daten von Messgeräten via TQuery ab. Diese werden dann in einer DBGrid dargestellt und bei Bedarf über einen Report ausgedruckt.
Die einzelnen Messergebnisse lassen sich aber noch in andere Bezugssysteme umrechnen. In der Datenbank ist das Standardbezugssystem abgelegt. Nun möchte ich gerne ein anderes Bezugssystem wählen können (via ComboBox), die Records vom TQuery editieren (Messergebnis neu berechnen), in der DBGrid anzeigen und falls gewünscht wieder via Report ausdrucken.
Das Problem: Die einzige Lösung, mit der ich die Ergebnismenge editieren konnte macht automatisch ein Update auf der TTable, so dass meine Datensätze danach "ruiniert" sind.
Hier mein bisheriger Code. Nicht sonderlich sauber, da ich ja grad lediglich auf redundanten Daten teste, wie mein Vorhaben umzusetzen ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| RequestLive := True; Open; if chkbxUmrechnung.Checked then begin Index := Query1.RecordCount; Query1.First; for J := 0 to Index - 1 do begin Query1.Edit; Query1.Fields[2].AsFloat := Query1.Fields[2].AsFloat * Faktor; Query1.Post; Query1.Next; end; end; |
Wie muss ich die Komponenten behandeln, so dass nicht automatisch ein Update auf der Table vorgenommen wird? Geht das überhaupt? Wenn nicht, wie würdet ihr das (möglichst unkompliziert) umsetzen?
Vielen Dank und beste Grüße,
Thomas
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mi 07.11.12 09:15
Also, ich nehme an, dass Du den Wert in dem Feld nur einmal ändern möchtest, was ja Sinn macht. Ansonsten würde ja die Umrechnung mehrfach erfolgen.
Was ist, wenn Du ein zusätzliches Feld in der Datenbank anlegst, das "UMGERECHNET" heißt und als logisches Feld deklariert wird. Gleichzeitig wird das Ergenis auch wieder zurückumgerechnet, siehe Quelltext.
Dann sieht Deine Abfolge so aus:
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: 28: 29: 30: 31: 32: 33: 34:
| RequestLive := True; Open; if chkbxUmrechnung.Checked then begin Index := Query1.RecordCount; Query1.First; for J := 0 to Index - 1 do begin Query1.Edit; if not(Query1.FieldByName('UMGERECHNET').AsBoolean) then begin Query1.Fields[2].AsFloat := Query1.Fields[2].AsFloat * Faktor; Query1.FieldByName('UMGERECHNET').AsBoolean := TRUE; Query1.Post; Query1.Next; end; end; end else begin Index := Query1.RecordCount; Query1.First; for J := 0 to Index - 1 do begin Query1.Edit; if Query1.FieldByName('UMGERECHNET').AsBoolean then begin Query1.Fields[2].AsFloat := Query1.Fields[2].AsFloat / Faktor; Query1.FieldByName('UMGERECHNET').AsBoolean := FALSE; Query1.Post; Query1.Next; end; end; end; |
Hoffentlich ist es das, was Du wolltest,
Gunther
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
spacemanspiff 
      
Beiträge: 53
Erhaltene Danke: 1
|
Verfasst: Mi 07.11.12 09:33
Hi Gunther,
danke für den Vorschlag.
Leider kommt eine solche Lösung aber nicht in Frage. :-\
Ich möchte die Datenbank nicht ändern, da sie bei etlichen Kunden schon seit Jahren im Einsatz ist. Das würde dann bedeuten, dass ich eine zweite Software pflegen muss (alte und neue Kunden). Darüber hinaus ändert das ja noch immer die Daten innerhalb der Datenbank. Diese sollen aber immer im Standardbezugssystem bleiben, da ich sonst mehrfach rechnen muss (erst zurück ins Standardsystem, dann in das ausgewählte) und somit wird auch die Software wieder unnötig komplexer.
Lediglich der in dem DBGrid und dem Report dargestellte Wert soll verändert werden. Keine Zugriffe auf die Datenbank, ausser Lesende.
Vielleicht hast Du (oder jemand anders) ja noch einen anderen Ansatz.
Vielen Dank und beste Grüße,
Thomas
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 07.11.12 10:04
spacemanspiff hat folgendes geschrieben : | Wie muss ich die Komponenten behandeln, so dass nicht automatisch ein Update auf der Table vorgenommen wird? Geht das überhaupt? Wenn nicht, wie würdet ihr das (möglichst unkompliziert) umsetzen? |
Eine Query oder auch eine Tabelle ist ja gerade dazu da das Du einzelne Datensätze bearbeiten kannst und sie geändert in die Datenbank wandern. In Deinem Fall musst du mit einer lokalen Kopie der Daten arbeiten das Du sie Lokal verändern kannst. Ich verwende dazu je nach Bedarf eine MemTable (Tabelle, die ihre Daten selber intern verwaltet) oder ich lasse die Daten vom Grid verwalten. Ob das aber jeder Grid anbietet weis ich nicht.
_________________ 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?
|
|
Blup
      
Beiträge: 174
Erhaltene Danke: 43
|
Verfasst: Mi 07.11.12 10:11
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 07.11.12 10:32
Hi!
TQuery? Also SQL?
Spricht was dagegen, die DB rechnen zu lassen?
SQL-Anweisung 1:
| SELECT ... MESSWERT, MESSWERT/25.4 as "Zoll".... |
Grüße,
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Für diesen Beitrag haben gedankt: spacemanspiff
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Mi 07.11.12 11:31
Wie wäre es mit einem berechneten Feld in der Query?
In der Doku steht dazu etwas unter "Felder berechnen"
|
|
spacemanspiff 
      
Beiträge: 53
Erhaltene Danke: 1
|
Verfasst: Mi 07.11.12 13:53
Danke schön an alle!
Ich war gerade dabei mir die Ideen mit MemTables bzw. TClientDataSet (das ja eine ähnliche Herangehensweise hat) anzusehen (Danke an Sinspin & Blub, damit wäre das Problem zu lösen gewesen), da kam Martok daher... der Wald... lauter Bäume... da fragt man sich "Was kann Delphi für mich tun" und übersieht doch glatt, dass auch die DB rechnen kann
Danke, das war die am wenigsten aufwendigste Lösung und hat (natürlich) auf Anhieb geklappt.
Danke auch an mandras, aber bis dahin bin ich schon nicht mehr gekommen
Beste Grüße und angenehme Woche weiterhin,
Thomas
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Mi 07.11.12 18:19
Moin...
...warum einfach wenn es auch kompliziert geht.
Dein Freund heißt CachedUpdates der Query. Ist das True werden alle Änderungen an der Query nicht sofort zurückgeschrieben. Sollte man das doch wollen, muß das mit ApplyUpdates angeschoben werden.
Zuletzt bearbeitet von haentschman am Mi 07.11.12 18:36, insgesamt 1-mal bearbeitet
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mi 07.11.12 18:24
Abnsonsten bleit da ja noch die Möglichkeit, ein berechnetes Feld zu definieren. Dann kannst Du aus dem Wertefeld dann dieses berechnen. Es ist kein Feld, welches in der Datenbank auftaucht, wird bei jedem Datensatzaufruf aktualisiert udn angezeigt, aber eben nur als temporäres Feld (sozusagen als Zusatzinformation).
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
WasWeißDennIch
      
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Mi 07.11.12 18:35
Ich persönlich würde auch Martoks Lösung favorisieren, da sie keine Änderung der DB-Struktur oder Komponenteneinstellungen benötigt, schnell umzusetzen ist und man alle benötigten Informationen sofort zur Verfügung hat. Falls mit den berechneten Feldern COMPUTED FIELDS gemeint sind: ist das nicht eine Spezialität von Interbase/Firebird?
|
|