Как найти запись в базе и переименовать, если она удовлетворяет условию?
Вопрос: как сделать чтоб при включении моего DBCheckBox1, тот который бал включен раньше, выключился, т.е. таблица может содержать только одну запись true, но в пределах ключевого поля, а все остальные false! Это мне нужно для выбора главной строки в таблице, а главной должна быть одна. Я хотел использовать RadioButton, но его
использование, на мой взгляд, в данной ситуации, не возможно. Использование именно этих компонентов и логического поля для меня не принципиально, мне главное сделать так чтоб в дочерней таблице я создавал записи, а в родительской отображалась выбранная главная запись из дочерней таблице, здесь даже не нужен цикл, т.к. запись true может быть только одна(не во всей табл., а в пределах ключевого поля). И всё это должно работать при добавлении или изменении записи(т.е. Table1.Append , Table1.Edit). Помогите пожалуйста! Заранее благодарен!
2) Прийти после этого к использованию TQuery
3) Использовать следующий запрос:
Код:
UPDATE table_name SET my_field = false WHERE my_field = true
4) Выполнять его перед изменениями в TDBCheckBox.
1) SQL я учил целый семестр, не скажу что успешно, но препод напрягал и в результате кое-что знаю. Мы с ним мучались в Oracle, потому, как в Делфи он работает, я мало что знаю.
2) С TQuery я не очень, но думаю с запросом написанным тобой я разберусь. Вообще я пользовался всегда Table.Lookup и у меня постоянно возникали косяки с автаматическим сохранением записи после поиска, приходилось в очередной раз изобретать колесо, я и тут хотел этим лукапом воспользоваться.
Кароче сейчас начну осваивать TQuery! Еще раз спасибо!
Ошибку прилагаю.
а погуглить?
Спасибо большое, в форуме действительно был такой вопрос, такая же точно ошибка, я понял где собака зарыта, вот только пока не знаю что сделать, но щас буду книжку читать, мож чё и вычитаю!
Query1.SQL.Text:='UPDATE C_H SET Glava=True WHERE Glava=False';
Query1.ExecSQL;
Всё заработало, но не долго, точнее до следующего запуска программы и при запуске стала выпрыгивать ошибка: типа Table1 не в режиме вставки или редактирования(первая ошибка.jpg, прикрепляю) и после нажатия ОК (на ошибке) открывалось окно проекта (project1, как и обычно в подобных случаях), и выделялась строка: Application.CreateForm(TForm9, Form9);
как я понял Table1, являющийся причиной ошибки, находиться на этой форме(ну это я так подумал)) и я начал всячески издеваться над ним, в конечном итоге удалил его совсем, но от ошибки это не спасло. Проблему удалось решить(но не на долго), когда я создав DataModule, переместил в него Query и DataSource, исправил немного код:
DataModule8.Query1.SQL.Text:='UPDATE C_H SET Glava=True WHERE Glava=False';
DataModule8.Query1.ExecSQL;
И всё якобы заработало, работало работало и опять ошибка, но на сей раз другая: что-то там ……..memory ……(вторая ошибка.jpg, тоже прикрепляю). Кстати похожие ошибки у меня часто бывают, но они исчезают после сохранения проекта и перезагрузки Делфи, но в этот раз это не сработало! Что сделать, чтоб ошибки не стало и может есть какой-нибудь хороший справочник по ошибкам, чтоб даже я разобрался? Заранее благодарствую!
Перед изменением запроса, датасет нужно закрыть, очистить текст запроса, а потом написать новый, и только после этого открывать или исполнять запрос (Open или ExeqSQL).
Цитата: mfender
Странно всё как-то...
Перед изменением запроса, датасет нужно закрыть, очистить текст запроса, а потом написать новый, и только после этого открывать или исполнять запрос (Open или ExeqSQL).
Перед изменением запроса, датасет нужно закрыть, очистить текст запроса, а потом написать новый, и только после этого открывать или исполнять запрос (Open или ExeqSQL).
И в правду, перед этим:
Query1.SQL.Text:='UPDATE C_H SET Glava=True WHERE Glava=False';
Query1.ExecSQL;
Нужно было вставить это:
Query1.Close;
Query1.SQL.Clear;
И всё стало на свои места.
Огромное спасибо!
Цитата: mfender
Странно всё как-то...
Перед изменением запроса, датасет нужно закрыть, очистить текст запроса, а потом написать новый, и только после этого открывать или исполнять запрос (Open или ExeqSQL).
Перед изменением запроса, датасет нужно закрыть, очистить текст запроса, а потом написать новый, и только после этого открывать или исполнять запрос (Open или ExeqSQL).
Это необходимо только в том случае, если используется такая конструкция:
Код:
..
Query1.SQL.Add("UPDATE C_H ");
Query1.SQL.Add("SET Glava=True ");
Query1.SQL.Add("WHERE Glava=False");
..
Query1.SQL.Add("UPDATE C_H ");
Query1.SQL.Add("SET Glava=True ");
Query1.SQL.Add("WHERE Glava=False");
..
При такой конструкции:
Код:
..
Query1.SQL.Text:="UPDATE C_H SET Glava=True WHERE Glava=False";
..
Query1.SQL.Text:="UPDATE C_H SET Glava=True WHERE Glava=False";
..
по моему понятно почему 'очистка' не обязательна. ;)
Query1.SQL.Add("UPDATE C_H ");
Query1.SQL.Add("SET Glava=True ");
Query1.SQL.Add("WHERE Glava=False");
..
QUOTE]
Ну всёж когда я так написал, все заработало без проблем.
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text:='UPDATE C_H SET Glava=True WHERE Glava=False';
Query1.ExecSQL;
Так что запрос очещать может и не обязательно, а вот датасет, полюбому нужно закрывать!;)
Цитата: koltaviy
по моему понятно почему 'очистка' не обязательна. ;)
Ну, вобщем-то да. Но закрывать-то датасет нужно ;)