1. Časové značky

    Článek: AN0002447Aktualizováno:: 25.01.2021

    ObjectGears umožňuje sledovat historii změn záznamu pomocí audit-trailu, který je možný na třídě zapnout. Následně máme v detailu záznamu tlačítka umožňující zobrazení předchozích verzí záznamu formou seznamu záznamů nebo zobrazení detailního archívu obsahujícího informaci, jaká hodnota v jakém sloupci byla změněna na jakou novou hodnotu, kým, kdy a jak.

    Zobrazení Detailního archívu obsahuje veškeré změny a vypadá následovně.

     

    V určitých případech budeme chtít přehledně evidovat historii jen některých položek. Takových, které jsou kritické pro posouzení vývoje případu. Ukážeme si to na příkladu Incidentu, u nějž nás zajímají změny ve sloupcích Status, Řešitel a Řešitelský tým. Na níže uvedeném obrázku vidíme záznam Incidentu se těmito zvýrazněnými poli.

     

    Změny v těchto kritických polích chceme vidět přehledně tak, jak to ukazuje následující obrazovka - záložka Časové značky v záznamu incidentu. 

    Po změně v uvedených polích tedy budeme chtít přidat nové záznamy, které se budou zobrazovat v této záložce. Tohoto dosáhneme ve třech snadných krocích.

    1. Zřídíme si třídu Časové značky pro ukládání změn klíčových polí.
    2. Vytvoříme Master-detail relaci ve třídě Incident.
    3. Vytvoříme pravidlo přidávající záznamy do třídy Časové značky.

    Třída Časové značky ukládající změny v klíčových polí

    Zřídíme si novou třídu a v ní následující sloupce. Na nich si všimneme:

    • Ve třídě není pouze odkaz na třídu Incident, ale i na další třídy (Problém, Úkol, Katalogový požadavek, Hlášení uživatele). Všechny tyto třídy mohou sdílet jednu třídu pro evidenci časových značek.
    • Datum - udává kdy došlo ke změně.
    • Popis - lokalizovaný text popisující, k jakému typu změny došlo (Změna řešitele, Změna stavu, Změna řešitelského týmu). Uživatel s různým jazykovým nastavením uvidí daný text ve svém jazyce.
    • Původní hodnota, Nová hodnota - sloupce udávající, ke změně z jaké hodnoty na jakou hodnotu došlo. Uživatel toto opět uvidí ve své jazykové verzi.
    • Původní Id a Nové Id - sloupce udávající hodnoty Id odkazovaných záznamů před změnou a po změně. Tyto hodnoty nemusíme zobrazovat uživateli, ale využijeme je při výpočtech, jak dlouho byl záznam v určitém stavu nebo jak dlouho byl někomu přiřazen.
    • Typ - typ změny daný kódem sloupce, v němž ke změně došlo. Odpovídá Popisu výše, ale je určen opět pro zpracování dat uložených ve třídě Časové značky.

    Master-detail relace

    Master-detail relation vytvoříme běžným způsobem a zvolíme sloupce z propojené třídy Časových značek, které se mají zobrazovat.

    Pravidlo přidávající záznamy do třídy Časové značky

    Ve třídě Incident vytvoříme pravidlo Po uložení existujícího záznamu typu Skript. Toto pravidlo nám založí nový záznam ve třídě Časových značek pro každou změnu v jednom z polí Stav, Řešitel a Řešitelská skupina. Protože tento záznam bude nalinkován na záznam třídy Incident, který byl měněn, uvidíme ho i v Master-detail relaci v daném Incidentu.

    var clTS = null;
    var date = OG.DateTime.Now;

    if (OGActualDataRow.IsChange('solver'))
    {
    clTS = OGDataParent.Model.ClassDefs['time_mark'];

    var dr = OG.DataRow.CreateNew(clTS.Id);
    dr['incident'] = OGActualDataRow.Id;
    dr['date'] = date;
    dr['type'] = 'solver';
    dr['previous_value'] = GetPerson(OGOldDataRow['solver']);
    dr['new_value'] = GetPerson(OGActualDataRow['solver']);
    dr['previous_id'] = GetPersonId(OGOldDataRow['solver']);
    dr['new_id'] = GetPersonId(OGActualDataRow['solver']);
    dr['description'] = 'cs-CZ::Změna řešitele~de-DE::Löser-Änderung~en-US::Solver change';

    OG.DataRow.SaveData(dr);
    }

    if (OGActualDataRow.IsChange('solution_team'))
    {
    if ( clTS == null)
    {
    clTS = OGDataParent.Model.ClassDefs['time_mark'];
    }
    var colSolutionTeam = OGDataParent.Columns['solution_team'];

    var dr = OG.DataRow.CreateNew(clTS.Id);
    dr['incident'] = OGActualDataRow.Id;
    dr['date'] = date;
    dr['type'] = 'solution_team';
    dr['previous_value'] = OGOldDataRow.GetClassLinkAsString(colSolutionTeam.Id);
    dr['new_value'] = GetShortDescription(OGActualDataRow.GetDR('solution_team'));

    dr['previous_id'] = OGOldDataRow.GetClassLink(colSolutionTeam.Id);
    dr['new_id'] = OGActualDataRow.GetClassLink(colSolutionTeam.Id);

    dr['description'] = 'cs-CZ::Změna řešitelského týmu~de-DE::Änderung von Lösungteam~en-US::Change of solution team';

    OG.DataRow.SaveData(dr);
    }

    if (OGActualDataRow.IsChange('status'))
    {
    if ( clTS == null)
    {
    clTS = OGDataParent.Model.ClassDefs['time_mark'];
    }
    var colStatus = OGDataParent.Columns['status'];

    var dr = OG.DataRow.CreateNew(clTS.Id);
    dr['incident'] = OGActualDataRow.Id;
    dr['date'] = date;
    dr['type'] = 'status';
    dr['previous_value'] = OGOldDataRow.GetClassLinkAsString(colStatus.Id);
    dr['new_value'] = GetShortDescription(OGActualDataRow.GetDR('status'));

    dr['previous_id'] = OGOldDataRow.GetClassLink(colStatus.Id);
    dr['new_id'] = OGActualDataRow.GetClassLink(colStatus.Id);

    dr['description'] = 'cs-CZ::Změna stavu~de-DE::Änderung von Status~en-US::Change of status';

    OG.DataRow.SaveData(dr);
    }

    function GetPerson(person)
    {
    return (person == null ? null : person.DisplayName);
    }

    function GetPersonId(person)
    {
    return (person == null ? null : person.Id);
    }

    function GetShortDescription(dr)
    {
    return (dr == null ? null : dr.ShortDescriptionOrFullId);
    }

    function GetId(dr)
    {
    return (dr == null ? null : dr.Id);
    }

     

     

×