Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Объединение плоских таблиц остатков и обротов. (число прочтений - 3300 )
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Объединение плоских таблиц остатков и обротов.
08. Июля 2008 :: 10:43
Печать  
Пример:

Есть две таблицы:

1. Остатки
поля:
Склад, Материал, Количество

2.Обороты
поля:
Склад, Материал, Месяц, КоличествоПриход, КоличествоРасход

Задача:

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

3. Остатки и обороты
поля:
Склад, Материал, Месяц, КоличествоПриход, КоличествоРасход , КоличествоНаКонецМесяца

Есть какие - нибудь классические решения данного вопроса?
Може кто почитать чего посоветует?
Нужно максимально универсальное решение.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #1 - 08. Июля 2008 :: 11:00
Печать  
Вот это не то?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #2 - 08. Июля 2008 :: 11:28
Печать  
JohnyDeath писал(а) 08. Июля 2008 :: 11:00:
Вот это не то?


Не не то. Я про ТЗ ил ИТЗ
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #3 - 08. Июля 2008 :: 11:57
Печать  
Ну уложи их в таблицу sqlite, напиши ВТ "РегистрОстаткиОбороты" (у меня руки никак не доходят, но скоро, думаю будет) и выбирай что тебе нужно.  Смех
Не спорю, геморный вариант, но зато вариант! Да и гемор только один раз должен быть.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #4 - 08. Июля 2008 :: 12:11
Печать  
Что есть в SQLite чего нет в ИТЗ?
В контексте данной задачи
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Объединение плоских таблиц остатков и обротов.
Ответ #5 - 08. Июля 2008 :: 19:53
Печать  
Nick писал(а) 08. Июля 2008 :: 12:11:
Что есть в SQLite чего нет в ИТЗ?
В контексте данной задачи

Объединение нескольких таблиц есть, тобишь join.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Объединение плоских таблиц остатков и обротов.
Ответ #6 - 08. Июля 2008 :: 20:45
Печать  
Ну, join для двух таблиц теперь есть и в ИТ.

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

В sqlite это можно делать одновременно с join, что, наверняка будет сильно выгоднее.
Собственно, это главное, почему я всегда был за, нет - ЗА - развитие 1sqlite.
Потому что даже если бы просто продолжать развитие ИТ, то рано или поздно все равно получился бы sqlite. ;)
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #7 - 09. Июля 2008 :: 01:10
Печать  
Цитата:
В sqlite это можно делать одновременно с join, что, наверняка будет сильно выгоднее.


Это как?

А как насчет потерь на загрузку в SQLite и выгрузку обратно в 1с?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Объединение плоских таблиц остатков и обротов.
Ответ #8 - 09. Июля 2008 :: 10:50
Печать  
Ну, в SQLite я бы попытался так:
Код
Выбрать все
	"create temp table flat as
	|select
	|	Склад,
	|	Материал,
	|	0 Месяц,
	|	0 Приход,
	|	0 Расход,
	|	Количество КонОст
	|from Остатки
	|union all
	|select
	|	Склад,
	|	Материал,
	|	Месяц,
	|	КоличествоПриход Приход,
	|	КоличествоРасход Расход,
	|	0 КонОст
	|from Обороты"

	"create index tmp_flat on flat(Склад, Материал, Месяц)"

	"update flat set КонОст = Приход - Расход +
	|	(select КонОст from flat f
	|	where f.Склад = Склад and f.Материал = Материал and f.Месяц < Месяц
	|	order by f.Склад desc, f.Материал desc, f.Месяц desc limit 1)
	|where Месяц <> 0"
 


Однако чуствую, что отнюдь не самым оптимальным это будет.
Это как раз такая задача, которая требует навигационных способов доступа, и запросом решается плохо.
Дмитро не зря ведь виртуальную таблицу остатков и оборотов реализовывал именно через врем-таблицу и процедурку на сервере.

Ну а общий принцип таков - идешь по таблице оборотов в порядке Склад, Материал.
Если Склад<>ПрошСклад или Материал <> ПрошМатериал, ищешь в таблице остатков остаток для Склада/Материала, запоминаешь его.
Вычисляешь коностаток как запомненный остаток + приход - расход.
Записываешь его в таблицу как коностаток, и запоминаешь его.

А если база дбф, то затрат на выгрузку ТЗ в базу можно избежать, если таблицы остатков и оборотов вычисляются запросом из таблиц базы. просто вместо select пишешь create temp table ttt as select
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #9 - 10. Июля 2008 :: 01:46
Печать  
Понятно, спасибо
Буду пробовать
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #10 - 17. Июля 2008 :: 11:08
Печать  
Что то не взлетает такой вот элементарный тест. Может кто скажет чего не так?
  

Test_SQLite_Union_001.ert ( 51 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Объединение плоских таблиц остатков и обротов.
Ответ #11 - 18. Июля 2008 :: 04:17
Печать  
В общем всё несколько не так как писал orefkov
Правильный вариант:

Код
Выбрать все
"create temp table flat as
	|select
	|	Склад,
	|	Материал,
	|	0 Месяц,
	|	0 Приход,
	|	0 Расход,
	|	Количество КонОст
	|from Остатки
	|union all
	|select
	|	Склад,
	|	Материал,
	|	Месяц,
	|	КоличествоПриход Приход,
	|	КоличествоРасход Расход,
	|	0 КонОст
	|from Обороты"

	"create index tmp_flat on flat(Склад, Материал, Месяц)"

	"update flat set КонОст = Приход - Расход +
	|	(select  f.КонОст from flat f
	|	where f.Склад = flat.Склад and f.Материал = flat.Материал and f.Месяц < flat.Месяц
	|	order by f.Склад desc, f.Материал desc, f.Месяц desc limit 1)
	|where Месяц <> 0"

 

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать