crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QSqlQueryModel, UPDATE
JohnZ
  опции профиля:
сообщение 15.3.2017, 20:18
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 1 раз(а)




Репутация:   0  


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

Пытаюсь реализовать динамическую 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 ? Буду благодарен за помощь !
.

Сообщение отредактировал JohnZ - 15.3.2017, 20:37
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2017, 22:02