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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.05.2010, 18:34
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию Банальная проблема 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;
Admin: Пользуемся тегами для оформления кода!

поправьте что не так плиз ребят, уж очень срочно надо! заранее спасибо

Последний раз редактировалось kirill.psl, 28.05.2010 в 18:38.
Ответить с цитированием
  #2  
Старый 28.05.2010, 18:39
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Намного проще было-бы если бы вы воспользовались DBLookupComboBox. Там заполнение списка идет автоматом.
А вот почему в вашем варианте только первая запись выводится, я затрудняюсь сказать. Написано все правильно, должно выводить все.
Единственное предположение, это что-то у вас либо с запросом, ограничение по условию или по кол-ву возвращаемых данных или же ADOQueryCOMBOProduct завязан на другую таблицу/запрос.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 28.05.2010 в 18:43.
Ответить с цитированием
  #3  
Старый 28.05.2010, 18:43
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

так, а поподробней, как с ним (DBLookupComboBox) работать не подскажете?

П.с. только вот решил его попробовать и тут Вы сразу отвечаете в тему =)
Ответить с цитированием
  #4  
Старый 28.05.2010, 19:14
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

Организовал через DBLookupComboBox

Нужно указать ListSource, ListField и KeyField. DataSource оставить пустым. И все заработало, а как выставить первоначально НЕ ПУСТОЕ значение? А к примеру текст написать "Выберите продукт" к примеру?
Ответить с цитированием
  #5  
Старый 28.05.2010, 19:19
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Что-бы добавить что от себя в список, можно для списка сделать запрос такого вида:
Код:
select -1,'<Выберите значение>'
union
select id,context from mytable
order by id
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 28.05.2010, 20:33
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

у меня база 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  
Старый 29.05.2010, 12:47
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Привет. Добрался до форума. Продолжаем разговор.
Значит мы остановились на том, что надо организовать совместную работу базы и 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;
2. Теперь надо сделать так, что-бы изменения в DateTimePicker вносились в БД. В событии OnChange для нашего DateTimePicker припишем такой код:
Код:
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  
Старый 29.05.2010, 13:18
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

Все подключил к базе, выводит первое значение в 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  
Старый 29.05.2010, 13:32
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ты снова наступаешь на те-же грабли как и с 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  
Старый 29.05.2010, 13:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А что касается добавления в таблицу, то тут я дал маху, надо эту ситуацию в 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  
Старый 29.05.2010, 13:41
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

Получилось преобразовать в строку:

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  
Старый 29.05.2010, 13:45
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Когда изменился набор данных для DBLookupComboBox1 попробуй сделать так:
Код:
DBLookupComboBox1.ListSource.DataSet.Refresh;
Или если не обновится, то можно так:
Цитата:
DBLookupComboBox1.ListSource.DataSet.Close;
DBLookupComboBox1.ListSource.DataSet.Open;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 29.05.2010 в 13:48.
Ответить с цитированием
  #13  
Старый 29.05.2010, 13:50
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
так работает. Но одно но, по дифолту показывает дату первого из таблицы продукта, как сделать чтоб на сегодняшнее число выводил изначально?
Поскольку он показывает текущую запись, то Locate поможет найти запись соответствующую текущей дате
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #14  
Старый 29.05.2010, 14:23
kirill.psl kirill.psl вне форума
Прохожий
 
Регистрация: 28.05.2010
Адрес: Ufa
Сообщения: 10
Репутация: 10
По умолчанию

спасибо. все что хотел сделал, только вот осталось одно...
прям стыдно спрашивать, ноне помню как это делается : при вводе в 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  
Старый 29.05.2010, 15:23
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вы не тот тип выбрали для K, т.к. возможен дробный результат.
Так, без промежуточных переменных:
Код:
Edit3.Text := FloatToStr(StrToInt(Edit1.Text)*StrToInt(Edit2.Text)/100);
Ну и что-бы сразу подсчитывались в Edit3, для Edit1 и Edit2 сделайте общее событие OnChange где пропишите этот код.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter