Page 22 of 23

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

PostPosted: 27 Aug 2019, 09:50
by rsv
Спасибо, Kosist, переделал.

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

PostPosted: 02 Sep 2019, 11:00
by rsv
И снова, здравствуйте.
Делаю выбор оператора из справочника в базе данных. В целом, работает - на панели отображается список и даёт выбрать. То, что получилось - на скринах.
Вопросы:
1. Как сделать вертикальную прокрутку списка (соответствующий пункт в меню недоступен)?
2. Как программно узнать, какой оператор выбран для дальнейшего использования?

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

PostPosted: 02 Sep 2019, 11:40
by Artem.spb
rsv wrote:1. Как сделать вертикальную прокрутку списка (соответствующий пункт в меню недоступен)?

сделать 2+ элемента вертикально. Тогда можно будет скрыть горизонтальную прокрутку и показать вертикальную

2. Как программно узнать, какой оператор выбран для дальнейшего использования?

Примерно никак.
массив - не лучший инструмент для выбора, списки в этом плане удобнее.
Если хочется прям массив, то Index Values Property может помочь: если отображается только один элемент, то индекс и будет его "номером"

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

PostPosted: 02 Sep 2019, 12:21
by rsv
сделать 2+ элемента вертикально. Тогда можно будет скрыть горизонтальную прокрутку и показать вертикальную

Это получилось.

массив - не лучший инструмент для выбора, списки в этом плане удобнее.

Первоначально я и хотел вывести через список. Но совершенное не понял как программно заполнить контролы TextRing, MenuRing & Enum. Или есть ещё какие-то списки, которые можно заполнять программно?

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

PostPosted: 02 Sep 2019, 12:45
by Kosist
Enum нельзя заполнить программно, во время выполнения виайки. Остальное можно. Как заполнить Ring - вот пример
Populate items.png

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

PostPosted: 04 Sep 2019, 08:40
by rsv
Какая оказывается обширная тема - узлы свойств!
Получилось выбрать оператора и записать его ФИО в глобальную переменную. Но, хотелось бы внутри приложения использовать идентификатор оператора из справочника, а не порядковый номер из списка. Вообще возможно заставить список работать со сторонними идентификаторами, а не с порядковым номером, присваиваемым автоматически?

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

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

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

PostPosted: 09 Sep 2019, 15:51
by rsv
Вот что у меня получилось.
Больше всего в получившейся диаграмме не нравится то, что ФИО и ID приходится вытаскивать из базы отдельными запросами. Но превратить разнотипные массивы в массив кластеров не получилось.
Подскажите, пожалуйста, можно упростить получившуюся диаграмму?

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

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

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

PostPosted: 10 Sep 2019, 14:13
by rsv
Теперь получилось. Спасибо, Borjomy_1.

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

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

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

PostPosted: 26 Sep 2019, 12:19
by Artem.spb
rsv wrote:Подскажите, пожалуйста, это единственный способ или есть ещё варианты?


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

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

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

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

PostPosted: 02 Nov 2019, 09:55
by 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" для сохранения в базе.
Правильно рассуждаю или есть варианты попроще?

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

PostPosted: 05 Nov 2019, 09:03
by ujin
Если записей не много и они постоянно используются можно при старте программы однократно считать сразу все данные во временный массив кластеров. При изменении значения записывать во временный массив и базу данных.
Не очевидна необходимость объединять данные в кластер. Можно хранить в разных массивах. Читать и записывать по одному индексу. При обработке данные все равно разделяются тем или иным способом.

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

PostPosted: 08 Nov 2019, 08:31
by rsv
Не очевидна необходимость объединять данные в кластер. Можно хранить в разных массивах. Читать и записывать по одному индексу. При обработке данные все равно разделяются тем или иным способом.

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