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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.02.2019, 18:15   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Про order by - это да, не сразу заметил. Но там тоже простая модификация. Хотя вызывает недоумение desc только для последнего поля

Map - эстетичнее и удобнее? Ну, вопрос личных предпочтений. С моей точки зрения наоборот. "Утяжеляет" весь код и существенно усложняет его понимание.

Собственно, проще показать, что достаточно сделать

X++:
// \Classes\SysDictIndex\showDuplicates
void showDuplicates()
{
    tableId         tableId         = this.tableid();
    DictTable       dictTable       = new DictTable(tableId);
    boolean         dataPrCompany   = dictTable.dataPrCompany();
    container       fields;
    Counter         numberOfFields  = this.numberOfFields();
    Counter         i;
    str             stmtStr;
    str             resultLineStr;
    str             resultField;
    str             resultField1;
    UserConnection  con             = new UserConnection();
    Statement       stmt            = con.createStatement();
    ResultSet       resultSet;
    boolean         anyDuplicates   = false;
    SqlStatementExecutePermission ssep;
    DictField dField;
    Counter enabledFieldCounter;
    int enabledFields[];
    str tableNameWithSchema;
    ;
    if (dataPrCompany)
        fields += dictTable.fieldName(fieldnum(Common,DataAreaId),DbBackend::Sql);

    enabledFieldCounter = 0;
    for (i = 1; i <= numberOfFields; i++)
    {
        dField = new DictField(tableId,this.field(i));
        if( dField.isSql() == false )
            continue;
        ++enabledFieldCounter;
        enabledFields[enabledFieldCounter] = i;
    }
    for (i = 1; i <= enabledFieldCounter; i++)
    {
        fields += dictTable.fieldName(this.field(enabledFields[i]), DbBackend::Sql);
    }

    stmtStr = 'select count(*)';
    //+ vmaksimo 15.02.2019
    if (dataPrCompany)
    {
        stmtStr += ', ' + dictTable.fieldName(fieldnum(Common,DataAreaId), DbBackend::Sql, 0, FieldNameGenerationMode::FieldListGroupBy);
    }
    //- vmaksimo 15.02.2019
    
    for (i = 1; i <= enabledFieldCounter; i++)
    {
        stmtStr += ', ' + dictTable.fieldName(this.field(enabledFields[i]), DbBackend::Sql, 0, FieldNameGenerationMode::FieldListGroupBy);
    }
    tableNameWithSchema = xSession::getDbSchema();
    if (tableNameWithSchema != '')
        tableNameWithSchema += '.'+ dictTable.name(DbBackend::Sql);
    else
        tableNameWithSchema = dictTable.name(DbBackend::Sql);


    stmtStr += ' from ' + tableNameWithSchema;
    stmtStr += ' group by ';
    //+ vmaksimo 15.02.2019
    if (dataPrCompany)
    {
        stmtStr += dictTable.fieldName(fieldnum(Common,DataAreaId), DbBackend::Sql, 0, FieldNameGenerationMode::GroupByFieldList); 
        if (enabledFieldCounter)
            stmtStr +=  ', ';
    }
    //- vmaksimo 15.02.2019
    for (i = 1; i <= enabledFieldCounter; i++)
    {
        if (i > 1)
            stmtStr += ', ';
        stmtStr += dictTable.fieldName(this.field(enabledFields[i]), DbBackend::Sql, 0, FieldNameGenerationMode::GroupByFieldList);
    }
    stmtStr += ' having count(*) > 1';
    if (numberOfFields > 0)
    {
        stmtStr += ' order by ';
        
        //+ vmaksimo 15.02.2019
        stmtStr += int2str(1) + ' desc, ';
        //- vmaksimo 15.02.2019
        
        for (i = 1; i <= enabledFieldCounter; i++)
        {
            if (i > 1)
                stmtStr += ', ';
            //+ vmaksimo 15.02.2019
            /*
            stmtStr += int2str(enabledFields[i]+1);
            */
            stmtStr += int2str(i+1) + ' desc';
            //- vmaksimo 15.02.2019
        }
        
        //+ vmaksimo 15.02.2019
        if (dataPrCompany)
        {
            if (i > 1)
                stmtStr += ', ';
            stmtStr += int2str(i+1) + ' desc';
        }
        /*
        stmtStr += ' desc';
        */
        //- vmaksimo 15.02.2019
    }

    // dangerous API mitigation
    ssep =  new SqlStatementExecutePermission(stmtStr);
    ssep.assert();
    // BP Deviation Documented
    resultSet = stmt.executeQuery(stmtStr);

    //+ vmaksimo 15.02.2019
    numberOfFields = enabledFieldCounter;
    if (dataPrCompany)
        numberOfFields++;
    //- vmaksimo 15.02.2019
    
    while (resultSet.next())
    {
        resultLineStr = "@SYS283" + strfmt(': %1', resultSet.getString(1));
        for (i = 1; i <= numberOfFields; i++)
        {
            //+ vmaksimo 15.02.2019
            /*
            resultField = strltrim(resultSet.getString(enabledFields[i]+1));
            */
            resultField = strltrim(resultSet.getString(i+1));
            //- vmaksimo 15.02.2019
            if (i == 1 && dataPrCompany)
                resultField1 = resultField;
            else
                //+ vmaksimo 15.02.2019
                /*
                resultLineStr += strfmt(', %1: \'%2\'', conpeek(fields, enabledFields[i]), resultField);
                */
                resultLineStr += strfmt(', %1: \'%2\'', conpeek(fields, i), resultField);
                //- vmaksimo 15.02.2019
        }
        if (dataPrCompany)
            setprefix(strfmt('%1: %2', conpeek(fields, 1), resultField1));
        info(resultLineStr);
        anyDuplicates = true;
    }
    if (!anyDuplicates)
        info("@SYS68671");

}
Очень тяжело читать код, большая часть которого - это комментарии. В таких случаях проще вообще весь исходный код закомментировать и оставить его в конце метода. А свой код написать "чистым". Без комментариев
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 15.02.2019 в 18:57. Причина: Поправил код вывода результата
За это сообщение автора поблагодарили: Link (1).
Теги
duplicates, index, sysdictindex, баг, индекс, ошибка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Баг или фича - неожиданное поведение метода xRecord.data() Pandasama DAX: Программирование 3 21.03.2016 13:01
AX 2012 Пересчет единиц измерения - баг или фича? Kabardian DAX: Функционал 3 25.02.2014 11:00
Баг или не баг? Murlin DAX: Программирование 53 14.09.2013 18:52
Баг при печати налогового кода petr DAX: Программирование 0 25.03.2009 16:33
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26

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

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

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