четверг, 9 апреля 2009 г.

Складские организации. Статус закрытия периодов

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

В отличии от Дебиторов/Кредиторов, где период закрывается сразу на всю операционную единицу, в Запасах периоды нужно закрывать в каждой конкретной складской организации.

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

Так вот оказалось, что наглядную картину можно получить одним запросом (чуть подправив).
А всё благодаря аналитическим функциям.


SELECT t.period_name
-- Вместо 1,2,3 нужно подставить реальные значения.
-- полный список складских ORG_ID:
-- SELECT DISTINCT operating_unit FROM org_organization_definitions
,MAX(DECODE(t.org_id, 1, t.NAME, NULL)) AS ORG_ID_1
,MAX(DECODE(t.org_id, 2, t.NAME, NULL)) AS ORG_ID_2
,MAX(DECODE(t.org_id, 3, t.NAME, NULL)) AS ORG_ID_3
-- и так далее, для каждой ORG_ID
FROM (
SELECT oap.period_name
,ood.operating_unit AS org_id
,DECODE(oap.open_flag, 'N','Закрыто', 'Y','Открыто', oap.open_flag)
|| ' - ' || ood.organization_code||' '||ood.organization_name AS NAME
,oap.period_start_date AS start_date
,oap.schedule_close_date AS end_date
,rank() OVER (
PARTITION BY oap.period_name, ood.operating_unit
ORDER BY DECODE(oap.open_flag, 'N','Закрыто', 'Y','Открыто', oap.open_flag)
|| ' - ' || ood.organization_code||' '||ood.organization_name
) AS row_num
FROM org_organization_definitions ood
,org_acct_periods oap
WHERE oap.organization_id = ood.organization_id
-- диапазон дат можно задавать в несколько периодов
AND oap.period_start_date >= TO_DATE('01.01.2009', 'DD.MM.YYYY')
AND oap.schedule_close_date <= TO_DATE('31.03.2009', 'DD.MM.YYYY')
-- можно задать конкретный тип периода (если используется несколько)
--AND oap.period_set_name = ''
-- откинем "левые" органзицаии, типа мастер организации позиций и закрытые
AND ood.organization_code <> '000'
AND ood.disable_date IS NULL
ORDER BY 4,5,2,3
) t
GROUP BY t.start_date, t.end_date, t.period_name, t.row_num
ORDER BY t.start_date, t.end_date, t.period_name, t.row_num

Комментариев нет: