![]() |
Datenbank: Access • Version: 2008 • Zugriff über: ADOQuery
ADOQuery berechnetes Feld
Hallo,
folgende Procedure:
Delphi-Quellcode:
An Datamodule1.ADOQueryGejoliste hängt ein DBGrid an, mit folgenden Felder:
procedure TForm1.ButtonMaterialSuchenClick(Sender: TObject);
var BestandMaterialNummer, BestandMaterial : real; begin Datamodule1.ADOQueryGejoliste.Close; Datamodule1.ADOQueryGejoliste.SQL.Clear; Datamodule1.ADOQueryGejoliste.SQL.Add('SELECT [Material-Stamm].[Mat-Nr], [Material-Stamm].Bezeichnung, [Material-Stamm].[Lieferant Bezeichnung], '); Datamodule1.ADOQueryGejoliste.SQL.Add('[Material-Stamm].aktuell'); Datamodule1.ADOQueryGejoliste.SQL.Add('FROM [Material-Stamm]'); Datamodule1.ADOQueryGejoliste.SQL.Add('WHERE (([Material-Stamm].[Lieferanten-Nr]= ' + Lieferantennr.Text + ') AND ([Material-Stamm].aktuell= -1))'); Datamodule1.ADOQueryGejoliste.Open; Datamodule1.ADOQueryGejoliste.Last; Datamodule1.ADOQueryGejoliste.First; BestandMaterial := 0; while not Datamodule1.ADOQueryGejoliste.Eof do begin Datamodule1.ADOQueryRollenJoinLagerplatz.Active := False; Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Clear; Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('SELECT DISTINCTROW Materialrollen.[Arb-Breite], Materialrollen.lfm, Materialrollen.[Mat-Nr], '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('Materialrollen.Rollennummer, Materialrollen.Mutterrolle, Materialrollen.DatumAb, Materialrollen.GrundAb, '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('Materialrollen.DatumZu, Materialrollen.GrundZu, '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('Materialrollen.DatumWE, Rollenlager.Lagerplatz, RollenPlanung.Kommentar, RollenPlanung.AuftragPlanung, '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('RollenPlanung.RestLaenge, RollenPlanung.RestBreite FROM (Materialrollen LEFT JOIN Rollenlager ON '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('Materialrollen.Rollennummer = Rollenlager.Rollennummer) LEFT JOIN RollenPlanung '); Datamodule1.ADOQueryRollenJoinLagerplatz.SQL.Add('ON Materialrollen.Rollennummer = RollenPlanung.Rollennummer where ((Materialrollen.[Mat-Nr] = ' + Datamodule1.ADOQueryGejolisteMatNr.AsString + ') and (Materialrollen.DatumAb is NULL) and (Materialrollen.[Arb-Breite] > 179))'); Datamodule1.ADOQueryRollenJoinLagerplatz.Open; Datamodule1.ADOQueryRollenJoinLagerplatz.Last; Datamodule1.ADOQueryRollenJoinLagerplatz.First; BestandMaterialNummer := 0; while not Datamodule1.ADOQueryRollenJoinLagerplatz.Eof do begin BestandMaterialNummer := BestandMaterialNummer + ((Datamodule1.ADOQueryRollenJoinLagerplatzArbBreite.AsInteger/1000) * Datamodule1.ADOQueryRollenJoinLagerplatzlfm.AsInteger); Datamodule1.ADOQueryRollenJoinLagerplatz.Next; end; // ShowMessage('BestandMaterialNummer = ' + FloatToStr(BestandMaterialNummer)); Datamodule1.ADOQueryGejoliste.Edit; Datamodule1.ADOQueryGejolisteBESTAND.AsFloat := BestandMaterialNummer; Datamodule1.ADOQueryGejoliste.Post; Datamodule1.ADOQueryGejoliste.Next; end; GridGejo.Visible := true; end; Mat-Nr: Bezeichnung Bestand Das Feld "Bestand" ist ein 'Calculated-Feld' in Datamodule1.ADOQueryGejoliste. Die anderen Felder werden aus dem 1.-tem SELECT eingetragen. Es funktioniert soweit fast alles, jedoch das 'Datamodule1.ADOQueryGejoliste.Post;' nicht, bzw. in der Tabelle 'GridGejo' kann ich es nicht sehen. Gruß, Luckner |
AW: ADOQuery berechnetes Feld
Hallo,
Zitat:
Wie soll denn das gehen. |
AW: ADOQuery berechnetes Feld
Ich dachte, dass man gerade diese Felder manipulieren kann.
Luckner. |
AW: ADOQuery berechnetes Feld
Hallo,
die Anzeige schon: Event OnCalcFields oder FieldByName (aber ohne das Post) Aber du kannst das doch nicht speichern. Lass das Post einfach mal weg. Es könnte natürlich sein, das dir ein Update der Oberfläche fehlt. |
AW: ADOQuery berechnetes Feld
Wenn ich an der Stelle 'Datamodule1.ADOQueryGejoliste.Post;' das Grid updatete mit 'GridGejo.Update;', dann sehe ich nur ganz kurz, dass in die entsprechenden Zeile die Zahl eingetragen wird, aber dann sofort wieder gelöscht, wenn die nächste Zeile angesprochen wird.
Luckner |
AW: ADOQuery berechnetes Feld
Was soll die Funktion machen?
1) Eine Anzeige des aktuellen Bestands? oder 2) Eine Anzeige und Speicherung des aktuellen Bestands? 2) wird nicht funktionieren, weil weder die Query noch das "berechnete" Feld das können. 1) wäre schon eher möglich, aber auf dieser Basis auch ein komplizierter Ansatz. P.S.: Berechnete Felde können nur das Ergebnis einer Formel mit Werten aus dem jeweils aktuellen Datensatz darstellen, nichts abspeichern. |
AW: ADOQuery berechnetes Feld
Hallo jobo,
es reicht nur eine Anzeige. Mir fällt noch die Möglichkeit die Daten in ein Stringgrid zu schreiben. Wa ich nicht weiß, ob ich die Daten aus dem Stringgrid im Fastrepport verwenden kann: Luckner |
AW: ADOQuery berechnetes Feld
Ach so, eher Punkt 1. am Ende muss die Tabelle auf einem Drucker raus.
Luckner |
AW: ADOQuery berechnetes Feld
Zitat:
Die Berechnung bzw. die Idee "berechnetes Feld" ist ja nicht verkehrt. Das kannst Du vom Vorgehen her so wie im Delphiquellcode (Delphicode mit Formel auf Basis der 2.Query) mit einer Query machen, die Du als Subquerey der ersten Abfrage anhängst/eibaust. Dann wird automatisch alles durch die Abfrage beim Öffnen der Query berechnet. Also ADOQueryGejoliste und ADOQueryRollenJoinLagerplatz so zusammenfassen, dass direkt der (in SQL) berechnete Bestand herauskommt. Diese Query / das Grid kann natürlich auch gedruckt werden. |
AW: ADOQuery berechnetes Feld
Delphi-Quellcode:
Bin mir nicht sicher, da Deine SQLs irgendwie extrem schwer lesbar sind (aber das hatten wir ja schon).
BestandMaterialNummer := 0;
while not Datamodule1.ADOQueryRollenJoinLagerplatz.Eof do begin BestandMaterialNummer := BestandMaterialNummer + ((Datamodule1.ADOQueryRollenJoinLagerplatzArbBreite.AsInteger/1000) * Datamodule1.ADOQueryRollenJoinLagerplatzlfm.AsInteger); Datamodule1.ADOQueryRollenJoinLagerplatz.Next; end; Sieht aber schwer nach sowas in der Art aus:
SQL-Code:
Wenn das soweit in etwa korrekt ist, baust Du das bitte noch in das erste SQL mit ein und sparst Dir die (mehr als nur gewöhnungsbedürftige) Whileschleife innerhalb einer Whileschleife, zwecks Anzeige in einem Grid, ein.
select sum(Arb-Breite / 1000) * lfm as BestandMaterialNummer
from Materialrollen LEFT JOIN Rollenlager ON Materialrollen.Rollennummer = Rollenlager.Rollennummer LEFT JOIN RollenPlanung ON Materialrollen.Rollennummer = RollenPlanung.Rollennummer where Materialrollen.[Mat-Nr] = :MatNr and Materialrollen.DatumAb is NULL and Materialrollen.[Arb-Breite] > 179 group by Materialrollen.[Mat-Nr] Ein Grid holt sich von der DB die Daten, die es zur aktuellen Anzeige benötigt. Dein Whileschleifenkonstrukt ist in dem Zusammenhang bestenfalls unschädlich, schlimmstenfalls kontraproduktiv, aber höchstwahrscheinlich nichts weiter als ein Zeit- und Resourcenfresser. Bitte gewöhne Dir an in SQL-Statements nur die Daten zu selektieren, die Du auch zur Anzeige / Weiterverarbeitung benötigst. Das macht die SQLs übersichtlicher, spart Serverresourcen und beim Client Arbeitsspeicher und macht ggfls. mögliche Vereinfachungen der Statements deutlich leichter erkennbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz