среда, 3 июня 2015 г.

Фильтрация по сдвоенному условию. Функция Concatenate.

При фильтрации некоторых документов иногда возникает необходимость отфильтровать документ по данным, расположенным в разных столбцах, но при этом отфильтровать по каждому условию отдельно нет возможности. Например, нам нужно убрать из реестра строки и параметрами Производство и Производство. Убрать отдельно Производство мы не можем, т.к. в нему относятся и другие операции (не Производство). Также мы не можем отдельно убрать Производство, т.к. этот подтип может относится к другим цехам. В этом случае следует воспользоваться обходным приемом как и c функцией SEARCH - в отдельно столбце сцепить нужные нам строки и затем удалить только нужную (в примере описанного случая будет сцепка "ПроизводствоПроизводство".
Рассмотрим код:

Sub NeRec
odoc=thiscomponent
oSheet = ThisComponent.Sheets(0)
oCellCursor = oSheet.createCursor()
oCellCursor.GotoStartOfUsedArea(True)
oCellCursor.GotoEndOfUsedArea(True)
Start_Row = oCellCursor.getRangeAddress.StartRow
End_Row = oCellCursor.getRangeAddress.EndRow
currcell = osheet.getcellbyposition(11, End_Row)
currcell4 = osheet.getcellbyposition(5, End_Row)
currcell5 = osheet.getcellbyposition(6, End_Row)
oConv = thiscomponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv.Address = currcell.getCellAddress
oConv4 = thiscomponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv4.Address = currcell4.getCellAddress
oConv5 = thiscomponent.createInstance("com.sun.star.table.CellAddressConversion")
oConv5.Address = currcell5.getCellAddress
' Функция Concatenate сцепляем содержимое столбцов Название контрагента и 
' Название типа операции
 Podstanovka  =   "=Concatenate(" & oConv4.UserInterfaceRepresentation &  ";" & oConv5.UserInterfaceRepresentation  & ")"
 currcell.setFormula (Podstanovka)
 odoc.getCurrentController().Select(currcell)
 dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args19(1) as new com.sun.star.beans.PropertyValue
args19(0).Name = "By"
args19(0).Value = 1
args19(1).Name = "Sel"
args19(1).Value = true
dispatcher.executeDispatch(document, ".uno:GoUpToStartOfData", "", 0, args19())
dispatcher.executeDispatch(document, ".uno:FillUp", "", 0, Array())
'В столбце 12 у нас получается уникальная сцепка
ThisComponent.Sheets(0).getCellByPosition (11, 0).String = "Уникаль"
' Вызываем фильтр по этому столбцу - на новый лист по типу не равно
Filt_NeRec
End Sub

 Sub Filt_NeRec
 Dim oDescriptor,oNewDescriptor,bCopyOutputData as Boolean, bUseCriteria as Boolean 
 oDoc = ThisComponent 
   oSheet = ThisComponent.getSheets().getByIndex(0) 
    oAddr = oSheet.getCellRangeByName("A1:L65535").getRangeAddress() 
    oDoc.DatabaseRanges.addNewByName("MyName", oAddr) 
  oRange = oDoc.DatabaseRanges.getByName("MyName") 
set oDescriptor = oRange.getFilterDescriptor
oSheet = ThisComponent.createInstance ("com.sun.star.sheet.Spreadsheet")
ThisComponent.Sheets.insertByName ("Новый лист", oSheet)
oCellAddress = ThisComponent.Sheets (1).getCellByPosition(0, 0).getCellAddress()
oFD = oRange.getFilterDescriptor()
With oFD
.CopyOutputData  = True
.OutputPosition = (oCellAddress)
End With
oField = createUnoStruct("com.sun.star.sheet.TableFilterField")
With oField
  .Field = 11
  .Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
  .StringValue = "ПроизводствоПроизводство"
  End With
oFD.setFilterFields(Array(oField))
oRange.refresh()
End Sub

Задача: Сделать аналогичный фильтр по типам Утиль Производства Торговый зал.

Комментариев нет:

Отправить комментарий