Russian Qt Forum

Qt => Базы данных => Тема начата: RVZ от Октябрь 06, 2010, 12:22



Название: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 06, 2010, 12:22
Всем доброе время суток!
Ни как не могу разобраться как заставить QComboBox editable добавлять новые значения в таблицу
(http://)

то есть есть две таблицы одна с парой (первичный ключ; значение)
А вторая основная с массой столбцов (один из которых внешний ключ к первой)

в общем все как бы работает до тех пор пока достаточно значений в первой таблице
как только надо что то добавить значение(текст) в QComboBox вводится(с клавы) но в таблицы не попадает
у кого нибудь есть пример как это реализовать
У меня только пока идея обнюхивать все изменения QComboBox и если значение новое инсертить его в таблицу SQL запросом но уж как то сильно педалями отдает такой метод может у QComboBox есть бортовой метод?


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 07, 2010, 15:07
Что то мне подсказывает что наверное с делегатом лажа какаято

QDataWidgetMapper *mapper = new QDataWidgetMapper();
mapper->setItemDelegate(new QSqlRelationalDelegate());

Сохраняет в базе только текстовые поля
На изменение даты кречит
QODBCResult::exec: unable to bind variable: "[Microsoft][SQL Server Native Client 10.0]Optional feature not implemented"


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: crossly от Октябрь 07, 2010, 15:18
тебе ODBC ругается... причем тут делегат??


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 07, 2010, 15:43
Ну наверное потому что в момент изменения поля с датой происходит эта ругань
А LineEdit нормально меняется
Думаю что это делегат данные портит от поля с датой


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 07, 2010, 18:02
И так в общем добавление новых строк из QComboBox решил пидальным способом расстраивает только то что QComboBox много в проекте
Код:

void DataE::addrow(QString Ed){
//слот всовывания  ;D
    ......
    QSqlQuery test;
    test.exec("SELECT id FROM ct.Cities WHERE City ='"+Ed+"'");
    //ct.Cities таблица с первичным ключем id и соответственно значением City(придется индексировать)
    if(!test.first()){ //проверяем есть ли что в результате
        QMessageBox::about(this, "Mod","New "+Ed);
        //если результат пустой записываем значение а ключь сам по себе прибавится
        test.exec("INSERT INTO ct.Cities(City) VALUES('"+Ed+"')");
    }
    else{QMessageBox::about(this, "Mod ","Est"+Ed);}
    .......
}

//коннектим сиглал activated(QString)) то QComboBox к слоту addrow(QString)
connect(ui->City,SIGNAL(activated(QString)),this,SLOT(addrow(QString)));
//теперь каждое выбранное значение будет селектится к базе  :'(
Можно конечно было и класс QComboBox переопределить и присутствие значеня проверять в боксе
но как я предполагаю есть готовые решения просто мне пока не известные и данный костыль тока на первое время чтобы просто работало

Ну а с датой бяда надо что то делать  ???


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 09, 2010, 23:26
В общем разобрался с датой
По мимо ComboBox на форме были еще и dateedit поля которые не хотели сохранятся оказалось что причина тип в поле таблицы SmallDateTime при попытки записи выдавал это QODBCResult::exec: unable to bind variable: "[Microsoft][SQL Server Native Client 10.0]Optional feature not implemented" хотя формат указанный в dateedit был похож
поменял тип столбца в таблице на DateTime и все заработало.
P.S. Движок MSSQL2005


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: DrHaos от Октябрь 10, 2010, 23:13
У проблема похожая на сколько я понимаю, есть QtSqlRelationalTableModel, у нее одно из полей внешний ключ (fkey) ну и соответвенно связанная таблица ID, Name. Все поля таблицы привязаны к виджетам на форме через QDataWidgetMapper, fkey привязан к ComboBox. При добавлении в связную таблицу нового значения в ComboBox оно отображается, в самой связной таблице добавляется но выбрать его в главной таблице не получается. После перезапуска приложения данный пункт выбрать уже можно.


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 10, 2010, 23:37
Цитировать
При добавлении в связную таблицу нового значения
Что то не понятно как значение добавляется?
-внешним каким то действием например от другой программы
-каким нибудь слотом SQL операции
-или самим ComboBox добавляет(так у меня не получилось хотя не понятно почему)

Цитировать
в ComboBox оно отображается, в самой связной таблице добавляется
по идеи модель держит курсор открытым и в ComboBox изменения таблиц должны отображаться в реальном времени  
а вот данные попадают в таблицу BD из модели в зависимости от выбранного способа редактирования например ручное потверждение
Код:
model->setEditStrategy(QSqlTableModel::OnManualSubmit);

Цитировать
но выбрать его в главной таблице не получается. После перезапуска приложения данный пункт выбрать уже можно.
Непонятно чем выбрать
но может имеет смысл заново проселектить модельку

И как проверял что значения попали в таблицу


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: RVZ от Октябрь 14, 2010, 11:34
Цитировать
У проблема похожая на сколько я понимаю, есть QtSqlRelationalTableModel

Мда.... Сам только что обратил внимание что запись в связанную таблицу добавляется а в основную (submitAll()) значение не сохраняется причем не сохраняется не только значение данного QComboBox но и всех остальных.
Что с этим делать пока не придумал  ???

Неужели ни кто не сталкивался с такой проблемой???????


Название: Re: QComboBox+QSqlRelationalTableModel Добавление новых значений в таблицу
Отправлено: DrHaos от Октябрь 14, 2010, 13:59
Есть кое какая информация http://pythonistaa.blogspot.com/ но это уже танцы с бубном, не очень хочется этим заниматься еще http://bugreports.qt.nokia.com/browse/QTBUG-10056 так что это вполне может быть просто багом.