aximand
Goto Top

T-SQL Abfrage, Erstellen einer Sicht mit Parametern, die aus einer Schleife (array) stammen

Hallo,
ich ochse gerade an einem Problem rum.

Ich habe in Excel eine Listbox. Aus dieser sollen Lagerplätze gewählt werden. Die entsprechende Lagerplatznummer wird in ein Array strLagerplatz() geschrieben:

strLagerplatz(0) = "70284"
strLagerplatz(1) = "70999"
...

Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.

Create View vwIrgendwas AS
Select  
SUM(DISTINCT case **when Lagerplatzkennung = strLagerplatz(y)** then Bestand  else 0 end) AS strLagerplatz(y)
...

Hat da jemand eine Idee?

Content-ID: 310987

Url: https://administrator.de/contentid/310987

Ausgedruckt am: 08.11.2024 um 21:11 Uhr

SlainteMhath
SlainteMhath 27.07.2016 um 11:24:20 Uhr
Goto Top
Moin,

spontan:
SQL-Abfrage in Excel zusammen bauen und dann an den SQL Server senden..

Pseudo-Code.
strSQL=""  
for each item in strLagerplatz()
  if strSQL!="" then strSQL += " OR "  
  strSQL += " Lagerplatzkennung =" & item & "'"  
next
strSQL = "SELECT SUM(...) FROM .... WHERE" & strSQL  

lg,
Slainte
Biber
Lösung Biber 27.07.2016 aktualisiert um 18:11:16 Uhr
Goto Top
Moin Aximand,


Zitat von @Aximand:

Nun möchte ich einen View bauen, der flexibel auf die Anzahl der Lagerplätze reagiert.

ist alles vom Ansatz her schon zum Scheitern verurteilt... da liegen ein paar Missverständnisse vor.

Was du eigentlich willst, ist eine Pivotierung mit einer dynamischen Anzahl Spalten.

Ist bis dahin nicht exotisch oder verwegen - aber du willst es auf einem SQL-Server.
Das geht sich leider nicht.

Der T-SQL-Sprachumfang kennt zwar eine PIVOT-Syntax der Form:

SELECT <Feldliste > -- zB Lager70284,  Lager70999, ...
From Tabelle
PIVOT
max(bestand)
FOR  LagerPlatzkennung IN ( <keyliste>)

Problem ist, das vor allem die <keyliste> , aber auch die <Feldliste> NICHT dynamisch angegeben werden kann.
Auch nicht als ..For Lagerplatzkennung IN (SELECT Lagerplatzkennung from AlleLagerplätze).

Bedeutet:
ähnlich wie SlaintheMhath durch die Blume hat durchblicken lassen, musst du in mehrere Teilschritten
- erst einen Teilstring zusammenbasteln, der meinen Platzhalter <Feldliste> zusammenbastelt,
- einen weiteren Teilstring, der den Platzhalter <keyliste> zusammenbastelt
- einen großes Gesamtstatement zusammenbasteln, das meiner obigen Skizze entspricht
- mit diesem dynamisch erzeugten Statement den DB-Server belästigen und auf ein Resultset warten
- und dieses Resultset auch irgendwie dynamisch verwerten - da sind Spaltennamen drin, die ja nur der Statement-generierer kenn kann.

Ein in diesem Kontext vollkommen irrelevanter Schritt wäre, statt dieses dynamisch erzeugten (Einmal-)Statements nun auch noch einen View zu erzeugen bzw anzulegen... wozu?
Der View enthält doch nur die x Lagerplätze, die sich ein Benutzer gerade spontan ausgewählt hat. Das wird 1x gebraucht.
Einen View brauchst doch nur, wenn diese Abfrage mehrmals verwendet wird.


Egal, jedenfalls würde man dieses Statement eigentlich in einer stored procedure auf der (DB-)Serverseite generieren lassen.

In der Theorie kannst du es natürlich auch mit Excel-VBA zusammenklöppeln auf der Clientseite.
Ist zwar eine etwas wilde Aufgabenverteilung, aber solange du nicht noch zusätzlich mal eben irgendwelche Views auf dem Server droppen+neiu anlegen musst, wird dich dein DBA nicht erschiessen.

