Date: prev next · Thread: first prev next last
2025 Archives by date, by thread · List index


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 vorgesehen
Die 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 Sub

Das 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 - 1
    if GridCtrl.getByIndex(i).Model.Name = "ID-Ang_fkey" then GridCtrl.getByIndex(i).makeVisible(selectedItemPos)
next

u.ä., aber das änderte nichts.

2. Variante: über das Unterformular
Das 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 then
    if 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 = FALSE
    FormProd.Columns.getByName("ID-Ang_fkey").Value = FormAng.Columns.getByName("ID-Ang").Value
end if

end sub

Ich 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 gering

Also: 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,00

Das 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

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.