Показать сообщение отдельно
Старый 18.07.2007, 13:19   #2  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Продолжение темы.
Выяснилось, что с моими исправлениями даная фича не работает для общих таблиц (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");
}
__________________
Андрей.