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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.01.2011, 23:36
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию Как сделать выборку из БД через Edit?

Здравствуйте! У меня есть база данных (Table) содержащая различные электродвигатели. При вводе в Edit значения мощности двигателя, мне необходимо что бы программа выбрала из БД двигатель мощностью равной или большей чем введенный в Edit, и занесла все значения выбранного двигателя в StringGrid. Заранее спасибо!
Ответить с цитированием
  #2  
Старый 25.01.2011, 03:19
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Лучше и правильнее работать не с таблицей, а с запросом к таблице. Тогда делаешь простенький запрос:
Код:
Query1.SQL.Text := 'select * from ElectricMotor where Power >= ' + Edit1.Text;
Query1.Open;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 25.01.2011, 05:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, не факт.
Человек может уже отфильтровал выборку и теперь хочет "поиграться" с результатами. тогда использование события OnFilterrecord удобнее.
Ответить с цитированием
  #4  
Старый 25.01.2011, 08:54
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

Я в программировании новичок. Вы не могли бы поподробнее описать код выборки. И ещё, БД у меня сделана в Table, а не в Query. Заранее спасибо!
Ответить с цитированием
  #5  
Старый 25.01.2011, 09:31
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну если делать так как говорит Imikle то примерно так:
Код:
if Table1.Filter = ''
then Table1.Filter := 'Power >= ' + Edit1.Text
else Table1.Filter := Table1.Filter + ' and Power >= ' + Edit1.Text;
Table1.Filtered := True;
А вот для вывода результатов лучше воспользоваться компонентом TDBGrid, а не TStringGrid
Но если очень хочется именно через TStringGrid то так:
Код:
 StringGrid1.RowCount := Table1.RecordCount + 1;
 StringGrid1.ColCount := Table1.Fields.Count;
 for Col := 0 to StringGrid1.ColCount - 1
 do StringGrid1.Cells[Col,0] := Table1.Fields[Col].FieldName;

 for Row := 1 to StringGrid1.RowCount - 1
 do begin
    for Col := 0 to StringGrid1.ColCount - 1
    do StringGrid1.Cells[Col,Row] := Table1.Fields[Col].asString;
    Table1.Next;
   end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 25.01.2011 в 09:55.
Ответить с цитированием
  #6  
Старый 25.01.2011, 09:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В моем варианте это не код выборки а просто условие отбора записей. На паскале.
Ответить с цитированием
  #7  
Старый 25.01.2011, 10:04
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

Будьте добры, подскажите, где в моём коде ошибка при занесении выбранного движка в StringGrid. Заранее благодарю!
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var  Pnom:Real;
begin
Pnom:=StrToFloat(Edit3.Text);
 if Table1.Filter = ''
then Table1.Filter := 'Pnom >= ' + Edit3.Text
else Table1.Filter := Table1.Filter + ' and Pnom >= ' + Edit3.Text;
Table1.Filtered := True;

end;
 var Pnom:Real; i,j:integer;
begin
  for i:=0 to 8 do for j:=1 to 100 do StringGrid1.Cells[i,j]:='';
  Table1.First; 
  j:=1;
  for i:=1 to Table1.RecordCount do 
   begin
    Pnom:=0;
    if Pnom then begin
      StringGrid1.Cells[0,j]:=Table1.FieldValues['Tiporazmer'];
      StringGrid1.Cells[1,j]:=Table1.FieldValues['Pnom'];
     StringGrid1.Cells[2,j]:=FloatToStrF(Table1.FieldValues['Inom'],ffFixed,4,1);
      StringGrid1.Cells[3,j]:=FloatToStrF(Table1.FieldValues['KPD'],ffFixed,5,1);
      StringGrid1.Cells[4,j]:=FloatToStrF(Table1.FieldValues['cos f'],ffFixed,4,1);
      StringGrid1.Cells[5,j]:=FloatToStrF(Table1.FieldValues['Ip/In'],ffFixed,4,1);
      StringGrid1.Cells[6,j]:=FloatToStrF(Table1.FieldValues['Mp/Mn'],ffFixed,4,1);
      StringGrid1.Cells[7,j]:=FloatToStrF(Table1.FieldValues['Mmax/Mn'],ffFixed,4,1);
      StringGrid1.Cells[8,j]:=FloatToStrF(Table1.FieldValues['N'],ffFixed,4,1);
      j:=j+1;
     end; {if}
    Table1.Next;
   end;  
end;
end.
Админ: Пользуемся тегами для оформления кода!

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

