powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Шаблон: Ресурсы накопления
5 сообщений из 5, страница 1 из 1
Шаблон: Ресурсы накопления
    #35711878
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
продолжаем тему шаблонов

Позволяет консолидировано хранить движения и быстро получать остатки ресурсов по заданным измерениям.

Структура:

Таблица TurnoverTable движения ресурсов
Код: plaintext
1.
2.
3.
4.
UID:UID уникальный ключ
Period: date/datetime not null Момент движения
Debet: boolean not null, true – увеличение ресурса, false - уменьшение 
<Измерения> Измерения разрезов ресурсов
<Ресурсы> Аккумулирующие ресурсы

Индексы:
1. Period
2. <Измерения>

Таблица BalanceTable остатки ресурсов (формируются по периодам, например, ежемесячно) Напрямую изменять записи нельзя!
Код: plaintext
1.
2.
3.
UID:UID уникальный ключ
Period: date/datetime not null Начало следующего периода
<Измерения> Измерения разрезов остатков ресурсов
<Ресурсы> Остатки ресурсов

Индексы:
1. Period, <Измерения> уникальный!
2. <Измерения>

Методы выборки:

Код: 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.
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.
Balance (Point:date/datetime): table(<Измерения>, <Ресурсы>)
//остатки ресурсов на дату/время по всем измерениям
Select <Измерения>, SUM(<Ресурсы>)
From
	(Select <Измерения>, <Ресурсы>
	From BalanceTable
	Where (Period=BeginPeriod(Point))
	Union All
	Select <Измерения>, 
Case 
When Debet Then <Ресурсы>
Else -<Ресурсы> 
End 
	From TurnoverTable
	Where (Period between BeginPeriod(Point) and Point))
Group by <Измерения>

DimensionBalance (Point:date/datetime , dimension:<Измерения>): <Ресурсы>
//остатки ресурсов на дату/время по одному набору измерений
Select <Измерения>, SUM(<Ресурсы>)
From
	(Select <Измерения>, <Ресурсы>
	From BalanceTable
	Where (Period=BeginPeriod(Point)) and (dimension=<Измерения>)
	Union All
	Select <Измерения>, 
Case 
When Debet Then <Ресурсы>
Else -<Ресурсы> 
End 
	From TurnoverTable
	Where (Period between BeginPeriod(Point) and Point) and (dimension=<Измерения>))

TurnoverAndBalance (BeginPoint, EndPoint:date/datetime): table(<Измерения>, BeginBalance, DebetTurnover, CreditTurnover, EndBalance: <Ресурсы>)
//движения и остатки ресурсов за период по всем измерениям
Select <Измерения>, SUM(BeginBalance), SUM(DebetTurnover), SUM(CreditTurnover), SUM(BeginBalance)+SUM(DebetTurnover)-SUM(CreditTurnover)
From
	(Select <Измерения>, <Ресурсы> as BeginBalance, null as DebetTurnover, null as CreditTurnover
	From Balance (BeginPoint)
	Union All
	Select <Измерения>, 
Case 
When Debet Then <Ресурсы>
Else -<Ресурсы> 
End,
Case 
When Debet Then <Ресурсы>
Else null 
End,
Case 
When Debet Then null
Else <Ресурсы>
End
	From TurnoverTable
	Where (Period between BeginPoint and EndPoint))
Group by <Измерения>
Триггеры:

Код: 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.
25.
26.
TurnoverTable.OnAfterInsert
CurrentPeriod := AddPeriod(StartPeriod(new.Period));
If new.Debet then
	K:= 1 
Else
	K:=- 1 ;
If (Select Count(*) From BalanceTable Where (<Измерения>=new.<Измерения> and Period= CurrentPeriod) =  0 
Then
	Insert BalanceTable(Period, <Измерения>, <Ресурсы>) Values (CurrentPeriod, new. <Измерения>, K*new.<Ресурсы>)
Else
	Update BalanceTable
	Set <Ресурсы>:=<Ресурсы>+K*new.<Ресурсы>
	Where (<Измерения>=new.<Измерения> and Period>=CurrentPeriod);

TurnoverTable.OnAfterDelete
CurrentPeriod := AddPeriod(StartPeriod(new.Period));
If new.Debet then
	K:= 1 
Else
	K:=- 1 ;
If (Select Count(*) From BalanceTable Where (<Измерения>=new.<Измерения> and Period= CurrentPeriod) =  0 
Then
	Insert BalanceTable(Period, <Измерения>, <Ресурсы>) Values (CurrentPeriod, new. <Измерения>, -K*new.<Ресурсы>)
Else
	Update BalanceTable
	Set <Ресурсы>:=<Ресурсы>-K*new.<Ресурсы>
	Where (<Измерения>=new.<Измерения> and Period>=CurrentPeriod);
...
Рейтинг: 0 / 0
Шаблон: Ресурсы накопления
    #35767868
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как-то вот так можно обобщить регистр накопления остатков (аналог 1С).
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
TBalanceRigister<A,B,C>=generic

	table TurnoverTable
		Period: datetime not null;
		Debet: boolean not null;
		Dimension: A;
		Resource: B;
		Information: C;
	end;

	table BalanceTable
		Period: datetime not null;
		Dimension: A;
		Resource: B;
	end;

	function Balance<X,Y>(Point:datetime; Filter:function(A,B):boolean=((p,q)=>true); GroupBy:function(A):X=(p=>p); SumBy:function(B):Y=(p=>p)):table(Dim:X,Res:Y);
	begin
		for select GroupBy(Dimension) as Dim, SUM(SumBy(Resource)) as Res
			from
			(	select Dimension, Resource
				from BalanceTable
				where (Period=BeginPeriod(Point))
				union all
				select Dimension, 
					case 
					when Debet then Resource
					else -Resource
					end
					from TurnoverTable
				where (Period between BeginPeriod(Point) and Point)
			)
			where Filter(Dimension, Resource)
			group by GroupBy(Dimension) do
				yield (Dim,Res);
	end;

end;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Шаблон: Ресурсы накопления
    #38746187
prog123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вредная галиматья. Вы пытаетесь построить учет при игнорировании принципа двойной записи. В сад!
...
Рейтинг: 0 / 0
Шаблон: Ресурсы накопления
    #38746188
prog123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У 1С так сделано от бедности , ибо они так не смогли создать универсальный справочник
У них все время меняется структура базы, - та еще запарка.
...
Рейтинг: 0 / 0
Шаблон: Ресурсы накопления
    #38746675
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prog123,

Это смотря какой учет пытаться строить.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Шаблон: Ресурсы накопления
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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