Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

 Помогите посчитать количество дней которые товар был на складе [MSSQL]


Страницы:   1 2

mvgfirst ©   (2003-05-16 17:14:00) 

Есть таблица "Обороты товара":
CREATE TABLE [RA219] (
[IDDOC] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , --Идентификатор документа
[DATE_TIME_IDDOC] [char] (23) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Дата+Время+Идентификатор документа
[SP290] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Идентификатор Контрагента
[SP291] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Идентификатор Товара
[SP292] [numeric](18, 3) NOT NULL , -- Количество прихода товара
[SP294] [numeric](18, 3) NOT NULL , -- Количество расхода товара
) ON [PRIMARY]

Нужно получить количество дней во время которых товар находился в организации (Количество_Прихода-Количество_Расхода <> 0). Т.е. нужно подсчитать количество дней в промежутках когда товар был на складах орагнизации. и не считать те промежутки когда товара небыло.


mvgfirst   (2003-05-20 10:02:00) [1]

Вопервых этот запрос применим всегда, а не только при нулевых начальных остатках, потому как считает конечные остатки по каждому товару. На каждую дату. Во вторых - технология клиент-сервер зачем-то была придумана? Тебе не кажется что как раз для того что бы избежать "быстрых обсчетов в памяти"??? Мне казалось что это одна из причин. И именно потому что 1С так "быстро" все обсчитывает я и занялся переводом механизмов получения данных на прямой доступ к SQL.


Serginio   (2003-05-19 20:13:00) [2]

Да еще 1 раз создав ручками будешь использовать его постоянно. Главное что бы структура возвращаемых запросов была одинакова.
Кстати обсчитывая 1С таблицы в основном в памяти и эти скорости 1С и не снились все очень бысто если не сказать мгновенно.


Serginio   (2003-05-19 20:08:00) [3]

Ну при таком подходе 1С вообще суппер быстрая. Зато ручками смотри Serginio (19.05.03 15:27)
Опять же твой так называемый 1 запрос справедлив только при нулевых начальных остатках, что бывает очень редко если не считать начало работы предприятия.


mvgfirst   (2003-05-19 20:01:00) [4]

Зато это делаю не я и не руками :) А SQL запрос. И это на порядок эффективней (особенно если слегка оптимизировать SQL скрипт) чем выполнять тот же анализ руками :).


Serginio   (2003-05-19 19:43:00) [5]

Предыдуший вопрос в силе, но ресурсы твой запрос конечно пожрет капитально. Просчитывать по нескольку раз то что уже расчитано на предыдущем шаге крайне не эффективно. Пока не переубедил.


Serginio   (2003-05-19 19:18:00) [6]

Вернее так поставим задачу. Остаток на 1 Января 3 затем 10 приход 4 а 30 расход 4. Сколько по твему запросу товар находился на складе????


Serginio   (2003-05-19 19:14:00) [7]

Я все могу понять но как ты без начальных остатков.
Было на 1 января было 3 7 января ушло 3.


mvgfirst   (2003-05-19 19:10:00) [8]

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


Serginio   (2003-05-19 19:07:00) [9]

Ну нашел ты за этот период сумму (прихода - расхода) и количество движений.
Для примера 1 января приход 1 и 1 января расход 1. Сколько по твоему запросу находился товар на складе. Он тебе выдать тольк то, что по нему за этот период були движения. А если товар находился на складе, а движений не было???
Кстати RA Содержит движения регистра конкретного вида не только остатков.


mvgfirst   (2003-05-19 18:48:00) [10]

Забыл сказать сервер MS SQL 2K


mvgfirst   (2003-05-19 18:47:00) [11]


set nocount on
declare @dMin smalldatetime, @dMax smalldatetime
select @dMin= Convert(smalldatetime,"20020801"), @dMax= Convert(smalldatetime,"20030130")

declare @tab table(dat smalldatetime PRIMARY KEY CLUSTERED)

while @dMin <= @dMax begin
insert @tab VALUES (@dMin)
set @dMin= @dMin+1
end

select
sp237,
count(kol) kol
from
(
select
sp237,
dat,
sum(case when debkred = 0 then sp239 else -sp239 end) kol
from
@tab,
ra210
where
-- sp237 = " F4 " and
left(date_time_iddoc,8) < convert(char(8),dat,112)
group by
sp237,
dat) aa
group by sp237

Здесь:
ra210 регистр остатков в 1С - если ты с ней знаком поймешь
sp237 идентификатор товара

Писал на скорую руку, над оптимизацией не думал - но работает проверял на живой базе количесвто записей в таблице RA210 30 000. Считает долго около 3-х мин.


Serginio   (2003-05-19 17:19:00) [12]

Тебе остатки не нужны только в одном случае когда они нулевые. Но еще раз повторю остатки будут прыгать
для примера 1 января приход 1; 1 января уход 1; дней в продаже 1; затем приход 4 января 100 и 30 января товар обнулился (30-4)+1;
Итого товар находился в продаже 27 дней. Если такое возможно сделать одним запросом подскажи намотаю на ус.


mvgfirst   (2003-05-19 17:12:00) [13]

А причем тут конечные и начальные остатки? У меня будет дата начала выборки и дата окончания выборки, на каждую день в этом (я надесюсь) я смогу получить итоги, и потом же подсчиать количество записей в у которых итоги > 0


Serginio   (2003-05-19 17:10:00) [14]

Тогда объясни мне глупому как можно найти количество нахождения товара на складе не зная конечных или начальных остатков. Причем остатки будут прыгать от 0 и больше и обратно взависимости от движения товара?????


mvgfirst   (2003-05-19 16:56:00) [15]

http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=32270
Посмотри - тут вот говорят что можно :)


Serginio   (2003-05-19 16:48:00) [16]

>>mvgfirst (19.05.03 16:18)
А зачем в 1С существуют ВК и обычные СОМ объекты. Я только через них и обрабатываю сложные задачи. Еще раз повторю 1 запросом не получится у тебя. Смотри >>Serginio (16.05.03 20:57)


Danilka   (2003-05-19 16:30:00) [17]

mvgfirst (19.05.03 16:18)
>научится брать остатки - я могу вас и сам научить :). Опыт имеется.

Если забесплатно, то почему-бы и нет, было-бы интересно. Можете лекции слать мне на мыло. :))


mvgfirst   (2003-05-19 16:23:00) [18]

2 kaif ©
Вот именно так и собираюсь делать. Но на всякий случай ищу альтернативы. :)


mvgfirst   (2003-05-19 16:18:00) [19]

2 Serginio
Обсчитывать на клиенте - абсолютно неприменимо. Все это я делаю на 1С, а любые операции над большми объемами в 1С - жто смертоубийство. Почему и пытаюсь сделать все одним запросом, что бы максимально уменьшить время отклика на больших отчетах.

2 Danilka
Вообщето я не первый год замужем. И что и как 1С хранит у себя в базах знаю, и если вы прочитаете внимательно весь топик то поймете что мне нужен отчет по каждому дню, не зависимо от того были в этот день движения или небыло. А насчет научится брать остатки - я могу вас и сам научить :). Опыт имеется.
Во вторых - точка актуальности в 1С придумана для того что бы не перещитывать итоги на момент "актуальности" - а если мне необходимо получить итог за нестандартный период - то 1С начинает все пересчитывать и делаеть она это НЕПРОСТИТЕЛЬНО ДОЛГО!!!!!


Danilka   (2003-05-19 16:07:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо