Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Суммирование в субформе


Автор: Woodlin 15.9.2009, 11:30
Доброго времени суток.

Подскажите как можно суммировать записи в субформе, в моём случае это будет поле [Сумма документа], по условию, [Дата документа] за январь.

Пробовал суммировать через DSum непосредственно из таблицы, но не получается, так как попадаются повторяющиеся записи и они суммируются.
У меня получилось что то вроде этого, но как сюда вставить группировку записей ума не приложу
Код

Me.Поле2 = DSum("[Сумма документа]", "2009", "[Дата документа] between #1/1/2009# and #1/31/2009# and 
[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] 
WHERE [Выбираемые КБК].Флажок = true) and [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато 
FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)")




В субформе же отображены записи какие нужно и их хотелось бы просто суммировать.

Автор: bopoha 15.9.2009, 16:55
Да, DSum не потдерживает группировок. На этот случай есть DAO:
Код

Dim rst as DAO.Recordset

Set rst = CurrentDb.OpenRecordset("SELECT sum(*) as sum FROM ...", dbOpenForfardOnly)

if Not rst.EOF Then
    Me.Поле2 = nz(rst("sum"), 0)
End if

rst.Close


P.S. Вроде можно было в примечании формы написать выражение в источнике данных "=Sum(поле)". Но я не помню этих обстоятельств.

Автор: Woodlin 17.9.2009, 08:04
bopoha, 

Цитата

Dim rst as DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT sum(*) as sum FROM ...", dbOpenForfardOnly)
if Not rst.EOF Then
    Me.Поле2 = nz(rst("sum"), 0)
End if
rst.Close


для меня это пока что слишком круто, будем разбираться. Пока что сделал обращение DSum к запросу с группировкой записей.

Только суммирование полей [Сумма документа] по дате у меня как то интересно:
вот кусок кода: [Дата документа] Like ""*.01.2009"", чтоб суммировать записи за январь

а в таком виде код почему то не работает: [Дата документа] Like ""*.1.2009"" , а мне в дальнейшем хотелось бы запустить цикл чтоб все месяцы перебирались автоматически

Автор: bopoha 17.9.2009, 09:44
Woodlin, для дат есть спец. функции Month() - месяц, Year() - год.

Добавлено через 1 минуту и 2 секунды
Цитата(Woodlin @  17.9.2009,  08:04 Найти цитируемый пост)
а в таком виде код почему то не работает: [Дата документа] Like ""*.1.2009"" 

Потому что движок преобразует дату в строковый формат в зависимтости от региональных настроек. А это будет ввиде 00.00.0000.

Автор: Woodlin 17.9.2009, 10:59
bopoha, 
Точно, получилось

Никогда бы не догадался написать Month([Дата документа])="номер месяца"
Спасибо!!!

Автор: Woodlin 18.9.2009, 06:20
bopoha, 
Едрить... снова упёрся.
Я наверное Вас уже задолбал, но не пойму почему Month([Дата документа])= i в цикле работать не хочет, если вместо i вручную ставлю число месяца от 1 до 12 всё работает
Код

Dim KBK_cnt As Integer         'количество записей КБК с вкл. флажком
Dim OKATO_cnt As Integer       'количество записей Окато с вкл. флажком
Dim i As Byte                          'счетчик от 1 до 12

KBK_cnt = DCount("[Флажок]", "[Выбираемые КБК]", "[Флажок]=true")
OKATO_cnt = DCount("[Флажок]", "[Выбираемые ОКАТО]", "[Флажок]=true")

With Forms![Подчиненная Свод Сумма]
  If KBK_cnt > 0 And OKATO_cnt > 0 Then
    For i = 1 To 12
      .Controls((i - 1) * 2) = DSum("[Сумма документа]", "2009 по месяцам", " Month([Дата документа])= i ")
    Next i

  End If
End With

Автор: Akina 18.9.2009, 07:38
Да потому что выполняется сравнение именно с i, а не с его значением в программе
Код

.Controls((i - 1) * 2) = DSum("[Сумма документа]", "2009 по месяцам", " Month([Дата документа])= " & CStr(i) )


Автор: Woodlin 18.9.2009, 08:45
Akina, 
Спасибо за помощь, буду знать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)