Показать сообщение отдельно
Старый 09.06.2007, 11:55   #1  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Кнопка "Add-ins\Дубликаты" на табличных индексах в АОТ
Вот, случайно обнаружил и спешу поделиться.

Если встать в Репозитарии на любой созданный на таблице индекс и вызвать контекстное меню, то в пункте "Add-ins" появляется интересный пункт "Дубликаты". Он позволяет, в частности, проверить индекс на потенциальную возможность включения уникальности: выводит список повторяющихся значений набора полей из состава индекса, а если не находит дублей, пишет "Без дубликатов".

Правда, у меня он нормально не заработал (АХ 3.0 SP3CU1), вот исправленный код метода SysDictIndex\showDuplicates:
X++:
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;
    ;
    if (dataPrCompany)
        fields += dictTable.fieldname(fieldnum(common,DataAreaId),DbBackend::SQL);

    for (i = 1; i <= numberOfFields; i++)
    {
        fields += dictTable.fieldName(this.field(i), DbBackend::SQL);
    }
    if (dataPrCompany)
        numberOfFields++;

    stmtStr = 'select count(*)';
    // andy, 08.06.2007 -->
    if (dataPrCompany)
        stmtStr += ', ' + conPeek(fields, 1);
    //for (i = 1; i <= numberOfFields; i++)
    for (i = 1; i < numberOfFields; i++)
    // andy, 08.06.2007 <--
    {
        stmtStr += ', ' + dictTable.fieldName(this.field(i),dbBackend::Sql,0,fieldNameGenerationMode::FieldListGroupBy);
    }
    stmtStr += ' from ' + dictTable.name(DbBackend::SQL);
    stmtStr += ' group by ';
    // andy, 08.06.2007 -->
    if (dataPrCompany)
        stmtStr += conPeek(fields, 1);
    //for (i = 1; i <= numberOfFields; i++)
    for (i = 1; i < numberOfFields; i++)
    // andy, 08.06.2007 <--
    {
        // andy, 08.06.2007 -->
        //if (i > 1)
        if (dataPrCompany || i > 1)
        // andy, 08.06.2007 <--
            stmtStr += ', ';
        stmtStr += dicttable.fieldName(this.field(i),dbBackend::Sql,0,fieldNameGenerationMode::GroupByFieldList);
    }
    stmtStr += ' having count(*) > 1';
    if (numberOfFields > 0)
    {
        stmtStr += ' order by ';
        for (i = 1; i <= numberOfFields; i++)
        {
            if (i > 1)
                stmtStr += ', ';
            stmtStr += int2str(i+1);
        }
        stmtStr += ' desc';
    }
    resultSet = stmt.executeQuery(stmtStr);

    while (resultSet.next())
    {
        resultLineStr = "@SYS283" + strFmt(': %1', resultSet.getString(1));
        for (i = 1; i <= numberOfFields; i++)
        {
            resultField = strLtrim(resultSet.getString(i+1));
            if (i == 1 && dataPrCompany)
                resultField1 = resultField;
            else
                resultLineStr += strFmt(', %1: \'%2\'', conPeek(fields, i), resultField);
        }
        if (dataPrCompany)
            setPrefix(strFmt('%1: %2', conPeek(fields, 1), resultField1));
        info(resultLineStr);
        anyDuplicates = true;
    }
    if (!anyDuplicates)
        info("@SYS68671");
}
__________________
Андрей.
За это сообщение автора поблагодарили: mazzy (5), Logger (4), Мариночка (2).