Lieber Michael,ich habe nun zwei Varianten anzubieten. Ich beschreibe sie hier etwas knapper, weil die Diskussion ja hier in der Öffentlichkeit begann, schicke dir aber per privater Mail noch ein paar Zusatzinformationen.
1. Variante: Listenfeld wie von dir vorgesehenDie Liste, die das Listenfeld anzeigt, muss für jede Zeile individuell sein, sie muss daher per Makro jeweils geändert werden. Ich habe das über das Ereignis "Nach dem Datensatzwechsel" des Formulars für die Produkte realisiert, nach dem Wechsel zu einer anderen Zeile wird in der Where-Bedingung für das Listenfeld das in dieser Zeile vorliegende Produkt eingesetzt. Das Makro dazu ist:
sub ListBoxAendern (evt as object) Dim t() as string FormProd = evt.Source GridProd = FormProd.getByName("MainForm_Grid") listboxModel = GridProd.GetByName("ID-Ang_fkey")t() = listboxModel.ListSource ' Der Zwischenschritt über ein Hilfs-Array ist notwendig t(0) = "SELECT `Anbieter` , `ID-Ang` FROM `test`.`tbl_angebote` WHERE `ID-Prod_fkey` = " & Formprod.Columns.getByName("ID-Prod").value & ";"
listboxModel.ListSource() = t() listboxModel.refresh end SubDas funktioniert auch grundsätzlich, hat aber einen kleinen Schönheitsfehler, zumindest in meiner Realisierung, bei der das Formular für die Produkte eine Tabelle anzeigt und nicht jeweils ein einzelnes Produkt: Wechsele ich von einer Zeile zu einer anderen, indem ich auf den Header der neuen Zeile klicke, so verschwindet die bisherige Anzeige des Listenfelds; sie erscheint wieder, wenn ich nochmals auf den Header klicke oder auf ein anderes Feld der Zeile. Wechsele ich dagegen die Zeile, indem ich irgendwo in ein Feld der neuen zeile klicke, wird der Inhalt des Listenfelds weiter angezeigt. Ich abe dafür keine Erklärung und somit auch keine Lösung. Falls jemand danach fragt: ich habe auch versucht, am Steuerelement etwas zu erreichen, mit:
GridCtrl = ThisComponent.CurrentController.getControl(GridProd) for i = 0 to GridCtrl.getCount - 1if GridCtrl.getByIndex(i).Model.Name = "ID-Ang_fkey" then GridCtrl.getByIndex(i).makeVisible(selectedItemPos)
next u.ä., aber das änderte nichts. 2. Variante: über das UnterformularDas Listenfeld ist ja nur dann hilfreich zur Auswahl des Angebots, das dem Produkt zugewiesen werden soll, wenn es alle relevanten Informationen der in Frage kommenden Angebote anzeigt, oder man muss sich im Unterformular die Nummer des Angebots merken, das man dann im Listenfeld auswählt. Daher bietet es sich an, diese Wahl gleich im Unterformular auszulösen (das zur schnellen Auswahl natürlich auch in Tabellenform vorliegen sollte). Schön wäre eine Schaltfläche pro Zeile, aber das geht wohl nicht (ohne Weiteres). Ein allgemeine Schaltfläche (oder auch ein Auslösen durch eine Tastenkombination) hat den Nachteil, dass man erst die Zeile mit dem gewünschten Angebot selektieren muss, was leicht zu Fehlbedienungen führen kann. Ich habe daher in der Tabelle der Angebote eine ansonsten bedeutungslose Spalte eingeführt, die nur dazu dient, in jeder Zeile der Angebotstabelle eine Checkbox anzubieten, die bedienbar ist. Beim Ereignis "Aktion ausführen" dieser Spalte wird folgendes makro ausgeführt:
sub AngebotWahl (evt as object) CheckBoxModel = evt.Source.Model FormAng = CheckBoxModel.Parent.Parent FormProd = FormAng.Parent 'oder ThisComponent.Drawpage.Forms.getByName("MainForm") if FormProd.Columns.getByName("BeschaffenAnzahl").Value = 0 thenif msgbox("Es ist kein Bedarf eingetragen. Soll trotzdem ein Angebot zugeordnet werden?", MB_YESNO, "Bedarfskontrolle") = IDNO then
CheckBoxModel.State = 0 exit sub end if end if if CheckBoxModel.State = 1 then CheckBoxModel.State = 0 FormAng.ismodified = FALSEFormProd.Columns.getByName("ID-Ang_fkey").Value = FormAng.Columns.getByName("ID-Ang").Value
end if end subIch habe hier als Beispiel auch die Prüfung auf die Notwendigkeit der Beschaffung eingebaut. Die Checkbox wird wieder ausgeschaltet und die Modifiziert-Eigenschaft zurückgenommen, damit die Angebotsdaten nicht versehentlich verwaltet werden. Auch bei dieser Variante ist das Formularfeld für ID-Ang_fkey ein Listenfeld, damit an Stelle der Angebots-ID der Klartext (bei meinem Test der Lieferant) angezeigt wird; dann würde es sich anbieten, das Listenfeld nur zur Anzeige freizugeben. Wenn da nur die Angebotsnummer stehen soll, reicht natürlich ein einfaches Feld.
Ich hoffe, die beiden Varianten bringen dich weiter. ich schicke dir wie gesagt per PM noch ein paar Screenshots.
Herzliche Grüße Gerhard Am 21.04.2025 um 18:44 schrieb Hessler, Klaus-Michael:
Lieber Gerhard, herzlichen Dank, sehr schön, von Dir zu hören.ich verstehe die Aufgabenstellung nicht.Das Listenfeld soll alle (vorhandenen) Angebote anzeigen, die das Produkt haben, das im Hauptformular steht. Das ist aber doch genau die Menge an Angeboten, die das Unterformular sowieso anzeigt! Da gibt es doch gar nichts mehr zuzuordnen! (Insofern ist auch die Einschränkung BeschaffenAnzahl > 0 irrelevant.)Ich beschreibe ein Beispiel: * tbl_Produkte, Felder: ID-Prod, Produktname, BeschaffenAnzahl, ID-Ang_fkey o 001, Spaten klein, 2, zu definieren o 002, Spaten groß, 2, zu definieren o 003, Schaufel, 0 o 004, Spitzhacke, 1, zu definieren * tbl_Angebote, Felder: ID-Ang, ID-Prod_fkey, Datum, Anbieter, Preis o 101, 001, 21.04.2020, Schulze, 65,00 o 102, 004, 25.04.2021 Best KG, 81,00 o 111, 001, 19.04.2025, Meier, 85,00 o ... o 112, 001, 19.04.2025, Best KG, 70,00 <<- dieses wird bestellt zu Prod. 001, aktuell und günstig o 113, 004, 19.04.2025, Meier, 90,00 o 114, 004, 19.04.2025, Best KG, 91,00 <<- dieses wird bestellt zu Prod. 004, aktuell, Mehrpreis geringAlso: Auswahl durch den Menschen, nur aktuelle Angebote, ggf. nur ein oder zwei Lieferer (buchhalterischer Aufwand, Versandkosten, ...). Und: Es gibt Produkte, die aktuell nicht beschafft werden müssen. Es gibt aus der Historie Angebote zu Produkten, die aktuell nicht benötigt werden.Das Formular / Unterformular liefert z.B.: * Produkt: 001, Spaten klein, 2, zu definieren * Angebote (sortiert nach Datum DESC, Preis DESC): o 112, 001, 19.04.2025, Best KG, 70,00 <<- dieses wird bestellt zu Prod. 001, aktuell und günstig o 111, 001, 19.04.2025, Meier, 85,00 o 101, 001, 21.04.2020, Schulze, 65,00Das Listenfeld (im Hauptformular positioniert) soll genau diese Auflistung anzeigen.Herzliche Grüße Michael
-- Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org Probleme? https://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/ Tipps zu Listenmails: https://wiki.documentfoundation.org/Netiquette/de Listenarchiv: https://listarchives.libreoffice.org/de/users/ Datenschutzerklärung: https://www.documentfoundation.org/privacy