Hervorhebung des aktuellen Datensatzes in einer Übersicht

18. Dezember 2005 23:28

Da ich des öfteren gefragt werde, wie man den aktuell ausgewählten Datensatz (in einer Übersichts-Form) hervorheben kann, hier die Lösung:

Code:
Form - OnAfterGetCurrRecord()
CurrentRecord := Rec;

Form - OnTimer()  // TimerInterval = 100
IF CurrForm.ACTIVE THEN
  IF NOT IsEqual(CurrentRecord2,Rec) THEN BEGIN
    CurrForm.UPDATE(FALSE);
    CurrentRecord2 := Rec;
  END;

Description - OnFormat(VAR Text : Text[1024];)
CurrForm.Description.UPDATEFONTBOLD(IsEqual(CurrentRecord,Rec));

// Wenn auch eine farbliche Hervorhebung gewünscht ist, bitte folgenden Code aktivieren:
//
//IF IsEqual(CurrentRecord,Rec) THEN
//  CurrForm.Description.UPDATEFORECOLOR(255)
//ELSE
//  CurrForm.Description.UPDATEFORECOLOR(0);

IsEqual(Rec : Record "<Tabelle>";Rec2 : Record "<Tabelle>") : Boolean
EXIT(
  (Rec."Primary Key Field 1" = Rec2."Primary Key Field 1") AND
  (Rec."Primary Key Field 2" = Rec2."Primary Key Field 2") AND
  (Rec."Primary Key Field 3" = Rec2."Primary Key Field 3") AND
  (Rec."Primary Key Field 4" = Rec2."Primary Key Field 4"));

Wichtig:
- CurrentRecord und CurrentRecord2 sind Variablen vom Typ Record welche auf die gleiche Tabelle verweisen, wie auch die SourceTable der Form.
- Im OnTimer-Trigger auf gar keinen Fall das IF CurrForm.ACTIVE THEN vergessen, sonst fliegt euch die fin.exe um die Ohren (auf gut deutsch: Absturz).
- In der Funktion IsEqual kann nicht einfach mit Rec = Rec2 vergleichen werden; das funktioniert nicht!
Es müssen alle Primärschlüsselfelder einzeln verglichen werden und mit AND verknüpft sein.

[Edit by TL: Erklärungstext bearbeitet. Dank an Michael Schumacher für den Hinweis.]
Zuletzt geändert von Timo Lässer am 23. Dezember 2005 11:12, insgesamt 1-mal geändert.

26. September 2006 18:55

Beim Stöbern bin ich auf diesen Beitrag gestoßen.

Ich hätte einen weiteren Vorschlag der ohne Timer und ohne einzelne Feldprüfungen auskommt.
Getestet auf Nav 4.0 SP2 mit "Item List" und einer eigenen Form/Tabelle mit 8 Schlüsselfeldern ;-).
Denke aber, dass es zumindest in allen aktuelleren Versionen die mit RecordRef umgehen können funktioniert.

Für Feedback (z.B. 3.70) wäre ich dankbar:

Code:
Globals
CurrentRecRef : RecordRef;
LastRecRef : RecordRef;


Form - OnOpenForm()
LastRecRef.GETTABLE(Rec);

Form - OnAfterGetCurrRecord()
CurrentRecRef.GETTABLE(Rec);

Form - OnBeforePutRecord()
LastRecRef.GETTABLE(Rec);
CurrForm.UPDATE(FALSE);

IsCurrent(CheckRecRef : RecordRef) : Boolean
RecRef.GETTABLE(Rec);
EXIT(FORMAT(CheckRecRef.RECORDID) = FORMAT(RecRef.RECORDID));

Description - OnFormat(VAR Text : Text[1024];)
CurrForm.Description.UPDATEFONTBOLD(NOT IsCurrent(LastRecRef));
CurrForm.Description.UPDATEFONTBOLD(IsCurrent(CurrentRecRef));

15. November 2007 20:14

Hallo,

gibt es eigentlich auch in einer Liste eine Möglichkeit, die komplette Zeilen abwechselnd mit einer anderen Schriftfarbe darzustellen?

16. November 2007 10:25

Diese Möglichkeit gibt es.:

Um Zeilen aber alternierend darzustellen, muss aber der OnFormat von jedem Control in der TableBox ausprogrammiert und der Zustand der Vorgängerzeile gemerkt werden.

20. November 2007 12:56

SilverX hat geschrieben:
Für Feedback (z.B. 3.70) wäre ich dankbar:

[/code]


Unter 5.0 funktionierts.

Leider nicht unter 3.60 :-( Der Client ist mir jedesmal abgestürzt --> es erscheint der Visual Studio Just-In-Time Debugger mit der Fehlermeldung:

An unhandeld win32 exception occurred in finsql.exe[2924]

Aber ein Versuch war es wert :-D

Total genial deine Lösung!

20. November 2007 14:29

Das RecordRef-Handling unter 3.60 war noch etwas fehlerhaft.
Erst ab 3.70 konnte man wirklich mit RecordRef & Co. arbeiten.
Mit 5.0 wurde das dann nochmal "optimiert".

Re: Hervorhebung des aktuellen Datensatzes in einer Übersich

30. April 2012 14:31

Ich habe mittlerweile beide Lösungen im Einsatz.
Die Lösung von Carsten mit dem RecRef ist mir eigentlich symphatischer, funktioniert wegen dem CurrForm.Update(False) im OnBeforePutRecord aber nur für nicht-editierbare Forms. Mit Timo's Variante klappt es auch bei editierbaren Übersichten.