Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Мне нужно подсчитать сумму поля в рекордсете.
Как я понял Sum и DSum не подходят - что тогда?
19 ноя 03, 18:16    [425167]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Цикл по всем записям.
19 ноя 03, 18:22    [425177]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
а я думал есть что по проще :)
19 ноя 03, 18:26    [425184]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Попроще - Sum и DSum, но не через этот рекордсет.
19 ноя 03, 18:32    [425194]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Попроще - это вот так:
Public Function RSum(R As DAO.Recordset, fld As String)

R.MoveFirst
Do Until R.EOF
RSum = RSum + R(fld)
R.MoveNext
Loop
End Function

19 ноя 03, 18:34    [425201]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Это и есть цикл по всем записям. Только эта программа работать не будет.
19 ноя 03, 18:37    [425205]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Почему не будет?
19 ноя 03, 18:37    [425208]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
А попробуй. Имя функции в правой части оператора присваивания.
19 ноя 03, 18:39    [425210]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
С функцией разобрался - спасибо
---
Не хочу начинать новый топик - спрошу здесь.
   Dim R As DAO.Recordset

Dim Str1 As String

Str1 = "SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, " _
& "(SELECT sum(cash.Эквивалент1) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, " _
& "(SELECT sum(bank.Эквивалент1) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, " _
& "(SELECT sum(cash.Эквивалент2) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, " _
& "(SELECT sum(bank.Эквивалент2) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, " _
& "Стоимость - (SELECT sum(calc.Эквивалент2) from calc WHERE calc.[реф №] = t.[реф №]) AS Доход " _
& "FROM Orders AS t " _
& "WHERE (t.[реф №]=[forms]![форма3]!ref Or [forms]![форма3]!ref Is Null) " _
& "And ((t.[дата начала] Between [forms]![форма3]!dates And [forms]![форма3]!datepo) " _
& "Or ([forms]![форма3]!dates Is Null And [forms]![форма3]!datepo Is Null)) " _
& "And (t.наименование=[forms]![форма3]!direction Or [forms]![форма3]!direction Is Null)"


Set R = CurrentDb.OpenRecordset(Str1)
Me!T1 = R("количество")

Ошибка: "Слишком мало параметров. Требуется 4"
В качестве запроса строка отрабатывается нормально, а вот с рекордсетом проблемы.
19 ноя 03, 18:47    [425225]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Вот.
19 ноя 03, 18:53    [425238]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Витал
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 2021
При формировании запроса динамически через VBA я бы порекомендовал передавать не параметры а значения поелй формы, тогда он и для ADO и DAO сгодится.
вместо
& "WHERE (t.[реф №]=[forms]![форма3]!ref Or [forms]![форма3]!ref Is Null) " 


"WHERE (t.[реф №]= " & forms!форма3!ref & " Or " &  forms!форма3!ref & " Is Null) " 
19 ноя 03, 19:04    [425259]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Витал, тогда можно (и нужно) дальше менять. Если в поле сидит Null, то твоя программа вернет

(пусто) Is Null

что является синтаксической ошибкой. В то же время если в поле сидит Null, то можно этот кусок условия просто не вставлять в селект.
19 ноя 03, 19:11    [425269]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Так что же мне делать? :)
Из сылки Саныча ничего не уловил я, а вариант Витала - это действительно синтаксическая ошибка.
19 ноя 03, 19:28    [425286]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
dim s as string

s="true"
if not([forms]![форма3]!ref Is Null)then
s=s &" and t.[реф №]=" & [forms]![форма3]!ref
endif
if not(([forms]![форма3]!dates Is Null And [forms]![форма3]!datepo Is Null)then
s=s &" and t.[дата начала] Between "
s=s & format([forms]![форма3]!dates, "mm\/dd\/yyyy")
s=s & " And "
s=s & format([forms]![форма3]!datepo, "mm\/dd\/yyyy")
endif
if not([forms]![форма3]!direction Is Null)then
s=s &" and t.наименование=" & [forms]![форма3]!direction
endif
Str1 = "SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, " _
& "(SELECT sum(cash.Эквивалент1) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, " _
& "(SELECT sum(bank.Эквивалент1) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, " _
& "(SELECT sum(cash.Эквивалент2) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, " _
& "(SELECT sum(bank.Эквивалент2) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, " _
& "Стоимость - (SELECT sum(calc.Эквивалент2) from calc WHERE calc.[реф №] = t.[реф №]) AS Доход " _
& "FROM Orders AS t " _
& "WHERE " & s
19 ноя 03, 19:41    [425299]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Спасибо, Саныч
-----
WHERE (t.[реф №]= '" & forms!форма3!ref & "' Or '" &  forms!форма3!ref & "' Is Null)

Однако странно. В А2000 такой вариант не катит - ошибка синтаксиса, а в А2002 все нормально.
20 ноя 03, 13:49    [426260]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
А зачем так писать?

Если forms!форма3!ref - это Null, то пишем

WHERE True (или ничего не пишем)

а иначе

WHERE t.[реф №]= '" & forms!форма3!ref & "'"
20 ноя 03, 14:04    [426305]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
А что значит WHERE True ?
20 ноя 03, 14:14    [426337]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Каждое слово по отдельности понимаешь?

where - отобрать записи, в которых верно условие, поставленное дальше
true - константа, которая всегда true

Итого: отобрать все записи.
20 ноя 03, 14:22    [426366]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, 

(SELECT Nz(sum(calc.Эквивалент2),0) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость,
(SELECT Nz(sum(cash.Эквивалент1),0) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к,
(SELECT Nz(sum(bank.Эквивалент1),0) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б,
(SELECT Nz(sum(cash.Эквивалент2),0) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к,
(SELECT Nz(sum(bank.Эквивалент2),0) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б,
(SELECT Nz(sum(Cash.Эквивалент1),0) from Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
Where Calc.Статус='получено' and cash.[реф №] = t.[реф №]) AS Получено_пост,
Приход_к + Приход_б as Опл_зак,
Расход_к + Расход_б as Опл_фирм,
Стоимость - Себестоимость as Доход
FROM Orders AS t

Если Приход_к = 5, а Приход_б = 6, то Опл_зак = 5
Что это за бред???
Если Расход_к = 2, а Расход_б = 3, то Опл_фирм = 23
22 ноя 03, 02:34    [429191]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
Может, в самой таблице Orders есть поля Приход_к и Приход_б? Тогда он складывает их, а не те, которые описаны в селекте.
22 ноя 03, 14:27    [429310]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Нет нету.
еще заметил одну особенность:
Если Приход_к = 5, а Приход_б = 6, то Опл_зак = 5
Если Приход_б = 6, а Приход_к = 5, то Опл_зак = 65
С Опл_фирм такого не наблюдается
22 ноя 03, 14:34    [429317]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Странно.
Для того, чтобы все правильно считалось необходимо сделать так:
CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак,

CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм
23 ноя 03, 18:45    [429708]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
А сами поля, от которых ты берешь CDbl, - они часом не стринги?

(Я имею в виду Эквивалент1 и Эквивалент2.)
23 ноя 03, 19:02    [429711]     Ответить | Цитировать Сообщить модератору
 Re: Сумма поля рекордсета  [new]
Vsevolod V
Member

Откуда: Россия. Санкт-Петербург
Сообщений: 3194
Нет - "Денежный"
23 ноя 03, 19:09    [429720]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Сумма поля рекордсета  [new]
Anton Klyauzov
Member

Откуда:
Сообщений: 585
Вопрос по ходу дела (у меня MDB 2003, база разделена):

Так как внешний вид (журнал) у меня сделан на ListView, то приходится довольно часто переспрашивать базу об измененияхи и затем заполнять ListView

Быстрее будет пробежаться по полям рекордсета и сосчитать сумму (4 поля - 4 суммы) или выполнить отдельный суммирующий запрос?
10 янв 06, 08:51    [2238205]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить