This is topic несколько SQL-запросов подряд in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Здравствуйте, уважаемая техподдержка.! Не могли бы вы отправить мне пример организации нескольких 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
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/