На главную   На главную   Форумы Новости Документация Скачать Купить  
Регистрация  
Система Allegro
Oб Allegro Характеристики Пример конфигурации Документация База ошибок Развитие
Версия для печати К списку книг Вернуться к оглавлению Предыдущий параграф Следующий параграф
Поиск по книге

Глава 7. СПРАВОЧНИКИ

Работа с таблицами справочников, хранимые процедуры CLASS_TREE, CLASS_ROOT

Предположим, у нас имеются классы справочников (таблицы):

  • Товары (GOODS)
  • Крепеж (METAL_ITEMS)
  • Винты (SCREWS)
  • Разный крепеж (OTHER_METAL_ITEMS)
  • Обувь (SHOES)

Мы можем легко запросить все краткие наименования объектов класса « Обувь», объединив таблицу наименований объектов OBJECT_NAMES с таблицей SHOES по полю ID:

select o1.object_id, o1.short_name
from object_names o1, shoes s
where o1.object_id = s.id;

Так как все объекты в таблице OBJECT_NAMES хранят свои ID в поле OBJECT_ID, то, объединяя OBJECT_NAMES с любой таблицей класса по полю ID, мы получим наименования любого класса объектов, какой только существует в системе. Например, мы можем получить весь «Крепеж», в который войдут и «Винты » и «Разный крепеж»:

select o1.object_id, o1.short_name
from object_names o1, metal_items m
where o1.object_id = m.id;

Или даже все «Товары» :

select o1.object_id, o1.short _name

from object_names o1, goods g

where o1.object_id = g.id ;

Объединяя таблицу любого класса с накопителем финансовых данных, например , с таблицей проводок ACC_TURN, мы можем получить анализ финансовой информации по любому атрибуту конкретно выбранного класса . Например, если мы хотим проанализировать остатки обуви на главном складе по цветам, то мы просто объединяем таблицу проводок ACC_TURN с таблицей SHOES и, для того, чтобы еще увидеть наименования цветов - с таблицей OBJECT_NAMES:

select
  sum(a.debit) – sum(a.credit) amount,
  o1.short_name shoes_color
from
  shoes s,
  acc_turn a,
  object_names o1
where
  a.object_id = s.id and
  o1.object_id = s.color and a.acc_id = 123
group by
  o1.short_name;

В приведенном примере мы использовали запрос с группировкой. Предполагалось , что ACC_ID главного склада равняется 123.

Если же мы хотим посмотреть распределение товаров на главном складе по классам, тогда лучше всего воспользоваться колонкой CLASS_ ID таблицы OBJECT_NAMES и тем, что нам известно устройство таблицы CLASS:

select
  sum(a.debit) – sum(a.credit) amount,
  c.name class_name
from
  acc_turn a,
  object_names o1,
  class c
where
  a.object_id = o1.object_id and
  o1.class_id = c.class_id and
  a.acc_id = 123
group by
  c.name;

А теперь предположим, что нам нужен список всех классов . Как нам его получить? Это очень просто – достаточно запросить таблицу CLASS:

select class_id, name from class c

А если нам нужен список всех классов, потомков класса «Товары»? Простой запрос типа

select class_id, name from class c
where parent_id = 100

нам вернет только прямых потомков класса «товары», но не все дочерние классы. Конечно, можно написать хранимую процедуру обхода дерева классов, но проще воспользоваться готовой системной процедурой CLASS_TREE, которая возвращает все сочетания CLASS _ID по правилу старший-младший для каждого класса и всех его потомков.

Результирующий набор, поставляемый хранимой процедурой CLASS_TREE


Название поля Тип данных Назначение
PARENT_ID INTEGER Внутренний ID класса-предка
CHILD_ID INTEGER Внутренний ID класса-потомка

Запрос вида:

select c.class_id, c.name
from class_tree ct, class c
where c.class_id = ct.child_id and  ct.parent_id = 100

вернет список всех классов, потомков класса «Товары», включая его самого.

Последняя системная хранимая процедура, имеющая отношение к справочной системе это процедура CLASS_ROOT. Эта процедура позволяет получить CLASS_ID корневого класса для любого выбранного класса, если нам известен его CLASS_ID. Она имеет входной параметр типа INTEGER, в котором при вызове передается CLASS_ID интересующего нас класса. Процедура возвращает один параметр: ROOT_ID, в котором передает нам CLASS_ID корневого класса. Например, для класса «Винты» корневым является класс «Товары». Использовать процедуру CLASS_ROOT несложно:

select c.class_id, c.name
from class_root(1005) cr, class c
where c.class_id = cr.root_id

Здесь предполагается, что класс «Винты» имеет CLASS _ID = 1005.



Система Allegro. Руководство разработчика Наверх