Delphi-PRAXiS
Seite 2 von 4     12 34      

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 5. Jun 2019 14:19

AW: ADOQuery berechnetes Feld
 
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

hoika 5. Jun 2019 14:45

AW: ADOQuery berechnetes Feld
 
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.

jobo 5. Jun 2019 15:23

AW: ADOQuery berechnetes Feld
 
Zitat:

Zitat von Luckner (Beitrag 1433989)
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:
Zitat:

Zitat von Luckner (Beitrag 1433989)
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]

jobo 5. Jun 2019 15:34

AW: ADOQuery berechnetes Feld
 
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.

Luckner 5. Jun 2019 15:40

AW: ADOQuery berechnetes Feld
 
Hallo jobo,

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

Gruß, Luckner

jobo 5. Jun 2019 16:23

AW: ADOQuery berechnetes Feld
 
Was hast Du geändert? Ich habe so 3-4 Vorschläge gemacht.
Und was bedeutet, "ohne Änderung in der Tabelle"?

Luckner 6. Jun 2019 09:53

AW: ADOQuery berechnetes Feld
 
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

Delphi.Narium 6. Jun 2019 10:45

AW: ADOQuery berechnetes Feld
 
Ist jetzt nur geraten.

Sinngemäß in etwa sowas?
SQL-Code:
SELECT
  Materialrollen.[Mat-Nr],
  sum((Materialrollen.[Arb-Breite] / 1000) * Materialrollen.lfm) as BESTAND,
  [Material-Stamm].Bezeichnung,
  Aufgebraucht
from (
  SELECT
    Materialrollen.[Mat-Nr],
    Materialrollen.[Arb-Breite],
    Materialrollen.lfm,
    [Material-Stamm].Bezeichnung,
    'nein' as Aufgebraucht
  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)
        )
  UNION ALL
  SELECT
    Materialrollen.[Mat-Nr],
    Materialrollen.[Arb-Breite],
    Materialrollen.lfm,
    [Material-Stamm].Bezeichnung,
    'ja' as Aufgebraucht
  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 not NULL)
         AND (Materialrollen.[Arb-Breite] > 179)
        )
)
group by
  Materialrollen.[Mat-Nr],
  [Material-Stamm].Bezeichnung
  Aufgebraucht
Die aufgebrauchten Materialien sollten nun in der Spalte "Aufgebraucht" einen entsprechenden Hinweise, bestehend aus den Wörten 'ja' bzw. 'nein', stehen haben.

Luckner 6. Jun 2019 11:01

AW: ADOQuery berechnetes Feld
 
Hallo Delphi.Narium,

:shock: Hut ab von meiner Seite. Ich werde versuchen diese Anweisung zu übertragen und auszuprobieren. Wenn mein Kopf dann etwas freier ist, dann werde ich versuchen diese Anweisung auch zu verstehen. Dieses sprengt meine Grenzen. Vielen Dank für die Mühe.

Gruß, Luckner

Delphi.Narium 6. Jun 2019 11:13

AW: ADOQuery berechnetes Feld
 
Eventuell geht auch dashier, ist kürzer und dürfte resourcen- / laufzeitschonender sein:
SQL-Code:
SELECT
  MaterialNr,
  sum((Arbeitsbreite / 1000) * lfm) as BESTAND,
  Bezeichnung,
  Aufgebraucht
from (
  SELECT
    Materialrollen.[Mat-Nr] As MaterialNr
    Materialrollen.[Arb-Breite] As Arbeitsbreite,
    Materialrollen.lfm,
    [Material-Stamm].Bezeichnung,
    case Materialrollen.DatumAb when null then 'nein' else 'ja' end as Aufgebraucht
  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.[Arb-Breite] > 179)
        )
)
group by
  MaterialNr,
  Bezeichnung,
  Aufgebraucht


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr.
Seite 2 von 4     12 34      

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