Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADOQuery использование ф-и Rank 
V
    Опции темы
Vaskevych
  Дата 14.2.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Всем привет, подскажыте как можно использовать ф-ю rank в запросе к базе даных Access или ето нереально !!! Большое Списабо !!!


Примерный запрос:
Код

SELECT [rat_students].[familiastudenta] & " " & [rat_students].[namestudenta] & " " & [rat_students].[fstudenta] AS FIOStudenta, 
rat_students.Group, rat_1_2.*, rank() OVER ( [count_prog] ORDER BY count_prog)
FROM rat_students INNER JOIN rat_1_2 ON rat_students.Kod_Std = rat_1_2.Kod_Std WHERE rat_students.Group LIKE :Group
ORDER BY rat_students.FamiliaStudenta;



Это сообщение отредактировал(а) Vaskevych - 17.2.2011, 21:48
PM   Вверх
Данкинг
Дата 14.2.2011, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



А что за функция такая?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Vaskevych
Дата 15.2.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Ф-я которая отвечает за установку места относительно параметра, аналог РАНГ (RANK) в Excel.
PM   Вверх
Vas
Дата 15.2.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Это же агрегатная функция, сомневаюсь что акцесс такое поддерживает. 
Vaskevych, у Тома Кайта подсмотрел?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Vaskevych
Дата 15.2.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Ладно, если нет ф-ї буду писать сам, помогите !!!
Значит есть значения например:

зн.    Ранг

3      2      
7      4
7      4
2      1
6      3

Как я понимаю, сначала ищем минимальное значение (ето отправная точка).  min = 2, rank =1
Потом, ищем следующее min+1 если есть rank = 2 если нет ищем следующее.

как ето реализовать в Delphi покоректнее.

PM   Вверх
Vas
Дата 15.2.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Vaskevych @  15.2.2011,  10:19 Найти цитируемый пост)
Как я понимаю, сначала ищем минимальное значение (ето отправная точка).  min = 2, rank =1

А разве от сортировки ранг не зависит? Если в обратную сторону отсортировать то ранг 1 будет у максимального значения или я что-то путаю?

Добавлено через 2 минуты и 20 секунд
Вдогонку описание агрегатной функции rank в oracle

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  rank_oracle.JPG 59,68 Kb


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Vaskevych
Дата 15.2.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Значит пишу свою ф-ю есть прогресс (потом выложу всем) только один вопрос можно ли в SQL запросе загнать значения какогото поля в массив. ?????
PM   Вверх
Vaskevych
  Дата 17.2.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Значит так как обещал, помогаю таким как я сам:  smile 

вот результат.
user posted image

1. Задаем поля Calculated для возможности вывода подсчетов.
2. В обаботчике CalcFields потомка ADOQuery (например) пишем код:

Код

var
  RecP: TRecord;
begin
  if DataSet.Bof then ado2tb.Clear;
  with RecP do
    begin
      UserID := DataSet.FieldByName('Auto_Index').AsInteger;
      UsValue:= DataSet.FieldByName('count_prog').AsInteger;
    end;
  ado2tb.AddRecord(RecP);

  DataSet.FieldByName('rank').AsInteger :=
  RankIndex(ado2tb, DataSet.FieldByName('count_prog').AsInteger);
end;


Что делает етот код ???
Он загоняет значения одного столбика в список с уникальным идентификатором (для возможности редактирования). 

RecP: TRecord Мой виртуальний список основан на TList (С понятных причин его не выбрасываю напишете сами):

Код

type
  TRecord = record
    UserID: integer;
    UsValue: integer;
  end;


3. В обработчике AfterOpen пишем код   ado2tb.Clear; - очищаем список от значений.
4. В обработчике AfterPost пишем код  

Код

var
  RecP: TRecord;
begin
  with RecP do
    begin
      UserID := DataSet.FieldByName('Auto_Index').AsInteger;
      UsValue:= DataSet.FieldByName('count_prog').AsInteger;
    end;
  ado2tb.AddRecord(RecP);

Изменяем значение которое редактировалось.

4. Сверху пишем 

Код

type
  TIntVec = array of Integer;


5. Сортируем масив методом пузырька (или другим)

Код

procedure BubbleSort(var a: TIntVec);
 var i,p,n: Integer; b: boolean;
begin
 n:= Length(a)-1;
 if n < 1 then exit;
 repeat
  b:= true;
  Dec(n);
  for i:= 0 to n do
   if a[i] > a[i+1] then
    begin
     p:= a[i];
     a[i]:= a[i+1];
     a[i+1]:= p;
     b:= false;
    end;
 until b;
end;


6. И вот сама функция которая отвечает за установку ранга

Код

function RankIndex(lst: TRecordList; ind: integer): integer;
var
  i,k,s: integer;
  mWin: TIntVec;
begin
  SetLength(mWin,lst.Count);

  for i := 0 to lst.Count-1 do
  begin
    mWin[i] := lst.Records[i].UsValue;
  end;

  BubbleSort(mWin);
   s := 0;
    for k := 0 to Length(mWin)-1 do
      begin
        if mWin[k] = mWin[k-1] then
          begin
            if ind = mWin[k] then
               s := s; 
          end
      else
        begin
         if ind = mWin[k] then
            s := k+1;
         end;
      end;
  Result := s;
end;


7. Все ...   smile  Если что то не ясно пишите в личку.

PM   Вверх
Vaskevych
Дата 18.2.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi Developer



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 30.12.2009
Где: UA. Rovno

Репутация: нет
Всего: нет



Добавлю что для пересчета поля CalcFields используйте ф-ю ниже но предварительно проверте открыт ли компонент.

Код

Resync( [rmExact, rmCenter] );

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1074 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.