Вот, случайно обнаружил и спешу поделиться.
Если встать в Репозитарии на любой созданный на таблице индекс и вызвать контекстное меню, то в пункте "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");
}