09.06.2007, 11:55 | #1 |
Moderator
|
Кнопка "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). |
Теги |
aot, ax2009, ax3.0, ax4.0, code access security, security, баг, безопасность, индекс, инструменты, ошибка, полезное |
|
|