This is topic несколько SQL-запросов подряд in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/000649.html

Posted by Юрий К. (Участник № / Member № 3684) on :
 
Здравствуйте, уважаемая техподдержка.! Не могли бы вы отправить мне пример организации нескольких SQL-запросов подряд в одной программе (с ожиданием выполнения каждого запроса) с реализацией алгоритма : “Если в реальном значении канала Call вызова шаблона связи СУБД появился 0, то запрос выполнен “. Заранее благодарен.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
IF (ARG_000 == 1) then \\ проверка старта цикла
ARG_006 = 1; \\выполнение первого запроса
ARG_000 = 2; \\ переход на второй запрос
end_if;
IF (ARG_000 == 2) and (ARG_001 == 0) then \\проверка окончания первого запроса
ARG_007 = 1; \\старт второго запроса
ARG_000 = 3; \\ переход на третий запрос
end_if;

и т.д.

Для запуска цикла нужно присвоить ARG_000 = 1.
 
Posted by Юрий К. (Участник № / Member № 3684) on :
 
Можно по-подробнее, а еще лучше бы пример. Мне нужно, чтобы за один проход программы выполнялось 3 SQL-запроса. Я написал программу:
m1: IF ARG_005 != 0 THEN
goto m1;
END_IF;
ARG_004 = 1; \\ Запрос 1
m2: IF ARG_005 != 0 THEN
goto m2;
END_IF;
ARG_004 = 2; \\ Запрос 2
m3: IF ARG_005 != 0 THEN
goto m3;
END_IF;
ARG_004 = 3; \\ Запрос 3
где
ARG_004 - с База_данных№1:Входное значение,
ARG_005 - с База_данных№1:Реальное значение.
Получилось,что в каждом цикле вызова программы отрабатывается только Запрос 3 - остальные "пролетают"
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вам был дан полный пример. Берите и пользуйтесь. Подробнее даже не знаем как написать. Старайтесь не использовать операторы GOTO.
 
Posted by Юрий К. (Участник № / Member № 3684) on :
 
Тогда скажите по привязкам аргументов в вашей программе:
ARG_001(IN,USINT) - Сall База_данных№1:Реальное значение -?
ARG_006(OUT,USINT) - Сall База_данных№1:Входное значение -?
ARG_007(OUT,USINT) - Сall База_данных№1:Входное значение -?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Да, абсолютно верно.

Если у Вас канал один связи с БД, то Вам хватит одного аргумента (вместо ARG_006 и 007), и приравнивать его к разным запросам
 
Posted by Юрий К. (Участник № / Member № 3684) on :
 
Да, канал связи с БД один. Спасибо! Буду реализовывать.
 
Posted by Юрий К. (Участник № / Member № 3684) on :
 
Начал реализовывать Ваш алгоритм - и опять столкнулся с трудностями. Как для запуска цикла SQL-запросов присвоить ARG_000 = 1. Я думаю, что нада ее сделать глобальной переменной и привязать к кнопке. Но как это сделать - не знаю!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Не надо делать глобальной переменной.

Просто аргумент экрана связываете с аргументом програмы.
 
Posted by Day13 (Участник № / Member № 3734) on :
 
Подскажите как сделать чтобы программа запускалась при старте МРВ. Я создал аргумент экрана и установил значение по умолчанию "1", но при старте значение не пересылается в программу. А если делать через кнопку, то все нормально, но такой вариант не подходит.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вам нужно поставить галочку отработать.
 
Posted by FiXiZ (Участник № / Member № 5069) on :
 
Здравствуйте!
По мотивам примеров выше написал подобный скрипт, но, в отличие от приера, он запускается сам каждую минуту. Текст скрипта:
IF (Номер_исп_запроса == 1) then
_DBASE__Запись_данных_OUT = 1;
Номер_исп_запроса = 2;
Счетчик_циклов = _DBASE__Запись_данных_R_In;

repeat
Счетчик_циклов = _DBASE__Запись_данных_R_In;
until (Счетчик_циклов!=0) end_repeat;
end_if;

IF (Номер_исп_запроса == 2) and (_DBASE__Запись_данных_R_In==0) then

_DBASE__Запись_данных_OUT2 = 2;
Номер_исп_запроса = 3;
Счетчик_циклов = _DBASE__Запись_данных_R_In;

repeat
Счетчик_циклов = _DBASE__Запись_данных_R_In;
until (Счетчик_циклов!=0) end_repeat;
end_if;
и т.д.

