Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

11 Август 2022, 21:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Здравствуйте. LibreOffice base. Макрос. Есть ли возможность о?...  (Прочитано 977 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ForumOOo (бот)

Offline Offline

Сообщений: 819


« Стартовое сообщение: 19 Май 2022, 21:57 »

Компонент: Base
Версия продукта: 7.x
Сборка: d1d0ea68f081ee2800a922cac8f79445e4603348
ОС: windows 10 64

Здравствуйте.
LibreOffice base. Макрос.
Есть ли возможность обращаться к столбцам таблице не по №, а по наименованию столбца при
переборе записей таблицы через sql-запрос , например:

Dim Masval(199, 10) as string
Dim RST
Set RST = Nothing

SQL = "SELECT ""ФИО"", ""Должность"" FROM ""Персонал""  
RST = Stmt.executeQuery(SQL)    
i=0
While RST.Next          
  Masval(i, 1) =RST.getString(1) '

--
Подпись: Владислав
Эл. почта: vladislav77@rambler.ru
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 809


« Ответ #1: 20 Май 2022, 11:55 »

Напрямую нет. Но Вы можете использовать findColumn:

Код:
RST.getString(RST.findColumn("ФИО"))

Ну и конечно можно написать свою обёртку вокруг этого сочетания.
Однако лучше всё же пользоваться индексом.

Цитата:
The column name option is designed to be used when column names are used in the SQL query. For columns that are NOT explicitly named in the query, it is best to use column numbers. If column names are used, there is no way for the programmer to guarantee that they actually refer to the intended columns.
« Последнее редактирование: 20 Май 2022, 14:02 от mikekaganski » Записан

С уважением,
Михаил Каганский
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 980


WWW
« Ответ #2: 20 Май 2022, 19:23 »

Мы в LO работаем с реляционными базами через HTTP REST API (а не "родными" методами), тем не менее рискну высказать свою точку зрения.

Формировать массив результата выполнения запроса циклами по каждой записи и каждому полю нудно и не эффективно. Было бы хорошо иметь метод аналогичный GetRows объекта Adodb.Recordset. Этот метод технически плохо реализован в MS Windows, но по постановке вполне удовлетворителен. Естественно, что должен возвращаться массив массивов в таком виде, как это делает getDataArray.

Сейчас такой результат можно получить, если создать (скрытый) документ Calc, закачать данные с помощью метода doImport и забрать в массив через упомянутый getDataArray, но это не элегантно. Возможно, есть и другой метод и я ломлюсь в открытую дверь...
« Последнее редактирование: 20 Май 2022, 19:29 от sokol92 » Записан

Владимир.
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #3: 27 Май 2022, 08:29 »

Код:
   i=0
    SQL="SELECT ""Column"" FROM ""Table"""
    Res=Statement.executeQuery(SQL)
    Do while Res.next
     ListBox.additem(Res.getstring(1),i)
     i=i+1
     Loop

Цикл перебора всех результатов. Цифра после getstring говорит о столбце в запросе. Так же, кроме getstring  есть и getint, getboolean и пр.
З.Ы. Не забывайте закрывать кавычки вокруг общего запроса.
« Последнее редактирование: 27 Май 2022, 08:32 от Ириминаге » Записан

Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...
economist
Форумчанин
***
Offline Offline

Сообщений: 1 719


« Ответ #4: 28 Май 2022, 00:02 »

Возможно, есть и другой метод

Работать с большим числом записей из БД до помещения в лист Calc можно очень эффективно, если использовать быструю матричную арифметику (векторизованные операции) в RAM. А самое популярное и доступное в LO решение для этого - это библиотека Pandas для Python.

Она же дает еще один уровень ускорения, так называемые "аксессоры", позволяющие получить часть значения (например год из ISO-даты/времени), ну или часть строки [срезом] - самым быстрым, т.е. векторизованным способом.

Например, превращение "на месте" колонки с ФИО вида "Иванов Иван Иванович" в колонку вида "Иванов И.И." на SQL будет неоднострочным и медленным, а в Pandas - однострочным и быстрым. И разница в длине кода, скорости набора этого кода и скорости выполнения кода - вполне может достигать 4-5 крат. Не так чтобы сверхзвук, но заметно всем.

Кроме того, "Excel-хотелки" вида "Автофильтр столбцов по регуляркам, на месте" и все другие из "Динамических массивов", PowerPivot/Query - в Pandas реализованы, а на чистом SQL или LO Basic для их реализации придется писать много и сложно.

Также в одну строку (~160 символов) с Pandas можно не не только применить технику SAC (Split, Apply, Combine), но и получить данные из (любой) БД, отобрать нужные строки, применить SAC и записать данные (по сути готовый табличный свод/отчет), скажем, в XLS/ODS/CSV. В этом, самом популярном паттерне работы с данными - ощущение про "в 5 раз быстрее" Пандас доводит до 10X.
« Последнее редактирование: 28 Май 2022, 00:13 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!