Ich hab einen kleinen Bug, bei dem ich nicht weiter weiß.
Ich hab eine Tabelle, die grob vereinfacht 4 Spalten hat
Quartal-Status-Stage-Zahl
Der Filter soll nun z.B. nur die Einträge anzeigen, die im aktuellen Quartal sind, sprich: der String im Feld 'Quartal' soll gleich 'Q1 2012' sein.
Außerdem sollen auch nur diejenigen Einträge durch den Filter kommen, dessen Stage kleinergleich '07' ist.
Diejenigen Einträge, die dem Filter entsprechen sollen nun noch sortiert werden.
Zuerst alphabetisch nach dem Status und bei gleichem Status, soll als zweites Kriterium die Zahl gelten.
D.h. ich habe dann z.B. eine Liste mit
Quartal---Status-Stage - Zahl
-----------------------------------
Q1 2012 --- A --- 05 --- 10
Q1 2012 --- A --- 01 --- 7
Q1 2012 --- A --- 06 --- 2
Q1 2012 --- B --- 07 --- 10
Q1 2012 --- B --- 03 --- 1
Q1 2012 --- C --- 01 --- 3
...
Das alles habe ich implementiert und funktioniert im Grunde genommen auch. Doch wenn ich meinen Filter anwende, habe ich manchmal das Phänomen, dass zwar nach Status und Zahl richtig sortiert ist, aber Einträge aus einem falschen Quartal und/oder der falschen Stage mit auftauchen.
Dass also z.B. neben 'Q1 2012' auch 'Q4 2011' oder 'Q3 2012' mit auftauchen. Die Sortierung ist jedoch immer korrekt.
Eine Liste schaut dann beispielsweise so aus:
Quartal---Status-Stage - Zahl
-----------------------------------
Q1 2012 --- A --- 05 --- 10
Q3 2012 --- A --- 01 --- 7
Q1 2012 --- A --- 06 --- 2
Q4 2011 --- B --- 10 --- 10
Q1 2012 --- B --- 09 --- 1
Q1 2012 --- C --- 01 --- 3
Wende ich den Filter ein zweites mal an, ist die komplette Sortierung & Filterung korrekt.
Eine genaue Abhängigkeit, wann der Bug auftritt und wann nicht konnte ich noch nicht feststellen.
Hier auf jeden Fall mal mein Code:
Die beiden folgenden Subs werden nacheinander in einer Sub 'main' aufgerufen.
der Filter:
Code: Alles auswählen
Sub currentQuarterFilter
Dim oRange
Dim oFilterDesc ' Filter descriptor.
Dim oFields(1) As New com.sun.star.sheet.TableFilterField
Dim currentQuarter as String
oSheet = ThisComponent.getSheets().getByIndex(1)
oRange = oSheet.getCellRangeByName("A4:S" & lastInputRow )
currentQuarter = Functions.getQuarter( DAY(NOW()) & "." & MONTH(NOW()) & "." & YEAR(NOW()) ) 'returns the current Quarter in the form "Q1 2012"
' If argument is True, creates an
' empty filter descriptor.
oFilterDesc = oRange.createFilterDescriptor(True)
With oFields(0)
.Field = 10 ' Filter column K
.IsNumeric = False ' Use a string, not a number.
.StringValue = "0[1-7].*" ' Sales stage from 01 to 07. Interpreted as regular expression
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
End With
REM Setup a field that requires two conditions
With oFields(1)
.Connection = com.sun.star.sheet.FilterConnection.AND
.Field = 2 ' Filter column C
.IsNumeric = False ' Use a string
.StringValue = currentQuarter ' String equals current Quarter
.Operator = com.sun.star.sheet.FilterOperator.EQUAL
End With
oFilterDesc.setFilterFields(oFields())
oFilterDesc.ContainsHeader = False
oFilterDesc.UseRegularExpressions = True
oRange.filter(oFilterDesc)
End Sub
Code: Alles auswählen
Sub SortRange
Dim oCellRange ' Data range to sort.
Dim lastInputRow as Integer
REM An array of sort fields determines the columns that are
REM sorted. This is an array with two elements, 0 and 1.
REM To sort on only one column, use:
REM Dim oSortFields(0) As New com.sun.star.util.SortField
Dim oSortFields(1) As New com.sun.star.util.SortField
REM The sort descriptor is an array of properties.
REM The primary property contains the sort fields.
Dim oSortDesc(0) As New com.sun.star.beans.PropertyValue
Functions.unprotectSheet(1)
lastInputRow = Functions.getLastRowOfInput()
REM Get the cell range to sort
oCellRange = oSheet.getCellRangeByName("A4:S" & lastInputRow)
REM Select the range to sort.
REM The only purpose would be to emphasize the sorted data.
'ThisComponent.getCurrentController.select(oCellRange)
REM The columns are numbered starting with 0, so
REM column A is 0, column B is 1, etc.
REM Sort column B (column 1) ascending.
oSortFields(0).Field = 1
oSortFields(0).SortAscending = TRUE
REM If column B has two cells with the same value,
REM then use column J ascending to decide the order.
oSortFields(1).Field = 9
oSortFields(1).SortAscending = False
REM Setup the sort descriptor.
oSortDesc(0).Name = "SortFields"
oSortDesc(0).Value = oSortFields()
REM Sort the range.
oCellRange.Sort(oSortDesc())
Functions.protectSheet(1)
End Sub