Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADOQuery berechnetes Feld (https://www.delphipraxis.net/200870-adoquery-berechnetes-feld.html)

Luckner 3. Jun 2019 13:59

Datenbank: Access • Version: 2008 • Zugriff über: ADOQuery

ADOQuery berechnetes Feld
 
Hallo,

folgende Procedure:

Delphi-Quellcode:
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;
An Datamodule1.ADOQueryGejoliste hängt ein DBGrid an, mit folgenden Felder:
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

hoika 3. Jun 2019 15:14

AW: ADOQuery berechnetes Feld
 
Hallo,
Zitat:

Das Feld "Bestand" ist ein 'Calculated-Feld' in Datamodule1.ADOQueryGejoliste
Du willst in ein berechnetes Feld einen Wert speichern?
Wie soll denn das gehen.

Luckner 3. Jun 2019 15:28

AW: ADOQuery berechnetes Feld
 
Ich dachte, dass man gerade diese Felder manipulieren kann.
Luckner.

hoika 3. Jun 2019 15:33

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.

Luckner 3. Jun 2019 15:57

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

jobo 3. Jun 2019 16:25

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.

Luckner 3. Jun 2019 16:37

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

Luckner 3. Jun 2019 16:38

AW: ADOQuery berechnetes Feld
 
Ach so, eher Punkt 1. am Ende muss die Tabelle auf einem Drucker raus.

Luckner

jobo 3. Jun 2019 16:42

AW: ADOQuery berechnetes Feld
 
Zitat:

Zitat von Luckner (Beitrag 1433752)
es reicht nur eine Anzeige. ..

Auf die Schnelle:
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.

Delphi.Narium 3. Jun 2019 17:31

AW: ADOQuery berechnetes Feld
 
Delphi-Quellcode:
  BestandMaterialNummer := 0;
    while not Datamodule1.ADOQueryRollenJoinLagerplatz.Eof do
    begin
      BestandMaterialNummer := BestandMaterialNummer + ((Datamodule1.ADOQueryRollenJoinLagerplatzArbBreite.AsInteger/1000) * Datamodule1.ADOQueryRollenJoinLagerplatzlfm.AsInteger);
      Datamodule1.ADOQueryRollenJoinLagerplatz.Next;
    end;
Bin mir nicht sicher, da Deine SQLs irgendwie extrem schwer lesbar sind (aber das hatten wir ja schon).

Sieht aber schwer nach sowas in der Art aus:
SQL-Code:
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]
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.

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 21:13 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz