1. Smazání záznamu včetně souvisejících záznamů

    Článek: AN0002444Aktualizováno:: 10.11.2020

    V určitých případech potřebujeme fyzicky smazat záznam, ale ObjectGears brání toto provést, protože na záznam odkazují jiné záznamy. Při logickém mazání záznamu by toto nebyl problém, ale při fyzickém mazání musíme nejprve smazat související záznamy (ty, které se na záznam odkazují) nebo jim alespoň odstranit odkaz na záznam, který chceme smazat.

    V našem příkladu budeme mít záznam dle obrázku níže. Záznam je označený jako Uživatel, ale nejde o uživatele ObjectGears, nýbrž o datový záznam jako každý jiný. U záznamu vidíme dvě master-detail relace. Na záznam, ale mohou odkazovat i další třídy, nejen ty ze dvou zobrazených master-detail relací. Pokud by tomu tak bylo, záznam nechceme mazat, ale necháme uživatel vyřešit tyto kolize ručně.

    Vytvoříme si tedy tlačítko, které zkontroluje, zda na záznam neodkazují záznamy v jiných relacích. Pokud ano, zobrazíme hlášení, která relace na záznam odkazuje. Pokud ne, smažeme záznamy z master-detail relací a nakonec i daný záznam. To uživateli ušetří čas, protože ve výše uvedeném příkladu by nejdříve musel mazat celkem osm záznamů z master-detail relací a nakonec i vlastní záznam. Zde to provede  skript po kliku na tlačítko vše najednou.

    if (OGActualDataRowId != null)
    {
    var m = OGDataParent.Model;

    //kontrola na x vazby - pokud existuji, tak nic nemazat
    //...kontrola třídy "model uloziste"
    var clf = m.ClassDefs['model_storage'];
    var f = OG.DataRow.GetDataRowFilter(clf.Id);
    f['service_user'] = OGActualDataRowId;
    if (OG.DataRow.ExistRowByFilter(f))
    {
    var s = OG.TextUtils.Format(OG.MessageLoc.GetText(m.Id, 'user_record_in_class'), clf.Name);
    OGForm.SetError(s);
    return;
    }

    //...kontrola třídy "model tisku"
    clf = m.ClassDefs['model_print'];
    f = OG.DataRow.GetDataRowFilter(clf.Id);
    f['service_user'] = OGActualDataRowId;
    if (OG.DataRow.ExistRowByFilter(f))
    {
    var s = OG.TextUtils.Format(OG.MessageLoc.GetText(m.Id, 'user_record_in_class'), clf.Name);
    OGForm.SetError(s);
    return;
    }

    //...kontrola třídy "napojení Poplatku ke Službě"
    clf = m.ClassDefs['link_charge_to_service'];
    f = OG.DataRow.GetDataRowFilter(clf.Id);
    f['service_user'] = OGActualDataRowId;
    if (OG.DataRow.ExistRowByFilter(f))
    {
    var s = OG.TextUtils.Format(OG.MessageLoc.GetText(m.Id, 'user_record_in_class'), clf.Name);
    OGForm.SetError(s);
    return;
    }


    //vlastni mazani
    var clSUA = m.ClassDefs['service_user_allocation'];
    var colSU = clSUA.Columns['service_user'];

    var sql = OG.TextUtils.Format(
    'delete from DataRow{0} where {1} = {2}',
    clSUA.Id, colSU.DBColumnName, OGActualDataRowId);
    OG.Sql.RunSql(sql);


    var clAGM = m.ClassDefs['ms_ad_group_members'];
    var colSU2 = clSUA.Columns['service_user'];

    var sql = OG.TextUtils.Format(
    'delete from DataRow{0} where {1} = {2}',
    clAGM.Id, colSU2.DBColumnName, OGActualDataRowId);
    OG.Sql.RunSql(sql);


    var sql = OG.TextUtils.Format(
    'delete from DataRow{0} where Id = {1}',
    OGDataParent.Id, OGActualDataRowId);
    OG.Sql.RunSql(sql);

    OGForm.RedirectTo(OGDataParent.ListUrl);
    }

    Ve skriptu pracujeme s objektem OG.MessageLoc. V řešení máme vytvořené hlášení s kódem user_record_in_class. Česká varianta hlášení je: "Uživatel má záznam v tabulce '{0}'. Mazání bylo zrušeno." Za výraz '{0}' se dosadí název související třídy zjištěné ve skriptu.

×