|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Банальная проблема DBComboBox
Всем доброго времени суток, в делфях работаю очень редко и вот в данный момент прям не как без них, в общем делаю курсач по БД и нужно написать программку и вот не как не могу заставить правильно работать DBComboBox, база у меня на MSSQL подключаю через ADOConnection, ADOQuery, DataSource ну и на табличку к примеру вешаю (DBGrid), но вот не как не могу правильно подключить (или в цикле проблема) DBComboBoх в общем подключаю так что у меня выводится только первый элемент из базы, как я понял нужно написать цикл (гугление сказало тоже самое)
Вот что у меня вышло : Код:
procedure TForm1.DBComboBox1Change(Sender: TObject); begin ADOQueryCOMBOProduct.First; DBComboBox1.Items.Clear; // чистим While not ADOQueryCOMBOProduct.EOF do begin DBComboBox1.Items.Add(ADOQueryCOMBOProduct.FieldByName('name_product').AsString); ADOQueryCOMBOProduct.Next; // го на следующего end; end; поправьте что не так плиз ребят, уж очень срочно надо! заранее спасибо Последний раз редактировалось kirill.psl, 28.05.2010 в 18:38. |
#2
|
||||
|
||||
Намного проще было-бы если бы вы воспользовались DBLookupComboBox. Там заполнение списка идет автоматом.
А вот почему в вашем варианте только первая запись выводится, я затрудняюсь сказать. Написано все правильно, должно выводить все. Единственное предположение, это что-то у вас либо с запросом, ограничение по условию или по кол-ву возвращаемых данных или же ADOQueryCOMBOProduct завязан на другую таблицу/запрос. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 28.05.2010 в 18:43. |
#3
|
|||
|
|||
так, а поподробней, как с ним (DBLookupComboBox) работать не подскажете?
П.с. только вот решил его попробовать и тут Вы сразу отвечаете в тему =) |
#4
|
|||
|
|||
Организовал через DBLookupComboBox
Нужно указать ListSource, ListField и KeyField. DataSource оставить пустым. И все заработало, а как выставить первоначально НЕ ПУСТОЕ значение? А к примеру текст написать "Выберите продукт" к примеру? |
#5
|
||||
|
||||
Что-бы добавить что от себя в список, можно для списка сделать запрос такого вида:
Код:
select -1,'<Выберите значение>' union select id,context from mytable order by id Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
у меня база mssql, как ввести из DBComboBox1 в нее? у меня щас вот такого рода код на кнопке стоит :
Код:
procedure TAddproduct.Button3Click(Sender: TObject); begin // Закрыть запрос Form1.QueryDynamic.Close; // Очистить массив строк для размещения // текста запроса Form1.QueryDynamic.SQL.Clear; // Сформировать строку с текстом запроса sql:= 'insert into product (id_category, id_proizvoditel,name_product) values (DBLookupComboBox1.Text, DBLookupComboBox2.Text, '''+ Edit1.Text +''');'; // Вывести текст запроса на экран application.MessageBox(PChar(sql), 'Текст запроса',MB_OK); // Добавить стоку с текстом запроса Form1.QueryDynamic.SQL.Add(sql); try // Выполнить запрос Form1.QueryDynamic.Open; // Обработать возможные ошибки // при выполнении запроса except application.MessageBox( 'Не могу выполнить запрос', 'Ошибка',MB_OK); end; end; DBLookupComboBox2 как Edit1 с добавоением .Text не хочет работать у меня там сделанно так : ListField (то что показывает в списке - "Продукт") и KeyField(id того что показывает в списке "ID_Продукт") нужно именно KeyField ввести мне... как сделать не знаю... |
#7
|
||||
|
||||
Привет. Добрался до форума. Продолжаем разговор.
Значит мы остановились на том, что надо организовать совместную работу базы и DateTimePicker. Поскольку компонент не оснащен методами автоматического получения/изменения данных в таблице, значит делать придется самому ручками. 1. Озаботимся тем, что-бы данные из текущей записи в таблице автоматом попадали в наш компонент DateTimePicker. Для этого в событиях AfterScroll и AfterPost для TAdoTable или TAdoQuery пропишем такой код: Код:
procedure TForm1.AdoQuery1AfterScroll(DataSet: TDataSet); begin if DataSet.State = dsBrowse then DateTimePicker1.DateTime := DataSet.FieldByName('MyDate').AsDateTime; end; procedure TForm1.AdoQuery1AfterPost(DataSet: TDataSet); begin DateTimePicker1.DateTime := DataSet.FieldByName('MyDate').AsDateTime; end; Код:
procedure TForm1.DateTimePicker1Change(Sender: TObject); begin if AdoQuery1.FieldByName('MyDate').AsDateTime <> DateTimePicker1.DateTime then begin AdoQuery1.Edit; AdoQuery1.FieldByName('MyDate').AsDateTime := DateTimePicker1.DateTime; AdoQuery1.Post; end; end; Вот собственно и все. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
Все подключил к базе, выводит первое значение в DateTimePicker1, а как мне сделать ввод через нее? т.е. у меня при выборе даты после нажатия на кнопку (бутон) должна вводится дата ну и остальные поля, на данный момент запрос такого вида:
sql:= Format('insert into postypenie (id_product, id_postacshik, date_postyplenie, vhodnaia_cena, nacenka) values (%s,%s,%s,''%s'',''%s'');',[DBLookupComboBox1.KeyValue, DBLookupComboBox2.KeyValue, DateTimePicker1, Edit2.Text, Edit3.Text]); просто пропускает момент с DateTimePicker и все.. а как DateTimePicker.Text не работает. И еще есть вопрос, как сделать обновление DBLookupComboBox при вводе данных в других полях? т.е например при добавление категории (это на другой форме) мне нужно чтобы в DBLookupComboBox отвечающем за категорию он обновился, а то приходится перезапускать программу |
#9
|
||||
|
||||
Ты снова наступаешь на те-же грабли как и с DBLookupComboBox1.
Я же чуть выше показал, куда и откуда берется значение в DateTimePicker1 Надо так: DateTimePicker1.DateTime Для записи данных в БД у тебя есть два способа. 1.Можно предварительно преобразовать значение DateTimePicker1.DateTime в строку - DateTimeToStr(DateTimePicker1.DateTime) и уже потом пытаться его записать как текст в таблицу. Но я сильно сомневаюсь, что у тебя в таблице поле date_postyplenie строкового типа. Поэтому могут быть сюрпризы. 2. Второй способ предпочтительнее и он более удобен, но потребует некоторой переделки кода, а именно использование параметров. Удобств у параметров довольно много, все расписывать долго, потому просто адаптация твоего кода под параметры: Код:
AdoQuery1.SQL.Text := 'insert into postypenie (id_product, id_postacshik, date_postyplenie, vhodnaia_cena, nacenka) values (:P1,:P2,:P3,:P4,:P5);'; AdoQuery1.Parameters.ParamValue['P1'] := DBLookupComboBox1.KeyValue; AdoQuery1.Parameters.ParamValue['P2'] := DBLookupComboBox2.KeyValue; AdoQuery1.Parameters.ParamValue['P3'] := DateTimePicker1.DateTime; AdoQuery1.Parameters.ParamValue['P4'] := Edit2.Text; AdoQuery1.Parameters.ParamValue['P5'] := Edit3.Text; AdoQuery1.ExecSQL; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
||||
|
||||
А что касается добавления в таблицу, то тут я дал маху, надо эту ситуацию в DateTimePicker1Change обрабатывать:
Код:
procedure TForm1.DateTimePicker1Change(Sender: TObject); begin if AdoQuery1.FieldByName('MyDate').AsDateTime <> DateTimePicker1.DateTime then begin if AdoQuery1.State <> dsInsert then AdoQuery1.Edit; AdoQuery1.FieldByName('MyDate').AsDateTime := DateTimePicker1.DateTime; if AdoQuery1.State <> dsInsert then AdoQuery1.Post; end; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Получилось преобразовать в строку:
sql:= Format('insert into postypenie (id_product, id_postacshik, date_postyplenie, vhodnaia_cena, nacenka) values (%s,%s,''%s'',''%s'',''%s'');',[DBLookupComboBox1.KeyValue, DBLookupComboBox2.KeyValue, DateTimeToStr(DateTimePicker1.DateTime), Edit2.Text, Edit3.Text]); так работает. Но одно но, по дифолту показывает дату первого из таблицы продукта, как сделать чтоб на сегодняшнее число выводил изначально? А как быть с обновлением? Пост выше |
#12
|
||||
|
||||
Когда изменился набор данных для DBLookupComboBox1 попробуй сделать так:
Код:
DBLookupComboBox1.ListSource.DataSet.Refresh; Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 29.05.2010 в 13:48. |
#13
|
||||
|
||||
Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#14
|
|||
|
|||
спасибо. все что хотел сделал, только вот осталось одно...
прям стыдно спрашивать, ноне помню как это делается : при вводе в Edit1 и Edit2 нужно чтоб в Edit3 сразу записалось Edit3 = Edit1*Edit/100 помню что нужно что то типа Код:
var I,J,K:Integer; begin I := StrToInt(Edit1.Text); J :=StrToInt(Edit2.Text); K := I*J/100; Edit3.Text :=IntToStr(K); а как сделать что бы не по кнопке было, а при вводе в Edit1 и Edit2 данных сразу подсчитывал в Edit3? |
#15
|
||||
|
||||
Вы не тот тип выбрали для K, т.к. возможен дробный результат.
Так, без промежуточных переменных: Код:
Edit3.Text := FloatToStr(StrToInt(Edit1.Text)*StrToInt(Edit2.Text)/100); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |