Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
1-1228049790
Михаил
2008-11-30 15:56
2009.12.13
TChart : BackImage не выводится на принтер.


15-1255375820
Unknown user
2009-10-12 23:30
2009.12.13
Запутался


2-1256209981
Dmitriy
2009-10-22 15:13
2009.12.13
Как создать правильный POST-запрос для E-port?


15-1255125983
Германн
2009-10-10 02:06
2009.12.13
Россия замерла в ожидании футбольного матча с Германией


15-1255284553
Denis123
2009-10-11 22:09
2009.12.13
Проверка сложности пaроля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский