Можно пример..groupBy

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Можно пример..groupBy

Сообщение masygreen »

Ни как не пойму как работатет ...

Код: Выделить всё

_loop aTable
{
  ...
  groupBy g1 : aTable f1
  {
    // g2.grSum( f3 );  тут сумма не доступна
    groupBy g2 : aTable f2
можно пример есть табл ..

Код: Выделить всё

table struct table01
(
  _NrecFPCO:comp,
  _s02:integer
)with index(
  TabPick0=_NrecFPCO
);
допустим таблица заполнена
  • _NrecFPCO | _s02
    Подр 1 | 10
    Подр 2 | 15
    Подр 3 | 5
    Подр 1 | 25
и какой должен быть код? что на выходе получить группировку по подразделению? пробовал в разных вариантах ни че не получается.... к тому же даже визуально это не логично ..:(

Код: Выделить всё

_loop table01
{
groupBy Gr01:table01._NrecFPCO
 {
 }
logstrtofile('c:\1.txt', Gr01.grSum(table01._s02));

}
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

А данные отсортированы по _NrecFPCO? По логике, нет смысла применять оператор к несортированным данным.
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

up

Код: Выделить всё

table struct table01
(
  _NrecFPCO:comp,
  _s02:integer
)with index(
  TabPick0=_NrecFPCO
);
таблица всегда отсортирована по _NrecFPCO .. это я пример фигово написал - но суть от этого не меняетмя
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

Максим, и что у Вас получается в c:\1.txt?
по логике, должно быть 3 строчки: 35, 15, 5
но их последовательность зависит от значений нреков.
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

Подкоректирую вопрос .. а как вывести само поле группировки (в случае с groupBy Gr01:table01._NrecFPCO это table01._NrecFPCO)??

Код: Выделить всё

_loop table01
{
groupBy Gr01:table01._NrecFPCO
 {
 }
logstrtofile('c:\1.txt',table01._NrecFPCO+'--'+Gr01.grSum(table01._s02));

}
в файле получается 1) - двиг суммы т.е.

должно быть
Подр1 25
Подр2 10
Подр3 15
..

а выходит сдвиг
Подр1 10
Подр2 15
..
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

Повторюсь .. если возможно то кусок рабочего кода .. а то в хелпе только схемы ..
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

masygreen писал(а):Подкоректирую вопрос .. а как вывести само поле группировки (в случае с groupBy Gr01:table01._NrecFPCO это table01._NrecFPCO)??

Код: Выделить всё

_loop table01
{
groupBy Gr01:table01._NrecFPCO
 {
 }
logstrtofile('c:\1.txt',table01._NrecFPCO+'--'+Gr01.grSum(table01._s02));

}
в файле получается 1) - двиг суммы т.е.

должно быть
Подр1 25
Подр2 10
Подр3 15
..

а выходит сдвиг
Подр1 10
Подр2 15
..
во-первых, в Вашем примере по Подр1 сумма должна быть не 25, а 35 ;-)

во-вторых, полный код Вы так и не привели, по приведенным фрагментам предположу, что у Вас сдвигается не сумма, а подразделение, т.к. когда отработал GroupBy - текущее подразделение уже де-факто следующее, его Вы и выводите вместе с суммами по группе предыдущего!
masygreen писал(а):Повторюсь .. если возможно то кусок рабочего кода .. а то в хелпе только схемы ..
пожалуйста, причем не кусок, а целиком корректно работающий интерфейс: 8-)

Код: Выделить всё

//--------------------------------------------------------------------------------------------------
Interface DemoGroupBy;
//--------------------------------------------------------------------------------------------------
Table Struct DemoTab
(
  a : word
, b : word
)
with index
(
  iDemoTab01 = a
);
//--------------------------------------------------------------------------------------------------
Create View
from
  DemoTab
;
//--------------------------------------------------------------------------------------------------
Procedure AddRecord(a, b:word);
{
  DemoTab.a := a;
  DemoTab.b := b;
  if insert current DemoTab <> tsOk
    message('Error: record not inserted');
}
//--------------------------------------------------------------------------------------------------
HandleEvent

cmInit:
  {
    MTClear(#DemoTab, mfNormal);  // аналог delete all

    AddRecord(100, 1);
    AddRecord(100, 2);
    AddRecord(100, 3);
    AddRecord(500, 10);
    AddRecord(500, 20);
    AddRecord(999, 555);

    _loop DemoTab
     {
       var aa: word; 
       groupBy Gr1: DemoTab.a
         {
           aa := DemoTab.a;
           logstrtofile('c:\DemoGroupBy.txt', string(DemoTab.a) + ' ' + string(DemoTab.b));
         }

       logstrtofile('c:\DemoGroupBy.txt', 'сумма значений b при a =' + string(aa) + ' равна ' + Gr1.grSum(DemoTab.b));
     }

    abort;
  }

end; // HandeEvent
End. // interface
а вот результат (c:\DemoGroupBy.txt):

Код: Выделить всё

100 1
100 2
100 3
сумма значений b при a =100 равна 6
500 10
500 20
сумма значений b при a =500 равна 30
999 555
сумма значений b при a =999 равна 555
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

заработало :-)
... дока очень тяжелая по этому разделу без нормальных примеров... :-(

спасибо !
  • _loop DemoTab
    {
    var aa: word;
    groupBy Gr1: DemoTab.a
    {
    aa := DemoTab.a;
    logstrtofile('c:\DemoGroupBy.txt', string(DemoTab.a) + ' ' + string(DemoTab.b));
    }

    logstrtofile('c:\DemoGroupBy.txt', 'сумма значений b при a =' + string(aa) + ' равна ' + Gr1.grSum(DemoTab.b));
    }
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

т.е., groupBy всё же работает ;-) , надо просто правильно и своевременно делать вывод (или готовить для него почву)
постараемся более подробно все описать в документации
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

О да работает :) .. на самом деле у меня такое ощущение что этим функционалом ни кто кроме Галактики пользоваться не умеет ... по крайней мере я ни разу на тюмбите такого не встречал ...
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

начиная с сего момента, надеюсь, уже умеем не только мы 8-)
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Полагаю, можно и без aa := DemoTab.a обойтись.
Как? Обычным для всех группировок образом. Все функции для этого есть: max, first....
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

интерфейс с использованием функций агрегирования вместо промежуточных переменных 8-)

Код: Выделить всё

//--------------------------------------------------------------------------------------------------
Interface DemoGroupBy;
//--------------------------------------------------------------------------------------------------
Table Struct DemoTab
(
  a : word
, b : word
)
with index
(
  iDemoTab01 = a
);
//--------------------------------------------------------------------------------------------------
Create View
from
  DemoTab
;
//--------------------------------------------------------------------------------------------------
Procedure AddRecord(a, b:word);
{
  DemoTab.a := a;
  DemoTab.b := b;
  if insert current DemoTab <> tsOk
    message('Error: record not inserted');
}
//--------------------------------------------------------------------------------------------------
HandleEvent

cmInit:
  {
    MTClear(#DemoTab, mfNormal);  // аналог delete all

    AddRecord(100, 1);
    AddRecord(100, 2);
    AddRecord(100, 3);
    AddRecord(500, 10);
    AddRecord(500, 20);
    AddRecord(999, 555);

    _loop DemoTab
     {
       groupBy Gr1: DemoTab.a
         {
           logstrtofile('c:\DemoGroupBy.txt', string(DemoTab.a) + ' ' + string(DemoTab.b));
         }

       logstrtofile('c:\DemoGroupBy.txt', 'сумма значений b при a = ' + Gr1.grFirst(DemoTab.a) 
                  + ' равна ' + Gr1.grSum(DemoTab.b)
                  + ', количество итераций: ' + Gr1.grCount));
     }

    abort;
  }

end; // HandeEvent
End. // interface
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

О_о
Ответить