Главная страница
    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.009 c
11-1180442897
=BuckLr=
2007-05-29 16:48
2009.12.13
Collapse и USE_MHTOOLTIP


15-1255863244
POOP
2009-10-18 14:54
2009.12.13
Если в bat файле


2-1256277237
kyn66
2009-10-23 09:53
2009.12.13
Подсчет среднего значения с нулевыми числами


1-1228663490
dmitry_12_08_73
2008-12-07 18:24
2009.12.13
Отображение нестандартных комбинаций горячих клавиш в меню


15-1255465807
Юрий
2009-10-14 00:30
2009.12.13
С днем рождения ! 14 октября 2009 среда





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский