# Werte von WinCCFlexible in SQL-Datenbank schreiben per Script



## hollyzwei (30 März 2011)

Hallo Leute,

ich wollte gerne Daten archivieren aus meinem Flexible-Project per Script.
Meine SQL-Tabelle besitzt 5 Spalten (Id=Primärschlüssel,Datum,Start,Ende,Dauer), bei einer Wertänderung einer bestimmten Variable wird mein Script ausgeführt. Hab mein Script so geschrieben, wie auf der Siemens Support Seite beschrieben *3.2 Datensatz schreiben*
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW
mit INSERT INTO VALUES und funktioniert auch alles soweit mit der Wertübertragung.
Mein Problem ist aber, ich möchte gerne nur in 4 Spalten (Datum,Start,Ende,Dauer) Werte schreiben und die erste Spalte Id soll dann automatisch in der SQL-Tabelle immer einen Wert weiter springen.
Auf der Siemens Seite wird nur beschrieben , wie man alle Spalten schreibt.
Könnte vielleicht jemand einen Beispielcode reinsetzen,mit allen Kommas,&-Zeichen,"-Strichen usw.???


----------



## tnt369 (30 März 2011)

wo soll denn der index-wert herkommen?
musst du schon selber erzeugen!

ich würde so vorgehen:
1. höchsten wert lesen (mit select und sortierung nach erster spalte)
2. +1 auf den wert addieren
3. und dann in alle 5 spalten mit insert schreiben

alternativ das lesen des höchsten wertes nur einmal beim
programmstart ausführen um zugriffe zu sparen.


----------



## tnt369 (30 März 2011)

warum wird der index benötigt?
reicht evtl. auch ein zeitstempel?
ich verwende gerne als typ "timestamp" mit "now()" bekommst du da
das aktuelle datum und die uhrzeit eingefügt. das sollte auch eindeutig
sein.

hab gerade noch etwas nachgeschlagen. es gibt eine funktion
"auto_increment". diese muß bei der definition der tabelle für eine
spalte angegeben werden. such mal in der doku zu deinem
sql-server danach.


----------



## hollyzwei (31 März 2011)

Danke für die schnelle Antwort.

Das mit der Addition würde ich gerne ausprobieren. Nur weiß ich nicht genau wie.

Mein Code speziell für SELECT und INSERT INTO sieht jetzt folgender Maßen aus:
SQL_Table = "SELECT * FROM"& "Tabellen_Name" & " WHERE Id = "& Dat_No

SQL_Table = "INSERT INTO "& "Tabellen_Name" & " VALUES ('" & Dat_No & _
"' , '" & Value_1 & "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

könnten vielleicht auch Fehler drin sein, bin erst Montag wieder in der Firma und seh den Code jetzt nicht vor mir.
Wo muss ich jetzt die Addition ansetzen.
Könntest du oder jemand mir bitte den oberen Code so umschreiben, dass es funktioniert.


----------



## mkol (31 März 2011)

setz bei deiner ersten spalte im sql server management studio die eigenschaft "identity" (increment 1), d.h. diese spalte wird dann automatisch hochgezählt.

daten einfügen kannst du dann folgendermaßen:

insert into tabelle (datum, start, ende, dauer) values ('hallo', 'welt', 'wie', 'gehts')

die spalte mit deiner id kommt also gar nicht vor, das regelt der sql server dann für dich.

(ich bin jetzt mal davon ausgegangen, du arbeitest mit dem microsoft sql server ...)


----------



## tnt369 (31 März 2011)

das lesen müsste etwa so aussehen:

SQL_Table = "SELECT * FROM " & "Tabellen_Name" & " ORDER BY Id DESC"

damit wird die tabelle gelesen und sortiert nach Id bereitgestellt (höchste zuerst).
du bekommst damit eine komplette tabelle als ergebnis!
nun wie im siemens-beispiel mit RST.MOVEFIRST den ersten datensatz
(und dmit die höchste Id) anwählen.
lesen und erhöhen mit
Dat_No = RST.FIELDS(0).VALUE
Dat_No = Dat_No +1

das ganze sollte noch auf RST.EOF und RST.BOF abgefragt werden wie
im siemens-beispiel.

