[Решено] Calc: Как построить стандартный фильтр по полю DatabaseRange?

Автор eeigor, 20 марта 2020, 12:41

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

eeigor

Прошу помочь с автофильтром в макросе.
Информация, в принципе, есть (в том числе на этом форуме), но не могу уловить нюансы.
Свойства и методы у именованных диапазонов и диапазонов базы данных различны. Создавать и модифицировать фильтр - не одно и то же. Примеры даны применительно к листу, а мне нужно для DatabaseRange (хотя лист - это тоже диапазон :)).
В общем, идут ошибки...
Подскажите, как создать дескриптор, задать значение поля фильтра и наложить фильтр применительно к объекту DatabaseRange?

На примерном наборе данных с именем "Data" (DatabaseRange).
Поле1 Поле2
а         д
б         ж
в         ж
г         д
Как отфильтровать по полю "Поле2" все "д".

Во всяком случае, у меня не получается инициализировать объект FilterFields оператором
oFilterDesc = oDBRange.getFilterDescription()
oFields = oFilterDesc.getFilterFields()
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Наложение фильтра: особенности обычных именованных диапазонов и диапазонов базы данных (БД).
Фильтруем диапазон по столбцу 8 по критерию "Некоторый критерий фильтрации".

   Dim oDoc, oSheet, nEndRow% ' ссылки уже установлены, переменная уже задана
   Dim oRange

REM   DatabaseRange

   oRange = oSheet.getCellRangeByPosition(0, 5, 8, nEndRow)  'некий диапазон
   oDoc.DatabaseRanges.addNewByName("Имя диапазона БД", oRange.RangeAddress)  'диапазон БД создается
   oRange = oDoc.DatabaseRanges.getByName("Имя диапазона БД")
   oRange.AutoFilter = True

   Dim oFilter As Object
   Dim oFields(0) As New com.sun.star.sheet.TableFilterField

   oFilter = oRange.getFilterDescriptor(True)
   With oFields(0)
      .Field = 8
'      .IsNumeric = False  'default
      .StringValue = "Некоторый критерий фильтрации"
      .Operator = com.sun.star.sheet.FilterOperator.EQUAL
   End With

   oFilter.setFilterFields(oFields())
   oRange.refresh()


REM   Обычный именованный диапазон

   oRange = oSheet.getCellRangeByPosition(0, 5, 8, nEndRow)  'некий диапазон
'   oRange = oNewSheet.getCellRangeByName("Имя диапазона БД")  'с диапазоном БД можно работать, как с обычным именованным

   Dim oFilter As Object
   Dim oFields(0) As New com.sun.star.sheet.TableFilterField

   oFilter = oRange.createFilterDescriptor(True)
   With oFields(0)
      .Field = 8
'      .IsNumeric = False
      .StringValue = "Некоторый критерий фильтрации"
      .Operator = com.sun.star.sheet.FilterOperator.EQUAL
   End With

   oFilter.setFilterFields(oFields())
   oFilter.ContainsHeader = True
   oRange.filter(oFilter)

Как-то так...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community