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

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

31 Март 2020, 15:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 1


« Стартовое сообщение: 26 Февраль 2020, 15:45 »

Добрый день!

Подскажите, пожалуйста, возможно ли сделать SQL запрос к данными на странице в Calc?

Суть задачи:
Есть некая несортированная таблица на одном из листов (лист скрыт от пользователя, сортировать нельзя), в столбцах: даты, суммы, текстовые значения.

Необходимо макросом Basic получить, например, сортированный массив по датам или наименованиям.

Реально ли как то реализовать такое? Или есть какой то более грамотный вариант решить задачу?
Нужно реализовать без использования base.
« Последнее редактирование: 26 Февраль 2020, 15:51 от quarantine85 » Записан
economist
Форумчанин
***
Offline Offline

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


« Ответ #1: 26 Февраль 2020, 16:18 »

Реально, можно, и даже без макросов. И даже с возможностью интерактивно указывать, скажем, период выборки.

Но фраза "без использования Base" означает что вы отказываетесь от того что работает "искаропки" в пользу непонятного. Это не "более грамотный путь".

А с Base это делается за 5 минут:

Файл - Создать БД - Соединиться - Эл. таблица - Обзор - Сохранить

Запросы - Создать в режиме SQL - Ввести (см. ниже) - Сохранить "Запрос1"

SELECT * FROM НекийЛист GROUP BY Наименование, Дата

Теперь вы в Calc или Writer жмете Ctrl+Shift+F4 и перетаскиваете "Запрос1" в документ. Всё.   



 
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
eeigor
Участник
**
Offline Offline

Сообщений: 45


« Ответ #2: 2 Март 2020, 21:38 »

В макросе присвойте нужный диапазон массиву (одним действием зараз) и выполните сортировку массива. Но вы можете отсортировать исходные данные на листе в другом месте (это проще и быстрее) средствами самого Calc в макросе.
Зачем нужен SQL?
В Excel давно используют PowerQuery (язык "М"). Однако та самая надстройка (SQL Query, вроде) в Excel ещё жива, с интерфейсом, застрявшим в 90-х...
« Последнее редактирование: 2 Март 2020, 22:16 от eeigor » Записан
kompilainenn
Мастер
*****
Offline Offline

Сообщений: 2 895



« Ответ #3: 2 Март 2020, 22:15 »

В Excel используют PowerQuery (язык "М"), а SQL - это "застрял" в 90-х...
Ну и где в LibreOffice этот самый (язык "М")?
Записан

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут
eeigor
Участник
**
Offline Offline

Сообщений: 45


« Ответ #4: 2 Март 2020, 22:16 »

Сортируйте на другом (временном) листе (или в другом свободном месте) средствами электронной таблицы... в макросе, если надо. Пример ниже от А.Питоньяка. Я новичок в LO Basic, но попробовал, всё получилось сразу. Excel намного легче, но я вынужденно перехожу на LO.
В примере - сортировка по трем столбцам.

Sub TestSorting()
  Dim oSheet
  oSheet = ThisComponent.Sheets(0)  'первый лист
  Call SortCustomers(oSheet,  6)  'кол-во строк в таблице вместе с заголовками столбцов
End Sub

' Sort the sheet for convenience
Sub SortCustomers(oSheet, iRows As Integer)
  Dim oRange
  Dim aSortFields(2) As new com.sun.star.util.SortField
  Dim aSortDesc(1) As new com.sun.star.beans.PropertyValue

  ' Sort options:
  ' (1) Customer's name
  ' (2) Customer's email (in case different persons have identical names)
  ' (3) Slot ID
  With aSortFields(0)
    .Field = 0
    .SortAscending = True
  End With
  With aSortFields(1)
    .Field = 1
    .SortAscending = True
  End With
  With aSortFields(2)
    .Field = 2
    .SortAscending = True
  End With
  
  With aSortDesc(0)
    .Name = "SortFields"
    .Value = aSortFields()
  End With
  With aSortDesc(1)
    .Name = "ContainsHeader"
    .Value = True
  End With
 
  oRange = oSheet.getCellRangeByPosition(0, 0, 4, iRows)
  oRange.sort(aSortDesc())
End Sub
« Последнее редактирование: 2 Март 2020, 23:29 от eeigor » Записан
economist
Форумчанин
***
Offline Offline

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


« Ответ #5: 2 Март 2020, 22:51 »

Все эти способы равнобесполезны, т.к. мы не знаем что нужно ТС сделать с полученным отбором.

Но у Base+SQL все-таки шансов больше, т.к. это наиболее "натоптанный" функционал, насквозь пронзивший LO.

Язык M был очередным скачком MS "наудачу" в сторону от всех популярных технологий. Но, в отличие от VBA, - чуда не случилось.

SQL создавался как язык для экономистов-аналитиков. Но не стал им. Чаще всего сисадмины таскают им из огня каштаны (опрашивают всякие WMI/LDAP/AD). Другая крайность - трехстраничные портянки запросов в 1С8, из-за того что вместо 100 таблиц сделано... 8 тысяч таблиц. Вся прелесть SQL уничтожена необходимостью джойнить в среднем отчете не менее 4-5 таблиц.

M - оказался сильно косноязычным и поэтому им пользуются единицы. Сравните число роликов/семинаров/книг для М и для более понятных Pandas etc и вообще всевозможных ORM, реализовавших "однострочный" цепной SQL.

Там где в SQL нужно городить ворох WITH, CTE, подзапросов, объединений в одном листинге - Pandas даст результат в одну строку в блокноте Jupyter. И задачу ТС я в Pandas решу за 3 минуты (и в три строки).  
« Последнее редактирование: 2 Март 2020, 22:57 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
economist
Форумчанин
***
Offline Offline

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


« Ответ #6: 2 Март 2020, 22:56 »

Сортируйте на листе средствами электронной таблицы... в макросе, если надо.

В топике же указано - 
Цитата:
(лист скрыт от пользователя, сортировать нельзя)... без использования base...
Т.е. "стоя на лыжах в гамаке", с преодолением наибольшего числа трудностей.
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
eeigor
Участник
**
Offline Offline

Сообщений: 45


« Ответ #7: 2 Март 2020, 23:24 »

Сортировать надо в любом удобном месте (другом, главное - на листе и средствами листа). Макрос - выше. Предварительно скопировать данные из источника.
« Последнее редактирование: 2 Март 2020, 23:31 от eeigor » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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