Продолжение темы.
Выяснилось, что с моими исправлениями даная фича не работает для общих таблиц (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");
}