Wednesday, November 20, 2013

Purger les données d'utilisations

En cas de migration, il convient parfois de devoir supprimer certaines données d'utilisations des utilisateurs afin que des ensembles variables soit correctement utiliser par le système.

Les reports par exemple nécessitent en cas de modification de version d'AX sur leur classe de contrôle, une purge des données des utilisateurs de l'ancienne version.

Voici un exemple de job permettant de faire l'opération. L'exemple créé un formulaire permettant de choisir un filtrage sur une colonne de la SysLastValue DesignName ou RecorType pour choisir les entrées à supprimer.



static void deleteUsageData(Args _args)
{
    Dialog                  dialog;
    DialogField             dlgRange1,dlgRange2;
    DialogField             dlgbox1;
    SysLastValue            sysLastValue;
    int i = 0;
    #OCCRetryCount
    ;
    dialog                      = new Dialog("Usage Data Deletion");
    dlgRange1                   = dialog.addField(extendedTypeStr(Range),"DesignName");
    dlgRange2                   = dialog.addField(extendedTypeStr(Range),"RecordType");
 // Need to declare TypeofSysLastValueRange Enum with two values : designName & RecordType
    dlgbox1                     = dialog.addField(enumStr("TypeofSysLastValueRange"),"Colonne de filtrage");

    dlgRange1.value("*Report*");
    // ou
    dlgRange2.value("!userSetupQuery");

    dlgbox1.value(TypeofSysLastValueRange::designName);
    if (dialog.run())
    {
        try
        {
            ttsbegin;
            if(dlgbox1.value() == TypeofSysLastValueRange::designName)
            {
                while select forUpdate SysLastValue
                where sysLastValue.designName like dlgRange1.value()
                {
                info(strFmt("Delete information : company : %1, designName : %2, element Name : %3, User : %4",
                                    sysLastValue.company,
                                    sysLastValue.designName,
                                    sysLastValue.elementName,
                                    sysLastValue.userId));
                SysLastValue.delete();
                i++;
                }
            }
            else
            {
                while select forUpdate SysLastValue
                where sysLastValue.recordType like dlgRange2.value()
                {
                info(strFmt("Delete information : company : %1 , DesignName : %2, Element Name : %3, User : %4",
                                    sysLastValue.company,
                                    sysLastValue.designName,
                                    sysLastValue.elementName,
                                    sysLastValue.userId));
                SysLastValue.delete();
                i++;
                }
            }


        ttsCommit;
        }
        catch (Exception::Deadlock)
        {
            retry;
        }
        catch (Exception::UpdateConflict)
        {
            if (appl.ttsLevel() == 0)
            {
                if (xSession::currentRetryCount() >= #RetryNum)
                {
                    throw Exception::UpdateConflictNotRecovered;
                }
                else
                {
                    retry;
                }
            }
            else
            {
                throw Exception::UpdateConflict;
            }
        }
        catch (Exception::Error)
        {
            ttsabort;
            throw error("@SYS93835");
        }

        info(strFmt("Total deleted lines : %1",i));
    }
}