Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.04.2009, 17:59
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
Печаль Ошибка при запросе

Добрый вечер! Моя проблема заключается вот в чем. У меня на форме есть 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;
Но выдается ошибка: "Field 'ID_Predmet' not found.
В чем ошибка запроса?
Ответить с цитированием
  #2  
Старый 23.04.2009, 18:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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
Соответсвенно, для получения соответствующего ID надо:
- поставить стиль в csDropDownList
- получить ID выбранного предмета через вызов Integer(cbPredmety.Items.Objects[cbPredmety.ItemIndex])
2.2. Использовать TDBLookupComboBox.
3. И вообще, не используй русские названия в БД. Это, конечно, рекомендация, но не все СУБД нормально их воспринимают. Потом придется переучиваться.
Ответить с цитированием
  #3  
Старый 23.04.2009, 18:08
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Предидущий ответ более информативный, чем мой ))
Ответить с цитированием
  #4  
Старый 23.04.2009, 18:38
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

lmikle, спасибо. По крайней мере не выдается ошибка.
Также у меня есть некоторые вопросы по Вашему посту.
1.
Цитата:
Используем обычный комбобокс
У меня и используется обычный.
2.
Цитата:
где в первом параметре указываем собственно название, а во втором приведенный к TObject ID записи:
То есть в первом параметре присваивается название предмета, а во втором присваивается свой ID к этому предмету?
3.
Цитата:
- поставить стиль в csDropDownList
Почему именно этот стиль?
4.
Цитата:
- получить ID выбранного предмета через вызов Integer(cbPredmety.Items.Objects[cbPredmety.ItemIndex])
а куда эту процедуру вставить?)
5.
Цитата:
Использовать TDBLookupComboBox
Чем он лучше обычного?
Ответить с цитированием
  #5  
Старый 23.04.2009, 19:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Я описывал все варианты.
2. Да, именно так. См приведенный код.
3. Что бы пользователь "лапами" не ввел там то, чего в списке нету.
4. Туда, где у тебя назначение предмета в основной записи.
5. Тем, что не надо писать лишнего кода. Просто кидаешь компоненты доступа к данным, его, настраиваешь и ни одной строчки кода не пишешь. Но он не всегда удобен - все зависит от конкретной задачи и от того как реализован интерфейс.
Ответить с цитированием
  #6  
Старый 23.04.2009, 19:37
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

lmikle
Цитата:
2. Да, именно так. См приведенный код.
Но в моей БД ничего не добавилось и не изменилось). Мы же не указали в какую БД должны заноситься предмет?
Ваш код я вставил так:
Код:
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;
Цитата:
3. Что бы пользователь "лапами" не ввел там то, чего в списке нету.
Дык пользователь то тоже может вводить свое название предмета вводить. Вот и надо, чтобы он когда ввел его, то название бы занеслось в базу и ему присвоился свой ID.
Цитата:
4. Туда, где у тебя назначение предмета в основной записи.
Что то я не очень понял предложение. Это как?

Последний раз редактировалось artemavd, 23.04.2009 в 19:41.
Ответить с цитированием
  #7  
Старый 23.04.2009, 19:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тогда чуть-чуть посложнее. Опять 2 варианта:
1. Оставляем стиль обычным. После того, как пользовательв ввел название, надо будет просмотреть загруженный список и, если нашли нужный предмет, то взяли готовый ID, если не нашли, то добавили в таблицу и взяли из нее новый ID.
2. Оставляем так, как написал, но добавляем кнопочку "Добавить новый". По ней добавляем новый предмет в базу и потом в комбобокс, выбираем его и запихиваем в основную таблицу.

По поводу того, что не понял - вместо того кода, который ты привел.
Ответить с цитированием
  #8  
Старый 23.04.2009, 19:47
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

1.
Цитата:
После того, как пользовательв ввел название, надо будет просмотреть загруженный список и, если нашли нужный предмет, то взяли готовый ID, если не нашли, то добавили в таблицу и взяли из нее новый ID.
Ваш код делает это?
2.
Цитата:
2. Оставляем так, как написал, но добавляем кнопочку "Добавить новый". По ней добавляем новый предмет в базу и потом в комбобокс, выбираем его и запихиваем в основную таблицу.
Я думаю, что это будет аналогично первому)
Ответить с цитированием
  #9  
Старый 23.04.2009, 20:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Нет, естественно. Там вообще этого кода нету. Я тебе привел только код заполнения списка.
2. Почти, но не совсем. Т.е. по кнопочке вываливается диалог ввода нового предмета, потом он добавляется в список и в базу. Т.е. Юзер осознанно добавит новый предмет, а не в результате тупой очепятки.
Ответить с цитированием
  #10  
Старый 23.04.2009, 20:24
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

Хорошо. Над вторым я подумаю. А можете привести код для первого пункта? Плиз.
Ответить с цитированием
  #11  
Старый 23.04.2009, 20:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не-а... сам думай. Там просто. Да и БД твою я не знаю, а там есть специфика - надо после вставки ID получить.
Ответить с цитированием
  #12  
Старый 23.04.2009, 20:40
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

А че там знать то. Есть таблица с двумя колонками. В одно заносится название во второй автоматом ID присваивается. Я бы может быть и подумал, да сроки сдачи курсовой поджимают. Ладно, спасибо и на том, в чем помогли. Спрошу на другом форуме еще.
Ответить с цитированием
  #13  
Старый 23.04.2009, 21:04
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Профессор тупой, но аппаратура при нем... (с) Ералаш (кажется).
Какая у тебя база? Как присваивается следующий ID - автоматически (типа Identity в MS SQL или через генератор (InterBase/FireBird) или сиквенс (Oracle)? А так-то чего там - через InputQuery запросил новый предмет, через запрос с INSERT вставил в БД, каким-то образом получил ID вставленной записи и через AddObject добавил в комбобокс. Все просто и тупо. В чем проблема? Или ты думаешь, что ща тут энтузиазисты понабегут и все за тебя сделают?
Ответить с цитированием
  #14  
Старый 23.04.2009, 21:26
Аватар для artemavd
artemavd artemavd вне форума
Начинающий
 
Регистрация: 05.08.2008
Сообщения: 115
Репутация: 12
По умолчанию

База Paradox. ID должен присваиваться автоматически, но если предмет уже есть, то новый ID не присваивается.
Цитата:
А так-то чего там - через InputQuery запросил новый предмет, через запрос с INSERT вставил в БД, каким-то образом получил ID вставленной записи и через AddObject добавил в комбобокс. Все просто и тупо.
Я рад за Вас, что для Вас все просто делается.
Цитата:
Или ты думаешь, что ща тут энтузиазисты понабегут и все за тебя сделают?
Мне не надо, чтобы за меня делали. Если бы я хотел, чтобы за меня сделали, я бы обратился в раздел Фриланс. Я хочу, чтобы мне помогли, а не смеялись надо мной, говоря, что я такой тупой и не могу элементарную вещь сделать. Если Вы знаете как сделать и можете помочь, то спасибо большое. Знаете-помогите, а смеяться не надо. Тогда лучше вообще ничего не помогайте. Найдутся люди, которым будет не сложно помочь.
Ответить с цитированием
  #15  
Старый 23.04.2009, 21:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А никто и не смеется.
Просто так уж откровенно тупить не надо, да?
Расписал по шагам что делать... да и честно говоря уже и не помню как в парадоксе получить Id вставленной записи. Только SELECT приходит на ум. Давно просто с парадоксом не имел дела.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter