Seite 1 von 1

Listenfeld füllen und wieder auslesen

Verfasst: Mo, 14.04.2014 13:33
von Argh
Hallo zusammen,

ich habe für mein Programm ein Formular für die Suche nach Namen. Sobald das Textfeld geändert wird, werden die Daten i mListenfeld aktualisiert.

Hierzu 2 Fragen:
1) Ich habe ein SQL mit dem Daten das Listenfeld gefüllt wird

Code: Alles auswählen

"SELECT  ""Name"" || ', ' || ""Vorname"" || '   ' || ""Geburtsdatum"",  ""ID"" FROM ""Stammdaten"" WHERE ""Name"" like '" & sFilterfeld & "%'"
Kann ich auch anstelle von "||" und kommaseparierte Daten mehrere Spalten in einem Listenfeld haben?

2) Werte wieder auslesen
Den aktuell selektierten Wert erhalte ich mit:

Code: Alles auswählen

Sub Felder_auslesen()
	Dim oForm as Variant
	Dim oErgebnisliste as Object
	
	oform = ThisComponent.drawpage.forms.getbyname("Suche")
	oErgebnisliste = oform.getbyname("Ergebnisliste")

	if (oErgebnisliste.currentValue = "") then
		msgBox "Keine Daten ausgewählt"
	else
		msgbox oErgebnisliste.currentValue
	end if
End Sub
Was mir jedoch fehlt ist der im SQL selektiwerten Werte "ID"!
Diesen Wert brauche ich für spätere Arbeiten. Wie komme ich an alle im SQL selektierte Werte?
(Meine Überlegung ist den aktuellen Wert zu parsen und ein Select aufzusetzen um wieder an die ID zu kommen. Das finde ich aber sehr umständlich)

Vielen Dank und Gruß,
Christian

Re: Listenfeld füllen und wieder auslesen

Verfasst: Mo, 14.04.2014 16:09
von RobertG
Hallo Christian,
Argh hat geschrieben: 1) Ich habe ein SQL mit dem Daten das Listenfeld gefüllt wird

Code: Alles auswählen

"SELECT  ""Name"" || ', ' || ""Vorname"" || '   ' || ""Geburtsdatum"",  ""ID"" FROM ""Stammdaten"" WHERE ""Name"" like '" & sFilterfeld & "%'"
Kann ich auch anstelle von "||" und kommaseparierte Daten mehrere Spalten in einem Listenfeld haben?
Du kannst im Listenfeld nicht spaltenförmig darstellen. Das Kürzel für Tabulatoren CHAR(9) funktioniert im Listenfeld nicht als Tabulator. Das einzige, was Du machen könntest: Wähle eine Schrift mit fester Zeichenbreite wie Courier oder alle Schriftarten, die ein "Mono" im Namen haben. Vervollständige alle einzelnen Felder auf eine feste Zeichenzahl mit z.B.

Code: Alles auswählen

LEFT("Name"||'          ',20)
und verbinde die Felder anschließend. An "Name" werden in obigem Beispiel so viele Leertasten angefügt wie Zeichen dargestellt werden sollen; danach wird der Begriff auf die Größe von 20 Zeichen beschnitten. Das Ganze macht zumindest bei mir anschließend den Eindruck einer sauberen Tabelle im Listenfeld.
Argh hat geschrieben: 2) Werte wieder auslesen
Den aktuell selektierten Wert erhalte ich mit:

Code: Alles auswählen

Sub Felder_auslesen()
	Dim oForm as Variant
	Dim oErgebnisliste as Object
	
	oform = ThisComponent.drawpage.forms.getbyname("Suche")
	oErgebnisliste = oform.getbyname("Ergebnisliste")

	if (oErgebnisliste.currentValue = "") then
		msgBox "Keine Daten ausgewählt"
	else
		msgbox oErgebnisliste.currentValue
	end if
End Sub
Was mir jedoch fehlt ist der im SQL selektiwerten Werte "ID"!
Das zeigt mir, dass Du nicht LibreOffice in einer der aktuellen Versionen nutzt. Dort ist das Ganze sinnvollerweise umgestellt worden. CurrentValue ist, wie bei den anderen Feldern, der Wert, der an die Datenbank weitergegeben wird, nicht der, der angezeigt wird. Ich habe früher auch mit viel Umwegen den Wert über Abfragen ermittelt. Geht aber auch anders:

Code: Alles auswählen

FUNCTION ID_Ermittlung(oFeld AS OBJECT) AS INTEGER
	a() = OfficeVersion()
	IF a(0) = "LibreOffice" AND LEFT(a(1),3) = "4.1" THEN
		stInhalt = oFeld.currentValue
	ELSE
		REM Vor LO 4.1 wird der Wert, der weiter gegeben wird, aus der Werteliste des Listenfeldes ausgelesen.
		REM Der sichtbar ausgewählte Datensatz ist SelectedItems(0). '0', weil auch mehrere Werte in einem Listenfeld ausgewählt werden könnten.
		stInhalt = oFeld.ValueItemList(oFeld.SelectedItems(0))
	END IF
	IF IsEmpty(stInhalt) THEN
		REM Mit -1 wird ein Zahlenwert weiter gegeben, der nicht als AutoWert verwendet wird, also in den Tabellen nicht existiert.
		ID_Ermittlung = -1
	ELSE
		ID_Ermittlung = CInt(stInhalt)	'Umwandlung von Text in Integer
	END IF	
END FUNCTION
Du wirst also in Deiner Version den Wert über stInhalt = oFeld.ValueItemList(oFeld.SelectedItems(0)) erhalten.

Edit 1: Da hatte ich doch glatt eine Funktion unterschlagen, die in der obigen Funktion aufgerufen wird:

Code: Alles auswählen

FUNCTION OfficeVersion()
	DIM aSettings, aConfigProvider
	DIM aParams2(0) AS NEW com.sun.star.beans.PropertyValue
	DIM sProvider$, sAccess$
	sProvider = "com.sun.star.configuration.ConfigurationProvider"
	sAccess   = "com.sun.star.configuration.ConfigurationAccess"
	aConfigProvider = createUnoService(sProvider)
	aParams2(0).Name = "nodepath"
	aParams2(0).Value = "/org.openoffice.Setup/Product"
	aSettings = aConfigProvider.createInstanceWithArguments(sAccess, aParams2())
	REM Der Name der Office-Version (LibreOffice oder OpenOffice) sowie die genaue Versionsnummer (4.1.5.3) werden als Array weitergegeben
	OfficeVersion() = array(aSettings.ooName,aSettings.ooSetupVersionAboutBox)
END FUNCTION
Gruß

Robert