Listenfeld aus Dialog in Tabellenblatt übertragen

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

Moderator: Moderatoren

Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Hallo Liebe Gemeinde

Ich habe zwar so ein bissl Ahnung von Calc, aber nun habe ich mich an Dialoge und Makros gewagt und ich bin seit Tagen einfach nur verzweifelt.

Ich habe eine Datei mit einem selbst erstellten Dialog, der ein Listenfeld mit ca. 850 Einträge enthält. Mein Gedanke war, dass wenn ich über das Listenfeld in dem Dialog (Über den dicken Button "Hersteller bearbeiten" aufzurufen) einen Hersteller auswähle und dann die weiteren Buttons bei Status, Team, Saison setze, dass es mir die entsprechenden Spalten in der Tabelle bei dem ausgewählten Hersteller ausfüllt.
Also ich wähle über das Listenfeld z.B. den Hersteller 100% aus und setze den Button bei inaktiv und suche mir ein Team aus und eine Saison. Dann möchte ich gerne, dass mir das in die Tabelle eingetragen wird. Und vorhandene Eintragungen gelöscht werden (bis auf den Hersteller) ;)

Ich habe keinen Plan wie ich das per Makro umsetzen kann (bin da auch wirklcih nicht sehr erfahren mit). Oder ob das überhaupt umzusetzen geht. Am coolsten wäre es, wenn es eine Möglichkeit gäbe, das wie mit dem Datenformular zu lösen. Nur gibt es da keine Suchfunktion und sich durch über 800 Datensätze durchklicken ist auch nicht die Lösung. Ich bin nicht auf den selbst erstellten Dialog angewiesen.

Kann mir bitte wer helfen?

Liebe Grüße

PS: LibreOffice Base ist keine Alternative.
Hersteller2.ods
(31.77 KiB) 87-mal heruntergeladen

Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

z.B. für das Merkmal "Status"

Code: Alles auswählen

Sub Eintragen()
  If Dlg_Hersteller.getControl("OBaktiv").State = True Then
      For i = 1 To 1000
        If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
          Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
            ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "aktiv"
          Exit Sub
        End If
      Next i
    Else
      For i = 1 To 1000
        If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
          Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
            ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "inaktiv"
          Exit Sub
        End If
      Next i
  End If
End Sub
(etwas 'langatmiger' Code, aber so wohl leichter zu verstehen)


Gruß
Stephan
Dateianhänge
Hersteller2a.ods
(32.66 KiB) 100-mal heruntergeladen
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

SSSUUUUUUUUPPPPPPERRRRR! Du bist mein Retter :D

Das klappt. Und meine anderen Codes (das war nur ein Auszug aus der eigentlichen Datei) sind viel länger und noch verworrener.

Ich danke Dir wie verrückt.
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Ich nochmal :)

Ich habe jetzt das Makro soweit bearbeitet, dass es alles macht was ich möchte. Es füllt mir jede Spalte aus in dem Blatt "Hersteller". Das Makro ist laaang und es dauert bis es fertig ausgeführt ist, aber es funzt :D (Wenn es fertig ist, kommt eine Masagebox, dass der Hersteller bearbeitet wurde...)

Nun möchte ich, dass mir die Hersteller in die Datenblätter verteilt werden. Und zwar in die wo auch ein "X" gesetzt ist. Also bei Hersteller 100% sind bei 2015, 2016 und 2017 X gesetzt, dann soll der Hersteller zu Datenblatt 2015, Datenblatt 2016 und Datenblatt 2017 usw.... Mit einer Wenn-Funktion klappt das nicht, weil es dann ziwschen den Herstellern Lücken gibt. Und ich habe keine Ahnung wie is es überhaupt anfangen soll...ob mit Makro oder Funktion...

Ein zweites Problem:
Über den Button "Neuer Hersteller" kann man einen neuen Hersteller hinzufügen. Das macht er bis jetzt ganz am Ende der Tabelle, weil das so im Makro steht. Kann man das Makro denn auch so schreiben, dass der Hersteller alphabetisch eingefügt wird? Bzw. kann man ein Makro schreiben, dass im Nachhinein das ganze Blatt duch sortiert und zwar so, dass alle Spalten berücksichtigt werden?

Zum besseren Verständnis hänge ich die Datei nochmal mit an. Ich hoffe es kann mir wieder so super schnell geholfen werden.

Schon mal Danke im Vorraus :D
Dateianhänge
test2 - Kopie.ods
(48 KiB) 87-mal heruntergeladen
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

Das Makro ist laaang und es dauert bis es fertig ausgeführt ist
das kann an den Schleifen in meinem Makro liegen, falls die in Deinem Makro mehrfach durchlaufen werden, wenn das die Ursache ist müsste das Makro anders implementiert werden unter Verwendung der Methode .getDataArray, Beispiel dazu z.B. in der letzten Datei/Link in:
viewtopic.php?f=18&t=1553
Nun möchte ich, dass mir die Hersteller in die Datenblätter verteilt werden. Und zwar in die wo auch ein "X" gesetzt ist. Also bei Hersteller 100% sind bei 2015, 2016 und 2017 X gesetzt, dann soll der Hersteller zu Datenblatt 2015, Datenblatt 2016 und Datenblatt 2017 usw.... Mit einer Wenn-Funktion klappt das nicht, weil es dann ziwschen den Herstellern Lücken gibt.
Es gibt 18 der Checkboxen, also:

namenAllerCheckboxen = Array("Name1", "Name2", ...)

For i = 0 To 17
If <die Checkbox namens "namenAllerCheckboxen(i)" aktiv> Then
'tue was zu tun ist
End If
Next i

da gibt es keine Lücken.
Kann man das Makro denn auch so schreiben, dass der Hersteller alphabetisch eingefügt wird? Bzw. kann man ein Makro schreiben, dass im Nachhinein das ganze Blatt duch sortiert und zwar so, dass alle Spalten berücksichtigt werden?
ich würde erst eintrage und dann sortieren. Eintragen ist klar, für Sortieren ist hier ein Beispiel:
https://sites.google.com/site/satuperai ... sort-sheet


Gruß
Stephan
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Hallo Stephan

Danke für deine letzte Antwort. Da muss ich mich erstmal rein lesen...das hab ich bis jetzt noch nicht gemacht.
Ich feil noch an einem anderen Problem, wo ich nicht weiß wie ich es angehen soll. Ist es möglich, dass ich mir die Eintragungen, die in dem Tabellenblatt Hersteller stehen in dem dazugehörogen Dialog anzeigen lassen kann, wenn ich ihn aufegrufen habe? Und wenn ja...wie?! ;) Also sozusagen das ganze umgekehrt. Falls das in einen neuen Thread müsste...dann tut es mir leid.

LG
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

Ist es möglich, dass ich mir die Eintragungen, die in dem Tabellenblatt Hersteller stehen in dem dazugehörogen Dialog anzeigen lassen kann, wenn ich ihn aufegrufen habe? Und wenn ja...wie?!
Das steht auch in der schon genannten Datei unter:
viewtopic.php?f=18&t=1553

z.B.:

Code: Alles auswählen

Sub Dlg_Hersteller_bearbeiten
	DialogLibraries.loadLibrary("Standard") 
	oForm = DialogLibraries.Standard.Dlg_Hersteller
	Dlg_Hersteller = CreateUnoDialog(oForm)
	Dlg_Hersteller.title = "Hersteller bearbeiten" 
	
	Ctl_Hersteller = Dlg_Hersteller.GetControl("Hersteller")
	'Ctl_Status = Dlg_Hersteller.GetControl("Status")
	'Ctl_Team = Dlg_Hersteller.GetControl("Team")	
	oDoc = ThisComponent
	'-->Listbox füllen---------------------------
	eintraege = ThisComponent.Sheets().GetByName("Tabelle1").getCellRangeByName("A2:A1000").getDataArray()
	Dim liste(UBOUND(eintraege()))
	For i = 0 To UBOUND(eintraege())
		tmp = eintraege(i)
		liste(i) = tmp(0)
	Next i
	Dlg_Hersteller.Model.GetByName("ListBox_Herst").StringItemList = liste()
	'-----------------------------------------<--
	Dlg_Hersteller.execute    
end sub
Gruß
Stephan
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Hallo Stephan

Trotzdem vielen Dank für deine Antwort :) ich hatte mir die Datei zwar schon mal angeschaut. Aber dachte, dass es nicht das richtige ist, da es 1. eine Combobox ist und 2. die Combobox mit den Werten aus B14:B20 gefüllt wird. Meine Listbox ist ja schon "gefüllt". Ich möchte nur, dass es die anderen Kontrollfelder füllt, wenn ich einen Hersteller in der Listbox ausgewählt habe.

Und wenn ich das Makro aus der Datei versuche in meine Datei einzubauen, dann meckert er wegen der "drawpage". Ich habe bei mir keine Drawpage...geschweige denn weiß ich nicht genau was das ist ;)

Ich habe dein Makro ausprobiert und da kommt in der Zeile

Code: Alles auswählen

Dlg_Hersteller.Model.GetByName("ListBox_Herst").StringItemList = liste()

folgender Fehlercode:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: .

LG
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

Ich habe dein Makro ausprobiert und da kommt in der Zeile [...]
dazu kann ich nichts sagen, die Funktion ist bei mir einwandfrei, was ich natürlich auch geprüft habe ehe ich meinen Post geschrieben habe.


Gruß
Stephan
Dateianhänge
Hersteller2b.ods
(32.79 KiB) 86-mal heruntergeladen
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

ah...ok. Ich glaube wir haben aneinander vorbeigeschrieben :D

Mein Gedanke war nicht die Listbox für die Hersteller zu füllen...sondern die ganzen anderen Krontrollfelder (Status, Team, Saisons...) und zwar anhand der Daten, die irgendwann mal in den Zellen drin stehen werden. Also wenn bei Hersteller 100% Status aktiv, Team Parts, Saison 2015 X drin steht, dann müsste das in dem Dialog, der aufgeht, wenn man auf Hersteller bearbeiten (bzw in dieser Datei noch Neuer Hersteller) klickt und den Hersteller 100% auswählt, schon vorausgewählt sein. Damit derjenige, der die Daten des Herstellers mal ändern muss, weiß was schon drin steht und das auch wieder reingeschrieben wird, wenn eine Änderung bzw. "Hinzufügung" vorgenommen wurde.

Ich wollte auch nicht sagen, dass dein Makro falsch ist....ich bin nur einfach zu blöde ;)

LG
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

Das Schreiben von Werte in den Dialog aus dem Tabellenblatt ist doch nur die Umkehrung des schon erläuterten Schreibens in das Tabellenblatt.

Beispielhaft für die zwei Radiobuttons aktiv/inaktiv also:

Code: Alles auswählen

Sub einlesen()
	For i = 1 To 1000
		If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
			Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
			If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "aktiv" Then
					Dlg_Hersteller.getControl("OBaktiv").State = True
				ElseIf ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "inaktiv" Then
					Dlg_Hersteller.getControl("OBinaktiv").State = True
			End If
		End If
	Next i
End Sub
Dieses Makro muss einem passenden Ereignis der Listbox, hier also beispielsweise dem Ereignis "Status geändert" zugewiesen werden.



Gruß
Stephan
Dateianhänge
Hersteller2c.ods
(32.96 KiB) 105-mal heruntergeladen
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Hallo Stephan

Nach längerem drüber nachdenken gestern Abend kam mir die "Idee" auch in den Kopf. Ich dachte nur, dass es da vielleicht einen kürzeren Weg gibt, da das Makro ja schon so lang ist. Aber ich werde es probieren. Ich danke dir.

LG und schönes Wochenende
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Nochmal Hallo

Ich habe dein Makro jetzt soweit an meine angepasst. Funzt alles prima. Jetzt hab ich nur noch ein Problem mit einer anderen Listbox in einem anderen Dialog. Wie muss ich das Calc Basic denn begreiflich machen, dass er mir den Eintrag in der Listbox markieren soll, wenn der in der entsprechende Zelle steht.

Hier mal ein Ausschnitt aus diesem Makro.

Code: Alles auswählen

	For i = 1 To 1000
		If ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(1,i).String = _
			Dlg_neuer_Eintrag.getControl("ListBox_Herst_Eintrag").SelectedItem Then
			If ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String <> "" Then
					Dlg_neuer_Eintrag.getControl("ListBox_Pfleger").getSelectedItem = ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String
				ElseIf ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String = "" Then
					Dlg_neuer_Eintrag.getControl("ListBox_Pfleger").getSelectedItem = ""
			End If
		End If
	Next i	
Ich bekomme so keine Fehlermeldung. Es wird einfach nur nix in der Listbox markiert.

Vielleicht kannst du mir ja hier nochmal helfen?! :D Ich bin dann auch bald fertig mit meinem "kleinen" Projekt ;)

Danke schon mal

LG
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Stephan »

ich sehe in Deinem Code nicht die Stelle wo in der Listbox selektiert werden soll.
Ein Eintrag in der Listbox wird jedoch allgemein so selektiert, z.B. der Eintrag "ACROS":

Code: Alles auswählen

Dlg_Hersteller.getControl("ListBox_Herst").selectItem("ACROS", True)
Gruß
Stephan
Katte
**
Beiträge: 23
Registriert: Mo, 04.05.2015 11:13

Re: Listenfeld aus Dialog in Tabellenblatt übertragen

Beitrag von Katte »

Es geht. Ich danke dir vielmals. :D
Antworten