Тема / Topic: Работа с несколькими строками выборки
Usr
Junior Member / Новичок
Участник № / Member № 4363
отправлено / posted
Добрый день, уважаемая поддержка!
Задача звучит так:
необходимо сделать Select из БД. В результате запроса должны будут получиться несколько строк, которые я друг за другом хотел бы поместить в отчет (в один html файл, таблица из нескольких значение в шаблоне документов) с помощью программы или как нибудь иначе(если посоветуете).
В хелпе есть пункт "Выполнение SQL-запросов в реальном времени"->"Извлечение строк". Не понятно, если для выполнения запроса в программе я должен написать CALL.SQLQuery.In=0xFFFF, то какой должен быть входной параметр у программы?
Вопрос 2: если все таки удастся осуществить вопрос один, то, чтобы подряд перебрать все строки, которые вернулись после запроса, мне нужно общее их количество, где мне взять его?
Вопрос 3: аналогично тому, как описано в вопросе 1, как осуществить генерацию документа из программы?
Сообщения / Posts 18 | Из / From: Россия
| IP / IP: IP адрес / IP address |
NestorIT
Forum Member / Участник форума
Участник № / Member № 4337
отправлено / posted
На первые два вопроса попробую ответить вместо ТП.
Необходимо: 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 того же канала - код ошибки.
Сообщения / Posts 35 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Usr
Junior Member / Новичок
Участник № / Member № 4363
отправлено / posted
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.Документ определит регламент и направление формирования файла документа.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
отправлено / posted
Уважаемая поддержка, можно получить такой же развернутый комментарий но для групповой записи. Создал канал CALL.SQLQuery с типом OUT. К каждому аргументу запроса привязал по CALL.ChGroupReq. В которых создал по 8 аргументов направлением OUT. Этим 8 аргументам програмно присваиваю нужные значения, затем отправляю во входное значение CALL.SQLQuery 1. Записываются одни нули. Что делаю не так?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Перепроверили в релизе 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.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
отправлено / posted
Дъявол видимо как всегда кроется в деталях. Если возможно отправте вашу рабочую версию мне на мыло?
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
отправлено / posted
Спасибо получил. Запись пошла, но в поле с DATETIME пишутся 01.01.1970 08:00:00. Если вместо реального значения ChGroupReq, к базе данных привязать первый аргумент из ChGroupReq то значения пишутся нормальные. Версия релиза 6.06. База MS Access.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Вы имеете в виду, что 1 из каналов ChGroupReq имел аргументы типа D&T и писал в свой столбец БД с таким же типов данных?
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
отправлено / posted
Восемь аргументов ChGroupReq имеют тип D&T. Я привязал столбец БД с таким же типом данных к первому аргументу ChGroupReq. После этого стало писаться время указанное этом аргументе.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
Мы обнаружили некоторое несоответствие в типах данных. Пока, в качестве временного решения, задайте у соответствующего аргумента CALL.SQLQuery тип данных REAL.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
отправлено / posted
В отправленом примере к аргументам Date_and_time привязал время изменения битового меандра. Перестало работать. В трассировке видно, что вместо даты и времени отправляется 1. Можно пример где вместо констант, будт изменяемые значения. Хотя бы datatime.
Сообщения / Posts 11 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
К аргументам каналов ChGroupReq, привязанных к аргументам CALL.SQLQuery, могут быть привязаны только атрибуты РЕАЛЬНОЕ других каналов. Мы внесем дополнение в документацию.
В примере, посланном Вам, Вы можете привязать эти аргументы к атрибутам РЕАЛЬНОЕ каналов TIME. Можно передать в эти аргументы значение D&T из экрана, программы, канала CALL.MOVE и т.д., но с привязкой на стороне источников этих параметров.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Sapchag
Junior Member / Новичок
Участник № / Member № 4580
Alexander Novikov
Junior Member / Новичок
Участник № / Member № 5459
отправлено / posted
Здравствуйте! А можете мне тоже выслать данный пример? Заранее благодарен.
Сообщения / Posts 16 | Из / From: Россия
| IP / IP: IP адрес / IP address |