Zum Hauptinhalt springen

Fragen zur RecList

Nach einem Update auf das RecList-Objekt verändert sich die Position des selektierten Datensatzes. Wie kann das verhindert werden?

Soll der selektierte Datensatz nach einem Update die Position in dem RecList-Objekt beibehalten, muss die Funktion ``WinUpdate() wie folgt verwendet werden:

$RecList->WinUpdate(_WinUpdOn, _WinLstFromSelected | _WinLstPosSelected | _WinLstRecDoSelect)

In welcher Reihenfolge werden die Ereignisse eines RecList-Objekts verarbeitet?

Siehe Ereignisse eines RecList-Objekts.

Wie kann über eine Prozedur in einem RecList-Objekt zeilenweise gescrollt werden?

Um in einem RecList-Objekt prozedural auf- und abzuscrollen wird mittels der Funktion ``RecRead() und den Optionen _RecPrev oder _RecNext der vorhergehende oder nächste Datensatz gelesen. Damit der gelesene Datensatz in der Liste selektiert wird, muss das RecList-Objekt mit folgender Anweisung aktualisiert werden:

Beispiel:

$RecList->WinUpdate(_WinUpdOn, _WinLstRecFromBuffer | _WinLstRecDoSelect);

Bei Umsatzzahlen soll die Währungsbezeichnung "EUR" dargestellt werden. Wie kann das erreicht werden?

Zur Anzeige einer Währungsbezeichnung sind folgende Schritte notwendig:

  • Aufnahme eines Datenbankfeldes vom Typ alphanumerisch welches die Umsatzwerte darstellt.
  • Setzen der Eigenschaft ClmAlign dieser Spalte auf den Wert _WinClmAlignRight, damit der Inhalt der Spalte rechtsbündig dargestellt wird.
  • Definition der Ereignisfunktion EvtLstDataInit, in der das alphanumerische Feld den Umsatzwert erhält und mit Darstellung der Währungsbezeichnung formatiert wird. Dazu wird die Konvertierungsfunktion CnvAF() mit der Option _FmtNumCurrencyIntl zur Darstellung des Währungscodes verwendet.

Beispiel:

sub EvtLstDataInit
(
aEvt : event; // Ereignis
aID : bigint; // Datensatz-ID oder Zeilennummer
) : logic;

{
// Konvertierung des Umsatzfeldes mit Nullunterdrückung und Währungscode
Feld # CnvAF(KndUmsatz, _FmtNumNoZero | _FmtNumCurrencyIntl);
return(true);
}

Wie kann die Sortierung eines RecList-Objekts zur Laufzeit geändert werden?

Da die Sortierung eines RecList-Objekts über den in der Eigenschaft DbKeyNo angegebenen Schlüssel läuft, lässt sich die Sortierung der RecList jederzeit durch Setzenb der Eigenschaft ändern. Die Sortierung kann auch durch Anklicken der entsprechenden Spaltenköpfe geändert werden, vorausgesetzt die Eigenschaften ClmSortFlags und DbKeyNo der entsprechenden Spalten ist gesetzt.

Wie kann ein bestimmter Datensatz im RecList-Objekt selektiert werden?

Mit der Option _WinLstRecDoSelect kann ein bestimmter Datensatz im RecList-Objekt selektiert werden. Der Datensatz, welcher selektiert dargestellt werden soll, muss sich in den Feldpuffern befinden. Soll ein Datensatz mit einem bestimmten Schlüsselwert selektiert werden reicht es aus, dass der oder die Schlüsselfelder den entsprechenden Wert zugewiesen bekommen. Voraussetzung hierbei ist, dass der Schlüssel mit dem in der Eigenschaft DbKeyNo angegebenen Schlüssel übereinstimmt. Ist das nicht der Fall, muss der Datensatz gelesen werden.

Beispiel:

AdrNummer # 3;
$RecList->WinUpdate(_WinUpdOn, _WinLstRecDoSelect);
AdrOrt # 'Frankfurt';
RecRead($RecList->wpDbFileNo, 2, 0);
$RecList->WinUpdate(_WinUpdOn, _WinLstRecDoSelect);

Wie kann ermittelt werden, welcher Datensatz im RecList-Objekt selektiert ist?

Über die Eigenschaft DbRecID bzw. DbRecID64 des RecList-Objekts kann zu jedem Zeitpunkt die Datensatz-ID des selektierten Datensatzes ermittelt werden. Über die Datensatz-ID kann der Datensatz gelesen werden.

