AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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
Просмотров: 480
Размер:	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
Просмотров: 430
Размер:	31.3 Кб
ID:	8588

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

Последний раз редактировалось Kabardian; 07.11.2013 в 20:36. Причина: добавил щепотку маркетинга в название темы)
За это сообщение автора поблагодарили: Player1 (2).
Старый 07.11.2013, 20:55   #2  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
а ничего, что журнал базы данных как раз для администратора и сделан?
юзер не должен в него лазить
Старый 07.11.2013, 21:02   #3  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от lvan Посмотреть сообщение
а ничего, что журнал базы данных как раз для администратора и сделан?
юзер не должен в него лазить
Да ладно?) А когда юзеры хотят узнать кто изменил значение такого-то поля, то каждый раз к админу бегать? Полезный инструмент и для юзеров я считаю, и по опыту могу сказать очень даже любимый юзерами :-)

Я еще делал так, чтобы рядом с кодом пользователя выводилось ФИО, так юзеры совсем полюбили этот инструмент ;-)

Последний раз редактировалось Kabardian; 07.11.2013 в 21:11.
Старый 07.11.2013, 21:09   #4  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от lvan Посмотреть сообщение
а ничего, что журнал базы данных как раз для администратора и сделан?
юзер не должен в него лазить
На многих проектах, настроив доступ к журналу базы данных, удается отказаться от кучи модификаций по отслеживанию истории всего чего угодно. Просто пользователь смотрит журнал не из общего запроса, а через паспорт записи по конкретной сущности.

P.S. для сравнения трудоемкости - обратите внимание на "историю" в модуле CRM.
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: Kabardian (1).
Старый 08.11.2013, 07:30   #5  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Хмм ...

Мы подобное еще с тройки пользуем
Миниатюры
Нажмите на изображение для увеличения
Название: sysdatabaselog.jpg
Просмотров: 492
Размер:	151.7 Кб
ID:	8589   Нажмите на изображение для увеличения
Название: sysdatabaselog2.jpg
Просмотров: 581
Размер:	167.6 Кб
ID:	8590  

__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 08.11.2013 в 07:34.
За это сообщение автора поблагодарили: Kabardian (1).
Старый 08.11.2013, 10:32   #6  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Мы для лучшей читабельности делали метку поля отдельным столбцом. Ну и добавляли кнопку Стек вызовов. Это в качестве идеи расширения функциональности.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Kabardian (2).
Старый 08.11.2013, 11:11   #7  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
В 2012 актуальнее что-нибудь придумать с отслеживанием по наследуемым таблицам (или как они там называются). Попробуйте настроить отслеживание договоров например:
1. В настройке увидите целую кучку таблиц со словом "Договор".
2. Из паспорта записи увидите только основную таблицу "Договор".
3. Если смотреть через общую форму - то будут отдельные строки для "Договора" и "Договора покупки", например. Смотреть так изменения - еще то удовольствие.

После этого упражнения можно перейти на какой-нибудь еще более интересный справочник типа Клиентов...
__________________
Ivanhoe as is..
Старый 08.11.2013, 12:54   #8  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
В 2012 актуальнее что-нибудь придумать с отслеживанием по наследуемым таблицам (или как они там называются). Попробуйте настроить отслеживание договоров например:
1. В настройке увидите целую кучку таблиц со словом "Договор".
2. Из паспорта записи увидите только основную таблицу "Договор".
3. Если смотреть через общую форму - то будут отдельные строки для "Договора" и "Договора покупки", например. Смотреть так изменения - еще то удовольствие.

После этого упражнения можно перейти на какой-нибудь еще более интересный справочник типа Клиентов...
Я думаю для конкретных форм при острой необходимости можно в том же метод buildHistory написать кастомизацию, которая будет подменять стандартные имена более читабельными. Но это конечно уже разовая ювелирная работа.
Теги
sysdatabaselog, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Sustained Engineering: Announcing Compatibility Certification of App-V 5.0 and TFS 2012 with Dynamics AX 2012 CU5 and Dynamics AX 2012 R2 CU1 Blog bot DAX Blogs 0 01.06.2013 04:38
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View Blog bot DAX Blogs 0 12.12.2012 13:11
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
sumitsaxfactor: Create Your First Custom Service [AX 2012] Blog bot DAX Blogs 0 19.05.2012 19:14
ukax: AX 2012 Training content available on CustomerSource Blog bot DAX Blogs 0 09.09.2011 23:12
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:20.