Такой отчет: как сделать?

spliter
Дата: 02.12.2006 13:03:25
Как сделать отчет следующего вида:

___дата_____ Вх. остаток ___ Приход ___ Расход ___ Исх. остаток
01/10/06______-----------0--------------100-------------50--------------------50
02/10/06______-----------50--------------15--------------0--------------------65
10/10/06______-----------35---------------0-------------40--------------------25
и так далее.

в качестве исходных данных имеем 2 таблицы:

"приход" с полями
-КодПрихода
-ДатаПрихода
-СуммаПрихода
-ИсточникПрихода

и "расход" с полями
-КодРасхода
-ДатаРасхода
-СуммаРасхода
-НазначениеРасхода

таким образом в каждой таблице в может быть несколько записей о приходе (расходе) с одинаковой датой.

ЗЫ на "-" и "_" внимание не заостряйте, я просто не разобрался как можно здесь изобразить таблицу.
ILL HEAD
Дата: 02.12.2006 13:25:31
делаю это тремя запросами (два подчиненных):
- один групповой расход (группировка по датам и сумм по стоиомсти и колич)
- второй групповой приход (группировка по датам и сумм по стоиомсти и колич)
- третий (который собсно вижу) - связанные между собой первый и второй с остаток = прих_кол - расх_кол (связь по коду прихода который прописывается в табл расходе)

тока у вас не видно как приход с раходом связаны . то есть какое поле табл рахода есть внешний на табл приход ?
или у вас как ?
ILL HEAD
Дата: 02.12.2006 13:26:33
зы: сумм по стоиомсти - не читать. только сум по количеству
spliter
Дата: 04.12.2006 09:11:13
to ILL HEAD:

Не все так просто, как представляется на первый взгляд.
Таблицы Приход и Расход между собой никаким образом не связаны. Представьте, что с помощью этих таблиц мы считаем... ну например деньги : )))))).

Допустим 01/10: Иванов принес 75 рублей, Петров принес 25 рублей, Сидорову выдали 50 рублей на покупку кораблей.
02/10 Ляпкин внес 15 рублей, расходов не было, стало быть таблица Расход не заполняется.
10/10 Иванову выдали 40 рублей, поступлений не было, поэтому таблица Приход тоже не заполняется. (В первом сообщении допустил ошибку: входящий остаток на 10/10 составляет 65 рублей.)

Исходя из этого связать эти две таблицы будет проблематично (вернее результат будет корявый).

Я предполагал решить проблему следующим образом (совсем как у Вас):

Делаем запросы на приход и расход (с группировкой по дате и суммой по полю "сумма прихода/расхода").
В третьем запросе связываем два предыдущих запроса по полю дата.

а теперь самый гемморой: как формировать входящий (или исходящий) остаток?
ILL HEAD
Дата: 04.12.2006 09:16:59
ааа.. сорри . глаз замылиный был :)
это жэ не склад!

по вопросу
нарастающий итог на каждую дату в приходе и расходе. их разница (нарастающих итогов) будет остатком
klen_
Дата: 04.12.2006 09:23:00
1. Создай базу или (таблицу), назови её расчёт
2. Все действия или операции записывай в эту базу
например Иванов принёс 75 рублей - это действие запиши как приход
Сидоров получил 50 руб. - это действие запиши как расход
То есть пусть у тебя будет таБлица ОПЕРИЦИЙ (расчёт) и уже с неё получай любые отчёты
ILL HEAD
Дата: 04.12.2006 09:38:56
нарастающий итог - чтото типа такого для прихода
select a.ДатаПрихода, b.нарастающий_итог
from приход as a, (select sum(СуммаПрихода) as нарастающий_итог 
                   from приход as c
                   where a.ДатаПрихода>=c.ДатаПрихода) as b
group by a.ДатаПрихода, b.нарастающий_итог
тоже самое для расхода:
select a.ДатаРасхода, b.нарастающий_итог
from расход as a, (select sum(СуммаРасхода) as нарастающий_итог 
                   from расход as c
                   where a.ДатаРасхода>=c.ДатаРасхода) as b
group by a.ДатаРасхода, b.нарастающий_итог
окончательный:
select запрос1.ДатаПрихода as Дата, (a.нарастающий_итог - b.нарастающий_итог) as остаток
from запрос1, запрос2
where запрос1.ДатаПрихода=запрос1.ДатаРасхода
проблема будет с отсутствием поступлений на дни расхода и наебарот отсутсутствие расходов на день прихода
ну ето вы сами сообразите как %)
spliter
Дата: 04.12.2006 10:56:32
Решением разродился.

Входящий остаток на определенную дату - это сумма всех поступлений с начала по эту дату за вычетом суммы всех расходов с начала по эту дату.

Чтобы решить проблему отсутствия записей в Приходе/расходе делаем так:

Объединем таблицы Приход и расход, затем делаем группировку по дате, получаем что-то вроде списка актуальных дат.

Затем делаем:
1 запрос "Записи без подчиненных" для списка актуальных дат и таблицы приходы (т.е. в этот день был расход, но не было прихода)
2 и делаем запрос на объединение результатов п.1

То же самое делаем по расходам.

По входящим остаткам:

в запрос добавляем таблицы Приходы и Список актуальных дат, не связывая их.
Делаем выражение типа такого IIf([Поступления.Дата]<[Список актуальных дат.Дата];1;0)
затем ставим условие "=1", Группируем по дате и суммируем поступления.

т.о. получаем таблицу с датами и суммами поступлений до этой даты.

Аналогично делаем по расходам.

Затем все это связываем по дате и ...

В общем все работает, но получилось много запросов и кропотливой работы по их разведению. Быть может есть более
эффективная метода???
Chuchi-ptz
Дата: 04.12.2006 11:31:12
spliter
ПОЖАЛУЙСТА покажи пример как ты реализовал этот вопрос!!!!! У МЕНЯ ТАКАЯ ЖЕ ПРОБЛЕМА!!!!!
BoNiM
Дата: 04.12.2006 16:17:01
Создаем запрос А
SELECT ДатаПрихода As d, СуммаПрихода AS prih, 0 As rash FROM Приход
UNION ALL SELECT ДатаРасхода As d, 0 As prih, СуммаРасхода AS rash FROM Расход
Затем
SELECT B.d as Дата, B.nakopl-B.sprih+B.srash As Вх_остаток, B.sprih As Приход, 
B.srash As Расход, B.nakopl As Исх_остаток 
FROM (SELECT A.d, Sum(prih) As sprih, Sum(rash) as srash, (SELECT Sum(C.prih-C.rash) 
FROM A As C WHERE (C.d<=A.d)) As nakopl FROM  A GROUP BY A.d) As B