![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 приходит на ум. Давно просто с парадоксом не имел дела. |