Дело в том, что ни пример выше, ни любые модификации моего скрипта у меня не работают как нужно. В любом случае происходит выполнение последнего запроса, в независимости сколько их всего. Что же я делаю не так? mysql 5.0
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Ошибка состоит в том, что оператор repeat здесь применять нельзя, т.к. в ходе выполнения программы аргумент _DBASE__Запись_данных_R_In не изменяется.
Наши рекомендации от 25.06.2009 - рабочие.
Видимо, в реализации его Вы допустили ошибки.
Пришлите, пожалуйста, на hotline3@adastra.ru Ваш пример проекта реализации НАШИХ рекомендаций с пояснениями.
 
Posted by FiXiZ (Участник № / Member № 5069) on :
 
Отправил
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Пример проекта с программой, реализующей последовательное выполнение запросов, выслан Вам на почту.

Код программы:

Case Счетчик of
1: In_Запрос_1= 1; Счетчик = 2;
2: If R_Запрос_1 == 0 then In_Запрос_2 = 1; Счетчик = 3; end_if;
3: If R_запрос_2 == 0 then In_Запрос_3 = 1; Счетчик = 0; end_if;
End_case;

Для выполнения запросов нужно задать аргументу «Счетчик» значение 1.
 
Posted by FiXiZ (Участник № / Member № 5069) on :
 
В данном примере при изменении переменной «Счетчик» на 1, выполняется только 1-ый запрос, остальные не проходят!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Проверил проект. Должны последовательно выполняться 3 запроса.

Чтобы убедиться, что у Вас выполнятся только первый запрос, проделайте следующее:
Поставьте флаг "Отладка" для каналов вызова шаблонов связей с СУБД. В папке узла проекта создайте cnf-файл с ключом DEBUG=40000 ( для релиза 6.07.7 ). Далее запустите проект и нажмите на кнопу "Выполнить запросы". После этого остановите проект и отправьте на hotline3@adastra.ru файл протокола профайлера и файл tm6_log.txt.

Если Вы работаете не в релизе 6.07.7, то в cnf-файле поставьте ключ DEBUG=2000.
 
Posted by FiXiZ (Участник № / Member № 5069) on :
 
В моем проекте источник данных один! Это важно. Возможно ли сделать несколько запросов на одном источнике? Высылаю пример. Там все время выполняется только первый запрос и не один раз.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В случае одного шаблона связи в СУБД во входное значение канала вызова шаблона нужно последовательно подавать число, соответствующее номеру SQL-запроса.
Реализовать программу можно аналогично примеру, приведенному выше для нескольких шаблонов.

В присланном Вами проекте в программе нет условия, обеспечивающего ожидания выполнения SQL-запроса по реальному значению канала вызова шаблона. Это и приводит к тому, что из трех запросов выполнятеся только первый.

Отправил Вам пример проекта.
 
Posted by Жигалов Денис Николаевич (Участник № / Member № 6035) on :
 
Вышлите пожалуйста пример проекта с программой, реализующей последовательное выполнение запросов.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
К сожалению, за давностью времени пример проекта не сохранен.
Суть процедуры состоит в том, что в программе, последовательно реализующей несколько SQL-запросов одного шаблона, условием запуска следующего запроса является завершение предыдущего. Факт завершения запроса определяется по равенству нулю ВХОДНОГО_ЗНАЧЕНИЯ канала CALL.SQL.
 
Posted by Plumber (Участник № / Member № 7942) on :
 
Доброго дня,уважаемая техподдержка.У меня к вам несколько вопросов.Вопрос первый-будет работать программа в таком виде и почему при компиляции выдает синтаксическую ошибку в первой строке?  -
 -
Пожалуйста помогите разобраться.
 
Posted by Plumber (Участник № / Member № 7942) on :
 
Да извините задача для начала: нужно отправить 3 запроса в разные строки таблицы автоматически.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Щелкните два раза по ошибке в сообщениях, курсор переместится на саму ошибку. Из скрина видно, что комментарии неправильно объявлены. См. справку: Программирование алгоритмов - описание языка Техно ST - Лексическая структура языка Техно ST - Комментарии Техно ST. Необходимы символы "//", тогда как в программе "\\". После правильного объявления комментария, его текст изменит цвет на серый.
 
Posted by Plumber (Участник № / Member № 7942) on :
 
А работать программа будет? аргументы правильные? И второй вопрос: как вывести на ГЭ ЭТИ значения? Заранее благодарен.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Почему необходимо использовать именно 3 запроса? В рамках одного запроса получить данные нет возможности?
Исправьте сначала очевидные ошибки. В отладчике будет результат компиляции.
Вывод уже полученных данных на графику описан почти в каждом учебном видео на нашем канале на YouTube: https://www.youtube.com/c/TRACEMODESCADAHMI
На сайте есть пример с ODBC с получением данных: http://www.adastra.ru/products/drivers/odbc/
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2