Befrag mal eine Suchmaschine nach "TSQL pivot dynamisch" (oder ähnlich), da gibt es Tonnen von Beispielen.
Ein deutschsprachiges empfehle ich für das grundsätzliche Verständnis: http://www.itrain.de/knowhow/sql/tsql/pivot/index.asp

Handwerklich brauchbare Lösungen finden sich anscheinened eher auf outlandish.
Vielleicht dieses hier:
http://blog.programmingsolution.net/sql-server-2008/sql-server-pivot-co ...

Grüße
Biber
Aximand
Aximand 27.07.2016 um 18:56:15 Uhr
Goto Top
Hallo Biber,

danke für die ausführliche Antwort.

Zum Verständnis:

Es ist ein ERP-System gegeben, das grottig gepflegt wird. Frontend Access und .Net, Backend MS-SQL. Die Geschäftsführung kann das Teil gar nicht bedienen, will es auch nicht bedienen können.
Stattdessen kommt die GF daher und will Excel-Dateien.
Und wie der Herr so das... nich wahr. Also arbeiten auch etliche Mitarbeiter total am System vorbei. Und Du kannst die Leute nicht an die Eier packen, wenn die GF nicht selbst dahinter steht. Zu umständliche Datenpflege im Frontend blablaba und plötzliches Wachstum des Unternehmens und die Prozesse kommen nicht hinterher.

Jetzt brauche ich also kumuliert aus allen möglichen Tabellen des ERP-Systems die relevanten Informationen für den Einkauf, der dann dort in Excel filtern kann oder mit den gezogenen Daten direkt in Excel weiter fruckeln kann. Z.B. artikelbezogen die Lagermengen auf Fremdfertiglagern, Gesamtlagermenge ohne Fremdfertiger, Wiederbschaffungszeiten der Artikel, Dispomethode, EK-Preis, Hauptlieferant, Verbrauch der letzten 6/12 Monate....

Fairerweise kommen auch Anforderungen hinzu die das ERP-System im Standard auswertungstechnisch nicht bietet, aber durchaus bieten könnte indem ich eigene Berichte (Abfragen) generiere.

D.h. das View soll diese Daten grundsätzlich erst einmal zusammenführen, weil das meiner Einschätzung nach schneller ist - kann mich aber auch irren.

Kommt nun ein neuer Lagerplatz hinzu, weil er angelegt wird, so ist der nicht im bestehenden View enthalten weil dort eine manuell verdrahtete Abfrage auf einem früheren IST-Stand durchgeführt wurde. Genaugenommen gab es mal 3 Fremdfertiger mit den Fremdfertiglagern und es werden halt mehr un dich will nicht jedesmal manuell die Sicht ändern.

Also möchte ich grundsätzlich erst einmal die Sicht aktualisieren.
Ermittle die Lagerplätze, die Fremdfertiglager = -1 sind und zieh mir diese in den view.

Mein erster Ansatz war, da ich eben über die Listbox eine Teilauswahl der relevanten Lager durchführen kann/will, dass ic, je nach den markierten Datensätzen in der Listbox den view aktualisiere. Weil die Abfrage Fremdfertiglager = -1 eben beim initialisieren der Listbox erfolgt.

Grundsätzlich war der Gedanke von SlaineMhath schon der richtige Hinweis und es funktioniert sogar. Ist aber eben kompliziert zu stricken.
Alleine weil Du eben auch auf die SQL-Syntax achten musst. Denn auch in dem Durchlauf der letzen Schleife hab ich dann hinten ein "," im Statement stehen, was da nicht sein darf. Ergo muss ich den gesamten String / Teilstring auch wieder manipulieren und das letzte Zeichen wegnehmen.

Eine SP wäre da schon schön, an diese Möglichkeit hatte ich aber eben noch nicht gedacht. Diese SP kann dann den View aktualisieren und ich die SP aus VBA beim öffnen des Dokumentes anleiern.

Daher rührt auch mein besonderer Dank, weil eben nicht nur die konkrete Lösung für ein Problem gezeigt wird, sondern darüber hinaus auch nachgefragt wird, was man erreichen will. Denn dadurch bin ich jetzt eben auf die SP gekommen.