SQL: Update-Frage



  • Hi,

    ich habe folgendes vor:
    In einer Tabelle 'artikel' möchte ich die Jahres-Verkaufsmenge bei allen Artikeln um die Menge erhöhen, die in den Rechnungspositionen einer bestimmten Rechnung stehen.

    Ich habe folgendes versucht:

    update artikel
    set jahresmenge=jahresmenge+
      (select menge from rechnungpos,artikel where rechnungpos.artikel=ar.artikel and rp.rechnung = '053723')
    from artikel ar, rechnungpos rp
    where ar.artikel =rp.artikel and rp.rechnung = '053723'
    

    erhalte aber immer den Fehler:

    Die Unterabfrage gab mehr als einen Wert zurück.
    Das ist ungültig, wenn die Unterabfrage auf =, !=, <, <= , >, >= folgt 
    oder als Ausdruck verwendet wird.
    Die Anweisung wurde beendet.
    

    zurück.
    Offensichtlich stimmt mit der Unterabfrage (select menge...) etwas nicht, es wird wohl nicht erreicht, dass nur die Rechnungsposition abgefragt werden soll, in der auch der Artikel aus der Hauptabfrage eingetragen ist.

    Wie kann ich dies richtig machen?



  • gib doch einfach mal diese Unterabfrage aus - ich vermute, daß dort eine ganze Liste von Werten ausgespuckt wird.



  • Hallo,

    stimmt natürlich, bei der Unterabfrage kommen alle Artikel, die in der betreffenden Rechnung sind (alle Rechnungspositionen).
    Ich möchte eigentlich, dass in der Unterabfrage nur die Rechnungsposition gefunden wird, in welcher der Artikel eingetragen ist, für den das Update durchgeführt werden soll.
    Also:

    where rechnungpos.artikel=ar.artikel
    

    soll sich nur auf den Artikel der äußeren Abfrage beziehen (beziehungsweise auf jeweils eine Rechnungsposition).

    Geht das irgendwie?



  • Hat keiner eine Idee, wie ich das in einem Aufwasch erledigen könnte?

    Alternativ müsste ich sonst eine Schleife programmieren, bei der über alle Rechnungspositionen der fraglichen Rechnung gegangen wird und die Jahresmenge des jeweiligen Artikels entsprechend der Menge in der Rechnungsposition ändern.
    Aber das würde wohl wesentlich länger dauern 😞

    Über weitere Vorschläge/Ideen wäre ich jedenfalls sehr dankbar,

    Andreas



  • Versuch es mal so:

    update artikel
    set jahresmenge=jahresmenge +
    	 (select
    	 menge
    	 from rechnungpos rp
    	 where (rp.artikel=artikel)
    	 and (rp.rechnung = '053723'))
    

    Das sollte bei allen Artikeln in der Rechnung 053723 die Menge um die Menge in der RP erhöhen. Falls ein Artikel mehrfach in einer Rechnung vorkommen kann, mußt Du ein SUM Menge und natürlich eine GROUP BY-Klausel verwenden.

    So rein interessehalber: Wozu dient das Ganze? Falls es um den aktuellen Lagerbestand geht: Gibt es keine 'Artikelkonto'-Tabelle? Damit meine ich eine Tabelle, in der alle Buchungen zu den Artikeln festgehalten werden (Abgänge, Zugänge, Stornos, Retouren, Ausschuß, usw.)



  • So, ich habe es jetzt soweit, dass es funktioniert 🤡 :

    update artikel 
    set jahresmenge=isnull(jahresmenge,0.0)+
         (select 
         case
              when rg.art = 'R' then
                   sum(rp.menge)
             when rg.art = 'G' then
                   -sum(rp.menge)
         end
         from rechnungpos rp, rechnung rg
         where (rp.artikel=ar.artikel) 
         and (rp.rechnung = '053764')
         and (rg.rechnung = '053764')
         group by rp.artikel, rg.art)
    
    from artikel ar, rechnungpos rp
    where ar.artikel = rp.artikel and rp.rechnung = '053764'
    

    Ich habe noch eine Unterscheidung drin, ob es sich um eine Rechnung oder eine Gutschrift handelt (rg.art).

    Vielen Dank für die Mithilfe 🙂 🙂

    Andreas


Anmelden zum Antworten