1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

VBS/SQL. Присвоить значение тегу, полученному из БД

Ответить

Автор темы
asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение asuprog »

Приветствую всех.
Все еще разбираюсь с темой "Работа с SQL из VBS WinCC". Хочу запросить у БД значение и записать его в тег.
Имеем в БД таблицу TAB. В ней два поля ID (ключ) и DATA. Нам нужно содержание поля DATA

Код: Выделить всё

	'Опускаю моменты подключения к базе. Там вроде как все верно
	Dim objConnection
  	Set objConnection = CreateObject("ADODB.Connection")
	strSQL = "SELECT DATA FROM TAB WHERE ID = 1"
	objConnection.Execute strSQL
	Dim Any
	Set Any = HMIRuntime.Tags("Tag")
	Any.Write 'Вот что тут записать )
Пробую так

Код: Выделить всё

	Dim a
	strSQL = "SELECT a = DATA FROM TAB WHERE ID = 1"
	objConnection.Execute strSQL
	Dim Any
	Set Any = HMIRuntime.Tags("Tag")
	Any.Write a
Не выходит. Ошибок по обоим скриптам нет.

makesstr
осмотрелся
осмотрелся
Сообщения: 194
Зарегистрирован: 19 сен 2019, 10:09
Имя: Макс
Страна: Россия
город/регион: Славянск-на-Кубани
Благодарил (а): 5 раз
Поблагодарили: 34 раза

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение makesstr »

Попробуйте так
Option Explicit
Function action
Dim Srvname, strCon, cn, sql, sql2, query, res, Vsm, Vmm, j, mm, LVL
Dim Capacity ''Вместимость м3/мм для РВС

For j = 1 To 18 ' Номер РВС

If j<=11 Then
Set LVL = HMIRuntime.Tags("L_2.L_"&j)
Else Set LVL = HMIRuntime.Tags("L_1.L_"&j-11)
End If

LVL.Read
On Error Resume Next

Srvname = HMIRuntime.Tags("@ServerName").Read + "\WINCC"
strCon = "Provider=SQLNCLI11.1;Server=" + Srvname + ";Database=TankVolume;Trusted_Connection=Yes;"
Set cn = CreateObject("ADODB.Connection")
cn.Open strCon


'Расчет обьема с сантиметров
sql = "SELECT top 1 [Volume] FROM [Calc] WHERE [Number] = {Number} AND [Level] <= {Level} ORDER BY [Level] DESC"
query = Replace(sql, "{Number}", j)
query = Replace(query, "{Level}", Replace(LVL.Read * 100, ",", "."))

Set res = cn.Execute(query)
Vsm = res.Fields(0).Value
Vsm.Read
'Расчет обьема с миллиметров
sql2 = "SELECT top 1 [Capacity] FROM [Calc] WHERE [Number] = {Number} AND [Level] <= {Level} ORDER BY [Level] DESC"
query = Replace(sql2, "{Number}", j)
query = Replace(query, "{Level}", Replace(LVL.Read * 100, ",", "."))

Set Capacity = cn.Execute(query)
Capacity = Capacity.Fields(0).Value
Capacity.Read

mm = Round((LVL.Read*100-Fix(LVL.Read*100))*10) 'Целое кол-во мм
Vmm = mm *Capacity
Vmm.read
If LVL<0.028 Then
HMIRuntime.Tags("V_"&j).Write Vmm+Vsm
Else HMIRuntime.Tags("V_"&j).Write 0
End if
Next

End Function
WinCC 7.4 SP1 Upd15, Step5.6

Автор темы
asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение asuprog »

Спасибо.
Пришел пока к такому выводу, что без RecordSet пока никак. Правда у Вас он как то необычно рализован
makesstr писал(а): 23 янв 2020, 08:01 strCon = "Provider=SQLNCLI11.1;Server=" + Srvname + ";Database=TankVolume;Trusted_Connection=Yes;"
Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

Set res = cn.Execute(query)
Vsm = res.Fields(0).Value
Vsm.Read
Видимо работает и так. Может дело в провайдере (драйвере). Я открываю драйвером provider = SQLOLEDB.1
У меня более "классически"

Код: Выделить всё

Set rst = CreateObject("ADODB.RecordSet")
rst.ActiveConnection = objConnection
strSQL = "SELECT DATA FROM TAB WHERE ID = 1"
rst.Open strSQL
HMIRuntime.Trace rst.fields("DATA") & vbCrLf 'Выводим в окно дебагера
Мало опыта у меня с SQL, и подумалось, может есть что то попроще. Сделать запрос и присвоить полученное значение переменной. Обычной. Может и есть такой способ.
А скрипт написан, немного допилю - скину

Отправлено спустя 25 минут 29 секунд:
На самом деле запись в БД конечно не одна, но я точно знаю, что их неизменно 30.
Создал в WinCC 30 внутренних тегов Opt_1 - Opt_30

Код: Выделить всё

 	Dim objConnection
  	Set objConnection = CreateObject("ADODB.Connection")

  	Dim strConnectionString
  	Dim msqlserver
  	Dim msqldatabase
  	Dim userlogin
  	Dim userpassword
  	Dim strSQL
  	Dim rst
  	Dim i
	Dim group
	Set group = HMIRuntime.Tags.CreateTagSet

  	msqlserver = "SQL_Server"
 	msqldatabase = "DB"
  	userlogin = "log"
  	userpassword = "pass"

' 	MS SQL Server, SQL authorization
  	strConnectionString = "provider=SQLOLEDB.1; Data Source=" + msqlserver + ";User ID=" + userlogin + ";Password=" + userpassword + ";Initial Catalog=" + msqldatabase

  	objConnection.ConnectionTimeout = 60
  	objConnection.Open strConnectionString
  	
  	Set rst = CreateObject("ADODB.RecordSet")
  	rst.ActiveConnection = objConnection
  	
  	strSQL = "SELECT DATA FROM TAB"
  	rst.Open strSQL
  	
  	For i = 1 To 30
  		group.Add "Opt_" & i
  		group("Opt_" & i).Value = rst.fields("DATA").Value
  		rst.MoveNext
  	Next
  	
  	rst.Close	'Надеюсь, что этим я освобождаю память от полученных данных RecordSet )
  	group.Write
И еще вопросик назрел. Вот открыли мы сессию

Код: Выделить всё

objConnection.Open strConnectionString
Ее не надо закрывать в конце, как нибудь вроде objConnection.Close? В примерах такого нигде не наблюдаю. А закрыть что нибудь после использования - очень хочется )

makesstr
осмотрелся
осмотрелся
Сообщения: 194
Зарегистрирован: 19 сен 2019, 10:09
Имя: Макс
Страна: Россия
город/регион: Славянск-на-Кубани
Благодарил (а): 5 раз
Поблагодарили: 34 раза

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение makesstr »

Это цикличный скрипт, поэтому надобности закрывать соединение нет. А вообще в других примерах в конце скрипта соединение закрывают.
Например
[+]
https://stackoverflow.com/questions/261 ... connection
WinCC 7.4 SP1 Upd15, Step5.6
Аватара пользователя

den_vish
освоился
освоился
Сообщения: 233
Зарегистрирован: 11 апр 2013, 13:22
Имя: Вишневский Денис
Благодарил (а): 11 раз
Поблагодарили: 13 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение den_vish »

asuprog писал(а): 23 янв 2020, 09:55 Ее не надо закрывать в конце, как нибудь вроде objConnection.Close? В примерах такого нигде не наблюдаю. А закрыть что нибудь после использования - очень хочется )
закрывай, иначе можешь поиметь тучу открытых соединений в базе,
а потом база просто тебя не пустит
"- Знаешь, дружище, в чем истинный смысл второго закона термодинамики?
Как ни упирайся, а бардака все больше. И чем серьезнее ты упираешься, тем страшнее неразбериха."(с)

Автор темы
asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение asuprog »

den_vish писал(а): 23 янв 2020, 11:02закрывай
Так?

Код: Выделить всё

objConnection.Open strConnectionString
' Поюзали БД
objConnection.Close strConnectionString
makesstr писал(а): 23 янв 2020, 10:13 Это цикличный скрипт
Ну да, как и весь Runtime в режиме ОСРВ. Только этот скрипт выполняется раз в 10 минут. А мне неизвестны тонкости работы MS SQL. То ли она сама закроет автоматически неактивное соединение, то ли как говорит den_vish они остаются открытыми. А это уже не есть гуд, и закрывать их нужно в любом случае.
Аватара пользователя

den_vish
освоился
освоился
Сообщения: 233
Зарегистрирован: 11 апр 2013, 13:22
Имя: Вишневский Денис
Благодарил (а): 11 раз
Поблагодарили: 13 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение den_vish »

asuprog писал(а): 23 янв 2020, 13:37 objConnection.Close
этого хватает обычно
"- Знаешь, дружище, в чем истинный смысл второго закона термодинамики?
Как ни упирайся, а бардака все больше. И чем серьезнее ты упираешься, тем страшнее неразбериха."(с)

Автор темы
asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

VBS/SQL. Присвоить значение тегу, полученному из БД

Сообщение asuprog »

den_vish писал(а): 24 янв 2020, 04:33 этого хватает обычно
Да. Спасибо. Выяснилось оптыным путем ) Мой вариант с закрытием со строкой давал ошибку при исполнении. Также добавил строчку

Код: Выделить всё

Set objConnection = Nothing
Разрушил... метод наверно ) Не силен в ООП терминологии
Ответить

Вернуться в «WinCC»