![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Предидущий ответ более информативный, чем мой ))
|