Listbox mit aktueller Auswahl

Hallo,

in einem Fenster (Dialog) zeige ich Datensätze einer Tabelle in einer Listbox (Datenquelle:Aktuelle Auswahl) an.
Diese Listbox zeigt z.B. 2 Felder (z.B. Name und Vorname) des Datensatzes an.

In diesem Fenster werden zusätzlich noch die restlichen Felder (z.B. Strasse, Ort,…) angezeigt.

Klicke ich auf einen Datensatz in der Listbox wird dieser Datensatz mit “GoTo selected Record ([Tabelle],Zeile)”
als aktueller Datensatz geladen und angezeigt. Das alles geht…

Nun möchte ich, bevor der angeklickte Datensatz angezeigt wird den aktuellen Datensatz speichern.
Allerdings finde ich kein Event mit dem das möglich ist.
Sobald ich auf die Listbox klicke, ist kein Datensatz mehr ausgewählt - also aktuell.

Ist das irgendwie möglich ?

Vielen Dank.

Sie bekommen das mit einer Listbox vom Typ aktueller Auswahl nicht richtig hin. Mit viel basteln vielleicht scheinbar, aber nie richtig.
Die Listbox lädt read only, sie gibt frei, sie lädt nach und Sie haben darüber keine Kontrolle. Deshalb wird es scheitern.

Schauen Sie sich einmal ORDA von v17 an. Unter ORDA gibt es keine aktuelle Auswahl, keinen aktuellen Datensatz, sondern viele Auswahlen, viele Datensätze, daher keine Konflikte.
Eine Listbox vom Typ Entity Selection füllt auf Wunsch automatisch eine Variable mit der angeklickten Entity. Diese kann dann in einem weiteren Formular angezeigt werden.
Man kann sich diese in einer zweiten Variablen merken.

Mit optimistic Locking geht das dann sogar ohne das jeder angeklickter Datensatz gleich für alle anderen gesperrt ist. Hier ein Beispiel:
<code 4D>
If (Form.CurRecord#Null)
If (Form.CurRecord.touched())
CONFIRM(“Änderungen speichern?”)
If (OK=1)
C_OBJECT($status)
$status:=Form.CurRecord.save(dk auto merge)
Case of
: ($status.success)
// nichts, also passt!
: ($status.status=dk status automerge failed)
ALERT(“Jemand anderes hat in der Zwischenzeit die gleichen Felder verändert, die Daten können nicht gespeichert werden!”)
: ($status.status=dk status locked)
$user:=$status.lockInfo.user_name+"/"+$status.lockInfo.host_name+"/"+$status.lockInfo.task_name
CONFIRM("Datensatz ist gesperrt von "+$user;“Warten”;“Verwerfen”)
If (OK=1)
LISTBOX SELECT ROW(*;“Listbox”;Num(Form.Position);lk replace selection)
Form.SelectedElement:=Form.CurRecord

				Else 
                                            //nichts
				End if 
		End case 
	End if 
End if 

End if

Form.CurRecord:=Form.SelectedElement
Form.Position:=Form.SelectedPosition
</code 4D>

Der Code erfordert ein Formular angezeigt über DIALOG (damit Form benutzt werden kann).
Die Listbox heißt Listbox
Der Listbox ist eine Entity Selection zugewiesen.
Als angeklickte Entity wurde Form.SelectedElement, als angeklickte Position Form.SelectedPosition zugewiesen.

Form.CurRecord und Form.Position merken sich die gerade angezeigte Zeile/Datensatz, damit auch beim Wechsel die alte noch bekannt ist.
War bereits einer angeklickt (nicht direkt nach dem Öffnen) und wurde der angezeigte geändert, wird gefragt ob Speichern.
Tritt bei .save() ein Fehler auf, wird geprüft ob Kollision oder Sperrung. Bei Sperrung entweder warten (zurück auf vorher angeklickte Zeile) oder nichts.

Hallo Herr Maul,

vielen Dank für die ausführliche Antwort.

Sie haben mit ORDA natürlich Recht. Das wäre die beste und sauberste Lösung.
Um auf ORDA umzusteigen müssten aber die ganzen Formulare abgeändert werden.

Auch meinten Sie: “Diese kann dann in einem weiteren Formular angezeigt werden.”
Zwei Fenster hatte ich früher und das wollte ich nicht mehr. Da hat man ständig das Problem beim “Fenster verschieben” gehabt.

Vielleich kann man mit “Create entity selection” eine Entity selection erzeugen und diese in Listbox anzeigen.

Habe aber auch herausgefunden, dass das Form event “On Getting Focus” noch rechtzeitg zum Speichern anschlägt.
Damit könnte ich leben…

Warum hat 4D ORDA nicht vor 20 Jahren erfunden :wink: