Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Группировка записей в НД   Найти похожие ветки 

 
JS2   (2009-10-22 11:04) [0]

SELECT"ом формирую НД. Получается, к примеру:

item_id | group_id
------------------
2                16
5                16
6                16
17              16
21              22
22              22
36              7
74              7

P.S. ORDER BY group_id

Нужно сделать следующие: пройти по всему набору группируя в сроку Item_id с
одинаковыми group_id + вывод, т.е. для данного примера должно быть так:

1 - ShowMessage -> 2,5,6,17
2 - ShowMessage -> 21,22
3 - ShowMessage -> 36,74

Как бы это написать алгоритм пограмотнее?


 
Sergey13 ©   (2009-10-22 11:08) [1]

> [0] JS2   (22.10.09 11:04)
> Как бы это написать алгоритм пограмотнее?

Так ты же его уже написал

> пройти по всему набору группируя в сроку Item_id с одинаковыми group_id + вывод


 
Л.Д.   (2009-10-22 11:10) [2]


> Так ты же его уже написал


вообщем-то написал, но не совсем удачный, как мне кажется


 
JS2   (2009-10-22 11:10) [3]

Удалено модератором


 
palva ©   (2009-10-22 11:24) [4]

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

Сохраняйте значение group_id в отдельной переменной, и на каждой итерации у вас будет значение group_id на предыдущей итерации.
Если значение group_id на очередной итерации то же самой, что и на предыдущей, то накапливайте item_id в строке для вывода. Если оно другое, то выводите строку в ShowMessage и очищайте ее.
По особому должна быть выполнена самая первая итерация (не выводить ShowMessage), а также следует выполнить дополнительные действия после окончания цикла -  выполнить ShowMessage, если строка вывода не пустая.


 
JS2   (2009-10-22 11:32) [5]


> palva ©


кажется, я так и делал. Вот код:

procedure Tform_Main.Button1Click(Sender: TObject);
var
 ItemIds: string;
 GroupID: Integer;
 field_group_id, field_item_id: TField;
begin
 with DMConnection do
 begin
   field_group_id := query_ByField.FieldByName("group_id");
   field_item_id := query_ByField.FieldByName("item_id");

   query_ByField.First;
   GroupID := field_group_id.AsInteger;
   ItemIds := "";

   while not query_ByField.Eof do
   begin
     if field_group_id.AsInteger = GroupID then
       ItemIds := ItemIds + ", "
     else
     begin
       ShowMessage(ItemIds);
       ItemIds := "";
     end;
     ItemIds := ItemIds + field_item_id.AsString;
     GroupId := field_group_id.AsInteger;

     if ItemIds[1] = "," then
       Delete(ItemIds, 1, 1);

     query_ByField.Next;
   end;
   ShowMessage(ItemIds);
 end;
end;


Посмотрите может есть какие-то упущения?


 
palva ©   (2009-10-22 11:48) [6]


> if ItemIds[1] = "," then
>        Delete(ItemIds, 1, 1);

Вот это непонятно зачем нужно. Тем более, что ItemIds может быть пустой строкой и проверка первого символа может привести к неприятностям.
Перед последним ShowMessage полезно проверить, что строка не пустая. Иначе будет ненужный вывод пустой строки в случае пустого множества записей.


 
palva ©   (2009-10-22 11:54) [7]


>    query_ByField.First;
>    GroupID := field_group_id.AsInteger;

Здесь также будут неприятности, если датасет пустой.


 
JS2   (2009-10-22 12:03) [8]


> если датасет пустой


А если предварительно добавить проверку на пустой датасет имеет ли смысл проверять ItemIds перед Delete(ItemIds, 1, 1) и перед последним ShowMessage.



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1256393458
Lamer6666
2009-10-24 18:10
2009.12.13
Работа с COM портом.


2-1256864358
Тимофей
2009-10-30 03:59
2009.12.13
скриншот заданной области


15-1255851782
POOP
2009-10-18 11:43
2009.12.13
Как сделать, что бы в FAR сохранялась


15-1255282877
fics)
2009-10-11 21:41
2009.12.13
asm


2-1256810464
petvv
2009-10-29 13:01
2009.12.13
Дублируются записи ???