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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2010, 08:24   #1
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию Реализация выборки данных

Здравствствуйте. Прошу помощи. Задача следующая. Есть БД в Access. в бд таблица с наличием товара. товар находиться на разных складах (всего 5 складов). поиск товара выполняется запросом (типа 'SELECT * FROM наличие WHERE наименование="ручка"'). один и тот же товар содержиться на разных складах. Необходимо сделать следующее. Если товар содержиться на складе№1, то отображать только его. если товара нет или количество=0, то отображать наличие на складе№2, если нет на складе№2, то отображать на складе №3-5, если нет в наличие нигде показывать все нулевые записи. Должна быть возможность выборки отображаемых данных. т.е. стоят чекбоксы (отображать на складе№2, отображать на складе№3, отображать все записи).
Используются компоненты: AdoConnection, AdoQuery, DataSource, DbGridEh.
Каким способомлучше сделать отображение данных? Через фильтры или формировать запросы?
До этого было только одно условие (отображать или нет нулевые записи) делал с помощью фильтра
Код:
procedure TForm_work.Query_nalichFilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
begin
  Accept:=Query_nalich['количество']>0;
end;
...
procedure TForm_work.CheckBox2Click(Sender: TObject);
begin
  If CheckBox2.Checked=false then
    Query_nalich.Filtered:=true
  else
    Query_nalich.Filtered:=false;
end;
Но условий стало больше.
Спасибо.
S@fer вне форума Ответить с цитированием
Старый 31.07.2010, 10:23   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,210
По умолчанию

Цитата:
Через фильтры или формировать запросы?
Думаю, что через запросы скорее всего надо. . А может нужно делать просто запрос, который бы проверял таблицы (склады) на наличие в них выбранного товара и если находил, то выбирал бы в запросе склад, на котором содержится выбранный товар. Что-то может типа такого:
Код:
select №_склада from base where товар="ручка"
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 03.08.2010, 10:03   #3
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Запросом долго получается. потому-что выборка данных выполняется из большой таблицы по нескольким критериям. (около 5-10 сек.)
В DBGridEh есть свойство STFilter. можно ли им управлять программно?
S@fer вне форума Ответить с цитированием
Старый 03.08.2010, 11:16   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

запросом быстрее
просто ты "не умеешь его готовить" (с)
про криво спроектированную БД говорить не будем. но вот индексы стОит прикрутить
soleil@mmc вне форума Ответить с цитированием
Старый 03.08.2010, 11:26   #5
S@fer
Форумчанин
 
Аватар для S@fer
 
Регистрация: 29.01.2009
Сообщений: 411
По умолчанию

Запрос на выборку данных выглядит следующим образом:
Код:
  Form_work.Query_nalich.Close;
  Form_work.Query_nalich.SQL.Text:='SELECT DISTINCT наличие.препарат,наличие.форма,наличие.дозировка,наличие.№№,'+
  'наличие.количество,наличие.сертификат,наличие.склад,наличие.цена,препарат.имя,форма.имя,наличие.цена_опт,'+
  'наличие.цена_баз,наличие.цена_зак,наличие.годен_до,[наличие.size],[наличие.photo],[наличие.продано за смену],'+
  '[форма.Скидка] FROM (наличие LEFT JOIN (препарат LEFT JOIN препарат_замена ON препарат.имя = препарат_замена.препарат) '+
  'ON наличие.препарат = препарат.код) LEFT JOIN форма ON наличие.форма = форма.код ';
  s1:=Form_work.Ed_poisk.Text;
  s2:='';
  j:=Length(s1);
  Form_work.Query_nalich.SQL.Add('WHERE (');
  for i:=1 to j do
  begin
    if s1[i]<>' ' then
      s2:=s2+s1[i]
    else
    begin
      Form_work.Query_nalich.SQL.Add('(((препарат.имя) Like "%'+s2+'%")or((форма.имя) Like "%'+s2+'%")or'+
      '((наличие.дозировка) Like "%'+s2+'%")or(([наличие.size]) Like "%'+s2+'%")or((наличие.№№) Like "%'+
      s2+'%")or((наличие.сертификат) Like "%'+s2+'%")or((препарат_замена.Замена) Like "%'+s2+'%")) and ');
      s2:='';
    end;
  end;
  Form_work.Query_nalich.SQL.Add('(((препарат.имя) Like "%'+s2+'%")or((форма.имя) Like "%'+s2+'%")or'+
  '((наличие.дозировка) Like "%'+s2+'%")or(([наличие.size]) Like "%'+s2+'%")or((наличие.№№) Like "%'+
  s2+'%")or((наличие.сертификат) Like "%'+s2+'%")or((препарат_замена.Замена) Like "%'+s2+'%")))');
  Form_work.Query_nalich.ExecSQL;
S@fer вне форума Ответить с цитированием
Старый 03.08.2010, 12:47   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

чота скобочек лишних полно
но речь не про них

1)главный тормоз запроса на первый взгляд это поиск по всей таблице, который ты провоцируешь вот таким фильтром
Код:
(препарат.имя) Like "%'+s2+'%"
если бы было хотя бы так
Код:
(препарат.имя) Like "'+s2+'%"
то это уже намного легче для субд

может имеет смысл делать предварительный поиск для показа возможных вариантов по данному полю? т.е. будет просто мелкий запросец с таким негуманным условием, но по одному полю

2) второй тормоз - дофига OR
soleil@mmc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помочь с макросами для выборки определенных данных по нескольким критериям rdt Microsoft Office Excel 6 30.07.2010 13:12
Реализация структуры данных Nata_student_nik Помощь студентам 3 17.03.2010 08:52
реализация линейных структур данных в подпрограммах ArniLand Общие вопросы C/C++ 0 31.01.2010 01:20
Автоматизированное копирование данных выборки автофильтра на другой лист при помощи кнопки outstrip Microsoft Office Excel 0 12.08.2009 11:28
[C] Абстрактные типы данных. Реализация дерева общего вида. Dju Помощь студентам 0 11.05.2009 18:11