Autor Beitrag
spacemanspiff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: Mi 07.11.12 08:42 
Hallo zusammen,

ich verzweifle ein wenig. Es hapert mal wieder an der schlechten Doku zu den Delphi-Komponenten :cry:

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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
RequestLive := True;
Open;
if chkbxUmrechnung.Checked then //checkbox umrechnen markiert?
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; //Faktor wurde vorher bestimmt
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
28:
29:
30:
31:
32:
33:
34:
RequestLive := True;
Open;
if chkbxUmrechnung.Checked then //checkbox umrechnen markiert?
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; //Faktor wurde vorher bestimmt
      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; //Faktor wurde vorher bestimmt
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 07.11.12 10:04 
user profile iconspacemanspiff hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 174
Erhaltene Danke: 43



BeitragVerfasst: Mi 07.11.12 10:11 
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mi 07.11.12 10:32 
Hi!

TQuery? Also SQL?
Spricht was dagegen, die DB rechnen zu lassen?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mi 07.11.12 18:19 
Moin... 8)

...warum einfach wenn es auch kompliziert geht. :roll:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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?