Listenfelder im Tabellenfeld

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

Moderator: Moderatoren

Luke78
**
Beiträge: 29
Registriert: Do, 27.09.2012 19:43

Listenfelder im Tabellenfeld

Beitrag von Luke78 »

Ich hab momentan ein Problem mit Listenfeldern im Tabellenfeld

Ziel ist es die Auswahlliste des einen Feldes durch die Auswahl des anderen zu begrenzen.
Die Tabelle PersonalVerwendung bildet die m:n Beziehung zwischen den Tabellen Personal und Verwendung. Es soll je nach ausgewählter Verwendung nur noch das Personal ausgewählt werden können das die für die entsprechende Verwendung eingesetzt werden kann.

Bei zwei normalen Listenfeldern ist das kein Problem, da kann ich das über dieses Makro lösen:

Code: Alles auswählen

Sub ListUpdate
	Dim oFormular 	As Object
	Dim oPersListe	As Object
	Dim oVerwListe	As Object
	Dim sSQL(0) As String
	Dim iVerwID		As Integer
	
	oFormular	= ThisComponent.DrawPage.Forms.getByName("TestForm") 
	oPersListe	= oFormular.getByName("PersListe")
	oVerwListe	= oFormular.getByName("VerwListe")
	iVerwID 	= oVerwListe.ValueItemList(oVerwListe.selectedItems(0))
	sSQL(0)		= 	"SELECT ""Personal"".""Nachname"", ""Personal"".""ID""" + _
					" FROM ""Personal"" INNER JOIN ""PersonalVerwendung"" ON ""PersonalVerwendung"".""PersonalID"" = ""Personal"".""ID""" + _ 
					"WHERE ""PersonalVerwendung"".""VerwendungsID"" = " + iVerwID + " ORDER BY ""Personal"".""Nachname"" ASC"
	oPersListe.ListSource = sSQL

End Sub
Wende ich das gleiche Skript für die entsprechenden Listenfelder eines Tabellenfeldes an funktioniert es nicht, obwohl die ListSource auf den entsprechenden SQL-Befehl gesetzt wird.

Geht das überhaupt?
Wenn es geht wäre es noch interessant zu wissen ob das auch Zeilenabhängig funktionieren kann.

Randprobleme:
- Warum kann ich ListSource (0) nicht direkt setzten sondern muss den Umweg über einen neuen Array gehen?
- In der obigen Darstellung des Strings ( + _ Trennung) wurde im Tabellenfeld ListSource jede Zeile als einzelnes Array Element gespeichert (dim 3) obwohl vorher auf 0 dimensioniert wurde. Bei normalen Listenfeldern trat das Problem nicht auf.
- Warum gibt es für Listenfelder im Tabellenfeld nicht mehr das ModifiziertEvent (ich weiß nicht, ob man bei StarBasic von Events spricht, weiß aber wohl jeder was ich mein)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Listenfelder im Tabellenfeld

Beitrag von DPunch »

Servus

Häng mal noch die zwei Zeilen an

Code: Alles auswählen

	oPersListe.ListSourceType = 3
	oPersListe.refresh
(siehe auch API: enum ListSourceType)
und schau, ob das reicht.
Luke78 hat geschrieben:Wenn es geht wäre es noch interessant zu wissen ob das auch Zeilenabhängig funktionieren kann.
Als grundsätzliche Einstellung für das Listenfeld? Nein.
Aber ich wüsste nicht, was degegen sprechen sollte, das Listenfeld abhängig von der aktuellen Zeile zu befüllen (z.B. als Aktion des Formulars "Nach dem Datensatzwechsel").
Luke78 hat geschrieben:Warum kann ich ListSource (0) nicht direkt setzten sondern muss den Umweg über einen neuen Array gehen?
Weil Du nur in einer Kopie der ursprünglichen ListSource arbeitest.

Code: Alles auswählen

oPersListe.ListSource(0) = "meinSQLStatement"
bedeutet nur: gib mir eine Kopie der als ListSource hinterlegten Sequence als Basic-Array und schreib dort dann bei Index 0 den String "meinSQLStatement" rein.
Direkt nach dieser Anweisung ist das per "oPersListe.ListSource" erhaltene Array wieder "weg" und die Listbox hat nichts von den Änderungen mitbekommen.
Luke78 hat geschrieben:In der obigen Darstellung des Strings ( + _ Trennung) wurde im Tabellenfeld ListSource jede Zeile als einzelnes Array Element gespeichert (dim 3) obwohl vorher auf 0 dimensioniert wurde. Bei normalen Listenfeldern trat das Problem nicht auf.
Das kann ich nicht bestätigen - kannst Du evtl. eine Beispieldatei für das Verhalten hochladen?
Luke78 hat geschrieben:Warum gibt es für Listenfelder im Tabellenfeld nicht mehr das ModifiziertEvent
Gute Frage.
Als Alternative kannst Du aber einfach das Event "Vor dem Aktualisieren" verwenden, dieses feuert auch nur, wenn die Auswahl geändert wurde.
Luke78
**
Beiträge: 29
Registriert: Do, 27.09.2012 19:43

Re: Listenfelder im Tabellenfeld

Beitrag von Luke78 »

Hi

Danke für die Tipps.
DPunch hat geschrieben:bedeutet nur: gib mir eine Kopie der als ListSource hinterlegten Sequence als Basic-Array und schreib dort dann bei Index 0 den String "meinSQLStatement" re
Ok, hätte vermutet, dass die Get-Funktion da den Array-Pointer zurückgibt, wird schon seine Gründe haben, dass nicht.
DPunch hat geschrieben:Häng mal noch die zwei Zeilen an
oPersListe.ListSourceType = 3
oPersListe.refresh
Das refresh sorgt zumindest für kurzfristigen Erfolg. SourceType, hatte ich schon vorher über die Eigenschaften auf SQL gesetzt, aber lieber einmal zuviel als zu wenig.

Leider musste ich feststellen, dass nur die Zeilenabhängige Lösung wirklich praktikabel ist, da meistens zuerst die Verwendung für alle Arbeitseinheiten festgelegt wird und dann zeitlich getrennt nach und nach das Personal zugeteil.
Da muss ich nochmal testen ob ich da entsprechenden Zugriff bekomme, und das entsprechende Verhalten hinbekomm.

Gibt es ansonsten weitere Möglichkeiten mehrere Datensätze auf einmal darzustellen, als mit einem Tabellenfeld. Hab noch nicht viel experimentiert, aber wenn es da ein Schema F gibt freu ich mich über anregungen.
LO 3.6.5.2 auf Windows 7 64bit
"Ein Programm ist immer nur so gut wie sein Benutzer" - "Software has no brain, use your own"
Antworten