![]() |
#2 |
Moderator
|
Продолжение темы.
Выяснилось, что с моими исправлениями даная фича не работает для общих таблиц (SaveDataPerCompany = No), хотя без моих изменений все работало в этом случае. После непродолжительных размышлений над оригинальным кодом я заметил некую странность: мы сначала наполняем контейнер названиями полей в SQL-интерпретации через X++: dictTable.fieldName(this.field(i), DbBackend::SQL) X++: dictTable.fieldName(this.field(i),dbBackend::Sql,0,fieldNameGenerationMode::FieldListGroupBy) 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(*)'; for (i = 1; i <= numberOfFields; i++) { // andy, 18.07.2007 --> //stmtStr += ', ' + dicttable.fieldName(this.field(i),dbBackend::Sql,0,fieldNameGenerationMode::FieldListGroupBy); stmtStr += ', ' + conPeek(fields, i); // andy, 18.07.2007 <-- } stmtStr += ' from ' + dictTable.name(DbBackend::SQL); stmtStr += ' group by '; for (i = 1; i <= numberOfFields; i++) { if (i > 1) stmtStr += ', '; // andy, 18.07.2007 --> //stmtStr += dicttable.fieldName(this.field(i),dbBackend::Sql,0,fieldNameGenerationMode::GroupByFieldList); stmtStr += conPeek(fields, i); // andy, 18.07.2007 <-- } 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"); }
__________________
Андрей. |
|
Теги |
aot, ax2009, ax3.0, ax4.0, code access security, security, баг, безопасность, индекс, инструменты, ошибка, полезное |
|
|