BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[jetzt aber gelöst] Listenfeld im Dialog füllen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
Benutzeravatar
Anekdoteles
Beiträge: 7
Registriert: Mo 10. Jan 2022, 12:27

[jetzt aber gelöst] Listenfeld im Dialog füllen

Beitrag von Anekdoteles » So 10. Apr 2022, 18:49

Hallo Gemeinde,
ich hab mal wieder nen paar handwerkliche Fragezeichen, und gehe von ein paar dämlichen Denkfehlern aus. Vielleicht könnt Ihr mir auf die Sprünge helfen.

Aus einem Formular heraus rufe ich einen Dialog auf, der (o Wunder) einige Felder enthält. Die ersten Felder dienen primär der derzeitigen Kontrolle der Inhalte, und werden auch richtig beschrieben (1.Sub). Irgendwann habe ich realisiert, daß nach dem .execute() kein Code mehr ausgeführt wird, weil der Dialog den Fokus hat. So fülle ich auch die Felder im Vorfeld auf.

Ich habe ein Listenfeld, das noch befüllt werden muß, und da liegt der Haken - er macht es nicht. Auf .ListSource, wie auch auf .StringItemList kriege ich eine Fehlermeldung. Da dich der Inhalt der Liste abhängig von einem Optionsfeld ändern kann, habe ich den Aufruf in eine weitere Sub gepackt, die offensichtlich auch aufgerufen wird. Die Befehle, die das Listenfeld ansprechen, habe ich deaktiviert, um eine Fehlermeldung zu umgehen, und ich den Variableninhalt kontrollieren kann. Ergebnis: Das Optionsfeld wird richtig ausgelesen, und die Listeneinträge stehen auch in der Variable stListe als Text mit Komma getrennt zur Verfügung. Wenn ich aber versuche, diesen String als Listeneinträge festzulegen, kommt die Fehlermeldung. Alles, was ich in Tutorials und Anleitungen gefunden habe, erwies sich als ergebnislos.
Ebenso soll die 2. Sub bei "Statusänderung" des Optionsfeldes aufgerufen werden, was ebenfalls nicht passiert. Beide Subs und der Dialog stehen im Selben Modul.

Hat jemand einen Tip, wo der Denkfehler liegt ? Heißen Dank im Voraus.

Code: Alles auswählen

DIM iNam1 as Long
DIM oEvent as Object
DIM oDialog as Object
DIM oDlg as Object
DIM oDatenquelle as Object
DIM oVerbindung as Object
DIM oSQL_Anweisung as Object
DIM stSQL as String
DIM oResult as Object
Dim stListe as String

SUB DialogNamRefStart

DIM IaktName as Integer
DIM sAktMC as String
DIM saktName1 as String
DIM sAktName2 as String


	oForm = thisComponent.drawpage.forms.getByName("NamenDetail")
	iaktName = oForm.getByName("fmtNamID").getCurrentValue
	
		oDatenquelle = thisDatabaseDocument.CurrentController
		If NOT (oDatenquelle.isConnected()) THEN
			oDatenquelle.connect()
		END IF
		oVerbindung = oDatenquelle.ActiveConnection()
		oSQL_Anweisung = oVerbindung.createStatement()
		stSql = "SELECT ""NamID"",""NamMC"",""NamName1"",""NamName2"" FROM ""Namen"" WHERE ""NamID"" = '" &  iaktName & "'"
		oResult = oSQL_Anweisung.executeQuery(stSql)
		
		oResult.next
		sAktMC = oResult.getString(2)
		sAktName1 = oResult.getString(3)
		sAktName2 = oResult.getString(4)
		
	DialogLibraries.LoadLibrary("Dialoge")
	oDialog = createUnoDialog(DialogLibraries.Dialoge.NamenReferenz)
	oDialog.getControl("NamensIDfeld").text = "" & iaktName & ""
	oDialog.getControl("NamMCfeld").text = sAktMC
	oDialog.getControl("Nam1feld").text = sAktName1
	oDialog.getControl("Nam2feld").text = sAktName2
	
	'oDialog.getControl("RefArtOpt").State = True
	'oDialog.getControl("RefArtGOpt").State = False
		
	RefArtListeAktualisieren
	oDialog.Execute()

END SUB

SUB RefArtListeAktualisieren

	DialogLibraries.LoadLibrary("Dialoge")
	oDialog = createUnoDialog(DialogLibraries.Dialoge.NamenReferenz)
	
		oDatenquelle = thisDatabaseDocument.CurrentController
		If NOT (oDatenquelle.isConnected()) THEN
			oDatenquelle.connect()
		END IF
		oDialog.GetControl("RefText").text = ""
		If oDialog.GetControl("RefArtOpt").State = True then
			oDialog.GetControl("RefText").text = "Referenz"
			stSql(0) = "SELECT ""RefABez"",""RefAID"" FROM ""RefArt"""
			Else
			oDialog.GetControl("RefText").text = "Gegenreferenz"
			stSql(0) = "SELECT ""RefAG"",""RefAID"" FROM ""RefArt"""
		End if
		'oDialog.GetControl("RefText").refresh
		
		oVerbindung = oDatenquelle.ActiveConnection()
		oSQL_Anweisung = oVerbindung.createStatement()
		'stSql(0) = "SELECT ""RefABez"",""RefAID"" FROM ""RefArt"""
		oResult = oSQL_Anweisung.executeQuery(stSql)
		stListe = " "
		while oResult.next
		stListe = stListe & ","& oResult.getString(1)
		wend
		
		'oDialog.getControl("RefArtListe").ListSource = stListe
		'oDialog.getControl("RefArtListe").refresh
	
END SUB
Und da ich da die nächsten Probleme vermute, wäre ich auch für einen Tip dankbar, wie ich den gewählten Listeneintrag auslesen kann :)

Gruß Daniel
Zuletzt geändert von Anekdoteles am Fr 15. Apr 2022, 09:59, insgesamt 3-mal geändert.
Libre Office 7.2.2.2
Windoof 10

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Listenfeld im Dialog füllen

Beitrag von RobertG » So 10. Apr 2022, 18:59

Hallo Daniel,

aus dem Handbuch Base:

Code: Alles auswählen

oCtlList1 = oDlg.GetControl("ListBox1")
oCtlList1.addItems(aInhalt(),0)
Der Zugriff auf die Felder des Dialogs erfolgt über GetControl sowie die entsprechende Bezeich-
nung. Bei Dialogen ist es nicht möglich, für zwei Felder die gleichen Bezeichnungen zu verwen-
den, da sonst eine Auswertung des Dialoges problematisch wäre.
Das Listenfeld wird mit den Inhalten aus der Abfrage, die in dem Array «aInhalt()» gespeichert wur-
den, ausgestattet. Das Listenfeld enthält nur die darzustellenden Inhalte als ein Feld, wird also nur
in der Position '0' bestückt.
Steht in der Fassung "Base Handbuch 7.2" auf Seite 574/575.

Damit füllst Du ein Listenfeld. Alles andere dann auch im Handbuch.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
Anekdoteles
Beiträge: 7
Registriert: Mo 10. Jan 2022, 12:27

Re: Listenfeld im Dialog füllen

Beitrag von Anekdoteles » So 10. Apr 2022, 23:09

Hi Robert,

erstmal heißen Dank für die superschnelle Antwort. Auf Basis des Hinweises weiß ich zumindest, daß ich um Handbuch viel höher ansetzen, und es auf meine Anwendung anpassen muß. Mach ich aber erst morgen nach Feierabend. Heute bin ich da wohl nicht mehr aufnahmefähig genug :D

Und ja, die Problematik mit der Mehrfachbelegung der Variablen habe ich auch schon bemerkt.

Was ich nur noch nicht so ganz verstehe, irgendwo stand mal, daß man das Listenfeld auch mit einem String befüllen kann (string = "wert1,wert2....,wertN"). Den String hat er mir richtig zusammengebaut, hat es aber trotzdem nicht genommen. Hab ich übersehen, daß vielleicht JEDER Wert für sich in Anführungszeichen stehen muß, oder kann das auch an der Mehrfachbelegung liegen ?

Das Thema hier setz ich aber schon mal auf gelöst, danke für den Hinweis nochmal. Sollte noch was klemmen, werd ich mich eh wieder melden (und zu anderen Themen ganz sicher :D )

Gruß Daniel
Libre Office 7.2.2.2
Windoof 10

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: [gelöst] Listenfeld im Dialog füllen

Beitrag von RobertG » Mo 11. Apr 2022, 07:41

Hallo Daniel,

Du meinst mit dem "String" für ein Listenfeld vermutlich S. 469 im aktuellen Handbuch 7.2:
Soll für die Einschränkung einer Auswahlmöglichkeit die Abfrage für ein Listenfeld ausgetauscht
werden, so ist dabei zu beachten, dass es sich bei dem Eintrag um ein «array of string» handelt.
Das Ding ist also ein Array, kein String.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
Anekdoteles
Beiträge: 7
Registriert: Mo 10. Jan 2022, 12:27

Re: [doch nicht ganz gelöst] Listenfeld im Dialog füllen

Beitrag von Anekdoteles » Mi 13. Apr 2022, 09:16

Guten Morgen,

ich habe nun den Code folgendermaßen umgestrickt:

Code: Alles auswählen

	Dim stListe as String
	Dim oListe as Object
	Dim oCtlListe as Object
	Dim aListe (1, 1) as String
	Dim iZaehler as Integer
	

		oDialog.GetControl("RefText").text = ""
		If oDialog.GetControl("RefArtOpt").State = True then
			oDialog.GetControl("RefText").text = "Referenz"
			'stListe = "SELECT ""RefABez"",""RefAID"" FROM ""RefArt"""
			Else
			oDialog.GetControl("RefText").text = "Gegenreferenz"
			'stListe = "SELECT ""RefAG"",""RefAID"" FROM ""RefArt"""
		End if
		'oDialog.GetControl("RefText").refresh
		'stListe = "SELECT ""RefABez"",""RefAID"" FROM ""RefArt"""
		oVerbindung = oDatenquelle.ActiveConnection()
		oSQL_Anweisung = oVerbindung.createStatement()
		stListe = "SELECT ""RefABez"",""RefAID"" FROM ""RefArt"""
		oListe = oSQL_Anweisung.executeQuery(stListe)
		iZaehler = 0
		while oListe.next
			Redim Preserve aListe(iZaehler,1)
			aListe(iZaehler,0) = oListe.getString(1)
			aListe(iZaehler, 1) = oListe.getString(2)
			iZaehler = iZaehler + 1
		wend
		
		oCtlListe = oDialog.getControl("RefArtListe")
		oCtlListe.addItems(aListe(),0)
		oCtlListe.refresh
Das füllt auch das Array so, wie es sein soll (glaube ich)
Nun bekomme ich aber bei .addItems die Fehlermeldung:

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: cannot coerce argument type during corereflection call:
arg no.: 0 expected: "[]string" actual: "void".

Das klingt, als hätte er das gar nicht als Array angenommen...
Wo ist denn nun wieder der Denkfehler ?

Gruß Daniel
Libre Office 7.2.2.2
Windoof 10

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: [doch nicht ganz gelöst] Listenfeld im Dialog füllen

Beitrag von RobertG » Mi 13. Apr 2022, 11:58

Hallo Daniel,

Du versuchst Deiner Liste zwei Werte gleichzeitig zuzuweisen. Das Listenfeld wird aber nur mit einem Array bestückt, das die einzelnen Werte einer Spalte anzeigt. Mit der ID kannst Du da nichts anfangen.

Code: Alles auswählen

Redim Preserve aListe(iZaehler,1)
aListe(iZaehler,0) = oListe.getString(1)
aListe(iZaehler, 1) = oListe.getString(2)
wird zu

Code: Alles auswählen

Redim Preserve aListe(iZaehler)
aListe(iZaehler) = oListe.getString(1)
Das, was Du im Dialog hast, ist kein Listenfeld wie im Formular, bei dem eben ein Wert angezeigt und ein anderer gespeichert wird. Den Speicherwert musst Du ja durch Makros selbst ermitteln.

Allerdings: Ich habe mich mit den Listenfeldern in Dialogen schon lange nicht mehr beschäftigt …

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
Anekdoteles
Beiträge: 7
Registriert: Mo 10. Jan 2022, 12:27

Re: [jetzt gelöst] Listenfeld im Dialog füllen

Beitrag von Anekdoteles » Fr 15. Apr 2022, 09:59

Hi Robert,

der Hinweis, daß das Listenfeld im Dialog anders funktioniert, als im Formular, war der entscheidende Hinweis.
Vielen Dank für die Hilfe.

Gruß Daniel
Libre Office 7.2.2.2
Windoof 10

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten