Gefiltertes Ergebnis weiter bearbeiten

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

Moderator: Moderatoren

HKönig
*
Beiträge: 12
Registriert: Mi, 10.06.2015 16:35

Gefiltertes Ergebnis weiter bearbeiten

Beitrag von HKönig »

Liebe Gemeinde,

ich bräuchte Tipps, wie ich denn nun weitermache (Calc).
Ich führe eine Filterung einer Tabelle durch, deren Ergebnis dann ab Zeile 5 abliegt (In FilterZOinit setze ich den Datenbereich, FilterZOsetzen erstellt dann die Ausgabe, im Test wird hier die Spalte 44 fürs Filterkriterium verwendet).
Danach möchte ich die nun gefilterten Zeilen weiter bearbeiten . Aber wie gehe ich da vor (Cursor setzen? Bereich ermitteln??)?
Kann mir da jemand einen Tipp geben?

Hier zur Info mein bisheriger Filtercode:

Code: Alles auswählen

sub FilterZOinit
'Datenbereich für die Filterung definieren
  dim iLZ as long		'Letzte Zeile als Index
  dim oCur as object 	'Cursor
  dim oTab as object 
  dim oDatArea as object 
  dim oBereich as new com.sun.star.table.CellRangeAddress
  
  'Letzte Zeile ermitteln
  oTab = thisComponent.sheets.getByName("TN")
  oCur = oTab.createCursor()
  oCur.gotoEndofUsedArea(false)
  iLZ = oCur.rangeAddress.EndRow
  'Datenbereich setzen bzw. überprüfen
  if not thisComponent.databaseRanges.hasByName(sZOfilterName) then
    'Datenbereich anlegen
    with oBereich
      .sheet = oTab.RangeAddress.sheet
      .StartColumn = 0
      .StartRow    = 4
      .EndColumn   = 72
      .EndRow = iLZ
    end with
    thisComponent.databaseRanges.addNewByName(sZOfilterName,oBereich)
  else	'Bereich schon vorhanden
    oDatBereichZO = thisComponent.databaseRanges.getByName(sZOfilterName)
    oDatArea = oDatBereichZO.dataArea
    oDatArea.EndRow = iLZ
    oDatBereichZO.dataArea = oDatArea
  end if
end sub

sub FilterZOsetzen
'Übergeben des Suchwertes aus Maske und filtern mit Ereignis Text modifizieren
  Dim oFFeld(0) As New com.sun.star.sheet.TableFilterField
  
  'Suchfeld initialisieren
  with oFFeld(0)
    .Field = 44 	'40+(iVNr-1)*2
    .IsNumeric = true
    .Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
    .NumericValue = 1
  end with
  'Datenbankbereich prüfen und entsprechend filtern
  
  oDatBereichZO = thisComponent.databaseRanges.getByName(sZOfilterName)
  with oDatBereichZO.FilterDescriptor
    .containsHeader = true
    .IsCaseSensitive = false
    .UseRegularExpressions = true
    .FilterFields = oFFeld()
  end with
  
  oDatBereichZO.refresh()

  '??? Danach sollten prinzipiell die gefilterten Zeilen(!) bearbeitet werden ???
end sub
Viele Grüße an Alle
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von Stephan »

ob es ein ansprechbares 'Filterergebnisobjekt' gibt, weiß ich garnicht, in jedem Falle sind aber gefilterte und ungefilterte Zeilen anhand der Eigenschaft .IsFiltered zu unterscheiden (True für NICHT sichtbare Zeilen) und können somit notfalls per Schleife über alle nicht leeren Zeilen ermittelt werden, z.B.:

Code: Alles auswählen

oDoc = thisComponent
Sheets=odoc.sheets(0)
oCellCursor = Sheets.createCursor
oCellCursor.GotoEndOfUsedArea(False)
nRow = oCellCursor.getRangeAddress().endRow
For i = 1 to nRow 'erste Zeile enthält Überschriften
  If Not(ThisComponent.getSheets().getByIndex(0).Rows(i).IsFiltered = True) Then
    '...
  End if
Next i

Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von Toxitom »

Hallo Herr König,

*grins* - Crossposting ist in der Regel nicht gewünscht... aber die Antwort haben Sie ja nun auch per mail bekommen ;)

Das Forum hier ist eine sehr gute Adresse um solche Fragen zu beantworten. Geht meist schneller und durch die vielen fähigen Menschen hier auch umfassender:)

Viele Grüße und viel Spass bei Ihrem Projekt

Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
HKönig
*
Beiträge: 12
Registriert: Mi, 10.06.2015 16:35

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von HKönig »

Hallo stefan, hallo toxitom,

vielen Dank für die schnelle Antwort. Das klappt gut. :D
Zum Test habe ich nur etwa 10 Zeilen, später sind es 300 Zeilen, wovon 20-30 gefiltert werden. Ich denke, da reicht die Geschwindigkeit. Wie es sich verhält, wenn einmal 2000 Zeilen durchgearbeitet werden müssen (im Bearbeitungsdialog gibt es dazu zwei Tasten Up/Down), weis ich nicht. Daher (nur prophylaktisch): Was könnte ich sonst machen? Habe gelesen, dass man eventuell das Ergebnis auch z.B. in eine eigene Tabelle auslagern könnte??

Viele Grüße
Helmut
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von Toxitom »

Hallo Helmut,

also bei diesen "kleinen" Werten von Zeilen ist die Schleife sicher ausreichend. bei 2000 Zeilen und mehr sollte man irgendwann überlegen, ob Calc die korrekte Applikation ist - oder ob nicht möglicherweise eine DB die bessere Wahl darstellt;)

Würde man bei Calc bleiben, würde ich den Filter auslesen und per Makro "filtern" - also direkt auf den Datenbereich ansetzen und dann das Resultset weiter-verarbeiten - unabhängig von der visuellen Darstellung. Das ist dann aber deutlich mehr Programmieraufwand und man trennt visuelle Darstellung und Auswertung. Um das aber abschließend beurteilen zu können, müssten Sie den Workflow mal hier schildern: Was passiert mit den gefilterten Daten? Was ist das gewünschte Endergebnis? etc.

Viele Grüße
Tom
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von Stephan »

Was könnte ich sonst machen?
wie schon geschrieben, weiß ich leider nicht wie man in Calc an das Filterergebnis als Objekt herankommt.
Habe gelesen, dass man eventuell das Ergebnis auch z.B. in eine eigene Tabelle auslagern könnte??
Indem Du den Filter erweiterst. Wo ist da das Problem, da Du doch ohnehin bereits den Code für den Filter benutzt und es nur um eine zusätzliche Eigenschaft (http://www.openoffice.org/api/docs/comm ... utPosition) geht?

z.B.:

Code: Alles auswählen

'...
with oDatBereichZO.FilterDescriptor
    .containsHeader = true
    .IsCaseSensitive = false
    .UseRegularExpressions = true
    .FilterFields = oFFeld()
    .CopyOutputData = True
    Dim x As New com.sun.star.table.CellAddress
    x.Sheet = 1
    x.Column = 0
    x.Row = 10
    oFiltDesc.OutputPosition = x
end with
'...

Gruß
Stephan
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von mikeleb »

Hallo,

mit

Code: Alles auswählen

oDatBereichZO.ReferredCells.queryVisibleCells()
bekommst du Zugriff auf die (nach dem Filtern) sichtbaren Zellen (ggf. mit Kopfzeile) als Mehrfachbereich.
Damit kannst du dann die einzelnen Bereiche durchgehen und wie gewünscht bearbeiten.
Gruß,
mikeleb
HKönig
*
Beiträge: 12
Registriert: Mi, 10.06.2015 16:35

Re: Gefiltertes Ergebnis weiter bearbeiten

Beitrag von HKönig »

Besten Dank für die Ideen zum Thema, die ich eventuell später nochmal aufgreifen werde.

Ich habe es jetzt so gelöst, und das klappt mittlerweile sehr gut:
Da ich keinesfalls mehr als 100 gefilterte Zeilen erwarte, führe ich beim Durchsuchen der Tabelle ein Array mit, in das ich die Zeilennummern der Treffer eintrage. Da dabei auch noch einiges in den Zeilen bearbeitet werden muss, wird über einen Fortschrittsbalken dem Benutzer auch angezeigt, dass es nun ein wenig dauern wird.
Danach werden die gefilterten Zeilen über einen Dialog noch manuell bearbeitet (Freigaben/Sperren setzen), wobei ich im Dialog über 2 Buttons UP/DOWN die angewählte Zeile durch Hintergrundfarbe markiere, und die wesentlichen Daten im Dialog auch noch mitanzeige. Um eine dann schnelle Positionierung zu erreichen, verwende ich das zuvor gefüllte Array.

Viele Grüße
Helmut
Antworten