Beispiel:

RecRead($RecList->wpDbFileNo, 0, _RecID, $RecList->wpDbRecID64)

Können bestimmte Datensätze von der Anzeige ausgenommen werden?

Für diesen Zweck gibt es das Ereignis EvtLstRecControl. Über den Rückgabewert der in diesem Ereignis angegebenen Funktion wird entschieden, ob ein Datensatz angezeigt wird oder nicht.

Beispiel:

sub EvtLstRecControl
(
aEvt : event; // Ereignis
aRecId : bigint; // Record-ID des Datensatzes
) : logic;

{
return(Ort = 'Frankfurt');
}

Im obigen Beispiel werden in dem RecList-Objekt nur Datensätze angezeigt, die im Feld "Ort" die Bezeichnung "Frankfurt" haben.

Aus Performancegründen sollte dieses Ereignis nur dann verwendet werden, wenn die Anzahl der Sätze die angezeigt werden, überwiegt und keine allzu großen Lücken vorhanden sind, da jeder Satz der übersprungen wird auch gelesen werden muss. Alternativ kann die Anzeige auch auf Basis einer Selektion (Eigenschaft DbSelection) oder eines Datensatzfilters (Eigenschaft DbFilter) durchgeführt werden.

Können innerhalb eines RecList-Objekts Felder aus unterschiedlichen Dateien dargestellt werden?

Dies ist möglich. Dazu müssen in dem Ereignis EvtLstDataInit des RecList-Objekts die Feldpuffer der betreffenden Felder, beispielsweise durch Lesen des gewünschten Datensatzes, gefüllt werden.

Beim Scrollen im RecList-Objekt soll der jeweils selektierte Datensatz in den Eingabeobjekten dargestellt werden.

Um zu erreichen, dass die Eingabeobjekte aktualisiert werden, muss in dem Ereignis EvtLstSelect des RecList-Objekts eine Funktion definiert werden, die ein Update auf die Felder durchführt.

Beispiel:

sub EvtLstSelect
(
aEvt : event; // Ereignis
aID : bigint; // Record-ID des Datensatzes oder Zeilennummer
) : logic;

{
$Frame->WinUpdate();
return(true);
}

Das Ereignis EvtLstSelect wird immer dann ausgelöst, wenn sich die selektierte Zeile in einer RecList ändert.

Standardmäßig werden in dem Ereignis EvtLstSelect lediglich die Feldpuffer der im RecList-Objekt angezeigten Datenbankfelder gefüllt. Ist es erforderlich, dass auch Felder der Datei welche nicht in dem Objekt vorhanden sind aktualisiert werden, muss der Datensatz in dem Ereignis EvtLstSelect gelesen werden.

Beispiel:

sub EvtLstSelect
(
aEvt : event; // Ereignis
aID : bigint; // Record-ID des Datensatzes oder Zeilennummer
) : logic;

{
RecRead(fKnd, 0, _RecID, aID);
$Frame->WinUpdate();
return(true);
}

Im obigen Beispiel wird der Datensatz über die interne Datensatz-ID gelesen. Ist der Schlüssel, über den das RecList-Objekt sortiert ist (DbKeyNo) ein eindeutiger Schlüssel und wird das Schlüsselfeld auch in der Liste angezeigt, kann der Datensatz auch über diesen Schlüssel gelesen werden.

RecRead(fKnd, aEvt:Obj->wpDbKeyNo, 0);

In einem Dialog werden Datensätze erfasst. Wie kann erreicht werden, dass ein neu angelegter Datensatz in einem RecList-Objekt des gleichen Dialoges angezeigt und selektiert dargestellt wird?

Damit der neue Datensatz in dem RecList-Objekt dargestellt werden kann, muss RecList neu aufgebaut werden. Mit der Funktion ``WinUpdate() und der Option _WinUpdOn wird ein Update auf das RecList-Objekt durchgeführt. Um den neuen Datensatz zu selektieren, muss noch zusätzlich die Option _WinLstRecDoSelect verwendet werden.

Beispiel:

$RecList->WinUpdate(_WinUpdOn, _WinLstRecDoSelect)

Die Option _WinLstRecDoSelect bewirkt, dass der Datensatz welcher in den Felpuffern steht, im RecList-Objekt selektiert wird.

Wenn das RecList-Objekt angeklickt wird, werden anschließend die Eingabeobjekte mit den Daten des selektierten Datensatzes überschrieben. Wie kann dies verhindert werden?

Standardmäßig wird, wenn das RecList-Objekt den Fokus verliert, der selektierte Datensatz in die Feldpuffer übertragen. Ist dieses Verhalten nicht erwünscht, muss bei der Eigenschaft LstFlags des RecList-Objektes die Option _WinLstRecFocusTermReset entfernt werden. Ist das Flag nicht gesetzt, werden Änderungen der Feldpuffer, bedingt durch das RecList-Objekt, wieder verworfen.

Nach dem Aufruf eines Frames mit einem RecList-Objekt sind Eingabeobjekte mit den Daten des selektieren Satzes bereits vorbelegt. Diese Felder sollen aber leer ein.

Da der selektierte Datensatz vom RecList-Objekt gelesen wurde, ist der Datensatzpuffer gefüllt.

Um zu erreichen, dass nach dem Aufruf des Frames die Felder leer sind, muss bei der RecList in der Eigenschaft DbRecBuf die Datei angehakt werden, die in der Eigenschaft DbFileNo angegeben ist. Vor der Anzeige des Frames muss der Datensatzpuffer mit der Funktion RecBufClear() geleert werden.

Durch Verwendung von DbRecBuf werden die Feldpuffer vor dem Aufbau der RecList gesichert und anschließend wieder hergestellt.

Können in einem RecList-Objekt Bilder angezeigt werden?

In einem RecList-Objekt können keine Bilder angezeigt werden.

Die Ausnahme bilden Icons. Werden in einer Spalte der Liste ganzzahlige Werte (Ganzzahlig kurz, Ganzzahlig lang oder Ganzzahlig 64) angezeigt, kann statt der Zahl ein Icon aus einem Symbolsatz (Tile) angezeigt werden. Die Zahl entspricht der Position des Symbols innerhalb des Tile.

Wenn ein Symbol angezeigt werden soll, muss die Eigenschaft ClmTypeImage auf _WinClmTypeImageC16 oder _WinClmTypeImageUser gesetzt werden. Bei _WinClmTypeImageC16 wird das CONZEPT 16 Tile verwendet. Im anderen Fall wird das benutzerdefinierter Tile verwendet, das beim RecList-Objekt in der Eigenschaft TileNameUser angegeben wurde.

Wie kann verhindert werden, dass der Anwender die Reihenfolge der Spalten verändert?

Wird der Eigenschaft LstStyle der Wert _WinLstHeader zugewiesen, ist das Verändern der Reihenfolge nicht mehr möglich. Eine Änderung der Spaltenbreite kann noch vorgenommen werden.

Der Anwender ändert in der Applikation die Reihenfolge der Spalten. Wie kann erreicht werden, dass diese Änderung bei Verlassen des Dialoges bzw. der Applikation erhalten bleibt?

Die Position einer Spalte kann über die Eigenschaft ClmOrder ermittelt und gesetzt werden. Um die Aufgabenstellung zu lösen, wird in der Ereignisfunktion EvtClose die Position aller Spalten des RecList-Objekts ermittelt und in eine Datei geschrieben.

Beispiel:

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

local
{
tObj : int;
}

{
// Abarbeiten der Spalten in der Anzeige-Reihenfolge
$RecList->wpOrderPass # _WinOrderShow;
for tObj # $RecList->WinInfo(_WinFirst);
loop tObj # tObj->WinInfo(_WinNext);
while (tObj > 0)
{
// Felder der Konfigurationsdatei setzen
KnfClmName # tObj->wpName;
KnfClmOrder # tObj->wpClmOrder;
...
}

return(true);
}

Damit über die Funktion ``WinInfo() die Spalten in der Reihenfolge ihrer Anzeige ermittelt werden können, muss die Eigenschaft OrderPass des RecList-Objekts auf den Wert _WinOrderShow gesetzt werden.

Beim Laden des Fensters wird in der Ereignisfunktion EvtInit die Datei gelesen und die Eigenschaft ClmOrder gesetzt.

Im RecList-Objekt werden vertikale und horizontale Linien gezeichnet. Wie können diese Linien ausgeblendet werden?

Um die Linien auszublenden muss der Eigenschaft ColGrid der Wert _WinColUndefined zugewiesen werden.