This is topic Работа с несколькими строками выборки in forum SIAD/SQL. Архивирование в TRACE MODE / SIAD/SQL. Data Logging in TRACE MODE at Форум TRACE MODE: техническая поддержка.


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

Posted by Usr (Участник № / Member № 4363) on :
 
Добрый день, уважаемая поддержка!

Задача звучит так:

необходимо сделать Select из БД. В результате запроса должны будут получиться несколько строк, которые я друг за другом хотел бы поместить в отчет (в один html файл, таблица из нескольких значение в шаблоне документов) с помощью программы или как нибудь иначе(если посоветуете).

Вопрос один: http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/40/t/000034.html - тут сказано что можно получить несколько строк, как это сделать?

В хелпе есть пункт "Выполнение SQL-запросов в реальном времени"->"Извлечение строк". Не понятно, если для выполнения запроса в программе я должен написать CALL.SQLQuery.In=0xFFFF, то какой должен быть входной параметр у программы?

Вопрос 2: если все таки удастся осуществить вопрос один, то, чтобы подряд перебрать все строки, которые вернулись после запроса, мне нужно общее их количество, где мне взять его?

Вопрос 3: аналогично тому, как описано в вопросе 1, как осуществить генерацию документа из программы?
 
Posted by NestorIT (Участник № / Member № 4337) on :
 
На первые два вопроса попробую ответить вместо ТП.

Необходимо:
1. шаблон БД с одним запросом (SELECT...), который возвращает много строк
2. канал типа CALL с типом вызова SQLQuery, вызывающий вышеуказанный шаблон БД (может быть получен автоматически перетаскиванием шаблона БД из предыдущего пункта в МРВ, н-р, в /Система/RTM_1/Каналы в навигаторе проекта если имена по умолчанию). Назовем его SQL_SELECT.
3. на каждый столбец выборки данных, возвращаемой запросом - канал типа CALL с типом вызова (дополнением) ChGroupReq. Для них надо создать N-аргументов (по max количеству извлекаемых в запросе строк) с типом данных, соответствующим типу параметра в шаблоне запроса и направлением IN.

Т.е. если запрос изначально был
code:
 SELECT a #A#, b #B# FROM T 

где параемтр шаблона вызова БД #A# скажем типа TIME, а #B# типа REAL, то создаем два канала CALL с типом вызова ChGroupReq, скажем, ChGroupReq_A и ChGroupReq_B, и для каждого из них создаем аргументы - для ChGroupReq_A с типом TIME, а для ChGroupReq_B - типом REAL. Именно в этих аргументах и будут располагаться извлекаемые данные.

4. Для канала CALL с типом вызова SQLQuery (см. п. 2. - SQL_SELECT) неоходимо аргументы связать со входными значениями каналов CALL с типом вызова ChGroupReq (см. п. 3.)

Т.е., продолжая пример, #А# канала SQL_SELECT с запросом связываем с ChGroupReq_A.ВходноеЗначение, #B# - с ChGroupReq_B.ВходноеЗначение

5. Когда необходимо получить данные из БД, то в канал с запросом (см. п. 2. - SQL_SELECT) во ВходноеЗначение посылаем 65535 или что то же самое 0xFFFF. Сделать это можно разными способами: хоть программа будет посылать это значение, хоть опреатор через "Ввести и передать" - неважно.

6. Как только в канале с запросом (SQL_SELECT) входное значение вернется в нулевое значение - запрос выполнен, в аргументах каналов ChGroupReq_A и ChGroupReq_B распологаются данные.
В атрибуте I1 канала SQL_SELECT - количество строк, в атрибуте I2 того же канала - код ошибки.
 
Posted by Usr (Участник № / Member № 4363) on :
 
Спасибо за информацию, все доступно объяснили)))
буду пробовать!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
NestorIT, спасибо.
Надо только уточнить:
"к аргументу канала CALL.SQLQuery, который используется в качестве подстановки в запросе, привязан атрибут 0, R канала CALL.ChGroupReq. "

По вопросу 3.
Для генерации документа программа должна записать во ВХОДНОЕ значение канала CALL, вызывающего шаблон документа, "ненулевого значения, при этом биты этого значения, установленные в 1, задают следующие опции:
бит 0 (0x1) – вывод на принтер;
бит 1 (0x2) – публикация на web-сервере (см. TRACE MODE Data Center );
бит 4 (0x10) – отображение жирных кривых (3 px) на трендах.

После отработки значение канала автоматически сбрасывается в 0."

В простейшем случае достаточно послать "1".

При этом значение атрибута ПАРАМЕТР канала CALL.Документ определит регламент и направление формирования файла документа.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Уважаемая поддержка, можно получить такой же развернутый комментарий но для групповой записи.
Создал канал CALL.SQLQuery с типом OUT. К каждому аргументу запроса привязал по CALL.ChGroupReq. В которых создал по 8 аргументов направлением OUT. Этим 8 аргументам програмно присваиваю нужные значения, затем отправляю во входное значение CALL.SQLQuery 1. Записываются одни нули. Что делаю не так?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Перепроверили в релизе 6.07 и MS Access.
Создали канал CALL.SQLQuery с типом OUT с двумя аргументами, связанными со столбцами БД (не с ID (!)).
К каждому аргументу запроса привязали по CALL.ChGroupReq. В которых создали по 8 аргументов направлением OUT. Этим 8 аргументам каналов CALL.ChGroupReq присваивали произвольные значения.
Затем отправляли во входное значение CALL.SQLQuery 1. Записывалась 1 строка со значениями аргументов ARG_000 каналов CALL.ChGroupReq.
Затем отправляли во входное значение CALL.SQLQuery 8. Записывались 8 строк со значениями аргументов ARG_000- ARG_007 каналов CALL.ChGroupReq.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Дъявол видимо как всегда кроется в деталях. Если возможно отправте вашу рабочую версию мне на мыло?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Отправлено.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Спасибо получил. Запись пошла, но в поле с DATETIME пишутся 01.01.1970 08:00:00. Если вместо реального значения ChGroupReq, к базе данных привязать первый аргумент из ChGroupReq то значения пишутся нормальные. Версия релиза 6.06. База MS Access.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вы имеете в виду, что 1 из каналов ChGroupReq имел аргументы типа D&T и писал в свой столбец БД с таким же типов данных?
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Восемь аргументов ChGroupReq имеют тип D&T. Я привязал столбец БД с таким же типом данных к первому аргументу ChGroupReq. После этого стало писаться время указанное этом аргументе.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Мы обнаружили некоторое несоответствие в типах данных.
Пока, в качестве временного решения, задайте у соответствующего аргумента CALL.SQLQuery тип данных REAL.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Можно поподробней как обойтись типом REAL? У меня не получилось.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Отправлен адаптированный пример.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
В отправленом примере к аргументам Date_and_time привязал время изменения битового меандра. Перестало работать. В трассировке видно, что вместо даты и времени отправляется 1. Можно пример где вместо констант, будт изменяемые значения. Хотя бы datatime.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
К аргументам каналов ChGroupReq, привязанных к аргументам CALL.SQLQuery, могут быть привязаны только атрибуты РЕАЛЬНОЕ других каналов.
Мы внесем дополнение в документацию.

В примере, посланном Вам, Вы можете привязать эти аргументы к атрибутам РЕАЛЬНОЕ каналов TIME.
Можно передать в эти аргументы значение D&T из экрана, программы, канала CALL.MOVE и т.д., но с привязкой на стороне источников этих параметров.
 
Posted by Sapchag (Участник № / Member № 4580) on :
 
Все получилось спасибо!
 
Posted by Alexander Novikov (Участник № / Member № 5459) on :
 
Здравствуйте! А можете мне тоже выслать данный пример? Заранее благодарен.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Отправлено.
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2