und das schreiben passt so wie es du gemacht hast.


----------



## mkol (31 März 2011)

wenn man es unbedingt manuell machen will (was mir nicht sinnvoll erscheint), kann man auch mit

select max(id) + 1 from tabelle

die nächste id/den nächsten index-wert ermitteln.


----------



## hollyzwei (31 März 2011)

Ok werde eure Vorschläge am Montag gleich mal testen und dann Info geben.Danke nochmal.

Den Vorschlag von mkol: 

insert into tabelle (datum, start, ende, dauer) values ('hallo', 'welt', 'wie', 'gehts')

hatte ich schon mal ausprobiert, nur funktioniert es bei mir nicht.Muss dazu sagen, das mit der increment_Funktion war auch nicht aktiviert,Spalte Id war nur mit einem Primärschlüssel versehen.
Hatte es ungefähr so geschrieben:
SQL_Table = "INSERT INTO "& "Tabellen_Name" ("Datum","Start","Ende","Dauer") & " VALUES ('" & Dat_No & _
"' , '" & Value_1 & "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

Was habe ich dort falsch gemacht??


----------



## hollyzwei (31 März 2011)

Sorry hinter VALUES der erste Wert muss natürlich weg.
SQL_Table = "INSERT INTO "& "Tabellen_Name" ("Datum","Start","Ende","Dauer") & " VALUES ('" & Value_1 & "' , '" & Value_2 & "' , '" & Value_3 & _
"' , '" & Value_4 & "')"


----------



## tnt369 (31 März 2011)

es müsste lauten:

SQL_Table = "INSERT INTO " & Tabellen_Name & " (Datum,Start,Ende,Dauer) VALUES ('" & Value_1 & "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

vorrausgesetzt Tabellen_Name ist eine Variable (String)


----------



## hollyzwei (31 März 2011)

Danke für die Vorschläge, werde diese am Montag gleich mal testen.

Den 1.Vorschlag von mkol hatte ich schon ausprobiert.
Meine Id Spalte war mit einem Primärschlüssel versehen,nur die Increment-Funktion war nicht aktiviert und mein Code sah so aus:
SQL_Table = "INSERT INTO "& "Tabellen_Name" ("datum","start","ende", "dauer") & " VALUES ('" & Value_1 & _ "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

Lag es jetzt an der Increment-Funktion oder ist mein Code falsch???


----------



## hollyzwei (31 März 2011)

Danke für die Vorschläge, werde diese am Montag gleich mal testen.

Den 1.Vorschlag von mkol hatte ich schon ausprobiert.
Meine Id Spalte war mit einem Primärschlüssel versehen,nur die Increment-Funktion war nicht aktiviert und mein Code sah so aus:
SQL_Table = "INSERT INTO "& "Tabellen_Name" ("datum","start","ende", "dauer") & " VALUES ('" & Value_1 & _ "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

Lag es jetzt an der Increment-Funktion oder ist mein Code falsch??? 


​


----------



## hollyzwei (31 März 2011)

Liegt wahrscheinlich an der Zuweisung des Tabellennamens
Das heißt also ich lege eine String Variable mit dem Name "Tabellen_Name" an (Interne Variable).
Nur wie weise ich der Variable "Tabellen_Name" die entsprechende Tabelle zu?


----------



## tnt369 (31 März 2011)

wenn du denn tabellennamen kennst und dieser immer gleich ist, dann
schreibe ihn (ohne eine variable zu verwenden) fest in den INSERT
Befehl mit rein:

SQL_Table = "INSERT INTO tabellenname (Datum,Start,Ende,Dauer) VALUES ('" & Value_1 & "' , '" & Value_2 & "' , '" & Value_3 & "' , '" & Value_4 & "')"

lass dir den string (SQL_Table) mal ausgeben und poste ihn hier falls
es probleme damit gibt.

sollte der tabellenname nicht fix sein, dann müsste ich wissen woher
der name dann kommt (eingabefeld?).


----------



## hollyzwei (31 März 2011)

Ok, Danke für die Hilfe, werde es am Montag ausprobieren und mich dann nochmal melden.
Bis dann


----------



## hollyzwei (4 April 2011)

Danke hab alles soweit hinbekommen.


----------

