C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как модифицировать данные в таблице
mihentium
Отправлено: 19.10.2005, 20:19


Не зарегистрирован







Я новичок, было
Q F
401 01
401 01
401 02
401 02
403 11
403 13
...... ....
надо
Q F
401 01
401 02
401 03
401 04
403 01
403 02
..... ....
Я делал так

[CODE]
int curcod=0,nextcod=0,i=0;
try
{
QProj->SQL->Clear();
QProj->SQL->Add("Select * from NTP_Proj order by codprog,f ");
for (QProj->Open(); !QProj->Eof ; QProj->Next())
{
if (curcod=0)
{
curcod=QProj->Fields->Fields[0]->AsInteger;

}
else
{
nextcod=QProj->Fields->Fields[0]->AsInteger;
if (nextcod=curcod)
{
i=i+1;
QProj->Fields->Fields[1]->AsInteger=i;
USQLProj->Apply(ukModify);
}
else
{
curcod=nextcod;
i=1;
QProj->Fields->Fields[1]->AsInteger=i;
}
}
}
}__finally
{
if (QProj->Active) QProj->Close();
}

только почему-то не работает,
не ругайтесь на мой глупый вопрос я новичок
AVC
Отправлено: 20.10.2005, 08:23


Ветеран

Группа: Модератор
Сообщений: 1583



2mihentium. Не забывайте про тэги!

Примерно так.
CODE

TQuery *qry = QProj;
if (qry->Active) qry->Active = false;
qry->SQL->Text = "Select * From..."; // обязательно из одной таблицы
// и QProj должен быть настроен так, что бы позволял редактировать
// и не забудьте о блокировках и транзакциях

TField *fldQ, *fldF;
try
{ qry->Active = true;
flqQ = qry->FieldByName("Q");
flqF = qry->FieldByName("F");
}
catch(Exception &xcp) { что то делаем с ошибкой; }

int oldQ = 0;
int curF = 0;
for (qry->First(); !qry->Eof; qry->Next())
{ if (fldQ->AsInteger != oldQ)
{ oldQ = fldQ->AsInteger; curF = 0;}
curF++;
qry->Edit(); fldF->AsInteger = curF; qry->Post();
}

qry->Active = false;

Код не проверялся (даже на синтаксис).

Еще посмотрите на тему "Всем, кто задает вопросы по БД". Для многих SQL серверов эту процедуру можно поручить самому серверу, что гораздо более эффективно.

Отредактировано AVC — 20/10/2005, 07:24
mihentium
Отправлено: 20.10.2005, 21:07


Не зарегистрирован







Всё конечно хорошо, но есть одна проблема приведенный код выдаёт ошибку
Cannot modify a read-only dataset ,
при этом если поставить свойство CashedUpdates в true то ошибки нет, но при этом не работает метод ApplyUpdates.
(компонент UpdateSQL я использую)

Plz help sad.gif
RVN
Отправлено: 21.10.2005, 07:18


Ученик-кочегар

Группа: Участник
Сообщений: 17



Свойство запроса поставь RequestLive=true
AVC
Отправлено: 21.10.2005, 07:57


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (mihentium @ 20/10/2005, 20:07)
Всё конечно хорошо, но есть одна проблема приведенный код выдаёт ошибку
Cannot modify a read-only dataset

Это не код выдает ошибку а настройка ваших компонентов выдает ошибку smile.gif . Я же специально подчеркнул в примере
// и QProj должен быть настроен так, что бы позволял редактировать
см. RVN
mihentium
Отправлено: 21.10.2005, 17:50


Не зарегистрирован







Всем спасибо smile.gif. Проблема была в Group by в Select, когда убрал всё заработало, но у меня возник следующий вопрос что делать если данные по столбцу Q не упорядочены по возрастанию? Если менять код просто скажите и не парьтесь.
AVC
Отправлено: 24.10.2005, 08:43


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (mihentium @ 21/10/2005, 16:50)
у меня возник следующий вопрос что делать если данные по столбцу Q не упорядочены по возрастанию?

Упорядочить. На строне сервера (это просто) или на клиенте (это сложнее). Этот алгоритм предпологает упорядоченность по полю Q.
Замена OldQ на массив OldQ[] позволит работать с неупорядоченным массивом (это практически эквивалентно упорядочиванию на кленте)

Вернуться в Работа с базами данных в C++Builder