Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 00:08   #1
Skif
 
Регистрация: 08.04.2007
Сообщений: 9
По умолчанию ввод в БД через таблицу с раскрывающимися полями (lookup)

Доброго времени суток Вам.
прошу помочь разобраться как ниже описанное сделать грамотно, профессионально и не самым длинным путём )
по идее подобные задачи имеют место быть и кажется у 1С виде подобное, но сам найти, например по "ввод данных через форму таблица с lookup-полям" не смог.
Суть дела:
Всё это часть базы для торговли одеждой:
мне надо сделать форму введения заказа клиента, выглядеть должно как таблица с 7-ю полями:
| Артикул | Размер | Рост | Кол-во | Цена | Скидка | Итог |
3 поля по типу lookup;
2 поля ручной ввод оператором;
1 поле заполняется из базы, не является списком и не меняется оператором;
1 рассчитывается по 3-м предыдущим.

т.е. оператор видит таблицу с единственной пустой строкой, его действия:
-выбирает нужную позицию товара из раскрывающегося списка ячейки первой колонки (Артикул)
-выбирает размер из 2-й колонки (Размер) [em] раскрывающийся список размеров во второй колонке меняется в зависимости от первой колонки, чтоб на детскую пижаму не взяли взрослый размер[/em]
-выбирает рост из 3-й колонки(рост) [em]раскрывающийся список зависит от первой колонки(Артикул), опять чтоб не заказали на детское взрослый рост или просто не существующий для данного артикула рост[/em]
-проставляет количество заказанных штук (Кол-во)
-следующее поле уже заполнено (Цена) из базы, зависит только от артикула
-проставляет скидку если есть(Скидка), по дефолту 0
-рассчитываться по колонкам Цена и Скидка для каждой строки (Итог)
после чего если это не весь заказ то оператор переводит курсор на другую строку и повторяет для другово артикула
ну а если весь то кликает кнопку и заноситься все в БД через процедуру, т.е. число строк всегда равно числу артикулов в заказе.

что сделано:
5 дней копание в инете, в книге фаронова и много попыток, научился обращаться с lookup-полями, пытался заполнять PickList у Columns, в итоге к нужному результату не дошел, башка уже квадратная, а в эти выходные надо сиё уже рабочим на работе к понедельнику установить в тестовый режим
.
Делаю в связке БД MySQL 5 и Delphi 2006, соединение с базой через Devart MyDAC

З.Ы. серверная часть сделана, заполнена и работает уже в штатном режиме 2 недели, таблицы БД используемые для данных к заполнению

заказов выглядят так:
BD2(kod_izd, tip, kol_vo) где __ kod_izd = ID;___ tip - тип склада, одно значение для всех артов;___ kol_vo кол-во на складеж
KOD_IZD(kod_izd, art, raz,rost) где __ kod_izd = ID; __ art - название артикула, __ raz - размер артикула; __ rost - значение роста для артикула
З.Ы.Ы. есть мысль что я принципиально не так подошел к решению этой задачи, это мой проект первый такой и наставников нет ( пытался у более опытного программиста спросить, но видимо недопоняли друг друга, так что старался изложить максимально детально. Буду благодарен за попутно указанную толковую литературу по созданию БД.
Skif вне форума Ответить с цитированием
Старый 13.04.2010, 06:17   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Я немного не понял: нужно использовать DBGrid или можно StringGrid? Если, например, StringGrid, то тогда вот этим кодом можно сделать выпадающий список в ячейке:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  {Высоту combobox'а не изменишь, так что вместо combobox'а
  будем изменять высоту строки grid'а !}
  StringGrid1.DefaultRowHeight := ComboBox1.Height; {Спрятать combobox}
  ComboBox1.Visible := False; ComboBox1.Items.Add('Delphi Kingdom');
  ComboBox1.Items.Add('Королевство Дельфи');
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  {Перебросим выбранное в значение из ComboBox в grid}
  StringGrid1.Cells[StringGrid1.Col,
  StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible := False; StringGrid1.SetFocus;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  {Перебросим выбранное в значение из ComboBox в grid}
  StringGrid1.Cells[StringGrid1.Col,
  StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible := False; StringGrid1.SetFocus;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
  R: TRect;
begin
  if ((ACol = 3) and (ARow <> 0)) then
  begin
    {Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
    R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;
    R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;
    R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1.Left := R.Left + 1;
    ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;
    ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}
    ComboBox1.Visible := True; ComboBox1.SetFocus;
  end;
  CanSelect := True;
end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.04.2010, 23:58   #3
Skif
 
Регистрация: 08.04.2007
Сообщений: 9
По умолчанию

artemavd, все правильно понял, DBGrid не обязателен, StringGrid замечательно подошел под мою задачу,
благодарю тебя, реально помог, а то думал уже что не успею к выходным

код немного потестил, для лучшей работы убрал обработку изменения КомбоБокса(в частности при вводе заработал поиск по комбоБоксу)

Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  {Перебросим выбранное в значение из ComboBox в grid}
  {StringGrid1.Cells[StringGrid1.Col,
  StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex];
  ComboBox1.Visible := False; StringGrid1.SetFocus;}
end;
так же изменил

Код:
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  {Перебросим выбранное в значение из ComboBox в grid}
//  StringGrid1.Cells[StringGrid1.Col,  //оригинальный код
//  StringGrid1.Row] := ComboBox1.Items[ComboBox1.ItemIndex]; //оригинальный код
// код после тестирования
  StringGrid1.Cells[SGCol,
  StringGrid1.Row] := ComboBox1.Text;{при вводе текста с клавиатуры происходит поиск по записям в ComboBox}
// и т.о. исключаеться неправильный ввод значение по индексу,  у меня он вставлял иногда не те значения что были выбраны
  ComboBox1.Visible := False; StringGrid1.SetFocus;
end;
еще изменение

Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var
  R: TRect;
begin
  if ((ACol = 1) and (ARow <> 0)) then
  begin
    {Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
    R := StringGrid1.CellRect(ACol, ARow);
    R.Left := R.Left + StringGrid1.Left;
    R.Right := R.Right + StringGrid1.Left;
    R.Top := R.Top + StringGrid1.Top;
    R.Bottom := R.Bottom + StringGrid1.Top;
    ComboBox1.Left := R.Left + 1;
    ComboBox1.Top := R.Top + 1; ComboBox1.Width := (R.Right + 1) - R.Left;
    ComboBox1.Height := (R.Bottom + 1) - R.Top; {Покажем combobox}
    ComboBox1.Visible := True;
    ComboBox1.Text:=StringGrid1.Cells[1, ARow];{добавлено: теперь в КомбоБоксе при изменении значения  учитываеться предыдущее положение курсора что актуально естли 2-3 сотни записей а оператор промахнулся всего на 1-2 записи}
    ComboBox1.SetFocus;
Невсегда отображаеться ComboBox если у StringGrid в Options параметр goEditing:=true
видимо таблица успевает начать редактироваться

artemavd, еще момент, почему-то при срабатывании скроллбара перестаёт отрисовываться ComboBox
не могу понять почему, они просто исчезают, если кликнуть там где уже введено значение то ComboBox не появиться
что может быть причиной?
Skif вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод данных через форму hamlook Microsoft Office Excel 9 24.03.2013 17:11
Можно ли создать таблицу через рhp-страницу?? xap4o SQL, базы данных 11 30.01.2010 00:37
автоматизировать ввод данных в таблицу пользуясь формой и ВБА amrnijad Microsoft Office Excel 2 07.01.2010 06:09
Занесение данных в таблицу через DBLookupComboBox andirock2112 БД в Delphi 3 18.05.2009 09:51
Как скопировать или быстро просмотреть таблицу с LookUp? Rain9 Общие вопросы C/C++ 3 28.10.2008 12:33