powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структура таблицы бухгалтерских проводок не дает покоя !!!!
25 сообщений из 43, страница 1 из 2
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32351546
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Опять пытаюсь узнать ваше мнение по стругтуре таблицы для бухгалтерских проводок...
Оч. хочется создать более менее унифицированую бухгалтерскую подсистему в своей программе чтобы там уживалась как основная деятельность (лизинг и кредитование, и учет любой прочей хозяйственной деятельности - аренда, зарплаты, покупка продажа основных средств и тому подобное).

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

2. Возможность нормально регистрировать различные хоз операции, любые непредусмотренные (тоесть бухгалтер может создавать аталитики для счетв и проводить с ними операции и т.д.)

Теперь я сомневаюсь как хранить привязку проводок к аналитикам счетов, т.к. 90% а может и больше проводок идут имено по основной деятельности по лизингу и происходят в пределах одного договора. Чтобы быстро получать все необходимые отчеты и остатки по договорам достаточно к каждой проводке добавить ID договора и все работает очень быстро и красиво. Причем если добавить ID_K и ID_D тоесть договор дебетного счета и договор кредитоного счета то расчет остатков производиться в два раза дольше (а таких проводок 1% не больше) потому выгоднее проводки между счетами двух разных договорами делать через промежуточный счет двумя операциями.

Так вот для реализации рагистрации различных хоз. операций и т.д. надо вобще возможность хранить в проводке аналитики не только договора но и какието другие неизвестные. Возможно также необходима возможность привязать несколько различных видов аналитик к проводке (доп. связанная таблица таблица) причем и к дебетному счету и кредитному счету, все это должно дать возможность бухгалтерам свободно учитывать различные хоз. операции. Но из за этих 7-10% проводок время получения отчетов и разноски по аналитикам 90% проводок основной деятельности будет в десятки раз медленней !!

У когонибудь была подобная сутуация ? Что вообще теоретически можете посоветовать в данном случае ?

Большое всем кто до читал до сюда (особенно тем кто что-то понял ! :))
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32352813
Alex S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брр... не совсем понял, но кину свои 3 копейки.
А что тебе мешает хранить так:
1)Табличка "Хоз.Операции" где будеш хранить ссылки на договора и прочее.
2) Табличка "Проводки" где будет ссылка на хоз. операцию
3) Табличка "Движение по аналитики" где у тебя тож будет ссылка на хоз. операцию

Или я не так тебя понял?
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32352920
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен с Алексом.
1. Хоз операция
- №пп
- Дата
- От кого
- Кому
- Сумма
Основание
- Тип (допустим ДОГ.-Договор)
- №
- от
2. Журнал проводок
- Связь с Хоз.опер.
- Номеклатура
- Дт
- Аналитика 1ур. (поле со списком - данные из справочника)
- Аналитика 2ур.
... сколько надо
- Кт
- Аналитика 1ур.
- Аналитика 2ур.
... столько сколько по Дт
- Кол-во
- Цена
- Сумма

ВОТ ВРОДЕ БЫ И ВСЕ!!!
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32353895
gringo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> DIGITALPRO

не совсем согласен
если по хоз. операции идут 2 и более договоров?

например, всякого рода взаимозачеты?
у нас поэтому договора хранятся как аналитика к проводкам
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32354150
Alex S.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весело. Только насколько мне известно хоз. операция создается на основании документа. Ну и сделай 2 и больше договора, элементами документа.
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32355961
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так ... я уже думал ни у кого нет никаких мыслей по этому поводу ... :)
в принципе я так примерно и планировал хранить проводки :
1.хоз операции
2.проводки привязаные к ним
но главный вопрос был как в проводке хранить связь с аналитикой

пара вопросов :
то Alex S.

>3) Табличка "Движение по аналитики" где у тебя тож будет ссылка на хоз. >операцию

что из себя представляет эта табличка ?

то DIGITALPRO

- Аналитика 1ур. (поле со списком - данные из справочника)
- Аналитика 2ур.

что значит данные из справочника ? данные из какого справочника ? например у меня куча справочников ... или вы заводите один общий для всех аналитик ?

как я понимаю вы предлагаете хранить аналитики и дебета и кредита в одной проводке ?

в основном меня интересовали мысли по поводу того как хранить аналитику в проводке. В общем случае нужно чтобы и для дебета и для кредита была возможность ввести несколько аналитик (это позволяют нормальные бухгалтерские программы), в упрощенном варианте это одна аналитика для одного счета (простые бух. программы).

В вою очередь обычно 95% проводок содержат и Дебете и Кредите одну и ту же аналитику (проводка в пределах одного договора). Если деть вариант где дебета и кредита свои аналитики то при вычислении остатков придеться групировать записи два раза вместо одного (в случае когда у нас п проводке одна аналитика и для дебета и для кредита, а проводки между аналитиками идут через промеж. счет)
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32356348
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dennis_L

(лизинг и кредитование, и учет любой прочей хозяйственной деятельности - аренда, зарплаты, покупка продажа основных средств и тому подобное).

Послушайте совета - купите готовую - научитесь с ней работать и будете ценным специалистом (той же Axapt'ы). Время кустарного/накаленного программирования проходит. Сейчас уже нет нужды изобретать велосипеды!
Более того (только не обежайтесь) - тот функционал, который вы привели - это как минимум год работы для команды с хорошим постановщиком и архитектором знакомым с предметной областью. Спрашивая о труктуре проводок вы автоматически из этих категорий себя исключаете - так что у вас нету шансов такое написать - не тут так та примете неверное архитектурное решение - и проекту конец

P.S> никаких обид - наоборот стараюсь предостеречь от напрасного труда. Мой совет - начинайте изучать какую-нибудь ERP - и в автоматизации предприятия разберетесь - и ценные навыки приобретете
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32357196
someone312002
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эт конечно же хорошо - покупать готовую и пользоваться ею (при наличии "мозгов" для пользования)... Правда, по собственному опыту скажу - Аксапта довольно-таки тяжела.
По сути вопроса: Dennis_L ,ты сказал одну "ключевую" фразу - организовать бухгалтерские проводки ... Надеюсь, с бугалтерией вообще ты знаком... Объяснять не понадобится, что некоторые операции дебетуют тебя, некоторые - кредетуют... В результате чего твоё "состояние" либо увеличивается, либо уменьшается. Отсюда и плясать будем. Что имеем ? Операция, Клиент, Товар. Что ещё ? Документ. Для всего этого тебе ещё понадобятся "классифицирующие" справочники по типам операции, типам документов, типам товара, единиц измерения товара. Заметь - это как минимум. Дальше всё просто. Составляешь "описание" для каждого из "основных объектов" - вот тебе уже и таблицы. В них проставь ключи на классификаторы, связи между ними. Отработай "систему" движения данных для каждой операции будь то : заключение договора, оплата договора, оплата товара по заключённому договору (часть товара, долгоиграющий договор), выписка накладной для склада (коли он есть), выдача чека (если есть касса), выдача результирующих (ежемесячные, годовые отчёты) данных по...

Сложно ? Но можно!!!
УДАЧИ!!!


"...я не волшебник - я только учусь" (с)
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32358156
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насчет аксапты я не против ее изучить и т.д. а вы можете подсказать где можно было бы получить доступ к описанию или демо версии и т.д. ?

но в свою защиту :)) погу только сказать что один такой проект мне удалось запустить и все работает в компании с портфелем в 200 000 000 USD в котором около 20 000 договорв и работает непосредстванно с ней 60 человек.
Но в этой системе бухгалтерская часть сделана так чтобы хорошо работать с конкрентным направлением безнеса но вести учет произвольных бугалтерских операций не удобно (этого и ненадо т.к. фирма использует большую корпоративную бух. систему куда ипортируються проводки по основному виду деятельности + там же и регистрируються др. хоз. операции)

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

то someone312002 :
Идея вполне понятна ... но я какраз хотел услышать мнения людей которые делали для своих программ бух. подсистему как они организовывали таблицу проводок и ее связь с аналитиками (класифицирующими справочниами) , причем конкрентые примеры а не абстрактные рассуждения ...
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32358200
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri а вы не вкурсе сколько примерно стоит axapta ? дело в том что директор компании которая у меня заказала новую систему являеться финансовым директором в более большой компании где он сейчас занимаеться вводом именно axapt-ы и у него не возникало даже никаких мыслей по поводу того что вместо того чтобы использовать мою программу можно было бы поставить axcapt-у .... и я незнаю почему но спрашивать тоже не хочеться
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32358220
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не спецалист по erp-системам - так что врать не буду - но думаю стоит она не мало
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32358226
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и потом - на axapta`е свет клином не сошелся - есть разные предложения для разных заказчиков - так что просто надо изучить рынок - но повторюсь - дело это перспективное и у вас не будет складываться впечатление что делается никому не нужная работа (хотя кто знает )
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32358457
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня какраз не складываеться впечатление о том что делаеться ненужная работа, какраз такки у заказчиков часто складываеться впечателение что при покупке больших EPR систем они заплатят много денег за чужую работу над функциями программы которые им не нужны или не очень нужны ...
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32359960
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализация принципа двойной записи для общего случая
))На DB2
Могу выслать приложение которое тестирует эту модель.
Генерит N - ное количество счетов, делает по ним N проводок,
формирует выписки, ведомость остатков.

Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
CONNECT TO SAMPLE
@

DROP TRIGGER	kernel.BDTrnDays@
DROP TRIGGER	kernel.BDTrnDebet@
DROP TRIGGER	kernel.BDTrnCredit@
DROP TRIGGER	kernel.BITrnDays@
DROP TRIGGER	kernel.BITrnDebet@
DROP TRIGGER	kernel.BITrnCredit@
DROP TRIGGER	kernel.BUTrn@
DROP TRIGGER	kernel.ADTrn@
DROP TRIGGER	kernel.AITrn@

DROP TRIGGER 	kernel.ADJrn@
DROP TRIGGER 	kernel.BDJrn@
DROP TRIGGER 	kernel.BIJrn@
DROP TRIGGER	kernel.AIJrn@

DROP TRIGGER    kernel.BUAccount@
DROP TRIGGER	kernel.AIAccount@
DROP TRIGGER	kernel.BIAccount@

DROP TRIGGER	kernel.BIStuff@

DROP TRIGGER	kernel.AIOverdraft@
DROP TRIGGER	kernel.ADOverdraft@

DROP TRIGGER	kernel.BIDocumentDayCheck@
DROP TRIGGER	kernel.BDDocumentDayCheck@
DROP TRIGGER	kernel.BUDocument@
DROP TRIGGER 	kernel.BIDocument@
DROP TRIGGER	kernel.ADDocument@
DROP TRIGGER	kernel.AIDocument@

DROP TABLE		kernel.Overdraft@
DROP TABLE		kernel.Trn@
DROP TABLE		kernel.Document@
DROP TABLE 		kernel.Days@
DROP TABLE		kernel.Jrn@
DROP TABLE		kernel.Account@
DROP TABLE		kernel.Stuff@

CREATE TABLE kernel.Stuff (
	Stuff	INTEGER NOT NULL,
	Name	CHAR( 35 ),
    AddCnt  INTEGER,
    DelCnt  INTEGER,
	CONSTRAINT Pk PRIMARY KEY (STUFF)
)
@

CREATE TRIGGER kernel.BIStuff 
NO CASCADE BEFORE INSERT ON kernel.Stuff
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	SET N.AddCnt= 0 ;
    SET N.DelCnt= 0 ;
END
@


ECHO  -------------------------@
 
ECHO Импорт учетных плоскостей@
ECHO@
IMPORT FROM _Stuff.del OF DEL COMMITCOUNT  100 
	INSERT INTO kernel.Stuff (Stuff,Name)
@
ECHO  -------------------------@
 
ECHO@
ECHO@


 ----------------------------------------------------------------
 
 --	Stuff		Учетная плоскость
 
 --	Account		Аналитический счет
 
 --  Opened		Дата открытия/создания счета
 
 --  Closed		Дата закрытия счета
 
 --	Type		Тип счета Активный,Пассивный, Астивно-пассивный
 
 --	Overdraft	Глубина овердрафта
 
 --	Active		Входящий активный остаток
 
 --	Passive		Входящий пассивный остаток
 
 --	Debet		обороты по дебету
 
 --	Credit		обороты по кредиту
 
 ----------------------------------------------------------------
 
CREATE TABLE kernel.Account (
	Stuff	INTEGER NOT NULL,
	Account	INTEGER NOT NULL,
	Closed	DATE,
	Type	CHAR( 1 ) CHECK (Type IN ('A','P','M')),
	Overdraft	DECIMAL( 17 , 2 ) CHECK (Overdraft>= 0 )  DEFAULT  0 ,
	Active		DECIMAL( 17 , 2 ) CHECK (Active>= 0 )		DEFAULT  0 ,
	Passive		DECIMAL( 17 , 2 ) CHECK (Passive>= 0 )	DEFAULT  0 ,
	Debet		DECIMAL( 17 , 2 ) CHECK (Debet>= 0 )		DEFAULT  0 ,
	Credit		DECIMAL( 17 , 2 ) CHECK (Credit>= 0 )		DEFAULT	 0 ,
	DCnt		INTEGER DEFAULT  0 ,
	CCnt		INTEGER DEFAULT  0 ,
	CONSTRAINT	AtStuff FOREIGN KEY (Stuff) 
		REFERENCES kernel.Stuff (Stuff) ON DELETE RESTRICT,
	CONSTRAINT  AtAPMCheck CHECK (
		(	
			(Type='A' AND Active>= 0 . 00  AND Passive= 0 . 00 ) 
			OR (Type='P') 
			OR (Type='M')
		)
		AND (Active= 0 . 00  OR Passive= 0 . 00 )
	),
	CONSTRAINT  AtBalance CHECK (
		(Type='A' AND (Active-Passive+Debet-Credit)>= 0 . 00 )
		OR (Type='P' AND (Passive-Active+Credit-Debet+Overdraft)>= 0 . 00 )
		OR (Type='M')
	),
	CONSTRAINT	Pk PRIMARY KEY (Stuff,Account)
)
@
CREATE UNIQUE INDEX kernel.IAccountStuff
	ON kernel.Account (Stuff DESC,Account DESC)
@

 --------------------------------------------------------------------
 
 --  Журнал остатков по аналитическому счету
 
 --------------------------------------------------------------------
 
 --  Stuff		
 
 --  Account 	
 
 --  Dt			
 
 --  Type		
 
 --  Overdraft	
 
 --	Active		
 
 --	Passive		
 
 --	Debet		
 
 --	Credit		
 
 --	DCnt		
 
 --	CCnt		
 
 --------------------------------------------------------------------
 
CREATE TABLE kernel.Jrn (
    Stuff		INTEGER,
    Account 	INTEGER,
    Dt			DATE,
    Type		CHAR( 1 ),
    Overdraft	DECIMAL( 17 , 2 ),
	Active		DECIMAL( 17 , 2 ) CHECK (Active>= 0 )		DEFAULT  0 ,
	Passive		DECIMAL( 17 , 2 ) CHECK (Passive>= 0 )	DEFAULT  0 ,
	Debet		DECIMAL( 17 , 2 ) CHECK (Debet>= 0 )		DEFAULT  0 ,
	Credit		DECIMAL( 17 , 2 ) CHECK (Credit>= 0 )		DEFAULT	 0 ,
	DCnt		INTEGER DEFAULT  0 ,
	CCnt		INTEGER DEFAULT  0 ,
	CONSTRAINT	AtStuffAccount FOREIGN KEY (Stuff,Account)
		REFERENCES kernel.Account (Stuff,Account) ON DELETE RESTRICT,
	CONSTRAINT  AtAPMCheck CHECK (
		(	
			(Type='A' AND Active>= 0 . 00  AND Passive= 0 . 00 ) 
			OR (Type='P') 
			OR (Type='M')
		)
		AND (Active= 0 . 00  OR Passive= 0 . 00 )
	),
	CONSTRAINT  AtBalance CHECK (
		(Type='A' AND (Active-Passive+Debet-Credit)>= 0 . 00 )
		OR (Type='P' AND (Passive-Active+Credit-Debet+Overdraft)>= 0 . 00 )
		OR (Type='M')
	)
)
@

CREATE UNIQUE INDEX kernel.IJrnSAD ON kernel.Jrn (Stuff,Account,Dt) ALLOW REVERSE SCANS@
CREATE UNIQUE INDEX kernel.IJrnDSA ON kernel.Jrn (Dt,Stuff,Account)@

 ----------------------------------------------------------------
 
 -- Контроль допустимых значений параметров счета
 
 -- Если овердрафт NULL тогда - 0
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BUAccount
NO CASCADE BEFORE UPDATE ON kernel.Account
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	SET N.Overdraft= 
		CASE 
			WHEN (N.Overdraft IS NULL) 
			THEN  0  ELSE N.Overdraft
        END;
END
@

 ----------------------------------------------------------------
 
 -- При добавлении новой записи в таблицу счетов
 
 -- обнуляются поля Overdraft,Active,Passive,Debet,Credit
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BIAccount 
NO CASCADE BEFORE INSERT ON kernel.Account
REFERENCING NEW AS N 
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	SET N.Closed=NULL;
	SET N.Overdraft= 0 ;
	SET N.Active= 0 ;
	SET N.Passive= 0 ;
	SET N.Debet= 0 ;
	SET N.Credit= 0 ;
	SET N.DCnt= 0 ;
	SET N.CCnt= 0 ;
END
@

CREATE TRIGGER kernel.AIAccount 
AFTER INSERT ON kernel.Account
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
UPDATE kernel.Stuff S
    SET S.AddCnt=S.AddCnt+ 1  WHERE S.Stuff=N.Stuff
@


ECHO  ---------------------------@
 
ECHO Импорт аналитических счетов@
ECHO@
IMPORT FROM _Account.del OF DEL COMMITCOUNT  100 
	INSERT INTO kernel.Account (Stuff,Account,Type)
@
ECHO  ---------------------------@
 
ECHO@
ECHO@

 ----------------------------------------------------------------
 
 --	Dt			Дата проведения операции
 
 --	Closed		Признак открыт/закрыт
 
 --	AddCnt	    Количество добавленных документов 
 
 --	DelCnt		Количество удаленных документов
 
 --	DebetCnt	Количество свернутых в журнал проводок по дебету
 
 --	CreditCnt	Количество свернутых в журнал проводок по кредиту
 
 --	TrnCnt		Количество тpанзакций * 2 в дне
 
 ----------------------------------------------------------------
 
CREATE TABLE kernel.Days (
	Dt			DATE NOT NULL, 
	Closed		CHAR( 1 ) CHECK (Closed in ('Y','N')) DEFAULT 'N', 
	AddCnt		INTEGER	DEFAULT  0 ,
	DelCnt		INTEGER DEFAULT  0 ,
	DebetCnt	INTEGER DEFAULT  0 ,
	CreditCnt	INTEGER DEFAULT  0 ,
	TrnCnt		INTEGER DEFAULT  0 ,
	CONSTRAINT  Pk PRIMARY KEY (Dt)
)
@

INSERT INTO kernel.Days (Dt,Closed) VALUES (CURRENT DATE,'N')
@





 ----------------------------------------------------------------
 
 --	Dt		Дата к которой относится документ
 
 --	DocID	Идентификатор документа в дне (порядковый номер)
 
 --	UserID	Пользователь, создавший документ
 
 --	DocType Тип документа
 
 --	DocTS	Дата и время создания документа
 
 ----------------------------------------------------------------
 
CREATE TABLE kernel.Document (
	Dt		DATE NOT NULL,
	DocID	INTEGER NOT NULL,
	UserID	CHAR( 12 ),
	DocType INTEGER,
	DocTS	TIMESTAMP,
	CONSTRAINT AtDt FOREIGN KEY (Dt) 
		REFERENCES kernel.Days (Dt) ON DELETE RESTRICT,
	CONSTRAINT Pk PRIMARY KEY (Dt,DocID)
)
@


 ----------------------------------------------------------------
 
 -- Триггер на добавление нового документа
 
 -- Увеличиваем количество введенных документов
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.AIDocument
AFTER INSERT ON kernel.Document
REFERENCING NEW AS N 
FOR EACH ROW MODE DB2SQL
	UPDATE kernel.Days Days set Days.AddCnt=Days.AddCnt+ 1 
       WHERE Days.Dt=N.Dt
@

 ----------------------------------------------------------------
 
 -- Триггер на удаление нового документа
 
 -- Уменьшаем количество введенных документов
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.ADDocument
AFTER DELETE ON kernel.Document
REFERENCING OLD AS O 
FOR EACH ROW MODE DB2SQL
	UPDATE kernel.Days Days set Days.DelCnt=Days.DelCnt+ 1 
       WHERE Days.Dt=O.Dt
@

 ----------------------------------------------------------------
 
 -- Триггер на добавление нового документа
 
 -- Контроль что операционный день открыт
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BIDocumentDayCheck 
NO CASCADE BEFORE INSERT ON kernel.Document
REFERENCING NEW AS Doc
FOR EACH ROW MODE DB2SQL
WHEN
	( 
		(SELECT Days.Closed 
			FROM kernel.Days Days 
			WHERE Days.Dt=Doc.Dt) = 'Y' 
	) SIGNAL SQLSTATE '75002' ('Попытка добавить документ в закрытый операционный день')
@

 ----------------------------------------------------------------
 
 -- Триггер на добавление нового документа
 
 -- Контроль что операционный день открыт
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BDDocumentDayCheck 
NO CASCADE BEFORE DELETE ON kernel.Document 
REFERENCING OLD AS Doc
FOR EACH ROW MODE DB2SQL
WHEN
	(
		(SELECT Days.Closed 
			FROM kernel.Days Days 
			WHERE Days.Dt=Doc.Dt) = 'Y' 
	) SIGNAL SQLSTATE '75003' ('Попытка удаления документа из закрытого операционного дня')
@

 ----------------------------------------------------------------
 
 -- Триггер на добавление нового документа
 
 -- Контроль кто и когда добавил документ
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BIDocument 
NO CASCADE BEFORE INSERT ON kernel.Document 
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	SET N.UserID=USER;
	SET DocTS=CURRENT TIMESTAMP;
END
@

 ----------------------------------------------------------------
 
 -- После того, как документ внесен нельзя менять его параметы
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BUDocument
NO CASCADE BEFORE UPDATE ON kernel.Document
FOR EACH ROW MODE DB2SQL
	SIGNAL SQLSTATE '75001' ('Hельзя изменять параметры документа')
@



 ----------------------------------------------------------------
 
 --  Проводки
 
 ----------------------------------------------------------------
 
CREATE TABLE kernel.Trn (
	Dt			DATE NOT NULL,
	DocID		INTEGER NOT NULL,
	TrnID		SMALLINT,
	Stuff		INTEGER,
	DAccount	INTEGER,
	CAccount	INTEGER,
	Summa		DECIMAL( 17 , 2 ) CHECK (Summa>= 0 ), 
	CONSTRAINT	AtDocument FOREIGN KEY (Dt,DocID)
		REFERENCES kernel.Document ON DELETE CASCADE,
	CONSTRAINT	AtStuff FOREIGN KEY (Stuff)
		REFERENCES kernel.Stuff ON DELETE RESTRICT,
	CONSTRAINT	AtDAccount FOREIGN KEY (Stuff,DAccount)
		REFERENCES kernel.Account (Stuff,Account),
	CONSTRAINT	AtCAccount FOREIGN KEY (Stuff,CAccount)
		REFERENCES kernel.Account (Stuff,Account)
)
@

CREATE UNIQUE INDEX kernel.IDTrn ON kernel.Trn (Stuff,DAccount,Dt,DocID,TrnID)@
CREATE UNIQUE INDEX kernel.ICTrn ON kernel.Trn (Stuff,CAccount,Dt,DocID,TrnID)@

 ----------------------------------------------------------------
 
 -- Этот триггер выполняет изменение остатков
 
 -- при добавлении проводки
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.AITrn
AFTER INSERT ON kernel.Trn
REFERENCING NEW AS N 
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	UPDATE kernel.Account Deb
		SET (Deb.Debet,Deb.DCnt)=(Deb.Debet+N.Summa,Deb.DCnt+ 1 )
		WHERE Deb.Stuff=N.Stuff AND Deb.Account=N.DAccount;
	UPDATE kernel.Account Cred
		SET (Cred.Credit,Cred.CCnt)=(Cred.Credit+N.Summa,Cred.CCnt+ 1 )
		WHERE Cred.Stuff=N.Stuff AND Cred.Account=N.CAccount;
	UPDATE kernel.Days
		SET TrnCnt=TrnCnt+ 2 
		WHERE Dt=N.Dt;
END
@

 ----------------------------------------------------------------
 
 -- Запpет на любые изменения в таблице Trn
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.BUTrn
	NO CASCADE BEFORE UPDATE ON kernel.Trn
	FOR EACH ROW MODE DB2SQL
	SIGNAL SQLSTATE '75004' ('Hельзя изменять таблицу TRN')
@

 ----------------------------------------------------------------
 
 -- Этот триггер выполняет изменение остатков
 
 -- при удалении проводки
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.ADTrn
AFTER DELETE ON kernel.Trn
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
	UPDATE kernel.Account Deb
		SET (Deb.Debet,Deb.DCnt)=(Deb.Debet-O.Summa,Deb.DCnt- 1 )
		WHERE Deb.Stuff=O.Stuff AND Deb.Account=O.DAccount;
	UPDATE kernel.Account Cred
		SET (Cred.Credit,Cred.CCnt)=(Cred.Credit-O.Summa,Cred.CCnt- 1 )
		WHERE Cred.Stuff=O.Stuff AND Cred.Account=O.CAccount;
	UPDATE kernel.Days
		SET TrnCnt=TrnCnt- 2 
		WHERE Dt=O.Dt;
END
@

 ----------------------------------------------------------------
 
 --	Stuff		Учетная плоскость
 
 --	Account		Аналитический счет
 
 --	Dt			Дата изменения
 
 --	Overdraft	Глубина овердрафта
 
 ----------------------------------------------------------------
 
CREATE TABLE kernel.Overdraft (
	Stuff		INTEGER NOT NULL,
	Account		INTEGER NOT NULL,
	Dt			DATE 	NOT NULL,
	Overdraft	DECIMAL( 17 , 2 ) CHECK (Overdraft >= 0 ),
	CONSTRAINT AtAccount FOREIGN KEY (Stuff,Account)
		REFERENCES kernel.Account (Stuff,Account) ON DELETE RESTRICT
)
@

CREATE UNIQUE INDEX kernel.IOverdraft 
	ON kernel.Overdraft (Stuff,Account,Dt) ALLOW REVERSE SCANS
@

 ----------------------------------------------------------------
 
 -- Изменение глубины овердрафта
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.AIOverdraft
AFTER INSERT ON kernel.Overdraft 
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
WHEN (
	N.Dt=
	(SELECT 
			CASE 
				WHEN Overdraft.Dt IS NULL THEN N.Dt
				ELSE Overdraft.Dt
			END
		FROM kernel.Overdraft Overdraft 
		WHERE 
			Overdraft.Dt=
				(SELECT MAX(O.Dt) FROM kernel.Overdraft O WHERE 
							O.Stuff=N.Stuff AND O.Account=N.Account	) 
			AND Overdraft.Stuff=N.Stuff 
			AND Overdraft.Account=N.Account
	)
) 
	UPDATE kernel.Account Account 
			SET Account.Overdraft=N.Overdraft
		WHERE Account.Stuff=N.Stuff AND Account.Account=N.Account
@

 ----------------------------------------------------------------
 
 -- Изменение глубины овердрафта
 
 ----------------------------------------------------------------
 
IMPORT FROM _Overdraft.del OF DEL COMMITCOUNT  100 
	INSERT INTO kernel.Overdraft (Stuff,Account,Dt,Overdraft)
@

 ----------------------------------------------------------------
 
 -- Изменение глубины овердрафта
 
 ----------------------------------------------------------------
 
CREATE TRIGGER kernel.ADOverdraft
AFTER DELETE ON kernel.Overdraft
REFERENCING OLD AS O
FOR EACH ROW MODE DB2SQL
UPDATE kernel.Account SET Overdraft=
	(SELECT Overdraft FROM kernel.Overdraft 
		WHERE Stuff=O.Stuff
				AND Account=O.Account
				AND Dt=
						(SELECT MAX(Dt) FROM kernel.Overdraft
							WHERE Stuff=O.Stuff AND Account=O.Account)
	)
@


CREATE TRIGGER kernel.BIJrn
NO CASCADE BEFORE INSERT ON kernel.Jrn
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
      SET (N.Active,N.Passive,N.Type) =
          (SELECT A.Active,A.Passive,A.Type FROM kernel.Account A WHERE 
                  A.Stuff=N.Stuff AND A.Account=N.Account);
      SET (N.DCnt,N.Debet) =
          (SELECT COUNT(*),VALUE(SUM(Summa), 0 ) FROM kernel.Trn D WHERE
                  D.Stuff=N.Stuff  
                  AND D.DAccount=N.Account
                  AND D.Dt=N.Dt); 
      SET (N.CCnt,N.Credit) =
          (SELECT COUNT(*),VALUE(SUM(Summa), 0 ) FROM kernel.Trn C WHERE
                  C.Stuff=N.Stuff
                  AND C.CAccount=N.Account
                  AND C.Dt=N.Dt);
      		
END
@


 --Автоматическая коppекция Accounts пpи добавлении записи
 
 --в жуpнал остатков
 
CREATE TRIGGER kernel.AIJrn
   AFTER INSERT ON kernel.Jrn
   REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL
   BEGIN ATOMIC
   UPDATE kernel.Account A SET
      (A.Debet,A.Credit,A.Active,A.Passive,A.DCnt,A.CCnt)=(
      A.Debet-N.Debet,
      A.Credit-N.Credit,
      ROUND((ABS(A.Active+N.Debet-A.Passive-N.Credit)+A.Active+N.Debet-A.Passive-N.Credit)/ 2 , 2 ),
      ROUND((ABS(A.Passive+N.Credit-A.Active-N.Debet)+A.Passive+N.Credit-A.Active-N.Debet)/ 2 , 2 ),
      A.DCnt-N.DCnt,
      A.CCnt-N.CCnt
   ) WHERE A.Stuff=N.Stuff AND A.Account=N.Account;
   UPDATE kernel.Days SET (DebetCnt,CreditCnt)=
      (DebetCnt+N.DCnt,CreditCnt+N.CCnt) WHERE Dt=N.Dt;
   END
@


 --Пpовеpка на возможность удаления записи из жуpнала
 
 --Записи из жуpнала должны удаляться только по поpядку
 
 --Запpет на удаление самой пеpвой записи в жуpнале
 
CREATE TRIGGER kernel.BDJrn
   NO CASCADE BEFORE DELETE ON kernel.Jrn
   REFERENCING OLD AS O FOR EACH ROW MODE DB2SQL
   WHEN ( 
      (SELECT MAX(Dt) FROM kernel.Jrn A
          WHERE A.Stuff=O.Stuff AND A.Account=O.Account)<>O.Dt
   ) SIGNAL SQLSTATE '75008' ('Hельзя удалить эту запись из жуpнала')
@

 --Изменение Accounts после удаления записи из жуpнала
 
 --остатков
 
CREATE TRIGGER kernel.ADJrn
   AFTER DELETE ON kernel.Jrn
   REFERENCING OLD AS O FOR EACH ROW MODE DB2SQL
   BEGIN ATOMIC
   UPDATE kernel.Account A SET
      (A.Active,A.Passive,A.Debet,A.Credit,A.DCnt,A.CCnt)=
      (O.Active,O.Passive,O.Debet+A.Debet,O.Credit+A.Credit,
       	  A.DCnt+O.DCnt,A.CCnt+O.CCnt)
      WHERE A.Stuff=O.Stuff and A.Account=O.Account;
   UPDATE kernel.Days SET (DebetCnt,CreditCnt)= 
      (DebetCnt-O.DCnt,CreditCnt-O.CCnt) WHERE Dt=O.Dt;
   END
@

 ------------------------------------------------------------------------------
 
 --Запpет на добавление новой тpанзакции если
 
 --был создан жуpнал движения по дебетуемому или кpедитуемому
 
 --внутpеннему счету или опеpационный день закpыт
 
 ------------------------------------------------------------------------------
 
CREATE TRIGGER kernel.BITrnDays
   NO CASCADE BEFORE INSERT ON kernel.Trn
   REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL
   WHEN (
      (SELECT Closed FROM kernel.Days A WHERE A.Dt=N.Dt)='Y'
   ) SIGNAL SQLSTATE '75003' ('Пеpед добавлением тpанзакции')
@

CREATE TRIGGER kernel.BITrnDebet
   NO CASCADE BEFORE INSERT ON kernel.Trn
   REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL
   WHEN ( 
      N.Dt <= (SELECT VALUE(MAX(Dt),DATE('01.01.0001')) FROM kernel.Jrn D
                       WHERE D.Stuff=N.Stuff AND D.Account=N.DAccount )
   ) SIGNAL SQLSTATE '75001' ('Существует журнал остатков по дебетуемому счету')
@

CREATE TRIGGER kernel.BITrnCredit
   NO CASCADE BEFORE INSERT ON kernel.Trn
   REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL
   WHEN ( 
      N.Dt <= (SELECT VALUE(MAX(Dt),DATE('01.01.0001')) FROM kernel.Jrn C
                       WHERE C.Stuff=N.Stuff AND C.Account=N.CAccount )
   ) SIGNAL SQLSTATE '75002' ('Существует журнал остатков по кредитуемому счету')
@

 ------------------------------------------------------------------------------
 
 --Запpет на удаление тpанзакции если
 
 --был создан жуpнал движения по дебетуемому или кpедитуемому
 
 --внутpеннему счету или опеpационный день закpыт
 
 ------------------------------------------------------------------------------
 
CREATE TRIGGER kernel.BDTrnDays
   NO CASCADE BEFORE DELETE ON kernel.Trn
   REFERENCING OLD AS N FOR EACH ROW MODE DB2SQL
   WHEN (
      (SELECT Closed FROM kernel.Days A WHERE A.Dt=N.Dt)='Y'
   ) SIGNAL SQLSTATE '75004' ('Пеpед добавлением тpанзакции')
@

CREATE TRIGGER kernel.BDTrnDebet
   NO CASCADE BEFORE DELETE ON kernel.Trn
   REFERENCING OLD AS N FOR EACH ROW MODE DB2SQL
   WHEN ( 
      N.Dt <= (SELECT VALUE(MAX(Dt),DATE('01.01.0001')) FROM kernel.Jrn D
                       WHERE D.Stuff=N.Stuff AND D.Account=N.DAccount )
   ) SIGNAL SQLSTATE '75005' ('Существует журнал остатков по дебетуемому счету')
@

CREATE TRIGGER kernel.BDTrnCredit
   NO CASCADE BEFORE DELETE ON kernel.Trn
   REFERENCING OLD AS N FOR EACH ROW MODE DB2SQL
   WHEN ( 
      N.Dt <= (SELECT VALUE(MAX(Dt),DATE('01.01.0001')) FROM kernel.Jrn C
                       WHERE C.Stuff=N.Stuff AND C.Account=N.CAccount )
   ) SIGNAL SQLSTATE '75006' ('Существует журнал остатков по кредитуемому счету')
@

...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360015
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приложение требует базу DB2 как я понимаю ? У меня MS SQL 2000 ... такчто использовать его наверно не выйдет

Но со структурой поразбираюсь ! Спасибо большое !

А вы у себя в базе используетьте такую структуру или это так для общего случая ? Всмысле можно ли спрашивать о возможных проблемах, ограничениях и производительности данной модели т.д. ... ?
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360044
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ради бога - обращайтесь...
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360057
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
производительность: на Intel Celron 1300/512 MB/Baracuda 7200 60GB
(под сервер б.д выделено всего 64МБ) ~ 120000 документов в час.
Удовлетворяет?
И это с полным контролем остатков.
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360137
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну таких объемом у меня не намечаться конечно ... в принципе меня интересует чтобы за приемлимое время считались бы остатки на всех счета и разбиение остатка одного из счетов по аналитикам !

Но как я вижу у вас хранятся остатки по всем аналитикам тоже ... я этого не делаю т.к. объем не такой большой. Остатки + обороты по всем счетам у меня счас рассчитываються гдето за 10 сек. при количестве проводок в таблице 1 000 000 000.

Да ... удобно тригеры писать когда есть возможность FOR EACH ROW .... надеюсь в след. SQL Serverе она появиться

Вопросы :
1. В таблице где храняться сами проводки я невижу валюты ? предпологаеться что все происходит в одной валюте ?
2. Что значит учетная плоскость ? я это какраз и рассматриваю как аналитический счет ... тоесть в проводке оычно ДебетСчет + АналитДебетСчета , КредитСчет + АналитКредитСчета. Т.к. у вас только одна аналитика (Stuff) то между разными аналитиками проводки только через промежуточный счет ?
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360423
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Миллиард проводок? круто...
если прикинуть - одна проводка 8 байт , дебетуемый счет - 4 байта, кредитуемый счет - 4 байта, (8+4+4)*1000 000 000= 16 GB - только таблица проводок...) без индексов...)) на интел платформе - очень круто...
уважаю...)

Учетная плоскость - это крубо говоря баланс.
В модели может храниться примерно 4 миллиарда балансов.
Одна Учетная плоскость - одна валюта... Валюта - не важно какая.
Можете учитывать доллара, можете рубли а можете литры, штуки, погонные метры,..валенки например)

Главное:
1)котроль остатков, чтоб никто не сделал перерасхода. вот)
2)производительность.
3)Чтоб баланс всегда сходился...)

А один документ= куча проводок в разнах валютах в разных учетных плоскостях.

Например, когда покупаете мартини - это покупаете за валюту, храните в литрах, а продаете за рубли...)) Гы...)
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360430
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь вообще - представлено только ядро системы.
Валюты , планы счетов и прочие артефакты вынесены за пределы
представленой части модели.

Из представленного ядра можно легко собрать либо банковскую систему, либо складскую, или любую бухгалтерскую систему.
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360734
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой ! какой там милиард конечно милион (в нулях ошибся) ... потому и говорю что объемы небольшие !!!
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32360982
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понимаю связь проводок со всеми другими объектами происходит через документ (таблицу документов) ?

Пример : У меня есть
1. Таблица клиентов (Cust)
2. Таблица договоров с клиентами (Agrs)
3. Таблица счетов по договорам (Invoices)
4. Таблица отдельные сумм счета которые и разносяться по бух счетам (InvSums)
5. Таблица платежей по договорам (Payments)

плюс как дополнение у меня есть
6. таблица основных средств
7. таблица работников
...
допустим есть еще несколько таких таблиц

При том мне необходимо показывать пользователю :

1. все проводки по конкретному договору (могут быть проводки не только по счетам но и не связанные с ними)
2. проводки по конкретному счету
3. Проводки по платежу
4. Остатки на счетах для одного договора
5. Остатки на счете разнесенные по договорам
6. Остатки на какомто счете (где аналитика не договора а работники) разнесенные по работникам
7. Проводки связанные с конкрентным работником
9. Остатки на счете разнесенные по еще какойто таблице
10. Проводки связанные с запись из еще какойто таблицы

ВОПРОС:
как должна выглядеть связь с проводками для каждой из этих таблиц ?

Например для каждго договора с клиентом создаем документ в таблице документов (который содержит ID договора).
Потом для каждого счета также создаем документ ?
Как в этой модели делать связь с другими таблицами например платежей, работников и т.д. ???
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32361117
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты даёшь...)
Хочешь чтоб я тебе вообще всю модель нарисовал?
Это я делать не буду...Такая работа денех стоит и времени.

Единственное что скажу:
1) Один договор - это несколько аналитических счетов в разных учетных плоскостях.
2) в таблице Docs есть поле типа документа. В завичимости от типа документа выполняешь проводки в нужных учетных плоскостях.
Например у меня в банке всякая платежный документ проходил по трем плоскостям:
-плоскость валюты дебетуемого счета
-плоскость валюты кредитуемого счета
-общая плоскость учета (рублевая)
а каждый счет имел два остатка в своей валюте и в валюте общей плоскости учета (рубли) и всякая операция соответственно меняла 6 остатков.
Иди по тому же пути. И всё будет ОК..

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

Определить тип документа- "продажа кирпичей за нал. рачет".
при этом в процессе обработки подобного документа выполнять соответствуюшие проводки во всех трех плоскостях, и дополнительно в рублевой плоскости сделать еще проводку которая учтет прибыль-убытки от этой операции...
Да что тут говорить? Тут нужно просто сначала родить "что" тебе надо учитывать. Потом наложишь это на представленную модель и поймешь "как" это надо учитывать. Я не зная специфики того, чего вы там делаете не смогу тебе в этом помочь. Тут надо рисовать на доске, общаться с бухгалтерами, чтоб понять что они хотят.
Короче ищите и обрящите)
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32361138
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и еще...
То что тут нарисовано - это всего лишь 5 таблиц. И реализация принципа двойной записи. А то что касается клиентов - это CRM - другая часть базы данных (у меня это ~ 15 таблиц). План счетов (они , планы счетов бываю не только бухгалтерскими), и собстенно договора - это третья часть системы...
...
Рейтинг: 0 / 0
Структура таблицы бухгалтерских проводок не дает покоя !!!!
    #32361222
Dennis_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про то что в каждочасти базы может быть куча таблиц это понятно но в итоге все равно там есть таблица основных объектос с уникальным ID. И я пытаюсь решить как лучше этот самый ID связывать с бугалтерией тоесть с таблицей проводок ...особо много тут исовать и писать ненадо если придумать стандартную схему по которой связывать .... тоже самое что в этих несколькх таблицах можно описывать любые проводки в форме двойной записи ....

Честно про плоскости учета так и немогу въехать еще подумаю .... я это все делал до этого гораздо более упращенно вроде :

Doc_id int, - ID документа
Agr_id int, - ИД договора
TDate datetime, - дата проводки
DACC varchar(10), дебетный счет
KACC varchar(10), - кредитный счет
TCurr varchar(3), - валюта
TSum money, - сумма
TSumRUB money - сумма в базовой валюте

вот и все .... в принципе примерно этой же схемы я бы и хотел придерживаться и все вопросы связаны с полям и Agr_id (и возможно Doc_id)
варианты : 1. Analyt1_id, Analyt2_id ...
2. DAnalyt1_id, DAnalyt2_id ... KAnalyt1_id, KAnalyt2_id ...
3. Таблица TransAnalyt (Trans_id, Analyt_id, AnalytType ...)
4. возможно еще что то ...

продрузамеваеться что будет таблица где будут все возможные аналитические счета : Analytics (Analyt_id, Type, Descr, Sys_id ...)
и нуда будет помещатся все что может быть аналитиками для счета вроде

1 'A' 'AB16726', 100 - договор номер AB16726 с Agr_id=100 в таблице Agrs
2 'A' 'AV83274', 234 - договор номер AV83274 с Agr_id=234 в таблице Agrs
3 'S' 'Mazda 6', 100 - основное средство Mazda 6 с Asset_id=234 в таблице Assets
4 'U' 'Иванов', 4 - Работник Иванов с Employee_id=4 в таблице Employees

и т.д.

Есть вариант не делать такую общую таблицу а указвать тип объекта и его ID напрямую в проводке вместо Analyt_id - > Type , Sys_id - используя то что везде P.k. это int или smallint

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


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