Создание кластера с размерностью, заданной параметром

Простейшие вопросы в области инженерной разработки
Ответить
rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Создание кластера с размерностью, заданной параметром

Сообщение rsv »

Доброго времени суток.
Хочу создать универсальный SubVI, который на входе принимает запрос к базе, а на выходе выдаёт кластер с одной строкой, но разным количеством полей в ней.
Проблема в том, что функции Database Variant To Data на вход Type надо подать шаблон кластера переменной размерности, которая задаётся входным параметром SubVI.
Тип всех полей, возвращаемых запросом можно приводить к String.
Подскажите, пожалуйста, как создать кластер с размерностью, заданной параметром?
Вложения
ExecSP.JPG

Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
professor
professor
Сообщения: 4922
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Репутация: 0
Версия LabVIEW: 2015, 2016
Откуда: СССР

Re: Создание кластера с размерностью, заданной параметром

Сообщение IvanLis »

Сомнительная идея.
Если вы хотите получить данные в виде 2D массива String типа, так и подключите его вместо TypeDef кластера....
Нужно получить 1D массив, его подключаете.
Кластер не обязательно, там вход Type, Вы этот тип и определяете. Ну и обработку делаете соответственно исходя из предопределенного типа.
https://zone.ni.com/reference/en-XX/hel ... t_to_data/

Посмотрите примеры, станет более понятен механизм взаимодействия с БД.

ujin
junior
junior
Сообщения: 68
Зарегистрирован: 28 июл 2019, 13:16
Репутация: 0
Версия LabVIEW: 19
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение ujin »

Подскажите, пожалуйста, как создать кластер с размерностью, заданной параметром?
Если сформулировать по другому. Вы хотите подать на входной параметр строку из которой получите тип кластера и далее используете его в качестве Typedef.
Или Вы хотите подать на вход Typedef заранее неизвестно какой кластер и получить на выходе так же заранее неизвестный кластер но определенный во время вызова subVI
При этом строку параметра (а на самом деле это не параметр а запрос, который может содержать много параметров и быть достаточно сложным) вы сформируете исходя из требуемого кластера перед вызовом subVI
Эта задача к базам данных имеет отношение только потому, что Вы в subVI используете обращение к базе.
В другом случае это мог бы быть вызов разных обработчиков инструментов.
В общем надо смотреть классы и Dynamic Dispatch методы.
Когда Вы подаете на входной параметр запрос в виде текстовой строки в ответ изначально приходит так же набор текстовых полей.
Запрос может быть сложным и к разным базам данных. Например я запрашиваю аналоговые параметры
SELECT fa.instrument_gain, fa.instrument_offset, fa.time_const,
fa.instrument_min_offset, fa.instrument_range_min, fa.process_range_min,
fa.process_low_acd, fa.process_low_alr, fa.process_high_alr,
fa.process_high_acd, fa.process_range_max, fa.instrument_range_max,
fa.instrument_max_offset, fa.d, fa.input_register_min,
fa.input_register_max, fa.input_pv_min, fa.input_pv_max, kfm.module_num,
fa.control_channel_num, kfm.ip_adress, fa.fcode, fa.fcodef,
fa_sun_3.fcode_full, fa_sun_3.fname, fa.process_units
FROM fa
JOIN kfm ON fa.control_fcode = kfm.fcode AND fa.control_fcode = kfm.fcode AND fa.control_module::text = kfm.module::text
JOIN fa_sun_3 ON fa.fcode = fa_sun_3.fcode AND fa.fcodef::text = fa_sun_3.fcodef::text;
поле fa.fcode имеет тип LTREE. LabVIEW не знает о таком типе данных и поэтому в LabVIEW я преобразую этот тип в enum.
Т.е. Вы всегда заранее знаете, что Вы запрашиваете из базы. В связи с этим можно и тип заранее проставить.
Повторюсь если нужно переопределять тип входа и выхода, то для этого лучше использовать классы.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение rsv »

>> Если вы хотите получить данные в виде 2D массива String типа, так и подключите его вместо TypeDef кластера....
Действительно. Подключил массив и получил массив. На первое время в таком виде пожалуй сойдёт...
Вложения
ExecSP_new.JPG
ExexSP.vi
(30.09 КБ) 25 скачиваний

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение rsv »

>> Или Вы хотите подать на вход Typedef заранее неизвестно какой кластер и получить на выходе так же заранее неизвестный кластер но определенный во время вызова subVI
Да, именно это я и хотел.

>> В общем надо смотреть классы и Dynamic Dispatch методы.
Спасибо за идею. Я себе ставил задачу-минимум получить на выходе данные типа string и в общем, она достигнута. Когда этого будет не хватать, воспользуюсь Вашей идеей.

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение rsv »

В процессе разработки выяснилась проблема с типом time (MS SQL Server 2014). Если данные этого типа доходят до функции "DB Tools Fetch Recordset Data.vi", то возникает ошибка "Числовое значение выходит за пределы допустимого диапазона". То ли ODBC глючит, то ли "DB Tools Fetch Recordset Data.vi". Причину особо не искал, сразу преобразовал в char().

Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1067
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Репутация: 0
Версия LabVIEW: 2013-2017
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение Kosist »

Если мне не изменяет память, MS SQL поддерживает несколько типов которые можно использовать для хранения времени. С типом datetime2 обычно проблем нет...
Мы делили апельсин - много наших полегло...

rsv
user
user
Сообщения: 91
Зарегистрирован: 18 июл 2019, 13:53
Репутация: 0
Версия LabVIEW: 2018
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение rsv »

Да, их там много: https://docs.microsoft.com/ru-ru/sql/t- ... rver-ver15
С обычным datetime тоже проблем нет. Но мне в некоторых случаях достаточно только времени, вот и решил сэкономить 4 байта.

ujin
junior
junior
Сообщения: 68
Зарегистрирован: 28 июл 2019, 13:16
Репутация: 0
Версия LabVIEW: 19
Контактная информация:

Re: Создание кластера с размерностью, заданной параметром

Сообщение ujin »

С временем как правило приходится поэкспериментировать.
Формат хранения времени в базах может быть в виде 64 битного целого числа, 32 битного целого числа, текстового поля - https://en.wikipedia.org/wiki/Epoch_(computing).
Представление в виде 64 битного числа так же может быть нескольких форматов в основном используют UNIX epoch.
Более-менее универсальный способ записи времени в базу - текстовое поле формата '1970-01-01 00:00:00.000'.
Чтение так же в виде текста и преобразование во время.
Формат хранения времени в LabVIEW Mac HFS+ timestamp https://zone.ni.com/reference/en-XX/hel ... me_string/
Формат хранения времени в MS SQL Server в разных полях разный. Все равно будет преобразование. Потери времени при передаче через текст будут небольшие.
Вложения
Время.png
Время.png (2.61 КБ) 883 просмотра

Ответить

Вернуться в «Для чайников»