UpdateSQL
В гриде работает все нормально: удаляет ,вставляет,модифицирует(изменяет) записи.
Но при выходе из формы все остается по- прежнему , словно и ничего не изменяла.
При явном вызове Apply(ukModify);Apply(ukInsert);Apply(ukDelete);
выдает 'Update failed'
:x
Цитата:
Originally posted by laifik
Есть база, из котрой делаю запрос,подключаю UpdateSQL к запросу.
В гриде работает все нормально: удаляет ,вставляет,модифицирует(изменяет) записи.
Но при выходе из формы все остается по- прежнему , словно и ничего не изменяла.
При явном вызове Apply(ukModify);Apply(ukInsert);Apply(ukDelete);
выдает 'Update failed'
:x
Есть база, из котрой делаю запрос,подключаю UpdateSQL к запросу.
В гриде работает все нормально: удаляет ,вставляет,модифицирует(изменяет) записи.
Но при выходе из формы все остается по- прежнему , словно и ничего не изменяла.
При явном вызове Apply(ukModify);Apply(ukInsert);Apply(ukDelete);
выдает 'Update failed'
:x
Дык, может надо транзакцию завершить?
I)А разве такой код ее не завершает?
Query1->ApplyUpdates();
Query1->CommitUpdates();
Query1->Close();
Query1->Open();
II)Эта проблема мне встретилась на форуме. Там вскользь прозвучало, что UpdateSQL будет работать, только если все поля таблицы - not null. Проверила, все так. Значит, в программе я все сделала правильно.
Вопросы теперь такие:
1) Как программно написать код, который бы запрещал оставлять пустые поля в таблице. Знаю, что это можно запретить в самой таблице БД. Но хотелось бы обойтись без этого.
2) А если мне не требуется заполнять все поля, какие-то могли бы остаться и пустые. Что делать в этом случае? :o
Да, а действительно, как быть в этом случае. В моей таблице около 40 полей. Не все они должны быть заполнены. Часто просто остаются пустыми. А если сделать not null, то что должно находится в полях при отсутствии значений?
Выполняет исправление
Query1->CommitUpdates();
Как раз и завершает транзакцию.
Query1->Close();
Закрывает связь с сервевером.
Query1->Open();
Открывает связь с сервевером.
Прости, не общался с Builder только с Visual C++ и API mysql(mysqlclient library).
И что, у тебя даже Table1->Post() есть?
Вот в этом событии и можно организовать проверку на пустату
Ну вот например у всех полей ставишь один обработчик и проверяешь
Вот мой пример
[COLOR=darkblue]
void __fastcall TForm40::STR_DOCPRICE_NEWValidate(TField *Sender)
{
if(prov)
{
if(STR_DOCSTATUS->AsInteger != 3 && STR_DOCSTATUS->AsInteger != 10)
{
String mess = "";
double max, min, nac;
max = STR_DOCPRICE_OFFICE->AsFloat*(1+procent);
min = STR_DOCPRICE_OFFICE->AsFloat*(1-procent);
nac = (max/STR_DOCPRICE_ENTER->AsFloat - 1)*100;
if(STR_DOCPRICE_NEW->AsFloat > max)
{
mess = "Öåíà íå äîëæíà ïðåâûøàòü "+FloatToStrF(max,ffFixed,10,3)+".\n Íàöåíêà íå äîëæíà ïðåâûøàòü "+FloatToStrF(nac,ffFixed,10,3);
Application->MessageBox(mess.c_str(), "Îøèáêà1",MB_OK|MB_ICONHAND);
Abort();
}
if(STR_DOCPRICE_NEW->AsFloat < min)
{
mess = "Öåíà íå äîëæíà áûòü ìåíüøå "+FloatToStrF(min,ffFixed,10,3)+".\n Íàöåíêà íå äîëæíà áûòü ìåíüøå "+FloatToStrF(nac,ffFixed,10,3);
Application->MessageBox(mess.c_str(), "Îøèáêà1",MB_OK|MB_ICONHAND);
Abort();
}
}
}
}
[/COLOR]
проверка происходит перед вставкой данных, если ты не хочешь чтобы вставлялась возбуждаешь исключение фунцией Abort().
А еще лучше сделай форму ввода новой строки, то есть чтобы чтобы новая строка добавлялась через форму, а не в гриде. Ну а в гриде соответственно запрети Insert
А насчет проверки я уже догадалась. Правда она у меня осуществляется при вставке записи. И если значения отсутствуют, то в поля вставляется "". И все потом работает. Проблемма в том, что есть поля форматы даты и блоб-поля. В них то что вставлять?
Все это я затеяла потому, что полностью отказалась в этой программе от компонента TTable, поскольку БД на удаленном сервере и в ней много информации. БД пользуются много юзеров. Когда они запускают программу, сервер начинает тормозить. Поэтому Table1->Post() я в данной программе уже не использую.;)