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
jobo

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

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 17: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.552 Beiträge
 
Delphi 7 Professional
 
#2

AW: ADOQuery berechnetes Feld

  Alt 3. Jun 2019, 18: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
Luckner

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

AW: ADOQuery berechnetes Feld

  Alt 5. Jun 2019, 15:19
Hallo,
habe mir alle Vorschläge zu Herzen genommen, vor allem die von Delphi.Narium und folgende SELECT-Abfrage gebastelt:
Delphi-Quellcode:
  SELECT Materialrollen.[Mat-Nr], sum((Materialrollen.[Arb-Breite] / 1000) * Materialrollen.lfm) as BESTAND, [Material-Stamm].Bezeichnung
  FROM Materialrollen
  LEFT JOIN [Material-Stamm] ON Materialrollen.[Mat-Nr] = [Material-Stamm].[Mat-Nr]
  WHERE (([Material-Stamm].[Lieferanten-Nr] = ' + Lieferantennr.Text + ') AND ([Material-Stamm].aktuell= -1)
  AND (Materialrollen.DatumAb is NULL) AND (Materialrollen.[Arb-Breite] > 179))
  group by Materialrollen.[Mat-Nr], [Material-Stamm].Bezeichnung
Jetzt werden mir die Daten in der DBGrid angezeigt und ich bin fast glücklich. Es werden mir jetzt Materialien angezeigt, deren (Materialrollen.[Arb-Breite] > 179 (mm)ist. Alle Materialrollen, deren die [Arb-Breite] <= 179 werden nicht angezeigt, was korrekt ist. Der Fall jedoch, wo es kein Material auf Lager gibt, weil verbraucht, geht verloren.
Hat Jemand, bitte, eine Idee, wie man das noch zusätzlich einbaut.

Danke, Luckner
  Mit Zitat antworten Zitat
hoika

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

AW: ADOQuery berechnetes Feld

  Alt 5. Jun 2019, 15:45
Hallo,

or (Feld x is Null)
or (Feld1=Feld2) ??

Ich kenne deine Datenstruktur ja nicht.

Wie erkennst Du, dass das Material aufgebraucht ist?

Du kannst auch eine komplett neue Query "hintendranhängen"

Select Query 1
Union
Select Query 2

Es müssen nur die gleichen Datenfelder (Anzahl, Datentyp usw.) sein.
Heiko
  Mit Zitat antworten Zitat
jobo

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

AW: ADOQuery berechnetes Feld

  Alt 5. Jun 2019, 16:23
habe mir alle Vorschläge zu Herzen genommen, vor allem die von Delphi.Narium..
Sehr gut, ist doch nicht schlecht, wenn man sich gleich ne halbe Seite Code spart oder?

Zu der Frage:
Delphi-Quellcode:
.. FROM Materialrollen LEFT JOIN
     [Material-Stamm] ON Materialrollen.[Mat-Nr] = [Material-Stamm].[Mat-Nr]
Ist bereits left join, also "offen" für Lücken. Da ich Dein Datenmodel nicht kenne, aber sinngemäß die tabellennamen lesen kann, scheint mir, der left join ist falsch rum. Also entweder ein right join daraus machen oder die Tabellen Nennung tauschen


so
Delphi-Quellcode:
.. FROM Materialrollen RIGHT JOIN
     [Material-Stamm] ON Materialrollen.[Mat-Nr] = [Material-Stamm].[Mat-Nr]
oder
so
Delphi-Quellcode:
.. FROM [Material-Stamm] LEFT JOIN
      Materialrollen ON Materialrollen.[Mat-Nr] = [Material-Stamm].[Mat-Nr]
Gruß, Jo
  Mit Zitat antworten Zitat
jobo

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

AW: ADOQuery berechnetes Feld

  Alt 5. Jun 2019, 16:34
Es kann auch sein, dass die Zusatzbedingungen den Left Join "kaputt machen".

Einfachste Möglichkeit das zu testen, wäre aus der Where Bedingung ein Teil des Joins zu machen. Also 'where' raus und große Klammer ab ..on..

Und nur weil wir grad dabei sind, vielleicht lässt Du Dich ja auch noch von Formatierung überzeugen.
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 5. Jun 2019, 16:40
Hallo jobo,

habe ich geändert, jedoch ohne Veränderung in der Tabelle.

Gruß, Luckner
  Mit Zitat antworten Zitat
jobo

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

AW: ADOQuery berechnetes Feld

  Alt 5. Jun 2019, 17:23
Was hast Du geändert? Ich habe so 3-4 Vorschläge gemacht.
Und was bedeutet, "ohne Änderung in der Tabelle"?
Gruß, Jo
  Mit Zitat antworten Zitat
Luckner

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

AW: ADOQuery berechnetes Feld

  Alt 6. Jun 2019, 10:53
Hallo jobo,

Zitat:

.. FROM [Material-Stamm] LEFT JOIN
Materialrollen ON Materialrollen.[Mat-Nr] = [Material-Stamm].[Mat-Nr]
Ergebnis: selbe Anzahl des Materials und die selben Ergebnisse aus der Multiplikation.

Wenn Material aufgebraucht ist, merke ich, wenn alle (Materialrollen.DatumAb <> NULL)ist. Also alle Materialrollen ein Abgangsdatum haben. Andererseits könnte es auch funktionieren, wenn man herausfindet, dass wenn das Produkt aus der Multiplikation = 0 ist. Irgendwas in dieser Richtung.

Gruß, Luckner
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:19 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 by Thomas Breitkreuz