|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Ошибка при запросе
Добрый вечер! Моя проблема заключается вот в чем. У меня на форме есть ComboBox. В нем записаны названия предметов. Через Database Desktop я создал таблицу table_predmety, в которой у меня есть две колонки: ID_Predmet и Название. В колонке "Названия" записаны те же названия предметов и у каждого свой номер(ID). Нужно, чтобы при выборе названия предмета из ComboBox-a ID этого предмета из БД заносился в DBGrid таблицу в колонку ID_Predmet. Делал такой запрос:
Код:
procedure TForm1.ComboBox3Select(Sender: TObject); var id_predm: integer; begin Query_zapros.Active:=False; Query_zapros.SQL.Clear; Query_zapros.SQL.Add('SELECT ID_Predmet FROM table_predmety WHERE Название='+Form1.ComboBox3.Text+''); id_predm:=Query_zapros.FieldByName('ID_Predmet').AsInteger; end; В чем ошибка запроса? |
#2
|
|||
|
|||
1. Название предмета в запросе надо заключать в кавычки.
2. И вообще не так надо делать. Варианта 2: 2.1. Используем обычный комбобокс. Тогда при его заполнении используем метод AddObject, где в первом параметре указываем собственно название, а во втором приведенный к TObject ID записи: Код:
qPredmety.Open; While Not qPredmety.EOF Do Begin cbPredmety.Items.AddObject(qPredmety.FieldByName('Название').AsString,TObject(qPredmety.FieldByName('ID_Predmet').AsInteger)); qPredmety.Next; End; qPredmety.Close; Запрос в qPredmety: SELECT * FROM table_predmety - поставить стиль в csDropDownList - получить ID выбранного предмета через вызов Integer(cbPredmety.Items.Objects[cbPredmety.ItemIndex]) 2.2. Использовать TDBLookupComboBox. 3. И вообще, не используй русские названия в БД. Это, конечно, рекомендация, но не все СУБД нормально их воспринимают. Потом придется переучиваться. |
#3
|
||||
|
||||
Предидущий ответ более информативный, чем мой ))
|
#4
|
|||||
|
|||||
lmikle, спасибо. По крайней мере не выдается ошибка.
Также у меня есть некоторые вопросы по Вашему посту. 1. Цитата:
2. Цитата:
3. Цитата:
4. Цитата:
5. Цитата:
|
#5
|
|||
|
|||
1. Я описывал все варианты.
2. Да, именно так. См приведенный код. 3. Что бы пользователь "лапами" не ввел там то, чего в списке нету. 4. Туда, где у тебя назначение предмета в основной записи. 5. Тем, что не надо писать лишнего кода. Просто кидаешь компоненты доступа к данным, его, настраиваешь и ни одной строчки кода не пишешь. Но он не всегда удобен - все зависит от конкретной задачи и от того как реализован интерфейс. |
#6
|
||||
|
||||
lmikle
Цитата:
Ваш код я вставил так: Код:
begin Query_zapros.Open; while not Query_zapros.Eof do begin Form1.ComboBox3.Items.AddObject(Query_zapros.FieldByName('Название').AsString,TObject(Query_zapros.FieldByName('ID_Predmet').AsInteger)); Query_zapros.Next; end; Query_zapros.Close; end; Цитата:
Цитата:
Последний раз редактировалось artemavd, 23.04.2009 в 19:41. |
#7
|
|||
|
|||
Ну тогда чуть-чуть посложнее. Опять 2 варианта:
1. Оставляем стиль обычным. После того, как пользовательв ввел название, надо будет просмотреть загруженный список и, если нашли нужный предмет, то взяли готовый ID, если не нашли, то добавили в таблицу и взяли из нее новый ID. 2. Оставляем так, как написал, но добавляем кнопочку "Добавить новый". По ней добавляем новый предмет в базу и потом в комбобокс, выбираем его и запихиваем в основную таблицу. По поводу того, что не понял - вместо того кода, который ты привел. |
#8
|
||||
|
||||
1.
Цитата:
2. Цитата:
|
#9
|
|||
|
|||
1. Нет, естественно. Там вообще этого кода нету. Я тебе привел только код заполнения списка.
2. Почти, но не совсем. Т.е. по кнопочке вываливается диалог ввода нового предмета, потом он добавляется в список и в базу. Т.е. Юзер осознанно добавит новый предмет, а не в результате тупой очепятки. |
#10
|
||||
|
||||
Хорошо. Над вторым я подумаю. А можете привести код для первого пункта? Плиз.
|
#11
|
|||
|
|||
Не-а... сам думай. Там просто. Да и БД твою я не знаю, а там есть специфика - надо после вставки ID получить.
|
#12
|
||||
|
||||
А че там знать то. Есть таблица с двумя колонками. В одно заносится название во второй автоматом ID присваивается. Я бы может быть и подумал, да сроки сдачи курсовой поджимают. Ладно, спасибо и на том, в чем помогли. Спрошу на другом форуме еще.
|
#13
|
|||
|
|||
Профессор тупой, но аппаратура при нем... (с) Ералаш (кажется).
Какая у тебя база? Как присваивается следующий ID - автоматически (типа Identity в MS SQL или через генератор (InterBase/FireBird) или сиквенс (Oracle)? А так-то чего там - через InputQuery запросил новый предмет, через запрос с INSERT вставил в БД, каким-то образом получил ID вставленной записи и через AddObject добавил в комбобокс. Все просто и тупо. В чем проблема? Или ты думаешь, что ща тут энтузиазисты понабегут и все за тебя сделают? |
#14
|
||||
|
||||
База Paradox. ID должен присваиваться автоматически, но если предмет уже есть, то новый ID не присваивается.
Цитата:
Цитата:
|
#15
|
|||
|
|||
А никто и не смеется.
Просто так уж откровенно тупить не надо, да? Расписал по шагам что делать... да и честно говоря уже и не помню как в парадоксе получить Id вставленной записи. Только SELECT приходит на ум. Давно просто с парадоксом не имел дела. |