powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Excel с группировкой
5 сообщений из 5, страница 1 из 1
Excel с группировкой
    #38532030
Фотография pipos522
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не могу с отчетом разобраться вроде легко а не получается.
было раньше так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
sele tmp
 locate for kp=0
 if found()
  wait 'Ошибка: Не указан код пр-ва у'+komu window time 3
 endif
 sort on kp,Gdee to temp
 zap
 _Sm=0
 sele 0
 use temp
 go 1
 _kp=kp 

 scan
  if _kp#kp
   sele tmp
   append blank
   replace name with 'Итого пр-во:', kwo with _sm, kp with 99, gdee WITH 'руб'
   _sm=temp.cena*temp.kwo
   _kp=temp.kp
  else
   _sm=_sm+temp.cena*temp.kwo
  endif
  sele tmp
  append blank
  replace name with temp.name, cena with temp.cena, kwo with temp.kwo, gdee with temp.gdee
 endscan
 
 sele tmp
 append blank
 replace name with 'Итого пр-во:', kwo with _sm, kp with 99, gdee WITH 'руб' 
 
 
 sele temp
 use
 delete file temp.dbf
 sele tmp

  && заполнить таблицу 2  
SELECT tmp
  SCAN FOR !EMPTY(name)
 .parent.cells(i,1).value= tmp.name
     .Range(.Cells(i, 1), .Cells(i, 2)).MergeCells = .T.
 .parent.cells(i,3).value= IIF(tmp.cena=0,"",tmp.cena)
      .Range(.Cells(i, 3), .Cells(i, 3)).HorizontalAlignment = 3
 .parent.cells(i,4).value= tmp.kwo
     .Range(.Cells(i, 4), .Cells(i, 4)).HorizontalAlignment = 3    
 .parent.Cells(i,5).value= tmp.Gdee
     .Range(.Cells(i, 5), .Cells(i, 7)).MergeCells = .T.
i=i+1
ENDSCAN  


он работает, "так-то". Пытаюсь сделать попроще. делаю вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
st=st+1
*----------------------------------------------------* 
SELECT tmp2
INDEX ON kp TO kp1.idx
SET INDEX TO kp1.idx
GO TOP 

lnDepartment = tmp2.kp
lcPerson = str(tmp2.kp,4)

lnPersonStartRow = st
*==========================================================*
SCAN 
IF m.lcPerson <> str(tmp2.kp,4)
*==========================================================*
IF m.lnDepartment <> tmp2.kp
  sm = tmp2.cena*tmp2.kwo
  lnDepartment = tmp2.kp
 .parent.cells(st,1).value = 'Итого пр-во:'+' '
 .parent.cells(st,7).value = sm
 .parent.cells(st,8).value = 'руб'

 .Range(.Cells(st,1),.Cells(st,6)).MergeCells = .T.
 .Range(.Cells(st,1),.Cells(st,6)).HorizontalAlignment = 4
 .Range(.Cells(st,7),.Cells(st,7)).HorizontalAlignment = 3	
 .Range(.Cells(st,8),.Cells(st,8)).HorizontalAlignment = 2
st=st+1
ENDIF    
*==========================================================*
ENDIF
 .parent.cells(st,1).value= tmp2.name
 .parent.cells(st,4).value= tmp2.cena
 .parent.cells(st,5).value= tmp2.kwo
 .parent.Cells(st,6).value= tmp2.Gdee
 .Range(.Cells(st,5),.Cells(st,5)).HorizontalAlignment = 3
st=st+1
ENDSCAN 
*==========================================================*
* "=SUM(R17C:R[-1]C"
*  SUM() 
*  CALCULATE  
sm = tmp2.cena*tmp2.kwo
  lnDepartment = tmp2.kp
	.parent.cells(st,1).value = 'Итого пр-во:'+' '
	.parent.cells(st,7).value = sm
	.parent.cells(st,8).value = 'руб'

	.Range(.Cells(st,1),.Cells(st,6)).MergeCells = .T.
	.Range(.Cells(st,1),.Cells(st,6)).HorizontalAlignment = 4
	.Range(.Cells(st,7),.Cells(st,7)).HorizontalAlignment = 3	
	.Range(.Cells(st,8),.Cells(st,8)).HorizontalAlignment = 2
*==========================================================*


и не знаю как сделать для каждой "Группы" "Пр-ва" расчет для всех вот по этой
Код: sql
1.
CALCULATE SUM(cena*kwo) FOR kp = kp TO vsego 

всё расчитывается. (то-есть открываем табл sele идём go top потом начинаем заполнять st=st+1 например и нужно как-то поля я макроподстановкой например A4*B4, A5*B5 результат сплюсовать выложить потом след группа A6*B6... ) если кто-то понял что я имею в виду подскажите как сделать такой итог.
...
Рейтинг: 0 / 0
Excel с группировкой
    #38532091
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pipos522,

В переменной сумму наращивай, а когда начнется новая группа - обнуляй.
...
Рейтинг: 0 / 0
Excel с группировкой
    #38532504
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим, есть некая таблица примерно такого содержания

Код: sql
1.
2.
3.
4.
5.
6.
create cursor curTest (f1 i, f2 i, f3 n(5,2))
insert into curTest (f1, f2, f3) values (1,1,1.10)
insert into curTest (f1, f2, f3) values (3,2,3.20)
insert into curTest (f1, f2, f3) values (1,3,1.30)
insert into curTest (f1, f2, f3) values (3,1,3.10)
insert into curTest (f1, f2, f3) values (1,2,1.20)



Необходимо вывести отчет, сгруппировав по полю f1, а внутри одинакового значения f1 по полю f2. Для каждой группы вывести подитог и общий итог по всему отчету.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
* Сначала надо отсортировать таблицу в порядке возрастания полей f1 и f2
select f1,f2,f3 into cursor curSort from curTest order by f1,f2

* Инициализирую переменные, в которые будут записаны подитоги
Private sumF1, sumF2, sumTotal
store 0.00 to sumF1, sumF2, sumTotal

* Инициализирую переменные, в которые будут записаны код группы ПРЕДЫДУЩЕЙ записи
Private prevF1, prevF2

* Для корректного "входа" в цикл инициализирую их значениями первой записи
* поскольку для первой записи никакой смены группы не происходит
select curSort
go top
prevF1 = curSort.f1 
prevF2 = curSort.f2

* Собственно вывод отчета
select curSort
scan
    * Если значение кодов групп ТЕКУЩЕЙ записи отлично от значений ПРЕДЫДУЩЕЙ записи
    * то надо вывести соответствующий подитог, прежде, чем отображать текущие значения

    * Сначала внутренняя группа
    if m.prevF2 <> curSort.f2
        ?'    Подитог по значению ' + str(m.prevF2) + ': ' + str(m.sumf2,10,2)
        * После вывода обнуляю сумму подитога и обновляю значение кода
        prevF2 = curSort.f2
        sumf2 = 0.00
    endif

    * Теперь внешняя группа
    if m.prevF1 <> curSort.f1
        ?'  Подитог по значению ' + str(m.prevF1) + ': ' + str(m.sumf1,10,2)
        * После вывода обнуляю сумму подитога и обновляю значение кода
        prevF1 = curSort.f1
        sumf1 = 0.00
    endif

    * Вывод очередной строки отчета
    ?'      Следующая строка ' + str(curSort.f3,10,2)

    * Наращивание сумм для подитогов и итогов
    sumF1 = m.sumF1 + curSort.f3
    sumF2 = m.sumF2 + curSort.f3
    sumTotal = m.sumTotal + curSort.f3

endscan

* По окончании цикла надо вывести подитоги по последним подруппам
* На случай, если в таблице вообще не было строк оставляю сравнение,
* поскольку по завершении SACN значения curSort.f1 и curSort.f2 
* будут равны пустому значению. В данном случае - нулю

* Сначала внутренняя группа
if m.prevF2 <> curSort.f2
    ?'    Подитог по значению ' + str(m.prevF2) + ': ' + str(m.sumf2,10,2)
endif

* Теперь внешняя группа
if m.prevF1 <> curSort.f1
    ?'  Подитог по значению ' + str(m.prevF1) + ': ' + str(m.sumf1,10,2)
endif

* И общий итог по отчету
?'ИТОГО по отчету : ' + str(m.sumTotal,10,2)
...
Рейтинг: 0 / 0
Excel с группировкой
    #38538696
Фотография pipos522
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,
не совсем понял вот на этом моменте
Код: sql
1.
2.
3.
* Инициализирую переменные, в которые будут записаны подитоги
Private sumF1, sumF2, sumTotal
store 0.00 to sumF1, sumF2, sumTotal



Отделов очень много и нужно посчитать только в тех в которых были "Изменения", много переменных создавать?
...
Рейтинг: 0 / 0
Excel с группировкой
    #38540583
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pipos522,
Или я чего-то не понимаю, или одно из двух... но этот "страшный" цикл легко превращается в один простенький "select ...,sum(a*b),...from... group by..."
Дальше нужно просто правильно (после нужных строк) расставить итоги. Можно связать две таблицы по kp, а можно еще один селект замутить, где правильно отсортировать (order by...) данные...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Excel с группировкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]