AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ADOQuery berechnetes Feld

Ein Thema von Luckner · begonnen am 3. Jun 2019 · letzter Beitrag vom 11. Jun 2019
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#1

ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 13:59
Datenbank: Access • Version: 2008 • Zugriff über: ADOQuery
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 15:14
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.
Heiko
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 15:28
Ich dachte, dass man gerade diese Felder manipulieren kann.
Luckner.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 15:33
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.
Heiko
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 15:57
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
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 16:25
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 16:37
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
  Mit Zitat antworten Zitat
Luckner

Registriert seit: 28. Nov 2006
Ort: Berlin
418 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 16:38
Ach so, eher Punkt 1. am Ende muss die Tabelle auf einem Drucker raus.

Luckner
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 16:42
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#10

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 17:31
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.
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