Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ QSqlQueryModel

Автор: JohnZ 15.3.2017, 20:18

Всем Здравия !

Пытаюсь реализовать динамическую QSqlQueryModel-Ьку :-)
Ес-сно нужны 3 доп. ф-ции

    bool insertRecord (QSqlRecord & Record);
    bool removeRecord (QSqlRecord & Record);
    bool updateRecord (QSqlRecord & RecOld, QSqlRecord & RecNew);


Первые 2 заработали, а вот с updateRecord траблема Вот их реализации ...
Раскрывающийся текст

bool fpQueryModel::insertRecord (QSqlRecord & Record)
{
QString s = QString("insert into %0 values( ").arg(tableName);
s += drv->formatValue(Record.field(0));
int fCnt = Record.count();
for (int i = 1;i < fCnt;i++)
{
s += ",";
s += drv->formatValue(Record.field(i));
}
s += " );";
QSqlQuery q;
return q.exec(s);
}

bool fpQueryModel::updateRecord(QSqlRecord & RecOld, QSqlRecord & RecNew)
{
QSqlIndex pidx = fpDb->db.primaryIndex(tableName);
QString s = QString("update %0 set ").arg(tableName);

int fCnt = RecNew.count();
for (int i = 0;i < fCnt;i++)
{
if (!pidx.contains(RecNew.fieldName(i)))
{
s += QString("%0 = %1").arg(RecNew.field(i).name())
.arg(drv->formatValue(RecNew.field(i)));
if ((i+1) < fCnt)
s += ", ";
}
}

fCnt = pidx.count();
if (!fCnt)
return false;

s += QString(" where %0 = %1").arg(pidx.fieldName(0))
.arg(drv->formatValue(RecOld.field(pidx.fieldName(0))));

for (int i = 1;i < fCnt;i++)
{
s += QString(" and %0 = %1").arg(pidx.fieldName(i))
.arg(drv->formatValue(RecOld.field(pidx.fieldName(i))));
}
s += " ;";

// QSqlQuery q;
// return q.exec(s);

return true;
}

bool fpQueryModel::removeRecord (QSqlRecord & Record)
{
QSqlIndex pidx = fpDb->db.primaryIndex(tableName);
QString s = QString("delete from %0 where ").arg(tableName);

int fCnt = pidx.count();
if (!fCnt)
return false;

s += QString(" %0 = %1").arg(pidx.fieldName(0))
.arg(drv->formatValue(Record.field(pidx.fieldName(0))));

for (int i = 1;i < fCnt;i++)
{
s += QString(" and %0 = %1").arg(pidx.fieldName(i))
.arg(drv->formatValue(Record.field(pidx.fieldName(i))));
}
s += " ;";

QSqlQuery q;
return q.exec(s);
}

В ф-цию bool fpQueryModel::updateRecord(QSqlRecord & RecOld, QSqlRecord & RecNew)
передаю старую и новую запись, иначе пока никак.
... и со-старта наступил на грабли, - при таблице из 3-х полей, все поля ключевые, секция
    for (int i = 0;i < fCnt;i++)
    {
        if (!pidx.contains(RecNew.fieldName(i)))
        {
            s += QString("%0 = %1").arg(RecNew.field(i).name())
                                   .arg(drv->formatValue(RecNew.field(i)));
            if ((i+1) < fCnt)
                s += ", ";
        }
    }

ес-сно генерит пустышку.
На прилагаемом снимке видны структуры таблиц, дабы долго не описывать задачу.
Проблема в обновлении полей таблицы "Шапка Журнала Расчёта ЗП", в которой ВСЕ поля
ключевые, вернее принадлежат составному ключу.
Я понимаю что в реальной задаче это низ-зя делать, но ... мне надо реализовать такое изменение.

Может возможна реализация UPDATE в ключе MVC ? Буду благодарен за помощь !
.

 

Автор: Алексей1153 16.3.2017, 8:07

JohnZ, расскажи словами (без кода на с++), что ты пытаешься сделать и где возникла проблема. Покажи пример запроса при вставке, при удалении, при апдейте. Сдаётся мне, что ты не туда копаешь

Автор: JohnZ 16.3.2017, 21:05

Цитата(Алексей1153 @ 16.3.2017, 8:07) *
JohnZ, расскажи словами (без кода на с++), что ты пытаешься сделать и где возникла проблема. Покажи пример запроса при вставке, при удалении, при апдейте. Сдаётся мне, что ты не туда копаешь

Дык запросы стандартные mysql-я для обозначенных операций.
Я пытаюсь "дотянуть" QSqlQueryModel-Ьку до QSqlTableModel в смысле Ins Del Update для последующей
комфортной работы с ней в динамической форме. Ес-сно модель должна уметь самостоятельно
выполнить обозначенные операции (Ins Del Upd) для заданной таблицы.
Для QSqlTableModel эта проблема у меня решилась с пом-ю
QDataWidgetMapper-а & model->submitAll(); (& Lanz :) - Thx ! )
Всё прекрасно добавляется и редактируется, но вот для разрабатываемого проекта понадобилось
заюзать подмену/добавление полей в запросе к таблице(-ам) для View-а. Поэтому пришлось обратиться
к QSqlQueryModel. QDataWidgetMapper с ней не работает и тем-более model->submitAll() у неё нет :-(
Там обновление решилось довольно просто, ес-сно с пом-ю QDataWidgetMapper ...
Раскрывающийся текст

if ( formChild->exec() == QDialog::Accepted )
{
model->submitAll();
viewChild->setCurrentIndex(curIndex);
}

Хочется что-то подобное и для QSqlQueryModel.
В сторону QSqlRelationalTableModel я смотрел, но на данном этапе посчитал её беЗполезной, т к она
подменяет поля в запросе вместо их добавления, и таблица в модели становится практически
не редактируемой для QDataWidgetMapper-а. Динамическое мапирование я приводил в соседней теме,
там нет ничего сложного. В общем как-то так ...

Автор: Алексей1153 17.3.2017, 7:50

JohnZ, стандартные запросы - это обычные строки текста. А у тебя какие-то модели, мапперы. Моя не понимать )) Возможно, потому что я не пользовался этими классами, мне QAbstractTableModel обычно за глаза хватало

Универсальную модель всё равно не сделаешь, с каждой таблицей будут свои нюансы

Автор: JohnZ 17.3.2017, 12:23

Цитата(Алексей1153 @ 17.3.2017, 7:50) *
JohnZ, стандартные запросы - это обычные строки текста. А у тебя какие-то модели, мапперы. Моя не понимать )) Возможно, потому что я не пользовался этими классами, мне QAbstractTableModel обычно за глаза хватало

Универсальную модель всё равно не сделаешь, с каждой таблицей будут свои нюансы

Ну почему-же ? 1C-ики и Ananas-овцы ( ananas.su ) сделали ! Так почему-бы и нам ... ?
Только у меня "своя" концепция, которая более схожа с MS Access-ом чем с 1С-ом и др.
В проекте только и будут универсальные SQL-модели и формы, всё остальное - в конфигурации :)
Как я уже говорилЪ, универсальная TableModel и её форма уже реализована и работает, осталось дело за реляционной ...
Но я так понимаю, что универсальную реляционную модель в ключе MVC реализовать сложновато, поэтому и обратился
за помощью ...
Да, и к стати, само понятие "универсальная" модель в данном случае подразумевается работа с БД описание которой
фактически "под рукой" в XML-ной модели ... Правда при реализации TableModel-и этого не понадобилось :)

Автор: Алексей1153 17.3.2017, 14:49

JohnZ, ладно, будем считать, что я не смог понять проблему (либо ты не сумел её мне объяснить) :D

Автор: JohnZ 17.3.2017, 15:30

Проблема заключается в динамической реализации bool updateRecord (QSqlRecord & RecOld, QSqlRecord & RecNew)
для QSqlQueryModel либо она-же но по правилам MVC !

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)