Код:
...if Pnom then begi...
Для логических операций нельзя использовать тип Real
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 25.01.2011, 12:12
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

Ну а как же всё таки будет выглядеть верный код? Никак не могу разобраться!
Ответить с цитированием
  #10  
Старый 25.01.2011, 12:30
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

не совсем вкурил в код, откуда там посреди var? вот тут:
Код:
Table1.Filtered := True;

end;
 var Pnom:Real; i,j:integer;
begin
не понятное условие
Код:
Pnom:=0;
    if Pnom then begin
Что вы им хотели добиться?

и как вам указали
Код:
if Pnom then 
нельзя.
Например
Код:
if Pnom=0 then
можно, а так как у вас нельзя.
хотя вопрос больше а нафига оно вообще здесь, это условие?
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #11  
Старый 25.01.2011, 22:38
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

Подскажите пожалуйста, где поправить код. Постоянно выходит ошибка в конце
Код:
[Error] Unit1.pas(405): '.' expected but 'END' found
А код такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var  Pnom:Real;
begin
Pnom:=StrToFloat(Edit3.Text);
 if Table1.Filter = ''
then Table1.Filter := 'Pnom >= ' + Edit3.Text
else Table1.Filter := Table1.Filter + ' and Pnom >= ' + Edit3.Text;
Table1.Filtered := True;

end;
 var Pnom:Real; i,j:integer;
begin
  for i:=0 to 8 do for j:=1 to 100 do Form1.StringGrid1.Cells[i,j]:='';
  Form1.Table1.First; {ïåðåõîä íà ïåðâóþ çàïèñü áàçû äàííûõ}
  j:=1;
  for i:=1 to Form1.Table1.RecordCount do {öèêë äî êîíöà áàçû}
   begin
     Pnom:=0;
      Form1.StringGrid1.Cells[0,j]:=Form1.Table1.FieldValues['Tiporazmer'];
      Form1.StringGrid1.Cells[1,j]:=Form1.Table1.FieldValues['Pnom'];
     Form1.StringGrid1.Cells[2,j]:=FloatToStrF(Form1.Table1.FieldValues['Inom'],ffFixed,4,1);
      Form1.StringGrid1.Cells[3,j]:=FloatToStrF(Form1.Table1.FieldValues['KPD'],ffFixed,5,1);
      Form1.StringGrid1.Cells[4,j]:=FloatToStrF(Form1.Table1.FieldValues['cos f'],ffFixed,4,1);
      Form1.StringGrid1.Cells[5,j]:=FloatToStrF(Form1.Table1.FieldValues['Ip/In'],ffFixed,4,1);
      Form1.StringGrid1.Cells[6,j]:=FloatToStrF(Form1.Table1.FieldValues['Mp/Mn'],ffFixed,4,1);
      Form1.StringGrid1.Cells[7,j]:=FloatToStrF(Form1.Table1.FieldValues['Mmax/Mn'],ffFixed,4,1);
      Form1.StringGrid1.Cells[8,j]:=FloatToStrF(Form1.Table1.FieldValues['N'],ffFixed,4,1);
      j:=j+1;
        Form1.Table1.Next;
   end;
end
end.
Если перед предпоследним эндом поставить точку с запятой-то Делфи просит убрать его.
Заранее спасибо!
Ответить с цитированием
  #12  
Старый 26.01.2011, 14:12
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

Я исправил код, но как сделать так, чтобы отфильтрованные значения заносились только в StringGrid, а сама БД оставалась нетронутой?
Ответить с цитированием
  #13  
Старый 26.01.2011, 17:25
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
По умолчанию

БД (Если код конечно такой какой приведен) остается не тронутой.
свойство Filter фильтрует данные в кэше физически они как были в таблицах так и остались.

ПС. не совсем понятно зачем использовать StringGrid ?! почему не использовать DBGrid?
__________________
Новый вирус - "БОМЖ"! Он просто роется в Корзине...и спит под ярлычком "Сетевое окружение"
Ответить с цитированием
  #14  
Старый 26.01.2011, 17:58
Fanil Fanil вне форума
Прохожий
 
Регистрация: 24.01.2011
Сообщения: 26
Репутация: 10
По умолчанию

У меня, на форме программы, есть отдельная вкладка, в которой можно просмотреть всю базу, но как только я ввожу в Edit какое либо число и нажимаю Кнопку, у меня из БД фильтруются все позиции которые меньше чем введенный в Edit. БД возвращается в своё исходное состояние только после перезапуска программы. Как быть?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter