18 апреля 2006

QSqlRelationalTableModel::setFilter(const QString & filter)

Есть в этом методе одна недокументированая особенность связаная с внешними ключами.
  1. Если ни одно отношение (QSqlRelation) в модель не добавлено, то её поведение ни чем не отличается от модели QSqlTableModel.
  2. Если добавлено хотя бы одно отношение, то для колонок без отношения строка фильтра должна выглядеть как "таблица.колонка = значение" (оператор сравнения естественно заменяем тем чем нам необходимо).
  3. Если добавлено хотя бы одно отношение, то для колонок с отношением строка фильтра должна выглядеть как "колонка = значение", но вместо имени колонки в таблице указанной методом QSqlRelationalTableModel::setTable() необходимо подставлять имя колонки указанной при создании отношения QSqlRelation::displayColumn().
Вот пример работающего кода:


QHash<QString, QString> filters; //ключ - имя колонки, значение - значение фильтра
QStringList filter;
QString tableName = table->tableName();

foreach(QString key, filters.keys())
if(_model->relation(_model->record().indexOf(key)).isValid()) {
filter << key + "='" + filters.value(key) + "'";
} else {
filter << tableName + "." + key + "='" + filters.value(key) + "'";
}

_model->setFilter(filter.join(" AND "));
_model->select();

Комментарии: 2:

Anonymous Анонимный сказал(а)...

Форматирование тут неудобное

5:14 AM  
Blogger LestorN сказал(а)...

Ага, я буду пробывать DepestSender (FireFox plugin), там поудобнее, и с угловыми скобками проблем меньше.

8:02 AM  

Отправить комментарий

Подпишитесь на каналы Комментарии к сообщению [Atom]

<< Главная страница