Listbox im Dialog auslesen und weiterverarbeiten

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

Moderator: Moderatoren

kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo liebe Gemeinde,
obwohl ich mehrere Wochen hier im Forum gelesen habe, finde ich keine Lösung.

Bei der Suche nach einer Lösung habe ich einige andere Anwendungen hier im Forum gefunden, die ich umsetzen konnte. Nur in diesem speziellen Fall fand ich nichts Brauchbares:

In meinem Dialog habe ich eine Listbox, die ich mit Nachnamen aus einer Spalte gefüllt habe.

Nun soll bei Auswahl eines Namens die restlichen Felder des Dialogs der betreffenden Zeile gefüllt werden.

Mit der Inputbox habe ich es, Dank eurer Hilfe, hinbekommen.



Da aber häufig Namensgleichheit besteht, muss ich auch noch mindestens den Vornamen in die Selektion mit einschließen.

Wie soll dies gehen ? Find Next oder so ?

Könnt ihr mir dabei helfen, denn ich bin noch blutiger Anfänger und möchte mir dieses Grundwissen aneignen ?

Wenn ich mir Bruchstücke von Andrew Pitonyak, Dannhöfer und Co zusammen suche, hakt es dann immer irgendwo.
Ich befürchte, wenn ich mir Bücher dazu kaufe, wird es ähnlich sein.

In der angehängten Datei seht ihr nur ein paar der vielen kläglichen Versuche, die ich gestartet habe.
Dateianhänge
Listbox 1 Forum.ods
(25.93 KiB) 157-mal heruntergeladen
:lol: Win 10
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von Stephan »

Es ist eine Frage der konkreten Daten und weniger der Programmierung das man in Deiner Beispieldatei eigentlich keine Listboxen verwenden sollte, weil das inhaltlich nicht so sinnvoll ist, da ja immer ein konkreter Datensatz geändert werden soll und man Namen, Vorname und Ort nur dann in einer Listbox anbieten kann wenn man alle denkbaren Namen und Ort in die Listbox aufnehmen würde, denn zum Ändern reicht es ja nicht nur die Namen und Orte wählen zu können die bereits in der Datentabelle sind.

Code: Alles auswählen

 Sub Person_bearbeiten()
    oDoc = thisComponent
    oSheet =  ThisComponent.Sheets().getByName("Tabelle1") 
    DialogLibraries.LoadLibrary( "Standard" )
    DlgPersAendern = CreateUnoDialog( DialogLibraries.Standard.DlgPersAendern) 
    
    With ThisComponent.getCurrentSelection
    	If .supportsService("com.sun.star.sheet.SheetCell") then
    	    akt_zeile = .RangeAddress.Startrow
    	ELse
    		Msgbox "Bitte nur eine Zelle in gewünschter Zeile markieren",16,"Falsche Selektion"
    		Exit Sub
    	End If
    End With
    	    
    With ThisComponent.CurrentController.ActiveSheet
    	DlgPersAendern.getControl("CB3").Text = .getCellByPosition(3, akt_zeile).String
    	DlgPersAendern.getControl("txt_vorname").Text = .getCellByPosition(4, akt_zeile).String
    	DlgPersAendern.getControl("txt_nachname").Text = .getCellByPosition(5, akt_zeile).String
    	DlgPersAendern.getControl("date_geburtsdatum").Text = .getCellByPosition(6, akt_zeile).FormulaLocal
    	DlgPersAendern.getControl("TField14").Text = .getCellByPosition(7, akt_zeile).String
    End With

	DlgPersAendern.Execute()  
End sub
In der angehängten Datei habe ich das Startmakro entsprechend angepasst, die übrigen Makros müssen ggf. noch angepasst werden.


Gruß
Stephan
Dateianhänge
Listbox 1 Forum_überarbeitet.ods
(25.21 KiB) 132-mal heruntergeladen
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo Stephan,
nachdem ich Textfelder im Dialog erstellt habe, werden die betreffenden Daten auch im Dialog übernommen.
Dazu muss der Cursor allerdings bereits in der Zeile stehen !

Ich hatte gedacht, dass durch die Auswahl des Namens in der Listbox, der Cursor zunächst in die erste gefundene Zelle springt und die Daten holt. Wenn dies dann nicht zutreffend ist, sollte der der nächste Satz geholt werden.
Aber ok, dann versuche ich es einmal so, wie Du es geschrieben hast. Vielen Dank

Da ich ungern mit "getCellByPosition" arbeite ( ich muss ja zählen ), werde ich die vielleicht noch umschreiben in getCellByName. Dies dürfte kein Problem werden.

Zum Abspeichern muss ich noch Änderungen vornehmen.
Vielen Dank, bis morgen
kalle
:lol: Win 10
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von Stephan »

Ich hatte gedacht, dass durch die Auswahl des Namens in der Listbox, der Cursor zunächst in die erste gefundene Zelle springt und die Daten holt. Wenn dies dann nicht zutreffend ist, sollte der der nächste Satz geholt werden.
Es ist, wie schon angedeutet, kein Programmierproblem (man könnte das also so machen) sondern eine Frage der Zweckmäßigkeit, denn wozu willst Du mehrfach weiter klicken, wenn der Name "Meier" ist und Du den letzten "Meiner"-Eintrag brauchst. Da ist es doch viel bequemer gleich den richtigen Meier zu wählen.

Wenn es hingegen stört das nach jedem Bearbeiten eines Datensatzes der Dialog neu gestartet werden muss ist das eine andere Frage, dann könnte man z.B. alle Einträge mit jeweils Nachname, Vorname, Ort in einer Listbox zusammenfassen. Die anhängende Datei zeigt das Prinzip, hat aber noch reichlich Verbesserungsbedarf.

Code: Alles auswählen

   Sub Person_bearbeiten()
    oDoc = thisComponent
    oSheet =  ThisComponent.Sheets().getByName("Tabelle1") 
    DialogLibraries.LoadLibrary( "Standard" )
    DlgPersAendern = CreateUnoDialog( DialogLibraries.Standard.DlgPersAendern) 
    
    ausgangsdaten = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("C5:H100").getDataArray
    
    Dim alle()
    
    For i = 0 To UBOUND(ausgangsdaten())
    	If ausgangsdaten(i) (0) <> "" Then
    		Redim Preserve alle(i)
    		alle(i) = ausgangsdaten(i) (3) & ", " & ausgangsdaten(i) (2) & ", " & ausgangsdaten(i) (5) & " #" & ausgangsdaten(i) (0)
    	End If
    Next i
    
    DlgPersAendern.Model.getByName("lst_alle").StringItemList = alle()
    
	DlgPersAendern.Execute()  
End sub


Sub zu_Datensatz_springen()
	erg = Split(DlgPersAendern.getControl("lst_alle").selectedItem, "#")
	ds_nummer = erg(1)
	For i = 0 To 99
		If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+3).FormulaLOcal = ds_nummer Then 
			j = i+3
			Exit For
		End If 
	Next i
	
	With ThisComponent.CurrentController.ActiveSheet
    	DlgPersAendern.getControl("CB3").Text = .getCellByPosition(3, j).String
    	DlgPersAendern.getControl("txt_vorname").Text = .getCellByPosition(4, j).String
    	DlgPersAendern.getControl("txt_nachname").Text = .getCellByPosition(5, j).String
    	DlgPersAendern.getControl("date_geburtsdatum").Text = .getCellByPosition(6, j).FormulaLocal
    	DlgPersAendern.getControl("TField14").Text = .getCellByPosition(7, j).String
    End With

End Sub
100%ig optimal wäre dann ein sog. Grid-Steuerelement auf dem Dialog, nur das scheint mir zu kompliziert für einen Anfänger. Ein Beispiel für ein Grid ist z.B. hier:
https://forum.openoffice.org/en/forum/v ... 96#p365635
Dateianhänge
Listbox 1 Forum_überarbeitet2.ods
(25.55 KiB) 126-mal heruntergeladen
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo Stephan,
soooo habe ich mir dies vorgestellt. Vielen Dank

Da ich etwas lernen möchte habe ich noch ein paar Fragen:

Sehe ich es richtig , dass das Lattenkreuz als Platzhalter dient ?
Was bedeutet "erg", ist dies frei wählbar ?
Mit "i" sind sicherlich die Zeilen gemeint, doch was bedeutet "j" ?
Und mit

Code: Alles auswählen

alle(i) = ausgangsdaten(i) (3)
ist dann die Spalte D (Spalte A = 0) gemeint ?
Was bedeutet

Code: Alles auswählen

getCellByPosition(2, i+3) 
Mich irritiert die Position 2(Lfd.-Nr.) in Verbindung mit i+3


Vielen Dank für Deinen Code. Nun habe ich einiges aufzuarbeiten.
Gruß Kalle
:lol: Win 10
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von Stephan »

Sehe ich es richtig , dass das Lattenkreuz als Platzhalter dient ?
Das 'Lattenkreuz' (Raute) dient nur dazu ein eindeutige Trennstelle zwischen der laufenden Nummer und dem Rest zu schaffen, damit die lfd. Numnmer bequem per Split()-Anweisung abgetrennt werden kann.
Die laufende NUmmer ihrerseits wird gebraucht um den Datensatz in der Calc-Tabelle ein-eindeutig zu identifizieren.

Das Ganze ist ein wenig 'hemdsärmlig' programmiert, erfüllt aber zunächst seinen Zweck.
Was bedeutet "erg", ist dies frei wählbar ?
erg ist nur ein Variablennasme, im Konkreten einer Variable die ein Array zugewiesen bekommt, welchjes aus der Split-Anweisung resultiert. Ja, der Name "erg" ist frei wählbar, einzig sollte/darf es kein 'Wort' sein was Teil der Basic-Programmiersprache ist.
Mit "i" sind sicherlich die Zeilen gemeint, doch was bedeutet "j" ?
Ja, i meint hier die Zeilen (den Index der Zeilen), und zwar einmal die Zeilen eines Array():

Code: Alles auswählen

For i = 0 To UBOUND(ausgangsdaten())
    	If ausgangsdaten(i) (0) <> "" Then
    		Redim Preserve alle(i)
    		alle(i) = ausgangsdaten(i) (3) & ", " & ausgangsdaten(i) (2) & ", " & ausgangsdaten(i) (5) & " #" & ausgangsdaten(i) (0)
    	End If
    Next i
und einmal die Zeilen einer Calc-Tabelle:

Code: Alles auswählen

For i = 0 To 99
		If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+3).FormulaLOcal = ds_nummer Then 
			j = i+3
			Exit For
		End If 
	Next i
i ist in beiden Fällen einfach nur eine Zählvariable, hat also alleine keinen konkrete Bezug auf Zeilen, sondern nur mit dem jeweiligen restlichen Code zusammen.

j ist wieder nur der Name einer Variable, man könnte das auch "x" oder "erg2" oder "BlaBla" oder sonstwie nennen. Sinnvoll ist es aber Variablennamen zu verwenden die etwas über das sagen was die Variable beeinhaltet, z.B. die zwei Variablen "alle" und "ausgangsdaten" sagen etwas über den Inhalt, "j" tut das nicht, ist also eigentlich kein günstiger Variiablenname.
alle(i) = ausgangsdaten(i) (3)
Links steht wieder eine Variable (in Form eines Array) hierbei wird der i-ten Zelle dieses Arrays der 3. Wert des Arrays zugewiesen das in der i-ten Zelle des Arrays "ausgangsdaten" steht.
Nein, das entspricht, hier im KOnkreten, nicht Spalte D (der Calc-Tabelle) weil das Array die Spalten C bis H der Calc-Tabelle rerpresentiert. Die 3. Spalte dieses Arrays (Zählung auch bei 0 beginnend) entspricht somit der Spalte F der Calc-Tabelle.

Das alles ist hier nur deshalb so weil DEine Calc-Tabelle nicht in Spalte A beginnte, sondern erst in Spalte C.
getCellByPosition(2, i+3)
2 bedeutet Spalte C (3. Spalte, weil Zählung bei 0 beginnt).
i+3 ist ein Schreibfehler, in der Beispieldatei selbst steht richtigerweise i+4, das bedeutet das in Zeile 5 (Index = 4) der Calc-Tabelle begonnen wird weil dort die erste Datenzeile steht.
Man kann das aber variabel schreiben, z.B. ist:

Code: Alles auswählen

For i = 0 To 99
		If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+4).FormulaLOcal = ds_nummer Then 
			j = i+4
			Exit For
		End If 
	Next i
das Gleiche wie:

Code: Alles auswählen

For i = 4 To 103
		If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i).FormulaLOcal = ds_nummer Then 
			j = i
			Exit For
		End If 
	Next i



Gruß
Stephan
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo Stephan,
Deine Ausführungen sind sehr ausführlich. Dies muss ich wohl mehrfach lesen und üben, bis ich dies verstehe.

Nachdem ich meinen Müll :lol: entsorgt habe, wollte ich Änderungen vornehmen. Doch ich stoße schon wieder an meine Grenzen.
Bei der Sub "Änderung speichern" werden die Änderungen in Spalte G1 und H1 geschrieben und nicht in die dazugehörenden Zeile.
Bis auf Nachname habe ich in den Feldern Nur Lesen auf Nein gesetzt.
Kannst Du mir noch einmal helfen ?
Gruß Kalle
Dateianhänge
Listbox Forum_überarbeitet2.ods
(19.78 KiB) 133-mal heruntergeladen
:lol: Win 10
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von Stephan »

Wahrscheinlich liegt es nur daran das j nicht deklariert ist und deshalb den Wert nur innerhalb des jeweiligen Makros behalt. ("Wahrscheinlich" weil es bei mir komischerweise ohne Deklaration funktioniert.)

Füge also im Kopf des Moduls hinzu:

Code: Alles auswählen

Dim j As Integer

Gruß
Stephan
Dateianhänge
Listbox 1 Forum_überarbeitet3.ods
(27.64 KiB) 144-mal heruntergeladen
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo Stephan,
jetzt funktioniert die Datei, bis auf den letzten Eintrag in der Listbox. Hier werden die Felder nicht geladen.

Ich habe selbst versucht, dies in der Sub zu_Datensatz_springen zu ändern, doch Fehlanzeige. Ich kann sicherlich in meiner OriginalDatei einen fiktiven Namen eintragen und das Problem wäre erledigt. Doch auch Du wirst der Meinung sein, dass dies unschön wäre.

Über Grid habe ich schon einiges hier im Forum gelesen. Und für die Datei bedanke ich mich. Ich mache nur noch :shock: :shock:
Dies sieht natürlich eleganter aus.

Doch bevor ich mich mit Grid auseinander setze, werde ich erst einmal 23 Spalten bearbeiten.

Vielen Dank und noch einen schönen Sonntag
kalle
:lol: Win 10
kalle05
**
Beiträge: 38
Registriert: So, 19.10.2014 18:13

Re: Listbox im Dialog auslesen und weiterverarbeiten

Beitrag von kalle05 »

Hallo Stephan,
ich muss mich korrigieren.
Durch

Code: Alles auswählen

Dim j As Integer
läuft es jetzt perfekt.
Ich hatte nicht daran gedacht die Datei zu schliessen und wieder zu öffnen - Sorry.
Gruß
Kalle
:lol: Win 10
Antworten