Zum Inhalt springen

Probleme mit UPDATE


Brodi87

Empfohlene Beiträge

...und wieder mal beschäftigt mich ein scheinbar unüberwindbares Problem! :)

Kurze Erläuterung: (noch schnell Traubenzucker einnehmen und los geht’s! ;) )

Es gibt eine Tabelle Kalkulation in der verschiedenen Preismodelle (1-3) und die dementsprechenden Prozente eingetragen sind. Nun gibt es eine Tabelle Preisgruppen, in der eingetragen wird welcher Mandant(gibt ca. 10), welches Preismodell hat. Wenn man nun in den Preisgruppen ein Preismodell für einen Mandanten einträgt, soll anhand einer Abfrage der neue Preis bestimmt werden.

Also wenn in Preisgruppe : Mandant2 (DB2) gleich Preisgruppe ‘2‘ hat, dann soll aus DB1 der Preis gezogen werden und mit dem Prozentwert von Tabelle Kalkulation aus Spalte Preismodell2 verrechnet werden und in DB2 eingetragen werden.

Da ich schon am einfachen scheitere, möchte ich mich erstmal mit dem Grundgerüst dem Ergebnis nähern:


declare

        @m_Hauptartikelpreis float,   -- der Preis aus DB1

        @m_Artikelpreis float,        --Artikelpreis DB2

        @m_Preismodell_2 float,       --Preismodell Tabelle Kalkulation

        @m_Artikelnummer varchar(18), --Artikelnummer der Datenbank1

        @m2_Artikelnummer varchar(18) --Artikelnummer der Datenbank2



select  @m_HauptArtikelpreis = HM1.HauptArtikelpreis,

        @m_ Preismodell_2  = Preismodell_2,

        @m_Artikelnummer = DB1.Artikelnummer,

	  @m2_Artikelnummer = DB2.Artikelnummer


from    DB1.Preis as HM1,                                                                                      DB1.Kalkulation, DB2.Preis as MUM2

where   @m_Artikelnummer = @m2_Artikelnummer and Kalkulation.Nummer = 'Preistarife 1-3'




update DB2.Preis

SET

DB2.Preis.Artikelpreis = round((@m_Hauptartikelpreis * @m_ Preismodell_2  / 100 + @m_Artikelpreismodell),2)



print 'Update abgeschlossen!';

Problem bei meinem Grundgerüst ist: Wenn ich die Artikelnummer fest definiere, funktioniert das Update bei der dementsprechenden Artikelnummer. Es soll nun aber bei jeder Artikelnummer den Preis aktualisieren.

Danke für Eure Hilfe!

PS: wie immer MSSQL

Bearbeitet von Brodi87
Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay habs erstmal hinbekommen das ich grundsätzlich die Werte von einer Tabelle in die andere schreibe. Nun ist aber das Problem das ich den Artikelpreis der DB2 aus dem Artikelpreis von DB1 und dem Prozentwert von DB1.Preisgruppe berechne.


declare


        @Artikelpreis float,        --Artikelpreis DB1

        @Artikelnummer varchar(18), --Artikelnummer der Datenbank1




select  @Artikelpreis = hm1.Artikelpreis, @Artikelnummer = hm1.Artikelnummer


from    DB1.Preis as HM1,                                                                                      join DB2.Preis UM2 on um2.Artikelnummer = hm1.Artikelnummer




update DB2.Preis

SET

DB2.Preis.Artikelpreis = (select Artikelpreis from DB1.Preis 


Where DB2.Preis.Artikelnummer = DB1.Preis.Artikelnummer)


2 Probleme: 1. In meiner aktuellen Abfrage holt es nicht bei allen den Wert aus DB1 in DB2. Ist mit dieser Abfrage grundsätzlich etwas falsch? 2. Wie bekommen ich nun in der Unterabfrage nach SET die Preisgruppentabelle rein, zum berechnen des DB2 Preises? In einem Versuch hab ich einfach:

SET

DB2.Preis.Artikelpreis = (select round(Artikelpreis*Preismodell/100) from DB1.Preis , Preisgruppe


Where DB2.Preis.Artikelnummer = DB1.Preis.Artikelnummer and Preisgruppe.Modell = '1')

aber da kommen nicht die gewünschten werte...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay...es läuft doch, war ein internes Problem.


declare


        @Artikelpreis float,        --Artikelpreis DB1

        @Artikelnummer varchar(18), --Artikelnummer der Datenbank1




select  @Artikelpreis = hm1.Artikelpreis, @Artikelnummer = hm1.Artikelnummer


from    DB1.Preis as HM1,                                                                                      join DB2.Preis UM2 on um2.Artikelnummer = hm1.Artikelnummer




update DB2.Preis

SET

DB2.Preis.Artikelpreis = (select round(Artikelpreis*Preismodell/100) from DB1.Preis , Preisgruppe


Where DB2.Preis.Artikelnummer = DB1.Preis.Artikelnummer and Preisgruppe.Modell = '1')


Nun kommt die eigentliche Schwierigkeit: Eine Tabelle PreisgruppeN...enthält die Mandanten Nummer (2-10) - was den Datenbanken DB2-10 entspricht - mit der entsprechenden Preisgruppenummer (1-3) - was jeweils einer Spalte in der Tabelle Preisgruppe entspricht. Wenn nun z.b. bei Mandant 5 die Preisgruppennummer (z.b. auf '1') geändert wird, soll in Mandant 5 die Preise: Artikelpreis*Preismodell1/100 berechnet werden. Es soll also unabhängig vom mandant sein und anhand der Preisgruppennummer die entsprechende Spalte in Preisgruppe nehmen. Ich hab es schon mit:

set @Artikelpreis =

case

when exists

...

probiert!

Leider bekomm ich da Probleme das die Datenbank bzw. Server nicht gefunden wird? wie realisier ich dies?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zu dem ersten update das du da hattest, das würd ich so schreiben :

update hm2

set artikelpreis = hm1.artikelpreis * hm1.Preismodell

FROM DB2.Preis hm2

	INNER JOIN db1.Preis hm1 on hm2.Artikelnummer = hm1.Artikelnummer

[Where x = y]

Das hat den Vorteil, dass du erstmal ein select schreiben kannst, und anhand vom dem siehst, ob du noch Fehler drin hast. Dann kommentierste einfach SELECT * aus, und Schreibst hin UPDATE [Alias] mit dem set, und das wars. Ist weniger Fehleranfällig imo. Das 2. Ich weis nicht ob ich dich richtig verstanden habe, aber mir scheint, dass du abhänig von dem Mandanten bei dem sich was ändert, eine bestimmte Tabelle updaten willst, richtig (oder bestimmtest Feld, geht aber genauso dann)?
declare @Mandant_ID int = 5

DECLARE @sql = varchar(max)

SET @sql = '


UPDATE ' + CASE 

		WHEN @mandant_id =1 THEN 'DB1.Preis'

		WHEN @mandant_id =2 THEN 'DB2.Preis'

		WHEN @mandant_id =3 THEN 'DB3.Preis'

		...

	   END + '

SET Artikelpreis = Artikelpreis * Preismodell1 / 100


'

EXEC (@sql)

Alternativ kannst du wenn die Struktur gleich für alle Mandanten DB's gleich ist, auch einfach
set @sql = ' UPDATE DB' + convert(varchar(2), @mandant_id) + '.Preis'
nehmen statt dem case. Mit sowas bekommst du dynamik in deine StoredProcs oder sql scripte und das ist ein verdammt mächtiges Konzept. Btw, wenn du was richtig perverses basteln willst, dann kannst du auch innerhalb einer @sql variablen eine neue varchar vari anlegen, und das damit noch verschachteln quasi. Also :

declare @sql varchar(max)

set @sql '

   declare @sql2 varchar(max)

   set @sql2 = '' irgendein krankes query ''

   EXEC (@sql2)

'

EXEC (@sql)

Das war eher zur allgemeinen Info, sowas braucht man normalerweise eher nicht.

Wennd zum Beispiel mit einem Cursor ein SQL Query auf die Art aufbauen willst, den Cursor selber aber auf einem Dynamischen Query brauchst, dafür brauchst du das dann.

Bearbeitet von streffin
Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay...das war auch meine Überlegung es auf diesem Weg zu versuchen.

Leider versteh ich grad nicht deine Schreibweise für folgendes:

Code:

declare @Mandant_ID int = 5

DECLARE @sql = varchar(max)

SET @sql = '

UPDATE ' + CASE

WHEN @mandant_id =1 THEN 'DB1.Preis'

WHEN @mandant_id =2 THEN 'DB2.Preis'

WHEN @mandant_id =3 THEN 'DB3.Preis'

...

END + '

SET Artikelpreis = Artikelpreis * Preismodell1 / 100

'

EXEC (@sql)

Um es nochmal kurz zu erläutern:

Es gibt verschiedene Mandanten die jeweils eine eigene Datenbank haben. In einer Tabelle Preisgruppen wird hinterlegt welcher Mandant welches Preismodell verwendent, worauf hin der entsprechende Mandant sich das Preismodell aus der Hauptdatenbank zieht. Also 3 Tabellen: Mandant (DB ->willkürlich - mit der Preistabelle) Preisgruppen aus HauptDB und Preismodelltabelle auch aus HauptDB.

Link zu diesem Kommentar
Auf anderen Seiten teilen

du hast fixe Elemente in dem Query, und dynamische Teile.

das heist, du erstellst dir den String mit den Fixen Teilen und verkettest hier jetzt deinen dynamischen Teil rein.

Am Schuss hast du dann oder solltest du haben, ein Query gespeichert als String in der Variablen, was du dann per exec ausführst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Nun hab ich sehr viel an dem Skript erweitert, wobei ein neues Problem auftaucht:


update

...

Preis =


case when exists(select...)


[INDENT][/INDENT]then


[INDENT][/INDENT]
(select case when exists (select...Artnr.Tab1=Artnr.Tab2)

[INDENT]then (...)[/INDENT]


[INDENT]else (...)[/INDENT]


[INDENT])end[/INDENT]



else


[INDENT][/INDENT](select case when exists (select...where Artnr.Tab1=Artnr.Tab2)

[INDENT]then (...)[/INDENT]


[INDENT]else (...)[/INDENT]


[INDENT])end[/INDENT]



....


Nun kommt immer die Meldung das die Unterabfrage mehr als einen Wert zurückgegeben hat. Wie kann ich es besser schreiben?

Danke schon mal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun kommt immer die Meldung das die Unterabfrage mehr als einen Wert zurückgegeben hat. Wie kann ich es besser schreiben?

Deine Abfrage bzw eine Unterabfrage, deren Inhalt du verschweigst, ergibt kein eindeutiges Ergebnis. Genaueres kann man hier ohne weitere Informationen kaum sagen. Es ist aber doch logisch, das eine Wertzuweisung nicht mehrere Werte haben darf, oder?

Beispiel:

Update Kunden set Nachname = (Select Familienname from AlleBewohnerDeutschlands where Personalausweisnummer='123456789')

sollte funktionieren, falls Personalausweisnummer eindeutig ist und die Nummer 123456789 tatsächlich existiert.
Update Kunden set Nachname = (Select Familienname from AlleBewohnerDeutschlands where Ort='Berlin')

geht hingegen ziemlich sicher in die Hose, weil du da näherungsweise 3,5 Millionen Sätze findest und das nicht in einem Nachnamen gespeichert werden kann.

Hoffe das hilft

Reinhold

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...