powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Нарастающий итог
19 сообщений из 19, страница 1 из 1
Нарастающий итог
    #33312865
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго утра!
Есть таблица:
Код: plaintext
1.
2.
3.
1 | 01.01.2005 | 25 | 50
2 | 01.01.2005 | 28 | 70
3 | 05.02.2005 | 32 | 40
4 | 06.02.2005 | 45 | 60
и т.д.
Как получить нарастающий итог по последнему столбцу? Нужно получить:

Код: plaintext
1.
2.
3.
1 | 01.01.2005 | 25 | 50 | 0
2 | 01.01.2005 | 28 | 70 | 50
3 | 05.02.2005 | 32 | 40 | 120
4 | 06.02.2005 | 45 | 60 | 160
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312878
Если речь идёт о .mdb формате (сеанс телепатии)

Напишите функцию, и вызывайте её из запроса. Статическую таблицу в таком виде как вы описали не получить - только основанный на ней запрос.
Если же речь идёт имено о таблице и сохранении в ней данных сальдо (это так называется) то без пр-ры (или запроса UPDATE бла-бла) которая будет считать это сальдо махом и записывать рез-т в поле, тоже ничего не получится.

Мой совет: сделайте view (сохранённый запрос) и вызывайте что-нибудь в таком духе.

Public Function qfSumField(Optional vVar As Variant) As Double
'Ревизия: 26.07.05 ****** *.*.
'ф-ция суммирования полей в запросе с накоплением qfSumField(ПОЛЕ) AS Summa
'возвращает тип Double (сквозное сальдо) в зависимости от сортировки запроса,
'gdSumQdf - глобальная переменная, перед вызовом нового запроса (отчёта) обнулить,
'если не нужен сквозной итог по нескольким запросам или отчётам.
'--------------------------------------------------------------------------------

If IsMissing(vVar) Then 'если значение не передано -
gdSumQdf = 0 'обнулить в любом случае
Else
gdSumQdf = gdSumQdf + Nz(vVar, 0) 'прибавить не null-евую сумму
End If
qfSumField = gdSumQdf 'вернуть в поле запроса

End Function

Можно использовать статическую переменную внутри ф-ции, у меня была необходимость именно глоб.перем.
Внимание! Эта функция работает не совсем так, как вы показали на таблице, первая строчка запроса будет не (0) (интересно, чем обусловлено такое написание сальдо? ПМСМ, оно не совсем верное - первое сальдо должно быть 50, иначе у вас получается смещение на дату, запаритесь стыковать с отчётами, работающими по чёткой дате дня, например.)

Но если вам, действительно нужно именно ТАК, модифицируйте код чут-чуть (одна строка) - как, догадайтесь сами. ;-)

З.Ы. На больших объёмах скорость такого решения невысокая. Если вы вуерены на всё 100%, что пустых значений не передаётся в код, уберите If-ы, оставте простое суммирование (ой, не зарекайтесь), это даст прирост в скорости. Но, всё равно, функции Акса на ВБА, лучше накладывать на результирующие наборы данных.

И куда на этом форуме девается нафиг красивое форматирование текста? Стараешься, структурируешь код, глаз радуется - постишь и грусть-тоска... всё в кашу. Табы и те порезали... Рич текст формат...

З.Ы. О! Я проснулся! Суббота, 8:00, на работе, головой на ноутбуке... Аднака...
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312884
Перечитал ещё раз ваше ТЗ. Поправте представление сальдо! Пока не поздно.
Показываю простой фокус:
Давайте спросим вашу шуструю программу - какое кол-во (не знаю чего это) за 01.01.2005?

Результирующее представление (таб2): строка1 + строка2 = 50.

Ага. Замечательно. А если запросить исходную таблицу, ведь результирующая основывается на ней. Логично? Ну надо проверить корректность расчётов, от балды. Делаем.

Исходная таблица (таб1): строка1 + строка2 = 120.

50 <> 120

Хм-м... Кажется, начались проблемы. Понимаете? А теперь представте пол-миллиона таких записей за год (для Акса это не предел - табличка не широкая).
В общем, спросили одно, я вам советую для начала другое. :-) Поправте представление сальдо.

