Доброго времени суток.
Хочу создать универсальный SubVI, который на входе принимает запрос к базе, а на выходе выдаёт кластер с одной строкой, но разным количеством полей в ней.
Проблема в том, что функции Database Variant To Data на вход Type надо подать шаблон кластера переменной размерности, которая задаётся входным параметром SubVI.
Тип всех полей, возвращаемых запросом можно приводить к String.
Подскажите, пожалуйста, как создать кластер с размерностью, заданной параметром?
Создание кластера с размерностью, заданной параметром
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Создание кластера с размерностью, заданной параметром
Сомнительная идея.
Если вы хотите получить данные в виде 2D массива String типа, так и подключите его вместо TypeDef кластера....
Нужно получить 1D массив, его подключаете.
Кластер не обязательно, там вход Type, Вы этот тип и определяете. Ну и обработку делаете соответственно исходя из предопределенного типа.
https://zone.ni.com/reference/en-XX/hel ... t_to_data/
Посмотрите примеры, станет более понятен механизм взаимодействия с БД.
Если вы хотите получить данные в виде 2D массива String типа, так и подключите его вместо TypeDef кластера....
Нужно получить 1D массив, его подключаете.
Кластер не обязательно, там вход Type, Вы этот тип и определяете. Ну и обработку делаете соответственно исходя из предопределенного типа.
https://zone.ni.com/reference/en-XX/hel ... t_to_data/
Посмотрите примеры, станет более понятен механизм взаимодействия с БД.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
Если сформулировать по другому. Вы хотите подать на входной параметр строку из которой получите тип кластера и далее используете его в качестве 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.
Т.е. Вы всегда заранее знаете, что Вы запрашиваете из базы. В связи с этим можно и тип заранее проставить.
Повторюсь если нужно переопределять тип входа и выхода, то для этого лучше использовать классы.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
>> Если вы хотите получить данные в виде 2D массива String типа, так и подключите его вместо TypeDef кластера....
Действительно. Подключил массив и получил массив. На первое время в таком виде пожалуй сойдёт...
Действительно. Подключил массив и получил массив. На первое время в таком виде пожалуй сойдёт...
- Вложения
-
- ExexSP.vi
- (30.09 КБ) 94 скачивания
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
>> Или Вы хотите подать на вход Typedef заранее неизвестно какой кластер и получить на выходе так же заранее неизвестный кластер но определенный во время вызова subVI
Да, именно это я и хотел.
>> В общем надо смотреть классы и Dynamic Dispatch методы.
Спасибо за идею. Я себе ставил задачу-минимум получить на выходе данные типа string и в общем, она достигнута. Когда этого будет не хватать, воспользуюсь Вашей идеей.
Да, именно это я и хотел.
>> В общем надо смотреть классы и Dynamic Dispatch методы.
Спасибо за идею. Я себе ставил задачу-минимум получить на выходе данные типа string и в общем, она достигнута. Когда этого будет не хватать, воспользуюсь Вашей идеей.
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
В процессе разработки выяснилась проблема с типом time (MS SQL Server 2014). Если данные этого типа доходят до функции "DB Tools Fetch Recordset Data.vi", то возникает ошибка "Числовое значение выходит за пределы допустимого диапазона". То ли ODBC глючит, то ли "DB Tools Fetch Recordset Data.vi". Причину особо не искал, сразу преобразовал в char().
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
Если мне не изменяет память, MS SQL поддерживает несколько типов которые можно использовать для хранения времени. С типом datetime2 обычно проблем нет...
Мы делили апельсин - много наших полегло...
-
- advanced
- Сообщения: 170
- Зарегистрирован: 18 июл 2019, 13:53
- Версия LabVIEW: 2020
- Откуда: Россия, Ижевск
- Благодарил (а): 33 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
Да, их там много: https://docs.microsoft.com/ru-ru/sql/t- ... rver-ver15
С обычным datetime тоже проблем нет. Но мне в некоторых случаях достаточно только времени, вот и решил сэкономить 4 байта.
С обычным datetime тоже проблем нет. Но мне в некоторых случаях достаточно только времени, вот и решил сэкономить 4 байта.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Создание кластера с размерностью, заданной параметром
С временем как правило приходится поэкспериментировать.
Формат хранения времени в базах может быть в виде 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 в разных полях разный. Все равно будет преобразование. Потери времени при передаче через текст будут небольшие.
Формат хранения времени в базах может быть в виде 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 (2.61 КБ) 3457 просмотров
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение