[gelöst]Suche nur über eine bestimmte Spalte

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

Moderator: Moderatoren

DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

[gelöst]Suche nur über eine bestimmte Spalte

Beitrag von DPunch »

Hallo erstmal

Als Frischling in Sachen ooo Basic stellt sich mir gerade ein Problem, für das ich auch nach längerer Suche keine Antwort gefunden haben.

Es geht um folgendes: Auf einem Tabellenblatt wird eine (bzw. mehrere) CAS-Nummern eingegeben, und auf Basis dieser die Tabelle per Makro aus verschiedenen anderen Tabellen ergänzt.
Das Problem dabei ist, dass diese Tabellen einen riesigen Haufen zusätzlicher Informationen beinhalten.
Die Spalte, in der die CAS-Nummer steht, ist bei allen Tabellenblättern bekannt, jedoch finde ich keine Möglichkeit, nur diese Spalte auch tatsächlich zu durchsuchen.

Zuerst bin ich das Ganze mit einer einfachen FOR-Schleife über die relevanten Spalten angegangen, aber das hat unerträglich lange gedauert.
Nun bin ich zum SearchDescriptor übergegangen, das klappt soweit auch ganz gut und vor allem deutlich schneller als mit der Schleife.
Dennoch kann man dem ganzen Vorgang noch ganz gemütlich zuschauen, weil andere Spalten mit für die Suche irrelevanten Daten und ewig langen Texten vollgestopft sind, aber trotzdem in die Suche miteinbezogen werden.

Daher meine Frage:
Kann man dem SearchDescriptor irgendwie mitgeben, dass er nur in einer Spalte zu suchen braucht?
XRay und Suche haben nichts (für mich) verwertbares ergeben, aber das heisst ja noch lange nicht, dass es nicht geht.

Sollte dem nicht so sein: gibt es möglichereweise andere Herangehensweisen / Ideen?

Danke im Voraus
Zuletzt geändert von DPunch am Mi, 04.11.2009 12:09, insgesamt 1-mal geändert.
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Suche nur über eine bestimmte Spalte

Beitrag von komma4 »

Willkommen im Forum.

Du kannst den SearchDescriptor auch auf einen Zellbereich anwenden.


Code-Beispiel: durchsucht Spalte A

Code: Alles auswählen

oBlatt = ThisComponent.Sheets().getByName( "Statistik" )
oBereich = oBlatt.getCellRangeByPosition( 0, 0, 0, 100 )

oSuchBeschr = oBereich.createSearchDescriptor()

Hilft Dir das?

P.S.: Ergänzen der Informationen - warum nicht per Formel (SVERWEIS)?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Suche nur über eine bestimmte Spalte

Beitrag von DPunch »

Ich kann es leider nicht direkt ausprobieren, aber die Möglichkeit, einen bestimmten Zellbereich anzugeben ist ja genau das, wonach ich gesucht habe.

Vielen Dank dafür :D (genaueres Feedback dann, wenn ich morgen wieder an der Arbeit bin)


SVerweis wäre theoretisch auch eine Möglichkeit, allerdings müssen die Informationen nach einigen Kriterien gefiltert, formatiert und angepasst werden, dafür schien mir ein Makro Alles in Allem sinnvoller.

Abgesehen davon bin ich im Moment für jede Erfahrung mit OOo Basic und jeden Codeschnipsel dankbar, werde mich nämlich für die nächsten 4 Monate fast ausschliesslich mit diesem Thema beschäftigen "müssen".

Gut möglich also, dass ich noch öfter mit mehr oder weniger intelligenten Fragen hier auftauche ;)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Suche nur über eine bestimmte Spalte

Beitrag von komma4 »

Mit Deinen Fragen bist Du hier gut aufgehoben 8)


Die "Standards" der OOo Basic-Entwicklung kennst Du:

Xray
Andrew Pitonyaks Makro Dokument
Andrew Pitonyaks Datenbank Dokument

Und meine Erweiterung OOo BTL2 – Basic Text Liste, zum Aufbereiten / Ausdrucken des installierten Basic-Codes.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Suche nur über eine bestimmte Spalte

Beitrag von DPunch »

So, da ich jetzt Zeit zum Testen hatte, hier genaueres Feedback:

Funktioniert leider nicht :(

Der SearchDescriptor durchsucht immer noch das ganze Blatt, nicht nur die entsprechende Spalte.

Code: Alles auswählen

oListA = oDoc.Sheets.getByName("liste 4a")

oCellCursor = oListA.createCursor
nLastRowA = oCellCursor.getRangeAddress().endRow

oSearchDesc = oListA.getCellRangeByPosition(1,1,1,nLastRowA).createSearchDescriptor()
Der obige SearchDescriptor hat Ergebnisse, egal ob der gesuchte String in Spalte 2 oder 13 steht.

Irgendwelche Lösungsansätze?


P.S.:
Ja, XRay kenne und habe ich natürlich, bei Andrews Dokumenten hatte ich leider schon einige Male das Problem, dass sie mir OOo direkt abgeschossen haben.
Bleibe da aber dran ;)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Suche nur über eine bestimmte Spalte

Beitrag von komma4 »

DPunch hat geschrieben:Der obige SearchDescriptor hat Ergebnisse, egal ob der gesuchte String in Spalte 2 oder 13 steht.
Mit dem geposteten Codeausschnitt hast Du noch gar keine Treffer, erst wenn Du auf den Bereich die Suche auch ausführst kommen Ergebnisse:
Testdaten in Spalte C

Code: Alles auswählen

sSuchbegriff = "Egon"

With oSearchDesc
 .SearchRegularExpression = FALSE
 .SearchCaseSensitive = TRUE
 .SearchString = sSuchbegriff
End With

oGefunden = oListA.getCellRangeByPosition(2,2,2,nLastRowA).findFirst( oSearchDesc )
Und das funktioniert hier (OOo 3.0.1/WinXP pro) wie erwartet.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Suche nur über eine bestimmte Spalte

Beitrag von DPunch »

Ohje, hab den Fehler gefunden.

Code: Alles auswählen

oSearchArea = oListA.getCellRangeByPosition(1,1,1,nLastRowA)
oSearchDesc = oSearchArea.createSearchDescriptor()
So weit alles in Ordnung, das Problem war, dass ich in der späteren Schleife dann allerdings immer noch

Code: Alles auswählen

oResult = oListA.FindFirst(oSearchDesc)
stehen hatte.

Problem erkannt und behoben, funktioniert wunderbar, vielen Dank für Deine Hilfe und entschuldige, dass ich für einen Moment an Deiner Lösung gezweifelt hatte ;)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: [gelöst]Suche nur über eine bestimmte Spalte

Beitrag von DPunch »

Hallo mal wieder

Aufgrund des obigen Falles stellt sich mir gerade eine Frage in Bezug auf den SearchDescriptor:

Macht es einen Unterschied, von welchem Objekt aus er erzeugt wird?

Aus der api.openoffice.org:
describes what and how to search within a container
Der Container wird ja allerdings erst mit dem Aufrufen der FindFirst-Methode festgelegt.
Es ist also (bezüglich des Resultates) völlig egal, ob ich den SearchDescriptor mit
thiscomponent.Sheets().getByIndex(1).createSearchDescriptor()
oder
thiscomponent.Sheets().getByIndex(99).createSearchDescriptor()
initialisiere, ich kann damit alle Blätter des (Calc-)Dokumentes durchsuchen.

Gibt es da einen versteckten Haken, z.B. bezüglich Geschwindigkeit, Fehleranfälligkeit o.Ä. - oder kann ich getrost einen einzigen SearchDescriptor für verschiedene Suchen auf verschiedenen Blättern verwenden?
Antworten