Показать сообщение отдельно
Старый 07.11.2013, 20:34   #1  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
AX 2012 Must-have доработка журнала базы данных
Добрый вечер!

Наверно, надо опубликовать это в разделе "Полезное", но у меня нет прав доступа на это .

ЗАДАЧА
Сделать журнал базы данных более user-friendly. Сейчас в нем ничего не понять, если ты не системный администратор:
Нажмите на изображение для увеличения
Название: ЖБД - до.JPG
Просмотров: 481
Размер:	29.4 Кб
ID:	8587

РЕШЕНИЕ
Очевидно, вместе с системными именами полей таблицы надо выводить еще и ее метку. Для этого в форме SysDatabaseLog поработал напильником в методе buildHistory и всем советую это сделать (это просто must-have хотфикс):
X++:
void buildHistory()
{
    //Метки в ЖБД ->
    SysDictField    dictFieldName;
    str             fieldLabel;
    //Метки в ЖБД <-
    DictTable dictTable;
    DictField dictField;
    DatabaseLog       databaseLog;
    fieldId arrFieldId[];
    int idx;
    int k;
    FormListItem item;
    int i, j;
    fieldId fieldId, extFieldId;
    #Properties;
    startLengthyOperation();
    element.lockWindowUpdate(true);
    list.deleteAll();

    imageArr[0] = 0;
    fieldArr[0] = 0;

    if (sysDatabaseLog.Table)
        dictTable = new DictTable(sysDatabaseLog.Table);

    if (dictTable)
    {
        while select LogTable,LogType,LogField from databaseLog
            where databaseLog.LogTable == dictTable.id() &&
                  databaseLog.LogType  == DatabaseLogType::Update
        {
            if (databaseLog.LogField)
            {
                arrFieldId[databaseLog.LogField] = true;
            }
            else
            {
                for (i = 1; i<=dictTable.fieldCnt(); i++)
                {
                    fieldId = dictTable.fieldCnt2Id(i);
                    dictField = new DictField(dictTable.id(), fieldId);
                    for (j=1; j<= dictField.arraySize(); j++)
                    {
                        extFieldId = fieldId2Ext(fieldId, j);
                        arrFieldId[extFieldId] = true;
                    }
                }
            }
        }

        for (i = dictTable.fieldCnt(); i; i--)
        {
            fieldId = dictTable.fieldCnt2Id(i);
            dictField = new DictField(dictTable.id(), fieldId);
            // Do not display values for Del_CreatedTime and Del_ModifiedTime in the database log as they are deprecated fields and there values are not updated
            if (dictField && (dictField.name() == #PropertyDel_ModifiedTime
                || dictField.name() == #PropertyDel_CreatedTime))
            {
                continue;
            }
            for (j=dictField.arraySize(); j; j--)
            {
                extFieldId = fieldId2Ext(fieldId, j);
                k++;
                //BP Deviation Documented

                //Метки в ЖБД ->
                dictFieldName = new SysDictField(dictTable.id(), extFieldId);
                fieldLabel = dictFieldName.label();

                //TODO: выбирай разделитель на свой вкус и цвет, нужно раскомментировать только 1 строку ->
                //fieldLabel = fieldLabel + " (" +  fieldId2name(dictTable.id(), extFieldId) + ")";
                //fieldLabel = fieldLabel + " [" +  fieldId2name(dictTable.id(), extFieldId) + "]";
                fieldLabel = fieldLabel + " / " + fieldId2name(dictTable.id(), extFieldId); //вариант по-умолчанию
                //fieldLabel = fieldLabel + " | " + fieldId2name(dictTable.id(), extFieldId); 
                //fieldLabel = fieldLabel + " \\ " + fieldId2name(dictTable.id(), extFieldId);
                //fieldLabel = fieldLabel + " - " + fieldId2name(dictTable.id(), extFieldId);
                //fieldLabel = fieldLabel + " ~ " + fieldId2name(dictTable.id(), extFieldId);
                //fieldLabel = fieldLabel + " « " + fieldId2name(dictTable.id(), extFieldId);
                //fieldLabel = fieldLabel + " » " + fieldId2name(dictTable.id(), extFieldId);
                //fieldLabel = fieldLabel + " # " + fieldId2name(dictTable.id(), extFieldId);
                //выбирай разделитель на свой вкус и цвет, нужно раскомментировать 1 строку <-
                item = new FormListItem(fieldLabel);
                //item = new FormListItem(fieldId2name(dictTable.id(), extFieldId)); //Shame on you Microsoft
                //Метки в ЖБД <-
   
                if (arrFieldId[extFieldId] || arrFieldId[fieldId])
                    item.image(imagelist.image(#ImageLog));
                else
                    item.image(imagelist.image(#ImageLogBlank));

                imageArr[k] = item.image();
                fieldArr[k] = extFieldId;

                idx = list.addItem(item);
                item = list.getItem(idx);
                item.data(k);
                list.setItem(item);
            }
        }
    }

    element.lockWindowUpdate(false);
    endLengthyOperation();
}
И получил вот такой красивый журнал базы данных:
Нажмите на изображение для увеличения
Название: ЖБД - после.JPG
Просмотров: 437
Размер:	31.3 Кб
ID:	8588

Вообще не понимаю, почему журнал базы данных изначально так не разработали , это настолько очевидно и гениально просто, что само напрашивается.

Последний раз редактировалось Kabardian; 07.11.2013 в 20:36. Причина: добавил щепотку маркетинга в название темы)
За это сообщение автора поблагодарили: Player1 (2).