Оно должно быть таким:
1 | 01.01.2005 | 25 | 50 | 50
2 | 01.01.2005 | 28 | 70 | 120
3 | 05.02.2005 | 32 | 40 | 160
4 | 06.02.2005 | 45 | 60 | 200
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312893
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в фак
оба
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312907
2 nibbles

MS SQLServer, Transact-SQL...
declare @tot_sum decimal(10,2)
set @tot_sum = 0

И каким боком это к вопросу об Аксесе и .mdb, уважаемый?
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312910
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ТеньОтцаГамлета
Почитайте фак внимательнее - предлагаемое там решение очень легко адаптируется к Access
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312914
И вообще, цитата предыдущего моего поста: "Статическую таблицу в таком виде как вы описали не получить - только основанный на ней запрос.
Если же речь идёт имено о таблице и сохранении в ней данных сальдо (это так называется) то без пр-ры (или запроса UPDATE бла-бла) которая будет считать это сальдо махом и записывать рез-т в поле, тоже ничего не получится."
И чем это противоречит тому, что написано в ФАК-е? Пускай и на T-SQL...
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312916
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ТеньОтцаГамлета
не надо ля-ля... ниже я привел запросы для Access, который, по-Вашему, там невозможно написать (разберетесь, как их юзать?)... и вообще - идите-ка на www.sql-ex.ru - дойдете там до 100-го упражнения и убедИтесь, что можно получить выборку практически любой сложности.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table tblTemp(id int, sum1 decimal( 10 , 2 ), tot_sum decimal( 10 , 2 ))

insert tblTemp(id, sum1) values( 1 ,  50 )
insert tblTemp(id, sum1) values( 2 ,  70 )
insert tblTemp(id, sum1) values( 3 ,  40 )
insert tblTemp(id, sum1) values( 4 ,  60 )

-- Вариант нарастающего итога, исключая текущую запись
select a.id, max(a.sum1) as sum1, sum(isnull(b.sum1,  0 )) as tot_sum
from tblTemp as a left outer join tblTemp as b on b.id < a.id
group by a.id
-- Вариант нарастающего итога включая текущую запись
select a.id, max(a.sum1) as sum1, sum(isnull(b.sum1,  0 ))+max(a.sum1) as tot_sum
from tblTemp as a left outer join tblTemp as b on b.id < a.id
group by a.id

-- А это - оптимальный вариант, предложенный Oracle - оба варианта
select id,sum1,(select sum(isnull(t_2.sum1, 0 )) 
				from tblTemp t_2 where t_2.id<t_1.id) as saldo
from tblTemp as t_1
select id,sum1,(select sum(isnull(t_2.sum1, 0 )) 
				from tblTemp t_2 where t_2.id<=t_1.id) as saldo
from tblTemp as t_1

drop table tblTemp
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312919
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно заменить:
decimal(10,2) на Decimal
insert на insert into
isnull на nz
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312920
Сударь, про ля-ля забудьте. В детском саду мы с вами в один горшок не делали.

Я предложил человеку не ФАК с адаптацией, и не к Гетцу послал, в магазин "Книги Нижневартовска", а конкретное решение для его задачи. Только предложил исправить представление сальдо, ибо, мой личный опыт говорит о том, что с таким представлением сальдо (наверняка это ему нарисовал заказчик-учётчик-бухгалтер) получится каша. Я на эти грабельки наступал, году так в 98-м. Как вспомню, так вздрогну...
Вот и предложил (не потребовал). И пример привёл, самый простой, что оказался под рукой. ПМСМ, ему уже решать - менять или нет, применять или отказаться.

А к ФАКу нет претензий. ФАК - просто информация к размышлению, а не панацея на все случаи жизни. И решение описано интересное, гимнастика для ума, но лично я его на "боевом" проекте НЕ применил бы! На это есть ВЕСКИЕ, ПМСМ, причины, выходящие за рамки этого топика.

