WinCC SQL Datenbank sortieren mit VBS Wincc V15.1 Adv

CNC840D

Level-2
Beiträge
156
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich versuche gerade die SQL- Datenbank aus einem Siemens Beispiel anhand des Wertes einer Spalte auf bzw. absteigend zu sortieren, allerdings funktioniert beides nicht. Verwendet habe ich WINCC Adv V15.1

Ich hab mal Screenshots der Datenbank und, die SQL- Kommandozeile die mein Skript erzeugt sowie das Skript selber angehängt, vielleicht hat jemand eine Idee was hier bei mir nicht passt. ( Fehlermeldungen vom Skript hab ich übrigens keine).

Danke für eure Tipps, steh gerade echt etwas auf dem Schlauch :)

Datenbankaufbau (DB- Name "Test" Tabellenname "Tab_1"
1646127667594.png


Wert der erzeugt wird vom Skript
1646127563965.png

Vorlage aus SQL Forum....sollte eigentlich passen
SELECT Column_name FROM Table ORDER BY Column_name [ASC, DESC];

Skript!!

'Declaration of local tags - Deklaration von lokalem Variablen
Dim conn, rst, SQL_Table

On Error Resume Next

Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

'Open data source - Datenquelle öffnen
conn.Open "Provider=MSDASQL;Initial Catalog=" & SmartTags("szDatabase") & ";DSN="&Database_Name&"" 'DSN= name of the odbc database - DSN= Name der ODBC-Datenbank

'Error routine - Fehlerroutine
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
Err.Clear
Set conn = Nothing
Exit Sub
End If


'Select all entries of a table - Alle Einträge der Tabelle selektieren
SQL_Table = "SELECT * FROM " & SmartTags("szTableName")

'Execute - Ausführen
Set rst = conn.Execute(SQL_Table)

'Order the table by the first column - Tabelle nach der ersten Spalte sortieren
SQL_Table = "SELECT " & rst.Fields(3).Name &" FROM " & SmartTags("szTableName") & " ORDER By " & rst.Fields(3).Name &" DESC" '* = Alle Daten ' * = all data
SmartTags("SQL_Table")=SQL_Table



'Execute - Ausführen
Set rst = conn.Execute(SQL_Table)

'Error routine - Fehler Routine
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
Err.Clear
'Close data source - Datenquelle schließen
conn.close
Set conn = Nothing
Set rst = Nothing
Exit Sub
End If

'Close data source - Datenquelle schließen
conn.close

Set rst = Nothing
Set conn = Nothing

End Sub
 
Moin.
Bekommst du erstmal überhaupt eine Verbindung so zur DB?
Hast du das mal getestet?
conn.Open "Provider=MSDASQL;Initial Catalog=" & SmartTags("szDatabase") & ";DSN="&Database_Name&""
Was ist mit UID und Passwort? Falls diese existieren kommen die als Option hinten dran.

Falls das klappt hast du auch mal getestet wie dein Command aussieht der dort wirklich ankommt?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
'Order the table by the first column - Tabelle nach der ersten Spalte sortieren
SQL_Table = "SELECT " & rst.Fields(3).Name &" FROM " & SmartTags("szTableName") & " ORDER By " & rst.Fields(3).Name &" DESC" '* = Alle Daten ' * = all data
SmartTags("SQL_Table")=SQL_Table
Ich habe zwar keine Ahnung von dem, was Du da tust, aber als "neutralem Betrachter" springt mir der Eintrag zwischen SELECT und ORDER BY ins Auge:
muss da nicht die komplette Tabelle selektiert werden? Du willst doch (hoffentlich) die ganze Tabelle nach den Werten der 3. Spalte sortieren?

PS:
Habe gerade im WWW die Schreibweise mit Sternchen entdeckt:
SQL_Table = "SELECT * FROM " & SmartTags("szTableName") & " ORDER By " & rst.Fields(3).Name &" DESC"
Das würde ich so deuten, wie ich es gemeint habe.
 
Zuletzt bearbeitet:
Also die Verbindung zur DB funktioniert. Ich habe das Skript jetztmal so angepasst wie von Heinileini vorgeschlagen und lass mir die Tabelle in einen DB ausgeben. Die Werte im DB sind richtig sortiert, je nachdem ob ich DESC oder ASC sortiere. Allerdings wird die Tabelle aus dem Screenshot nicht so dargestellt auch nicht nach einem Refresh.
Ich bin jetzt nicht so der SQL und skripte Freak, aber kann es sein das die Tabelle immer mit index 1 beginnt und das so bleibt obwohlich sie umsortiere? Dann müsst ich halt die Tabelle sortieren und dann die sortierte Tabelle auf einen DB o.ä. legen oder geht das auch eleganter, so dass sich die Reihenfolge in der Original DB ansehen lässt?

Danke für eure Antworten!


Ich hab mal das aktuelle Skript angehängt in dem ich die Reihenfolge in den DB lege

'Declaration of local tags - Deklaration von lokalem Variablen
Dim conn, rst, SQL_Table, i, j

On Error Resume Next

Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

'Open data source - Datenquelle öffnen
conn.Open "Provider=MSDASQL;Initial Catalog=" & SmartTags("szDatabase") & ";DSN="&Database_Name&"" 'DSN= name of the odbc database - DSN= Name der ODBC-Datenbank

'Error routine - Fehlerroutine
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
Err.Clear
Set conn = Nothing
Exit Sub
End If


'Select all entries of a table - Alle Einträge der Tabelle selektieren
SQL_Table = "SELECT * FROM " & SmartTags("szTableName")

'Execute - Ausführen
Set rst = conn.Execute(SQL_Table)

'Order the table by the first column - Tabelle nach der ersten Spalte sortieren
SQL_Table = "SELECT * FROM " & SmartTags("szTableName") & " ORDER By " & rst.Fields(3).Name &" ASC" '* = Alle Daten ' * = all data

'Execute - Ausführen
Set rst = conn.Execute(SQL_Table)

'Error routine - Fehler Routine
If Err.Number <> 0 Then
ShowSystemAlarm "Error #" & Err.Number & " " & Err.Description
Err.Clear
'Close data source - Datenquelle schließen
conn.close
Set conn = Nothing
Set rst = Nothing
Exit Sub
End If

If Not (rst.EOF And rst.BOF) Then
'Vergleich ob "End of File" oder "Begin of File" ist, wenn nicht wird der Zeiger auf den Ersten Eintrag zurueckgesetzt
'Compare if "End of File" or "Begin of File" exists, if not the pointer will be reset to the first entry

rst.MoveFirst 'reset to 1st entry - auf 1. Eintrag zuruecksetzen

'Definition of local tags - Definiton von loklen Variablen
j=0

'Amount of the entries in the table - Anzahl der Tabelleneinträge
Do
j=j+1
rst.MoveNext
Loop Until rst.EOF

rst.MoveFirst 'reset to 1st entry - auf 1. Eintrag zuruecksetzen Do

'Name of the columns - Name der Spalten
SmartTags("szName_1") = rst.Fields(1).Name
SmartTags("szName_2") = rst.Fields(2).Name
SmartTags("szName_3") = rst.Fields(3).Name

For i=1 To j
'Entries of the table - Einträge in die Tabelle
If rst.EOF Then
SmartTags("index")(i) =0
SmartTags("Code["&(i)&"]") =0
SmartTags("Wert1")(i) =0
SmartTags("Wert2")(i) =0

Else

SmartTags("index")(i) = rst.Fields(0).Value
SmartTags("Code["&(i)&"]") =rst.Fields(1).Value
SmartTags("Wert1")(i) = rst.Fields(2).Value
SmartTags("Wert2")(i) = rst.Fields(3).Value
rst.MoveNext
End If
Next

rst.close
Else
ShowSystemAlarm "No entries are available."
End If

'Close data source - Datenquelle schließen
conn.close

Set rst = Nothing
Set conn = Nothing
 
Mit einem SELECT fragst du nur die Daten aus der Tabelle ab, an der Datenbanktabelle ändert sich damit überhaupt nichts.
Um eine Datenbanktabelle zu modifizieren gibt es andere SQL-Anweisungen. Was versprichst du dir denn von dem Vorhaben?

Ich meine "Nr" in deiner Sicht im Management Studio ist ein Auto-Inkrement Wert (oder etwas in der Art), d.h. die Nr wird automatisch vergeben evtl. um einfach die Reihenfolge abzuspeichern in der die Einträge eintreffen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte eigentlich die Tabelle im nach größtem oder kleinsten Wert sortieren und abspeichern.
Anschliessend hätte ich dann zeilenweise von oben nach unten anhand von Nr. die zugehörigen Datensätze weiterverarbeitet und am Schluss die Zeilen gelöscht, wieder neu sortiert usw.
Was wäre das denn für ein SQL Befehl um die Tabelle entsprechend zu modifizieren?
 
Das ginge z.B. mit ALTER TABLE. Das was du vorhast macht aber bei einer neuen Datenbanktabelle normalerweise niemand und ist höchstens bei einer Migration o.Ä. notwendig.
Wenn jemand die Daten sortiert nach x haben möchte, dann kann man diese Sortierung doch beim SELECT angeben so wie du es ja auch machst. Eine Zeile einfügen und anschließend die ganze Tabelle auf links zu drehen ergibt keinen Sinn, bzw. sollte man sich um den Aufbau der Datenbank kümmern, auch was hier z.B. Primärschlüssel ist.
 
Hab ich mir schon fast gedacht. Ich denke ich werde es dann dabei belassen wie es jetzt ist.
Danke für eure Antworten
 
Wie gesagt ich habe leider nicht wirklich viel Ahnung von SQL und kämpf mich gerade so durch ;-)
Wie kann denn so ein View angelegt werden?
 
Views findest du im Management Studio unterhalb don Tables. Das ist wenn man so will eine vorbereitete Abfrage, ist manchmal ganz nützlich man Abfragen über verschiedene Tabellen vorbereiten möchte und das nicht alles im Code haben möchte. Oder auch zum Testen ganz hilfreich.
 
Also die Verbindung zur DB funktioniert. Ich habe das Skript jetztmal so angepasst wie von Heinileini vorgeschlagen und lass mir die Tabelle in einen DB ausgeben. Die Werte im DB sind richtig sortiert, je nachdem ob ich DESC oder ASC sortiere.
DB = DatenBaustein und DB = DatenBank ? Vorsicht mit Deinen Bezeichnungen! Da sind ja Missverständnisse so was von vorprogrammiert. :(
Allerdings wird die Tabelle aus dem Screenshot nicht so dargestellt auch nicht nach einem Refresh.
Wie wird sie nicht bzw. wie wird sie denn angezeigt? Ich verstehe nicht.
Ich bin jetzt nicht so der SQL und skripte Freak, aber kann es sein das die Tabelle immer mit index 1 beginnt und das so bleibt obwohlich sie umsortiere?
Der "Index" dürfte wohl nur eine laufende Numerierung der Zeilen sein - nicht eine Spalte der Tabelle, die mit sortiert wird.
Dann müsst ich halt die Tabelle sortieren und dann die sortierte Tabelle auf einen DB o.ä. legen oder geht das auch eleganter, so dass sich die Reihenfolge in der Original DB ansehen lässt?
Ich frage mich warum Du die Tabelle in der DatenBank überhaupt sortierst und ob Du das überhaupt darfst? Wer "verwaltet" denn die DatenBank?

Wenn Du in der DatenBank nach Deinen Manipulationen den ursprünglichen Zustand wieder herstellen willst bzw. musst, dann geht das so gar nicht (dazu müsstest Du die IndexNrn bzw. ZeilenNrn in die Tabelle als zusätzliche Spalte eintragen und könntest abschliessend nach dieser Spalte sortieren).

Anscheinend benötigst Du nur in Deiner SPS ein nach Deinen Kriterien sortiertes Exemplar der Tabelle unter Beibehaltung des "Originals" in der DatenBank.
D.h. Du liest die (unveränderte) Tabelle aus der DatenBank in die SPS ein und kannst dann die Kopie der Tabelle in Deiner SPS nach Belieben sortieren, ohne den Inhalt der DatenBank zu verändern (= zerstören!?).
Aber vermutlich möchtest Du aus Bequemlichkeit die SortierTätigkeit lieber der DatenBank überlassen?

PS:
Man kann auch eine Tabelle sortieren ohne den Inhalt der Tabelle zu verändern (dann bleiben die Zeilen der Tabelle in der ursprünglichen Reihenfolge).
Dazu benötigst Du aber ...
- entweder ein von der Tabelle unabhängiges, weiteres Array mit (mindestens) so vielen Elementen, wie die Tabelle Zeilen hat
- oder wenn Du ohnehin Dein "eigenes" Exemplar (Kopie!) der Tabelle hast, mit dem Du anstellen kannst, was Du willst, dann kannst Du diese Tabelle um eine (oder mehrere) Spalte( n ) erweitern (pro Sortierung eine Spalte).
Um den Inhalt der Tabelle in der gewünschten Sortierung anzuzeigen, muss man dann allerdings "doppelt indirekt" adressieren (das ist aber nicht so kompliziert, wie es klingt) und ein Computer ist geduldig und der sträubt sich nicht dagegen. ;)

Du kannst speziell beim MSSQL-Server auch ein entsprechendes View anlegen, wo die Spalten entsprechend sortiert werden.
:unsure: Laaangsam, Thomas, hier geht es nicht darum die Spalten zu sortieren, sondern die Zeilen ... allerdings nach Kriterien, die sich aus einer oder mehreren Spalte[n] ergeben. Ich denke, Du hast genau das auch gemeint. Aber wir müssen hier mit Missverständlichkeiten sparen, wo wir nur können. ;)
 
Zuletzt bearbeitet:
Zurück
Oben