1. Případová studie Model IT: Třída historie

    Článek: AN0001839Aktualizováno:: 06.02.2019

    V modelu IT existuje několik entit (Incident, Problém, Úkol..), u nichž mají uživatelé možnost evidovat komentář a čas strávený řešením.

    Popis funkčnosti

    Uživatelé mohou pro jednotlivé záznamy postupně přidávat komentáře formou historie uvádějící datum, uživatele, komentář, popř. hodiny strávené řešením. V rámci životního cyklu záznamu je možné přidat libovolné množství těchto komentářů.

    Uživateli se při vytváření záznamu zobrazí pouze pole Komentář a Odpracovaná doba (hodiny). Pole Datum, Uživatel a odkaz na entity Incident, Problém, Úkol... se skryjí a vyplní automaticky. Uživatel má možnost zobrazit dříve uložený záznam historie se všemi sloupci, ale bez možnosti editace. Pokud se záznam týká např. entity Incident a odkazuje na ni, ostatní sloupce pro odkazy na jiné entity budou skryty.

    Popis řešení

    Komentáře ze všech entit budou uloženy v jedné společné třídě historie. To umožní snadný reporting a snadné přidání historie pro další třídu. Třída historie obsahuje ve zvláštních sloupcích odkazy na Incident, Problém, Úkol atd.

    Pro každou třídu, z níž má být možné vytvářet historii, zřídíme ve třídě Historie sloupec typu Číselníková hodnota. Vztahy těchto tříd zobrazuje následující entity-relationship diagram.

     

    U každé třídy, z níž má být možné komentář přidat, vytvoříme master-detail zobrazení na třídu Historie, v něm zaškrtneme Zobrazit tlačítko Nový a v Url proměnné pro nový záznam nastavíme název proměnné identifikující třídu s uvedením pořadí proměnné v URL (např. inc={5} pro třídu incident). Toto umožní na třídě s Historií identifikovat entitu a záznam, z níž byl požadavek na historii zaslán a vyplnit odpovídající odkaz. Uživatel může přidat nový komentář po kliku tlačítko Nový v master-detail zobrazení.

    Ve třídě historie vytvoříme pravidlo Před uložením nového záznamu, které v URL vyhledá odpovídající řetězce (v níže uvedeném příkladě inc, pro, tsk) a podle toho založí v záznamu historie odkaz v příslušném sloupci na příslušný záznam.

    var isOk = false;
    var qs = System.Web.HttpContext.Current.Request.QueryString;
    var incId = Com.ObjectGears.Common.Helpers.ExtendMethod.GetInt( qs, 'inc');
    var proId = Com.ObjectGears.Common.Helpers.ExtendMethod.GetInt( qs, 'pro');
    var tskId = Com.ObjectGears.Common.Helpers.ExtendMethod.GetInt( qs, 'tsk');
    var uscId = Com.ObjectGears.Common.Helpers.ExtendMethod.GetInt( qs, 'usc');
    var reqId = Com.ObjectGears.Common.Helpers.ExtendMethod.GetInt( qs, 'req');

    //OG.Log.Write( incId + ' - ' + urpId);
    if ( incId != null)
    {
        var cl = OG.ClassDef.GetByCode( OGActualDataRow, 'incident');
        var drInc = OG.DataRow.GetDataById( cl.Id, incId);
        if ( drInc != null && !drInc.IsDeleted)
        {
            //zde není kontrola na toho, kdo to zapisuje!

            OGActualDataRow['incident'] = drInc.Id;
            isOk = true;
        }
    }
    else if ( proId != null)
    {
        var cl = OG.ClassDef.GetByCode( OGActualDataRow, 'problem');
        var drPro = OG.DataRow.GetDataById( cl.Id, proId);
        if ( drPro != null && !drPro.IsDeleted)
        {
             OGActualDataRow['problem'] = drPro.Id;
            isOk = true;
        }
    }
    else if ( tskId != null)
    {
        var cl = OG.ClassDef.GetByCode( OGActualDataRow, 'tasks');
        var drTsk = OG.DataRow.GetDataById( cl.Id, tskId);
        if ( drTsk != null && !drTsk.IsDeleted)
        {
             OGActualDataRow['task'] = drTsk.Id;
            isOk = true;
        }
    }
    else if ( uscId != null)
    {
        var cl = OG.ClassDef.GetByCode(  'requests', 'user_call');
        var drUsc = OG.DataRow.GetDataById( cl.Id, uscId);
        if ( drUsc != null && !drUsc.IsDeleted)
        {
             OGActualDataRow['user_call'] = drUsc.Id;
            isOk = true;
        }
    }
    else if ( reqId != null)
    {
        var cl = OG.ClassDef.GetByCode(  'requests', 'request');
        var drReq = OG.DataRow.GetDataById( cl.Id, reqId);
        if ( drReq != null && !drReq.IsDeleted)
        {
             OGActualDataRow['request'] = drReq.Id;
            isOk = true;
        }
    }

    if ( !isOk)
    {
        OGActualMessage.SetError( 'No reference to incident, problem nor task was provided.');
        return true;
    }

    Skrytí sloupců typu číselníková hodnota, které neobsahují odkaz, zajistíme ve třídě Historie pomocí skriptu pro detail záznamu:

    function OnPreRender()
    {
        var cinc = OGColumns.GetByCode('incident');
        var cpro = OGColumns.GetByCode('problem');
        var ctsk = OGColumns.GetByCode('task');
        var cusc = OGColumns.GetByCode('user_call');
        var creq = OGColumns.GetByCode('request');

        cinc.Visible = !(cinc.ColumnUI != null && ( cinc.ColumnUI.GetData() == null || cinc.ColumnUI.GetData().Count == 0) || OGDataRowId == null);
        cpro.Visible = !(cpro.ColumnUI != null && ( cpro.ColumnUI.GetData() == null || cpro.ColumnUI.GetData().Count == 0) || OGDataRowId == null);
        ctsk.Visible = !(ctsk.ColumnUI != null && ( ctsk.ColumnUI.GetData() == null || ctsk.ColumnUI.GetData().Count == 0) || OGDataRowId == null);
        cusc.Visible = !(cusc.ColumnUI != null && ( cusc.ColumnUI.GetData() == null || cusc.ColumnUI.GetData().Count == 0) || OGDataRowId == null);
        creq.Visible = !(creq.ColumnUI != null && ( creq.ColumnUI.GetData() == null || creq.ColumnUI.GetData().Count == 0) || OGDataRowId == null);

       if ( OGDataRowId == null)
       {
           OGColumns.GetByCode('date').Visible = false;
           OGColumns.GetByCode('og_user').Visible = false;
       }
    }

    (Příklad předpokládá, že sloupce třídy Historie odkazující na Incident, Problem, Task, User call a Request mají zaškrtnutu volbu Výběr ve vyhledávacím formuláři.)

×