![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||||
|
|||||
![]() lmikle, спасибо. По крайней мере не выдается ошибка.
Также у меня есть некоторые вопросы по Вашему посту. 1. Цитата:
2. Цитата:
3. Цитата:
4. Цитата:
5. Цитата:
|
#4
|
|||
|
|||
![]() 1. Я описывал все варианты.
2. Да, именно так. См приведенный код. 3. Что бы пользователь "лапами" не ввел там то, чего в списке нету. 4. Туда, где у тебя назначение предмета в основной записи. 5. Тем, что не надо писать лишнего кода. Просто кидаешь компоненты доступа к данным, его, настраиваешь и ни одной строчки кода не пишешь. Но он не всегда удобен - все зависит от конкретной задачи и от того как реализован интерфейс. |
#5
|
||||
|
||||
![]() 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. |
#6
|
|||
|
|||
![]() Ну тогда чуть-чуть посложнее. Опять 2 варианта:
1. Оставляем стиль обычным. После того, как пользовательв ввел название, надо будет просмотреть загруженный список и, если нашли нужный предмет, то взяли готовый ID, если не нашли, то добавили в таблицу и взяли из нее новый ID. 2. Оставляем так, как написал, но добавляем кнопочку "Добавить новый". По ней добавляем новый предмет в базу и потом в комбобокс, выбираем его и запихиваем в основную таблицу. По поводу того, что не понял - вместо того кода, который ты привел. |
#7
|
||||
|
||||
![]() Предидущий ответ более информативный, чем мой ))
|