Base tabcontrol Tabelle Mehrere markierte Zeilen auswerten

Ist es in Base möglich, in einem tabcontrol nach der Markierung mehrerer Zeilen diese Zeilen insgesamt auszuwerten?

Aktuell sehe ich nur die Möglichkeit, das eine Zeile markiert ist (im Datensatzmarkierer per Pfeil visualisiert) und diese Zeile per “… Bookmark…” per Makro auswertet werden kann. Eventuell andere markierte Zeilen (blau markierte Zeilen) sind dabei nicht auswertbar.
Für die Listbox gibt es die Möglichkeit, mehrere markierte Zeilen auszuwerten.

Wenn ich mehrere Zeilen in einem tabcontrol markiere (blau markierte Zeilen), möchte ich diese per Makro auswerten bzw. verwenden, z.B. für das Löschen oder übertragen in eine weitere Ansicht/Tabelle und damit dem Anwender die Möglichkeit anbieten, mehrere Zeilen per einem Makro zu bearbeiten.

Rückfragen gerne.

In Verwendung: LibreOffice Base 7.0… Windows 10

Beim Tabellenkontrollfeld gibt es das Array Selection.

SUB Tablecontrol(oEvent AS OBJECT)
oTablecontrol = oEvent.Source
arSelect() = oTablecontrol.Selection
…
END SUB

In diesem Array stehen die markierten Datensätze in der angezeigten Reihenfolge vermerkt, also
arSelect(0) = 1
arSelect(1) = 3
wenn ich den 1. und den 3. Datensatz ausgewählt habe.

XRAY hilft bei so einer Ermittlung.

Von der entsprechenden Zeile geht es dann weiter zu

oTablecontrol.Model.Parent.absolute(1)
oTablecontrol.Model.Parent.absolute(3)

… und darüber dann zu den Werten des jeweiligen Datensatzes.
Die Markierung wird dabei leider entfernt.

1 Like

Hi Robert,
vielen Dank für Deine Infos.
Ich werde es ausprobieren und berichten.
Danke!
Gruß Tom

Hi Robert,

nochmal vielen Dank für Deinen für mich wichtigen Tipp!

Deinen Lösungsvorschlag nutzend konnte ich unter Einsatz einer globalen Array-Variante und dem leider notwendigen Wait-Parameter meine Anforderung umsetzen.

Das Problem war u.a., dass die Zeilenmarkierungen im TabControl bei Focusverlust im globalen Array nicht zeitnah erfasst wurde bei Auslösen des Verarbeitungsbuttons ausserhalb des TabControls. Die Verarbeitung nach Auslösen des Verarbeitungsbuttons musste also künstlich verlangsamt werden.

Da die Erfassung der markierten Zeilen und Arbeitsschritte davon getrennt ausserhalb des Tabcontrols passieren, bleibt ein Risiko bzgl. der Initialisierung der globalen Array-Variante. Dies muss in der Anwendung weiter beobachtet werden.

Robert, vielen Dank.
Gruß Tom

Hallo,
die Sache mit der Selection funktioniert bei mir irgendwie nicht.
Zum Hintergrund:
Ich habe mir eine Art ERP mit der internen HSQLDB gebastelt, wo ich für meine Firma die ganzen Bestellungen verwalte. Beim Erzeugen der Lieferscheine möchte ich erreichen, dass aus der Gesamtbestellung nur bestimmte Positionen übernommen werden. Dazu gibt es ein Formular, dessen Filter vom übergeordneten entsprechend gesetzt wird und dessen Quelle eine Abfrage ist. Bis dahin funktioniert alles prima. Auf dem Formular gibt es zu Visualisierung der Daten ein Tabellensteuerelement. Wenn ich dort mehrere Zeilen markiere ist trotzdem die Property “Selection” des Steuerelementes leer (im Debugger). Wenn ich eine Spalte auswähle ist “Selection” <> null.
Ich stehe da grade ziemlich auf dem Schlauch.

Bin für jeden Hinweis dankbar.

Gruß
Karsten

Hi Karsten,

meine Vorgehensweise zum Auswerten mehrerer markierter Zeilen ist wie folgt:

globales Array

oGlobal arEntFilterArray()

im Formular ein Tabellen-Steuerelement

unter Eigenschaften dieses Steuerelements in Eigenschaften einen Makroaufruf eingetragen

Bei Fokusverlust Bibliothek.Modul.TabControl(…)

Makro

wird immer aufgerufen, wenn der Cursor die Tabelle verlässt.

das Makro dient nur dazu, die aktuell markierten Zeilen zu merken

Sub TabControl (oEvent as object)

dim oTableControl as object

oTableControl = oEvent.Source

Einsatz des globalen Arrays

arEntFilterArray() = oTabControl.Selection

End Sub

im weiteren Makro wird die Auswertung durchgeführt

die Auswertung wird ausgelöst durch z.B. einen Button, ….

Sub WerteAus (oEvent as object)


dim oTabListe = oMainForm.oSubForm („name“)

keine Zeile markiert

if UBound (arEntFilterArray()) = - 1 then EXIT SUB

eine Zeile markiert

if UBound(arEntFilterArray()) = 0 then

auswerten der Zeile

oSpalte = oTabListe.getByIndex (3)
inWert = oSpalte.getCurrentValue()

else

mehrere Zeilen sind markiert

inZaehler = 0
while inZaehler <> UBound ( arEntFilterArray( ) )

#hole aus der Formular.Unterformular.Tabelle aus der Zeile (inZaehler)
oSubForm_Liste.absolute (arEntFilterArray (inZaehler)

#wert aus spalte (z.B. 3) /zeile
stWert = ….oTabListe.getByIndex (3).getCurrentValue()


end if

end Sub


Beachte, das globale Array bei Neuaufruf des Formulars bzw. bei Neuaktionen zu initialisieren

Redim arEntFilterArray()

Vielleicht hilft es.
Gruß Tom

Hallo Tom,
so rum geht es. Problem ist hier wohl, dass der Sender des Events ein com.sun.star.comp.dbu.SbaXgridControl ist, das was man über Form.getbyname(…) bekommt aber ein sun.com.star.form.OGridControlModel ist, also nur eine Property vom obigen Konstrukt. Das mit dem globalen Array ist nicht besonders schön, hilft aber erst mal weiter.
Danke
Gruß
Karsten

Ich nochmal
habe grade auch festgestellt, dass, wenn man aus dem Tabellensteuerelement heraus direkt auf einen Button of dem Formular klickt zuerst der “Maustaste losgelassen”-Event des Buttons und dann erst der “LostFocus”-Event des Tabellensteuerelementes abgearbeitet wird. Das ist ungefähr das, was weiter oben schon mal angesprochen wurde.
Unschön…

Gruß
Karsten