LINUX.ORG.RU

сформировать условие для setFilter из QSqlTableModel

 ,


0

1

Нужно отфильтровать данные из таблицы по имени, хранящемуся в связанном справочнике. Т.е. в таблице храниться идентификатор dict_id, который разыменовывается в справочнике.

Ниже простой пример. Конечно же dict_id=1 работает и отфильтровывает строку с first element. А вот как выбрать по 'first element' не понятно.

CREATE TABLE TestDict (    
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE TestTable (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "dict_id" integer NOT NULL,
    "value" real NOT NULL,
    FOREIGN KEY("dict_id") REFERENCES TestDict
);

INSERT INTO TestDict ("name") VALUES ("first element");
INSERT INTO TestDict ("name") VALUES ("second element");

INSERT INTO TestTable ("dict_id","value") VALUES ("1","22");
INSERT INTO TestTable ("dict_id","value") VALUES ("2","32");
#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName("test.db");
	if(!db.open()) {
            qDebug() << "open error";
	    return 1;
	}
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
	//model.setFilter(tr("TestTable.dict_id=TestDict.id AND TestDict.name='first element'"));
	model.setFilter("dict_id=1");
	QTableView view;
	view.setModel(&model);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.show();
	model.select();
	return app.exec();
}

В SQL был бы такой запрос:

sqlite>  select TestTable.id, TestTable.dict_id, TestTable.value from TestTable,TestDict WHERE TestTable.dict_id=TestDict.id AND TestDict.name='first element';
1|1|22.0
или может так правильнее
sqlite> select TestTable.id, TestDict.name, TestTable.value from TestTable,TestDict WHERE TestTable.dict_id=TestDict.id AND TestDict.name='first element';
1|first element|22.0

p.s. Пытаюсь «лесом» обойти вот эту проблему https://www.linux.org.ru/forum/development/11689249?cid=11689890 (комментарий)

решение нашел такое

model.setFilter("name='first element'");
developer-cpp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.