Здравствуйте. LibreOffice base. Макрос. Есть ли возможность о?...

Автор ForumOOo (бот), 19 мая 2022, 21:57

0 Пользователи и 1 гость просматривают эту тему.

ForumOOo (бот)

Компонент: 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

#1
Напрямую нет. Но Вы можете использовать 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.
С уважением,
Михаил Каганский

sokol92

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

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

Сейчас такой результат можно получить, если создать (скрытый) документ Calc, закачать данные с помощью метода doImport и забрать в массив через упомянутый getDataArray, но это не элегантно. Возможно, есть и другой метод и я ломлюсь в открытую дверь...
Владимир.

Ириминаге

#3
   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 и пр.
З.Ы. Не забывайте закрывать кавычки вокруг общего запроса.
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

#4
Цитата: sokol92 от 20 мая 2022, 19:23Возможно, есть и другой метод

Работать с большим числом записей из БД до помещения в лист 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.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...