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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 16:11   #11
Zohei
Пользователь
 
Регистрация: 29.04.2010
Сообщений: 13
По умолчанию

сейчас - msaccess.
Сразу сообщать не стал, потому что стоит вопрос о переносе базы на другую субд, из-за ее глючности..

3 таблицы выбрал потому что такая структура бд в интернет магазине, откуда все данные сливаются.
Zohei вне форума Ответить с цитированием
Старый 04.02.2012, 16:16   #12
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

раз переносишь базу - бери ту, где можно делать Хранимые Процедуры и выбирать из них данные, в ХП можешь реализовать все что твоей душе угодно

судя по всему вашу базу надо перерабатывать....
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Старый 04.02.2012, 16:30   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для фиксированного (не более чем) небольшого числа уровней можно попробовать и без хранимой процедуры. Не отлаживал. varchar(30) предпологаемый тип category_name
Код:
SELECT P.product_name,
    CASE WHEN C1.Parent_Id=0 THEN C1.category_name
         WHEN C2.Parent_Id=0 THEN C2.category_name
         WHEN C3.Parent_Id=0 THEN C3.category_name
         ELSE C4.category_name END AS Name1,
    CASE WHEN C1.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         WHEN C2.Parent_Id=0 THEN C1.category_name
         WHEN C3.Parent_Id=0 THEN C2.category_name
         ELSE C3.category_name END AS Name2,
    CASE WHEN C1.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         WHEN C2.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         WHEN C3.Parent_Id=0 THEN C1.category_name
         ELSE C2.category_name END AS Name3,
    CASE WHEN C1.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         WHEN C2.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         WHEN C3.Parent_Id=0 THEN CAST(NULL AS varchar(30))
         ELSE C1.category_name END AS Name4
  FROM Products P,Product_Category PC
    LEFT JOIN Categories C1 ON C1.category_id=PC.category_id
    LEFT JOIN Categories C2 ON C2.category_id=C1.parent_id
    LEFT JOIN Categories C3 ON C3.category_id=C2.parent_id
    LEFT JOIN Categories C4 ON C4.category_id=C3.parent_id
  WHERE PC.product_id=P.product_id
  ORDER BY 2,3,4,5,P.product_name
ADD В ACCESS проблема с CASE, можно попробовать с IIF
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.02.2012 в 16:35.
Аватар вне форума Ответить с цитированием
Старый 05.02.2012, 15:10   #14
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Проблема здесь очевидна.
При любом предложенном варианте запроса, сортируется окончательный результат.
Это и приводит к тому что сортировка происходит "не взирая" на вложенность.

В Аксессе, вроде бы нет ХП и поэтому сделать желаемую ТС сортировку на сервере невозможно. Т.е., придется сортировать на клиенте отдельно по каждому вложению.

Перейдя на MS SQL Server или Firebird можно сделать такую сортировку, но тоже не так и просто. В силу той же причины - сортировать нужно промежуточные результаты.

--------------- послесловие --------------
P.S. Если не мудрить, а сформировать TreeView с вложенными категориями и продукцией, то нужная сортировка произойдет автоматически.

Последний раз редактировалось Прик; 05.02.2012 в 17:17. Причина: Проще надо быть, проще...
Прик вне форума Ответить с цитированием
Старый 05.02.2012, 16:50   #15
Zohei
Пользователь
 
Регистрация: 29.04.2010
Сообщений: 13
По умолчанию

Большое спасибо всем за советы, мне они очень помогли

Аватар, С первой же секунды уперся в стену..
msaccess почему-то отказался делать сортировку по псевдонимам

Прик
Учитывая что ваша сортировка по убыванию, в последних двух строках август должен идти после сентября, но идея в общем-то ясна :

Цитата:
P.S. Если не мудрить, а сформировать TreeView с вложенными категориями и продукцией, то нужная сортировка произойдет автоматоматически.
? подробнее пожалуйста)
Дерево есть. Клиент как раз захотел добавить пункт меню "Все категории", по нажатию на который, товары в таблице повторили структуру меню
Zohei вне форума Ответить с цитированием
Старый 05.02.2012, 17:06   #16
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Здесь я несколько не прав.

Последний раз редактировалось Прик; 05.02.2012 в 17:19.
Прик вне форума Ответить с цитированием
Старый 05.02.2012, 17:24   #17
Zohei
Пользователь
 
Регистрация: 29.04.2010
Сообщений: 13
По умолчанию

путаница в терминах...
под меню подразумевается TreeView
Zohei вне форума Ответить с цитированием
Старый 05.02.2012, 17:30   #18
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

При формировании пунктов TreeView применяется тот же механизм отделения одного вложенного уровня от другого. И конечно, через рекурсивный вызов.
Вот, например, как сделано в одном из проектов (для Firebird):
Код:
procedure TForm3.FormCreate(Sender: TObject);
var
  TN : TTreeNode;

  procedure FillNode(aTN : TTreeNode; IDN : Integer);
  var
    TN : TTreeNode;
    qr: TIBQuery;
  begin
    qr := TIBQuery.Create(Self);
    qr.Database := DM.IBDatabase1;
    try
      qr.SQL.Text := 'select * from catalog where IDParent = '+IntToStr(IDN);
      qr.Open;
      while not qr.Eof do begin
        TN := Tree.Items.AddChildObject(aTN, qr.FieldValues['Name'],
                               TObject(qr.FieldByName('ID').AsInteger));
        FillNode(TN, qr.FieldValues['ID']);
        qr.Next;
      end;
    finally
      qr.Close;
      qr.Free;
    end;
  end;

begin
  DM.qrTree.SQL.Text := 'select * from catalog where IDParent = 0';
  DM.qrTree.Open;
  while not DM.qrTree.Eof do begin
    TN := Tree.Items.AddObject(nil, DM.qrTree.FieldValues['Name'],
                          TObject(DM.qrTree.FieldByName('ID').AsInteger));
    FillNode(TN, DM.qrTree.FieldValues['ID']);
    DM.qrTree.Next;
  end;
  DM.qrTree.Transaction.Commit;
  DM.qrTree.Close;
end;
Прик вне форума Ответить с цитированием
Старый 06.02.2012, 02:13   #19
Zohei
Пользователь
 
Регистрация: 29.04.2010
Сообщений: 13
Хорошо

удалено...

Последний раз редактировалось Zohei; 06.02.2012 в 03:42. Причина: похоже пора спать ложиться
Zohei вне форума Ответить с цитированием
Старый 06.02.2012, 06:51   #20
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Самое простое: после загрузки в TreeView (пример см. пост 18) "дернуть" свойство SortType. Отсортируется как надо.
Код:
begin
  Tree.SortType := stNone;
  ...
  Tree.SortType := stText;
end;
Прик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложная сортировка в ListView Puhovoi Помощь студентам 0 02.01.2012 12:38
Простая и сложная сортировка - какие используются? paravoz1k Помощь студентам 1 02.04.2011 13:32
Сложная сортировка. Как сделать? valerik88 SQL, базы данных 1 27.02.2011 13:45
Сложная сортировка Aleksiyfenix Microsoft Office Excel 2 24.08.2010 22:07
Сложная сортировка массива данных april115582 Microsoft Office Excel 2 13.05.2010 17:38