З.Ы, Фак читал внимательно. Чесслово. :-) И не сегодня. И даже не в этом году. И даже не на этом сайте.
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312921
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТеньОтцаГамлетаИ вообще, цитата предыдущего моего поста: "Статическую таблицу в таком виде как вы описали не получить - только основанный на ней запрос.
Если же речь идёт имено о таблице и сохранении в ней данных сальдо (это так называется) то без пр-ры (или запроса UPDATE бла-бла) которая будет считать это сальдо махом и записывать рез-т в поле, тоже ничего не получится."
И чем это противоречит тому, что написано в ФАК-е? Пускай и на T-SQL...
Не Вы являетесь автором топика. А автор ни гу-гу не сказал о том, что ему нужна еще одна таблица, в которой будет добавлено поле с нарастающим итогом. Не умножайте сущностей сверх необходимого - пользуйтесь запросами\представлениями, они для того и были придуманы
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312927
И в этом "...и убедИтесь, что можно получить выборку практически любой сложности." я даже не сомневаюсь. Мало того, это моя работа и делаю я её каждый день.

"Не умножайте сущностей сверх необходимого"
Золотые слова. View не сущность, а представление. Сущность - сохранение значения сальдо в поле в виде готового и неизменного результата, и при изменении любого количества задним числом, конвульсивный пересчёт всех сальдо, сохранение, вперёд и с веером... Именно это я пытался донести. Но опять-же, если требования сохранить именно в таблице (посмотрите мой пост), то это совсем другая песня, и я её не словом ни обрисовал.

З.Ы. Вот так всегда, захочешь помочь человеку конкретным примером на конкретное условие, пошлют тебя в ФАК, по немного другому поводу, с немного другими исходными... и в общем, да ну вас... суббота, утро и все уже злые...
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312931
И вообще, с чего вы взяли, что я предлагал ещё одну таблицу? Вы где это прочитали? Я предлагал запрос (view) SELECT бла-бла, qfSaldo(бла-бла) AS SaldoMaldo... и т.п. Где здесь ещё одна сущность? Это просто вычисляемое поле. Самым простым способом в Аксе - пользовательская функция ВБА. И даже не собираюсь дискутировать по поводу вреда-пользы, эффективности-вредности пользовательских функций. Я предложил простое решение.
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312932
Фотография nibbles
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно-ладно, не обижайтесь - действительно был резок - и голова действительно побаливает после вчерашнего "банно-стаканного"... :)
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312938
Ок. Принято. :-)

2 xax_nv: Пардон за флейм. :-) Тут на форуме все немного ненормальные. И я в том числе. Только тронь...

З.Ы.
А я вот 3-й день у заказчика, с раскладушкой и тапочками... (вычеркнуто цензурой)...
...
Рейтинг: 0 / 0
Нарастающий итог
    #33312994
Фотография xax_nv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Ребята, давайте жить дружно!"
Извиняюсь, что завел тему и сбежал. Товарищ-гуманитарий затеял ремонт, пришлось помогать ему с электрикой. Пока бегло пробежал по топикам, сейчас буду вникать в суть предложений и советов. Спасибо за активное участие.
...
Рейтинг: 0 / 0
Нарастающий итог
    #33317225
Евгений1234-5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет Всем !
Не знаю надо ли это автору, но если в его таблице появится строка 5 и нарастающий итог должен быть выстроен по дате то запрос надо переделывать. (например нумеровать самостоятельно с учетом даты)
id dte f1 f2 1 01.01.2005 25 50 2 01.01.2005 28 70 3 05.02.2005 32 40 4 06.02.2005 45 60 5 01.01.2005 100 100

ЗЫ Проститес за древневатость поднятого топика
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Нарастающий итог
    #37998846
Aeliot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений1234-5,

И что делать в таком случае?
...
Рейтинг: 0 / 0
Нарастающий итог
    #37998869
Aeliot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aeliot,

Нашёл. Выглядит примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT a.[КодПлатежа], max(a.Сумма)*IIf((a.Направление=2),(-1),(1)) AS sum1, sum(nz(b.Сумма,0))+max(a.Сумма*IIf((a.Направление=2),(-1),(1))) AS tot_sum, a.[ДатаПлатеж]
FROM (SELECT t1.КодПлатежа, t1.Сумма, t1.Направление, t1.ДатаПлатеж
FROM тДолги as t1
ORDER BY t1.ДатаПлатеж)
 AS a LEFT JOIN (SELECT t2.КодПлатежа, t2.Сумма, t2.Направление, t2.ДатаПлатеж
FROM тДолги as t2
ORDER BY t2.ДатаПлатеж) AS b ON b.[КодПлатежа] < a.[КодПлатежа]
GROUP BY a.[КодПлатежа], a.[Направление], a.[ДатаПлатеж];
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Нарастающий итог
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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