[gelöst] Filter ist buggy

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Mephisto
**
Beiträge: 34
Registriert: Do, 08.12.2011 15:26

[gelöst] Filter ist buggy

Beitrag von Mephisto »

Hallo zusammen.

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
die Sortierung:

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 
Zuletzt geändert von Mephisto am Mi, 11.01.2012 14:20, insgesamt 1-mal geändert.
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Filter ist buggy

Beitrag von Frieder D. »

Hallo Mephisto

das Problem kenne ich.
Der Grund ist: Es wird immer die gesamte Tabelle sortiert(nicht nur die sichtbaren Zeilen)
Dadurch rutschen beim sortieren Einträge aus dem sichtbaren Bereich in den ausgeblendeten Bereich und umgekehrt.

Lösung: Erst Sortieren, und dann erst Filtern. (Und nicht umgekehrt, wie du es machst)

Gruß Frieder
Mephisto
**
Beiträge: 34
Registriert: Do, 08.12.2011 15:26

Re: Filter ist buggy

Beitrag von Mephisto »

Hey Frieder,

vielen Dank für deine schnelle Antwort.
Du hast das Problem einwandfrei erkannt und di epassende Lösung geliefert.
Jetzt funktioniert alles so, wie es soll.
Ich danke dir vielmals!
Antworten