This is topic Получение сигнала выполненного запроса от БД in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Здравстуйте. Составлена программа ST на выполнение запроса INSERT. При нажатии на кнопку на экране, посылается сигнал через аргумент на выполнение запроса INSERT в БД. Однако при дальнейшей работе профайлера, данные продолжают независимо от кнопки записываться в БД, пополняя базу новыми дубликатами. Вопрос: Как можно получить сигнал от БД, что операция INSERT выполнилась? К какому атрибуту базы данных нужно привязать аргумент?
Posted by Ave Oleg (Участник № / Member № 6246) on :
Сделал еще одну кнопку "Stop", чтобы остановить запись в БД. И выяснилось, что дело тут еще в самой кнопке. После ее нажатия, сигнал теперь постоянно поступает в программу как будто кнопка нажата. Вопрос: 1. Как сделать, чтобы сигнал от кнопки выполнялся один раз после ее нажатия? 2. И приходил сигнал от БД, что INSERT выполнен.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Получилось, сделать вроде защелки на кнопку. В настройках кнопки (Передать значение -> Источник) сделал привязку к аргументу который обнуляет сигнал кнопки после нажатия. Но теперь приходиться немного держать кнопку, чтобы запрос INSERT успел выполниться хотя бы 1 раз. Теперь нужно решить еще одну задачу. Как "ловить" сигнал от БД, что INSERT выполнен?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Согласно документации для генерации SQL-запроса необходимо в атрибут ВХОДНОЕ значение канала CALL.SQL передать значение, равное номеру запроса в вызываемом шаблоне. После реализации запроса ВХОДНОЕ значение канала CALL.SQL автоматически сбрасывается в 0. Т.о., достаточно связать кнопку на экране с аргументом, который залинкован на ВХОДНОЕ значение канала CALL.SQL. Кнопку надо запрограммировать на "прямую передачу" номера запроса. После реализации запроса аргумент экрана автоматически сбросится в 0. От того же аргумента экрана можно сделать индикатор (цветом, контуром, текстом), который будет фиксировать состояние запроса.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Да, но этот предложенный Вами способ скорее всего не может быть реализован. В будущем вместо кнопки сигнал на запрос в базу данных будет посылаться от внешнего устройства(оптический датчик). По заданию требуется выполнять операции в следующем порядке. Получив данные в аргумент следует: 1. Выполнить поиск записи (дубликата) в БД через SELECT сравнив с данными в аргументе; 2. Если запись найдена, то Выдать сообщение "Найден дубликат"; 2. Если записи нет, то в БД заносим эти данные аргумента через INSERT. Что бы Вы могли посоветовать в этом случае?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Из документации: "Если в шаблоне связи с БД содержится только один SQL-запрос, в атрибут 91, I1 записывается число строк в выборке, полученной из таблицы БД в результате этого запроса. "
Т.о., программа, анализирующая сигнал от оптического датчика, должна при регистрации "События" передать во ВХОД канала CALL_SQL_SELECT (аргумент IN/OUT) значение "1" (программно сбрасывать значение этого канала не следует!). После этого программа должна контролировать значение канала CALL_SQL_SELECT и после его автоматического обнуления (запрос выполнен) проверить значение его атрибута 91 (I1). Если это значение отлично от 0, надо выдать сообщение "Найден дубликат". Если значение атрибута 91 (I1) равно 0, запустить канал CALL_SQL_INSERT передачей в его ВХОД через аргумент IN/OUT номера запроса (программно сбрасывать значение этого канала не следует!). Затем программа должна контролировать значение канала CALL_SQL_INSERT и после его автоматического обнуления (запрос выполнен) фиксировать и при необходимости индицировать завершение процедуры записи.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Спасибо большое за помощь. Я так понимаю, нужно создать канал "Событие" и как-то используя ГЭ "События" все это совместить с ST - программой управляющей SQL запросами ? Возник следующий вопрос: Оптического датчика пока нет в наличии, возможно ли вместо него использовать кнопку?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Можно использовать кнопку, которая временно будет привязана к каналу, получающему сигналы от датчика.
2. В ГЭ "События" на вкладке "Привязки" правой клавишей мыши на свойстве "Привязки" вызвать и подтвердить ЛК предлагаемую команду "Привязка". В открывшемся диалоге осуществить привязку к нужному аргументу.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Скажите пожалуйста, есть ли какое-либо обучающее видео или пример с использованием канала "Событие" и ГЭ "События"?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Материалов по использованию канала СОБЫТИЕ, дополняющих его описание в документации, нет.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Решил обойтись без канала "Событие", по причине массы вопросов. После SELECT по атрибуту 91 (I1)удается зафиксировать дубликат в БД. Спасибо. Вопрос: После нажатия кнопки со значением "1" сигнал в программном коде становиться постоянным "1" даже после завершения SELECT. Как можно обнулить сигнал от кнопки до следующего нажатия? Если в свойствах кнопки установить "Восстанавливать значение" - TRUE, то приходиться ее держать вручную пока не выполниться запрос, что не есть хорошо. Или же как то можно привязать дополнительный аргумент к кнопке который будет считывать Входное значение на базу данных?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Если сигнал с кнопки передается непосредственно во ВХОД канала CALL.SELECT, то по завершении запроса значение соответствующего аргумента экрана сбросится в 0 автоматически. Если кнопка передает сигнал в программу, надо предусмотреть сброс этого сигнала самой программой после передачи команды в канал CALL.SELECT. При этом аргумент программы, принимающий сигнал от кнопки, должен быть типа IN/OUT.
Posted by Ave Oleg (Участник № / Member № 6246) on :
Спасибо большое, все работает
Posted by DimaZh (Участник № / Member № 1718) on :
Доброго времени суток. Объясните пожалуйста как без программы инициировать запись в БД по сигналу входа модуля ввода?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Для выполнения запроса в канал Call.SQLQuery в атрибут Входное Значение (2, In) нужно записать 1. После отработки значение канала автоматически сбрасывается в 0.
Программа необходима для создания однократной команды на запись. Команда должна подаваться и удерживаться до тех пор, пока не завершится процесс передачи команды в драйвер ODBC. Без программы эта задача крайне сложная.
Posted by DimaZh (Участник № / Member № 1718) on :
Раз в 5 минут на 10 секунд будет замыкаться вход на модуле ввода/вывода, по этому сигналу нужно записать в БД состояние других входов.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Можно реализовать необходимую логику с помощью программы. Например в FBD есть вкладка с FBD-блоками "триггеры и счетчики". Можно выбрать и настроить подходящие Вам по условиям счетчики и триггеры и с их помощью реализовать импульс по нужному событию и передать его на вход канала вызова шаблона СУБД, который осуществит запись в БД.
Posted by DimaZh (Участник № / Member № 1718) on :