Zum Hauptinhalt springen

Beispiel - Selektionen

Beispiel - Selektionen Selektion öffnen, durchführen und das Ergebnis in einem RecList-Objekt darstellen

In diesem Beispiel wird die Vorgehensweise beim Durchführen einer Selektion vorgestellt. Das nachstehende Beispiel geht von einem Dialog mit einem RecList- und einem Button-Objekt aus.

Beim Drücken der Schaltfläche soll eine Selektion durchgeführt und der Inhalt der Selektionsmenge in der RecList angezeigt werden. Wird die Schaltfläche erneut gedrückt, wird die Selektionsmenge verworfen und der Inhalt der Datei im RecList-Objekt dargestellt.

Die gesamte Verarbeitung kann im Ereignis EvtClicked der Schaltfläche durchgeführt werden.

sub EvtClicked
(
aEvt : event; // Ereignis
) : logic;

local
{
tHdlSel : int;
tErg : int;
tSelName : alpha(20);
}

{

Um die Selektion nicht für alle anderen Benutzer der Datenbank zu sperren, wird die Selektion SELA in eine temporäre Selektionsmenge kopiert. Der Name dieser Selektionsmenge setzt sich aus TMP.SELA. und der ID des Benutzers zusammen.

  tSelName # 'TMP.SELA.' + UserInfo(_UserCurrent);

In der folgenden if-Anweisung wird unterschieden, ob im RecList-Objekt bereits eine Selektionsmenge angezeigt wird oder nicht. Um eine Selektionsmenge anzuzeigen, muss die Eigenschaft DbSelection auf den Deskriptor der Selektion gesetzt werden. Beinhaltet die Eigenschaft den Wert 0, wird keine Selektionsmenge angezeigt.

  if ($RecList->wpDbSelection = 0)
{

Die vorhandene Selektion SELA wird unter dem temporären Namen kopiert. Auf diese Weise kann die Selektion gesperrt werden, ohne das andere Benutzer diese Selektion nicht mehr aufrufen können bis sie wieder geschlossen wurde. Da der temporäre Name mit der Benutzer-ID ergänzt ist, kann auch kein anderer Benutzer durch Aufruf der gleichen Prozedur den gleichen Namen ermitteln, da der Benutzer eine andere Benutzer-ID besitzt.

    tErg # SelCopy(ART.D.Artikel, 'SELA', tSelName);

Mit SelOpen () wird ein Selektionspuffer angelegt. Der zurückgegebene Deskriptor wird bei den folgenden Befehlen benötigt. Der Befehl SelRead () liest die kopierte Selektionsmenge und sperrt sie für andere Benutzer. Nur eine gesperrte Selektion kann mit dem Befehl SelRun () durchgeführt werden. Die Optionen _SelDisplay und _SelBreak sorgen dafür, dass der Lauf der Selektion angezeigt und durch den Benutzer unterbrochen werden kann.

    tHdlSel # SelOpen();
tErg # SelRead(tHdlSel, ART.D.Artikel, _SelLock, tSelName);
tErg # SelRun(tHdlSel, _SelDisplay | _SelBreak);

Ist die Selektion durchgelaufen, kann der Selektionsdeskriptor der Eigenschaft DbSelection zugewiesen werden. Anschließend findet automatisch ein Neuaufbau der Liste statt, die dann die Datensätze der Selektionsmenge anzeigt.

    $RecList->wpDbSelection # tHdlSel;
}

Wird in der Liste bereits der Inhalt einer Selektion angezeigt, wird der else-Fall aufgerufen. Hier wird der Selektionsdeskriptor aus der Eigenschaft des RecList-Objektes ausgelesen und die Selektion mit dem Befehl SelClose () geschlossen. Anschließend wird der Selektionsdeskriptor aus der Eigenschaft gelöscht. Die zuvor kopierte Selektionsmenge wird mit SelDelete () gelöscht.

  else
{
// Selektion beenden und löschen
SelClose($RecList->wpDbSelection);
$RecList->wpDbSelection # 0;
SelDelete(ART.D.Artikel, tSelName);
}

return(true);
}

Im else-Zweig kann nicht auf die Variable tHdlSel zugegriffen werden, da der Wert der Variable nur im if-Zweig gesetzt wird. Der else-Zweig wird aber erst nach einem erneuten Aufruf der Funktion durchlaufen, die Variable besitzt zu diesem Zeitpunkt keinen gültigen Wert mehr.

info

Innerhalb der hier vorgestellten Routine werden keine Fehlerüberprüfungen durchgeführt. Dies erfolgt, um das Beispiel möglichst einfach zu halten. In der Regel müssen die Rückgabewerte der einzelnen Befehle entsprechend ausgewertet werden.

Im Anschluss befindet sich nocheinmal der gesamte Funktionstext ohne Kommentare:

sub EvtClicked
(
aEvt : event; // Ereignis
) : logic;

local
{
tHdlSel : int;
tErg : int;
tSelName : alpha(20);
}

{
// Selektionsname bestimmen
tSelName # 'TMP.SELA.' + UserInfo(_UserCurrent);
if ($RecList->wpDbSelection = 0)
{
// Es wird keine Selektion angezeigt

// Selektion kopieren
tErg # SelCopy(ART.D.Artikel, 'SELA', tSelName);

// Selektion öffnen und durchführen
tHdlSel # SelOpen();
tErg # SelRead(tHdlSel, ART.D.Artikel, _SelLock, tSelName);
tErg # SelRun(tHdlSel, _SelDisplay | _SelBreak);

$RecList->wpDbSelection # tHdlSel;
}
else
{
// Selektion beenden und löschen
SelClose($RecList->wpDbSelection);
$RecList->wpDbSelection # 0;
SelDelete(ART.D.Artikel, tSelName);
}

return(true);
}