Č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.)