Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MSAccess SQL Update Statement verkürzen? (https://www.delphipraxis.net/207987-msaccess-sql-update-statement-verkuerzen.html)

HCB 25. Mai 2021 12:00

Datenbank: Access • Version: 2003 • Zugriff über: FireDac

MSAccess SQL Update Statement verkürzen?
 
Hallo, ich habe folgendes SQL-Statement zur Preisaktualisierung:

UPDATE sARTIKEL As A INNER JOIN ArtLief AS U
On A.ArtNR = U.ArtLiefArtNr
SET A.ArtZeit_0 = U.ArtLiefEkPreis,
where A.ArtZusinfo4 = U.ArtLiefLiefNr
and U.ArtLiefLiefNr = 'K000103';

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.620)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 between 0.01 and 5.00;

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.393)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 between 5.01 and 10.00;

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.336)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 between 10.01 and 30.00;

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.312)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 between 30.01 and 100.00;

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.295)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 between 100.01 and 500.00;

update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 1.252)/ 0.85,2)
where ArtZusinfo4 = 'K000103' and ArtZeit_0 >500.00;

Wobei ArtZeit_0 dem EKPreis entspricht und ArtVKPreis_0 dem neuen VK-Preis.
Ich frage mich ob man das nicht einfacher und kürzer lösen kann.
Am besten wäre so in der Richtung: EK Spanne von [0.00 bis 1000.00] setze den Multiplikator von [2.00 bis 1.05]
also wäre das bei einem EK von 500 EUR der VK 737,50 (Multiplikator 1.475)

Ich habe an so etwas wie array gedacht, Access scheint aber nicht damit umgehen zu können.
Hat jemand vielleich eine Idee wie man das besser lösen kann, also dynamisch ausgehend vom EK den Multiplikator für VK setzen??

LG Harry

mkinzler 25. Mai 2021 12:12

AW: MSAccess SQL Update Statement verkürzen?
 
SQL-Parameter sollten helfen.

Jumpy 25. Mai 2021 12:17

AW: MSAccess SQL Update Statement verkürzen?
 
Mit einem "Case When" für den Multiplikator, wenn Access das kann?

SQL-Code:
update sArtikel set ArtVkPreis_0 = Round((ArtZeit_0 * 
  Case when ArtZeit_0 between 0.01 and 5.00 then 1.620
       when ArtZeit_0 between 5.01 and 10.00 then 1.39
       ...
       else 1.252     
  end)/ 0.85,2)
where ArtZusinfo4 = 'K000103'

markus888 25. Mai 2021 14:37

AW: MSAccess SQL Update Statement verkürzen?
 
Die Switch Funktion wäre eine Möglichkeit.

https://support.microsoft.com/de-de/...3-f47504f9e379

HCB 25. Mai 2021 15:01

AW: MSAccess SQL Update Statement verkürzen?
 
@jumpy
Gute Idee, danke. Funktioniert aber unter Access nicht, was mich aber auf die Funktion switch gebracht hat.

@marcus
Ja, danke mit switch kann ich den code etwas reduzieren :)

Vielleicht hat noch jemand eine Idee wie man folgendes umsetzt:

EK Spanne von [0.00 bis 1000.00] setze den Multiplikator von [2.00 bis 1.05]
also wäre das bei einem EK von 500 EUR der VK 737,50 (Multiplikator 1.475) Je höher der EK desto niedriger der Preisaufschlag.

Wie kann man da eine Automatik per SQL code einbauen???

LG Harry

Delphi.Narium 25. Mai 2021 15:23

AW: MSAccess SQL Update Statement verkürzen?
 
Zeig' doch bitte mal Dein derzeitiges Statement (wenn's mehrere sind, dann eben mehrere).

Ohne ist es eher schwierig festzustellen, was geändert werden könnte / müsste, um Deinen Wünschen zu entsprechen.

jobo 25. Mai 2021 17:54

AW: MSAccess SQL Update Statement verkürzen?
 
Also am einfachsten wäre, Deine Faktoren ergeben eine Formel. Dann ist es nur ein Statement.

Datenbank Style, halbwegs elegant und stark adaptierbar (Rabatt, Saison, ..) wäre ganz schlicht eine zusätzliche Tabelle die Preisspannen und Faktor aufführt. Dann ist es auch wieder nur ein Update Statement. Ggf. muss man hier beachten, dass es auch nach Änderungen später langfristig nachvollziehbar bleibt (Also nur inserts mit Zeiger für aktive Elemente, Gültigkeitsdauer usw., wenn man das auf die Spitze treibt kann man redaktionell für beliebige Zeiträume Preisanpassungen vornehmen, während man selbst auf den Bahamas Drinks schlürft. Wenn man alles richtig eingestellt hat, gibt's auch daheim keine böse Überraschung)

HCB 26. Mai 2021 17:04

AW: MSAccess SQL Update Statement verkürzen?
 
@jobo
Danke für Deinen Vorschlag mit der zusätzlichen Tabelle. In der Richtung habe ich noch gar nicht gedacht.
Die Idee mit den Bahamas gefällt mir natürlich außerordentlich gut :drunken:

LG Harry

HCB 26. Mai 2021 19:27

AW: MSAccess SQL Update Statement verkürzen?
 
EINE Frage hätte ich noch:
Ich möchte aus einer Lieferanten Tabelle den günstigsten EK Preis für einen Artikel auswählen und diesen als EKPreis in der Artikel Tabelle speichern, also updaten.
Den günstigen Lieferantenpreis auszuwählen hab ich schon:

SELECT Min(A.ArtLiefEKPreis) As Preis
From ArtLief As A
Group By A.ArtLiefArtNr;

Wie aber kann ich aber ein Update des EKpreis der Artikeltabelle machen? Funktioniert das mit join und Access?
Hat jemand einen Lösungsvorschlag? Das wäre toll.

LG Harry

DeddyH 26. Mai 2021 20:16

AW: MSAccess SQL Update Statement verkürzen?
 
Du hast eine Artikeltabelle, eine Lieferantentabelle und eine Zuordnungstabelle zwischen Artikeln und Lieferanten, habe ich das richtig verstanden? Wozu dann den Preis noch redundant in der Artikeltabelle speichern?

HCB 27. Mai 2021 07:10

AW: MSAccess SQL Update Statement verkürzen?
 
Hallo Detlef,
weil in der Artikeltabelle der mittlere/niedrigste EKPreis für den Artikel gespeichert wird um dann die Preisberechnungen für die VK's machen zu können.

DeddyH 27. Mai 2021 07:14

AW: MSAccess SQL Update Statement verkürzen?
 
Im Sinne der Normalisierung gilt aber eigentlich der Grundsatz, dass Daten, die sich aus anderen Daten berechnen/ermitteln lassen, nicht redundant abgespeichert werden, um mögliche Anomalien zu vermeiden. Wenn die Performance sehr darunter leidet, kann man in Ausnahmefällen davon abweichen, muss dann aber auch sicherstellen, dass die Daten immer konsistent sind.

Jumpy 27. Mai 2021 08:37

AW: MSAccess SQL Update Statement verkürzen?
 
Zitat:

Zitat von HCB (Beitrag 1490215)
EINE Frage hätte ich noch:
Ich möchte aus einer Lieferanten Tabelle den günstigsten EK Preis für einen Artikel auswählen und diesen als EKPreis in der Artikel Tabelle speichern, also updaten.
Den günstigen Lieferantenpreis auszuwählen hab ich schon:

SELECT Min(A.ArtLiefEKPreis) As Preis
From ArtLief As A
Group By A.ArtLiefArtNr;

Wie aber kann ich aber ein Update des EKpreis der Artikeltabelle machen? Funktioniert das mit join und Access?
Hat jemand einen Lösungsvorschlag? Das wäre toll.

LG Harry

AUf die Gefahr, dass das mit Access wieder nicht geht und ohne die genauen Feldnamen zu kennen, als Subselect:

SQL-Code:
Update Artikel A
Set A.EKPREIS=
(SELECT Min(ArtLiefEKPreis) From ArtLief Where ArtLiefArtNr=A.ArtNr)
Du hast dann auch die Möglichkeit, je nach DB, das MIN z.B. durch AVG zu ersetzen für den Durschnittspreis o.ä.

HCB 27. Mai 2021 09:16

AW: MSAccess SQL Update Statement verkürzen?
 
@jumpy
Danke für Deine Unterstützung! Die Feldnamen stimmen so.

Update Artikel A
Set A.EKPREIS=
(SELECT Min(ArtLiefEKPreis) From ArtLief Where ArtLiefArtNr=A.ArtNr)

Leider wirft es mir beim Ausführen folgenden Fehler raus:
Statement #1:
Operation muss eine aktualisierbare Abfrage verwenden.

Ich bin neu auf dem SQL Sektor, bin deshalb etwas überfordert.

LG Harry

HCB 27. Mai 2021 13:28

AW: MSAccess SQL Update Statement verkürzen?
 
Ok an alle, so hab ich das gelöst (wenn mal jemand das geleiche Problem hat):

//temp Tabelle erstellen
CREATE TABLE AATest (
ArtNr TEXT(22) NOT NULL,
EKMin currency
);
//mit der Abfrage die temp Tabelle füllen
INSERT INTO AATest (ArtNr, EKMin)
SELECT ArtLiefArtNr, Min(ArtLiefEKPreis) From ArtLief
Group By ArtLiefArtNr;
// Das Update durchführen
UPDATE sArtikel
INNER JOIN AATest ON sArtikel.ArtNr = AATest.ArtNr
SET sArtikel.ArtEKQuer = AATest.EKMin;
// Temp Tabelle wieder löschen
Drop Table AATest;

Danke für Eure Hilfestellung.

LG Harry


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