Советы по программированию на LabVIEW

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Спасибо, Kosist, переделал.

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

И снова, здравствуйте.
Делаю выбор оператора из справочника в базе данных. В целом, работает - на панели отображается список и даёт выбрать. То, что получилось - на скринах.
Вопросы:
1. Как сделать вертикальную прокрутку списка (соответствующий пункт в меню недоступен)?
2. Как программно узнать, какой оператор выбран для дальнейшего использования?
Вложения
07_Выбор оператора.PNG
08_Оператор.PNG
08_Оператор.PNG (2.53 КБ) 4312 просмотров

Artem.spb

Activity Автор
expert
expert
Сообщения: 1886
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение Artem.spb »

rsv писал(а): 1. Как сделать вертикальную прокрутку списка (соответствующий пункт в меню недоступен)?
сделать 2+ элемента вертикально. Тогда можно будет скрыть горизонтальную прокрутку и показать вертикальную
2. Как программно узнать, какой оператор выбран для дальнейшего использования?
Примерно никак.
массив - не лучший инструмент для выбора, списки в этом плане удобнее.
Если хочется прям массив, то Index Values Property может помочь: если отображается только один элемент, то индекс и будет его "номером"

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

сделать 2+ элемента вертикально. Тогда можно будет скрыть горизонтальную прокрутку и показать вертикальную
Это получилось.
массив - не лучший инструмент для выбора, списки в этом плане удобнее.
Первоначально я и хотел вывести через список. Но совершенное не понял как программно заполнить контролы TextRing, MenuRing & Enum. Или есть ещё какие-то списки, которые можно заполнять программно?

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

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

Re: Советы по программированию на LabVIEW

Сообщение Kosist »

Enum нельзя заполнить программно, во время выполнения виайки. Остальное можно. Как заполнить Ring - вот пример
Populate items.png
Мы делили апельсин - много наших полегло...

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Какая оказывается обширная тема - узлы свойств!
Получилось выбрать оператора и записать его ФИО в глобальную переменную. Но, хотелось бы внутри приложения использовать идентификатор оператора из справочника, а не порядковый номер из списка. Вообще возможно заставить список работать со сторонними идентификаторами, а не с порядковым номером, присваиваемым автоматически?
Вложения
09_Выбор оператора.PNG

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

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

Re: Советы по программированию на LabVIEW

Сообщение Kosist »

Фишка Ring в том, что ему можно присваивать любые числовые значения (но они не могут повторяться). В то время как Enum может иметь только числа идущие по порядку, начиная с 0. А записать числа в Ring можно при помощи того же узла свойств - если пролистаете его до конца, то увидите там "Strings and Values", которые есть масив кластера со строкой, и соотвествующим ему числом.
Write number to ring.png
Мы делили апельсин - много наших полегло...

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Вот что у меня получилось.
Больше всего в получившейся диаграмме не нравится то, что ФИО и ID приходится вытаскивать из базы отдельными запросами. Но превратить разнотипные массивы в массив кластеров не получилось.
Подскажите, пожалуйста, можно упростить получившуюся диаграмму?
Вложения
09_Выбор оператора с ID.PNG

Borjomy_1

Activity Professionalism Silver
expert
expert
Сообщения: 1917
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Репутация: 0
Версия LabVIEW: 4-8.6,9-14
Откуда: город семи холмов

Re: Советы по программированию на LabVIEW

Сообщение Borjomy_1 »

Ничего не мешает в запросе (select) указать два поля - у вас уже все подготовлено, надо только собрать массив не из одного элемента, а из двух, выделить каждое из результата функцией Index Array, только для первого поля указать индекс 0, а для второго - индекс 1, массивы Variant преобразуете также и вуаля - один запрос - два типа данных.

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Теперь получилось. Спасибо, Borjomy_1.
Вложения
09_Выбор оператора с ID оптимизированный.JPG

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Доброго времени суток.
Задумался, как реализовать действия, которые выполняются один раз при открытии ФП. В Event Structure подобных событий не нашёл, реализовал через Flat Sequence.
Подскажите, пожалуйста, это единственный способ или есть ещё варианты?

Artem.spb

Activity Автор
expert
expert
Сообщения: 1886
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Репутация: 0
Версия LabVIEW: 12-18
Контактная информация:

Re: Советы по программированию на LabVIEW

Сообщение Artem.spb »

rsv писал(а):Подскажите, пожалуйста, это единственный способ или есть ещё варианты?
Тут два варианта (минимум).
1) это машина состояний, первое состояние - инициализация, дальше сама работа. Это в случае если "открытие" = запуск программы.
2) если под открытием понимается именно разворачивание окна, то может помочь событие This Vi -> Panel Resize

ну и да, я постоянно грешу тем, что всякую предработу по сбору ссылок в кластеры и пр. делаю перед общим циклом, и использую Sequence.

с Sequence не совсем понятно. На заре эволюции мануалы грозились тем, что Sequence замедляет работу. Я недавно тест провёл, разницы не выявил. Это вроде как плохой стиль программирования, но "если нельзя, но очень хочется, то можно"

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Доброго времени суток.
Есть такая задача: считать данные из одной записи в базе данных, отредактировать, проверить на корректность и сохранить изменения в базе.
План примерно такой:
1. Вытащить данные одной записи в формате Variant с помощью "DB Tools Fetch Next Recordset";
2. Преобразовать в массив кластера типа String с помощью "Database Variant To Data";
3. Из массива вытащить кластер;
4. Кластер разбить на отдельные поля;
5. Для каждого редактируемого поля создать локальную переменную соответствующего типа и заполнить переменные из кластера;
6. Для каждой переменной создать контрол;
7. Изменения внесённые в контрол автоматически перенесутся в переменные;
8. Проанализировать данные в переменных;
9. Переменные собрать в кластер;
10. Кластер передать в "DB Tools Update Data" для сохранения в базе.
Правильно рассуждаю или есть варианты попроще?

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

Re: Советы по программированию на LabVIEW

Сообщение ujin »

Если записей не много и они постоянно используются можно при старте программы однократно считать сразу все данные во временный массив кластеров. При изменении значения записывать во временный массив и базу данных.
Не очевидна необходимость объединять данные в кластер. Можно хранить в разных массивах. Читать и записывать по одному индексу. При обработке данные все равно разделяются тем или иным способом.

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

Re: Советы по программированию на LabVIEW

Сообщение rsv »

Не очевидна необходимость объединять данные в кластер. Можно хранить в разных массивах. Читать и записывать по одному индексу. При обработке данные все равно разделяются тем или иным способом.
Кластер у меня возник естественным образом, когда обрабатывал данные, считанные "DB Tools Fetch Next Recordset". Ну и при записи кластер нужен для "DB Tools Update Data". Причём это два отдельных кластера, так как набор полей для считывания и записи разный и как их объединить пока непонятно.
Реализовал считывание, обновление и добавление записи. Получилась большая блок-диаграмма с явным дублированием части кода, но работает.

Ответить

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