Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Query um ein Feld erweitern (inner join) (https://www.delphipraxis.net/216647-sql-query-um-ein-feld-erweitern-inner-join.html)

HCB 3. Feb 2025 19:24

Datenbank: Access mdb • Version: 2003 • Zugriff über: SQL / Delphi FireDac

SQL Query um ein Feld erweitern (inner join)
 
An die Datenbankprofis hier im Forum, mit der Bitte um Hilfe.
Folgende Abfrage funktioniert, aber ich brauche noch ein Feld ArtZusInfo4 aus einer anderen Tabelle sArtikel verknüpft mit ArtNr = ArtLiefArtNr:

SQL-Code:
SELECT
    ArtLief.ArtLiefArtnr,
    ArtLief.ArtLiefBestellNr,
    ArtLief.ArtLiefEKPreis,
    extern.brutto,
    extern.nettopreis,
    IIF(ArtLief.ArtLiefEKPreis = 0, 0, extern.nettopreis - ArtLief.ArtLiefEKPreis) AS DiffEUR,
    IIF(extern.brutto = 0, 0, (extern.brutto - extern.nettopreis) * 100 / extern.brutto) AS Rabatt,
    IIF(DiffEUR = 0, 0, DiffEUR * 100 / ArtLief.ArtLiefEKPreis) AS prozent,
    ArtLief.ArtEKDatum
FROM
    ArtLief
LEFT JOIN (
    SELECT *
    FROM ekpreise
    IN 'E:\Preisdateien\K000217_p.mdb'
) AS extern ON ArtLief.ArtLiefBestellNr = extern.Artikelnummer
WHERE
    ArtLief.ArtLiefLiefNr = 'K000217'
    AND extern.Artikelnummer IS NULL;
Mir gelingt es nicht mit inner join die tabelle sArtikel einzubinden und das Feld ArtZusInfo4 zuzufügen.
Vielleicht könnte hier mal ein Profi darüber schauen, wo und wie man das noch einbinden könnte.

Für Eure Hilfe jetzt schon Vielen Dank.

LG Harry

Delphi.Narium 3. Feb 2025 20:22

AW: SQL Query um ein Feld erweitern (inner join)
 
Bitte beschreibe mal etwas genauer, was Du vorhast.

Wenn ich das zur Zeit richtig interpretiere, möchtest Du aus der Tabelle ArtLief alle Sätze, zu denen es kein Gegenstück in der externen Tabelle ekpreise gibt (AND extern.Artikelnummer IS NULL). Damit dürfte jede Berechnung mit extern.brutto und extern.netto scheitern.

Bitte ersetze beim SELECT * den * durch die tatsächlich benötigten Spalten der externen Tabelle. Die macht das Verstehen der externen Daten für externe Helfer einfacher ;-)

SQL-Code:
    IIF(ArtLief.ArtLiefEKPreis = 0, 0, extern.nettopreis - ArtLief.ArtLiefEKPreis) AS DiffEUR,
    IIF(DiffEUR = 0, 0, DiffEUR * 100 / ArtLief.ArtLiefEKPreis) AS prozent,
Funktioniert das? Auf eine mit AS benannte Spalte dann später zugreifen?

Zeig' bitte mal Deine Versuche, in denen Du versucht hast die Tabelle sArtikel einzubinden. Hast Du "einfach nur" kein Ergebnis erhalten oder eine oder mehrere Fehlermeldungen? Wenn Fehlermeldungen, welche?

Momentan sehe ich keinen ernsthaften Grund, warum es nicht funktionieren sollte, außer, dass ich mit der korrekten Syntax vom Access-SQL absolut nicht vertraut bin.

Ein Versuch:
SQL-Code:
SELECT
    ArtLief.ArtLiefArtnr,
    ArtLief.ArtLiefBestellNr,
    ArtLief.ArtLiefEKPreis,
    ArtLief.ArtEKDatum,
    sArtikel.ArtZusInfo4,
    -- das Folgende erscheint mir (wegen extern.Artikelnummer IS NULL) sinnfrei, da die Werte immer = Null sind
    extern.brutto,
    extern.nettopreis,
    IIF(ArtLief.ArtLiefEKPreis = 0, 0, extern.nettopreis - ArtLief.ArtLiefEKPreis) AS DiffEUR,
    IIF(extern.brutto = 0, 0, (extern.brutto - extern.nettopreis) * 100 / extern.brutto) AS Rabatt,
    IIF(DiffEUR = 0, 0, DiffEUR * 100 / ArtLief.ArtLiefEKPreis) AS prozent -- hier bin ich fast sicher, dass das nicht geht
FROM
(
    ArtLief
    LEFT JOIN
    (   SELECT
          Artikelnummer,
          Brutto,
          Netto
        FROM ekpreise
        IN 'E:\Preisdateien\K000217_p.mdb'
    ) AS extern ON ArtLief.ArtLiefBestellNr = extern.Artikelnummer
)
INNER JOIN sArtikel ON ArtLief.ArtLiefArtNr = sArtikel.ArtNr
WHERE
    ArtLief.ArtLiefLiefNr = 'K000217'
    AND extern.Artikelnummer IS NULL

HCB 4. Feb 2025 17:36

AW: SQL Query um ein Feld erweitern (inner join)
 
Danke Delphi.Narium für Deine Unterstützung. Du erweist dich jetzt schon als meine letzte Rettung :)

Ich habe eine externe Preisliste vom Lieferant z.B. K000217 auf USB-Stick E:\Preisdateien\K000217_p.mdb. Da sind die Artikelnummer, Brutto, Rabatt und Nettopreis mit dem glecinamigen Feldern hinterlegt.

Jetzt sollen die Preise eingelesen werden. Das läuft.
Nun will ich mit button1 sehen, welche Preise erhöht wurden. Ok läuft.
Button2 zeigt mir welche Preise gleich geblieben sind, also nicht erhäht wurden. ok, läuft.
Button3 zeigt mir welche Artikelpreise günstiger geworden sind, Ok läuft auch.

Jetzt brauche ich eine Abfrage, welche Artikel vom Lieferant z.B. K000217 nicht mehr in der externen Preisliste E:\Preisdateien\K000217_p.mdb vorkommen, weil der Lieferant diesen Artikel nicht mehr führt. Also in der externen Tabelle ekPreise nicht mehr existiert. Diese sollen mir angezeigt werden.

Mit der Query werden die auch korrekt angezeigt. Das Problem besteht aber darin, dass ich aus der Tabelle sArtikel die Preise holen muss um diese nachher zu aktualisieren. Ich brauche also alle Felder die auch in dieser Query (die läuft) vorhanden sind:
Delphi-Quellcode:
SELECT
ArtName1,
ArtVKPreis_0,
ArtVKPreis_1,
ArtZusInfo4,
ArtLiefLiefNr,
ArtLiefArtNr,
ArtcDate,
ArtLiefBestellNr,
ArtLiefEKPreis,
extern.brutto,
extern.nettopreis,
ArtEKDatum,
IIF([ArtLiefEKPreis] = 0,0, (extern.nettopreis - ArtLiefEKPreis)) as DiffEUR,
IIF([extern.brutto]= 0,0,(extern.brutto-extern.nettopreis)*100/extern.brutto) as Rabatt,
IIF([DIFFEur] = 0,0,DiffEUR*100/(ArtLiefEKPreis)) as prozent
FROM (ArtLief INNER JOIN (SELECT * FROM ekpreise IN 'E:\Preisdateien\K000217_p.mdb') extern
ON ArtLief.ArtLiefBestellnr=extern.Artikelnummer)
INNER JOIN sArtikel ON ArtLief.ArtLiefArtNr = sArtikel.ArtNr
where ArtLief.ArtLiefLiefNr = 'K000217' order by ArtLiefArtNr;
Es müssen also die Felder aus der Tabelle sArtikel - ArtName1, ArtVKPreis_0, ArtVKPreis_1 und ArtZusInfo4 in die Abfrage eingebaut werden:

Delphi-Quellcode:
SELECT ArtLief.ArtLiefArtnr, ArtLief.ArtLiefBestellNr, ArtLief.ArtLiefEKPreis,
extern.brutto,extern.nettopreis,
IIF([ArtLief.ArtLiefEKPreis] = 0,0, (extern.nettopreis - ArtLief.ArtLiefEKPreis)) as DiffEUR,
IIF([extern.brutto]= 0,0,(extern.brutto-extern.nettopreis)*100/extern.brutto) as Rabatt,
IIF([DIFFEur] = 0,0,DiffEUR*100/(ArtLief.ArtLiefEKPreis)) as prozent,
ArtLief.ArtEKDatum
FROM ArtLief
LEFT JOIN (
    SELECT *
    FROM ekpreise
    IN 'E:\Preisdateien\K000217_p.mdb'
) AS extern ON ArtLief.ArtLiefBestellNr = extern.Artikelnummer
WHERE ArtLief.ArtLiefLiefNr = 'K000217' and extern.Artikelnummer IS NULL;
Genauer kann ich es leider nicht darstellen.

Meine Query läuft leider nicht und bringt folgende Fehlermeldung obwohl die Zuweisungen korrekt sind:

Syntaxfehler (fehlender Operator) in Abfrageausdruck 'ArtLief.ArtLiefBestellNr = extern.Artikelnummer
LEFT JOIN sArtikel ON ArtLief.ArtLiefArtnr = sArtikel.ArtNr'


Delphi-Quellcode:
SELECT ArtLief.ArtLiefArtnr, ArtLief.ArtLiefBestellNr, ArtLief.ArtLiefEKPreis,
extern.brutto, extern.nettopreis,
IIF([ArtLief.ArtLiefEKPreis] = 0, 0, (extern.nettopreis - ArtLief.ArtLiefEKPreis)) AS DiffEUR,
IIF([extern.brutto] = 0, 0, (extern.brutto - extern.nettopreis) * 100 / extern.brutto) AS Rabatt,
IIF([DiffEUR] = 0, 0, DiffEUR * 100 / ArtLief.ArtLiefEKPreis) AS prozent,
ArtLief.ArtEKDatum,
sArtikel.ArtName1, sArtikel.ArtVKPreis_0, sArtikel.ArtVKPreis_1, sArtikel.ArtZusInfo4
FROM ArtLief
LEFT JOIN (
    SELECT *
    FROM ekpreise
    IN 'E:\Preisdateien\K000217_p.mdb'
) AS extern ON ArtLief.ArtLiefBestellNr = extern.Artikelnummer
LEFT JOIN sArtikel ON ArtLief.ArtLiefArtnr = sArtikel.ArtNr
WHERE ArtLief.ArtLiefLiefNr = 'K000217' AND extern.Artikelnummer IS NULL;
Ich weiß nicht, wo der Fehler liegt. Kannst du nochmals versuchen mir zu helfen?
Dein Vorschlag funktioniert leider nicht.

LG Harry

Delphi.Narium 4. Feb 2025 18:23

AW: SQL Query um ein Feld erweitern (inner join)
 
Was funktioniert an meinem Vorschlag nicht?

Fehlermeldung = ?

Ergebnis stimmt nicht:

zuviele Daten
zuwenig Daten
Daten doppelt
...?

Da ich weder über Access noch über die von Dir genutzten Datenbanken / Tabellen verfüge, muss ich das alles durch die alten grauen Zellen ersetzen.

Dazu benötige ich präzise Informationen, sonst wird das scheitern.

HCB 4. Feb 2025 18:55

AW: SQL Query um ein Feld erweitern (inner join)
 
Vielen herzlichen Dank Delphi.Narium!

Dein Vorschlag brachte die Meldung: 2 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.
Dann habe ich das ganze nochmals anhand deines Vorschlages durchdacht. Es fehlten zur Anzeige im Grid noch 2 Felder.
Ich habe also vorsichtshalber Artikelnummer, Brutto, Netto von Dir durch * ersetzt und es funktioniert!!!!!!

Da bist ein wandelndes Genie!
DANKE FÜR DEINE ZEIT DIE DU INVESTIERT HAST MIR ZU HELFEN. Hut ab!

LG Harry


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 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