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

kvasov
Дата: 07.08.2005 14:08:21
Где бы увидеть пример класса с пользовательской стратегией хранения?
VadimF
Дата: 08.08.2005 13:14:20
Конечно можно. Высылаю Вам ссылку на презентацию с примерами.

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

Вадим
kvasov
Дата: 09.08.2005 13:25:59
Спасибо, прочитал, но вот на практике с внедрением пока не могу врубится.

Предположим есть класс «Поставки» с 4 свойствами – наименование товара, группа и подгруппа товара и количество, и есть 6 обьектов этого класса.
Если сохранять «по-умолчанию», то обьекты сохраняются так:

^Naklad(1)=$lb(“Группа4”,”Подгруппа18”, “Товар5”, 30)
^Naklad(2)=$lb(“Группа2”,”Подгруппа3”, “Товар7”, 30)
^Naklad(3)=$lb(“Группа2”,”Подгруппа3”, “Товар7”, 30)
^Naklad(4)=$lb(“Группа14”,”Подгруппа2”, “Товар1”, 30)
^Naklad(5)=$lb(“Группа14”,”Подгруппа18”, “Товар33”, 30)
^Naklad(6)=$lb(“Группа14”,”Подгруппа18”, “Товар5”, 30)


Хотелось бы решить такую задачу – при записи обьектов на лету вычислять и хранить еще и итоги по суммарному количеству товара по группам и подгруппам.
То есть при записи 6 обьектов должна появиться какая-то такая конструкция:

^Naklad(“Группа2”)=60
^Naklad(“Группа2”,”Подгруппа3”)=60
^Naklad(“Группа2”,”Подгруппа3”,0)=2 - инкремент подгруппы
^Naklad(“Группа2”,”Подгруппа3”,1)=$lb(“Товар7”, 30)
^Naklad(“Группа2”,”Подгруппа3”,2)=$lb(“Товар7”, 30)
^Naklad(“Группа4”)=30
^Naklad(“Группа4”,”Подгруппа18”)=30
^Naklad(“Группа4”,”Подгруппа18”,0)=1 - инкремент подгруппы
^Naklad(“Группа4”,”Подгруппа18”,1)=$lb(“Товар5”, 30)
^Naklad(“Группа14”)=90
^Naklad(“Группа14”,”Подгруппа2”)=30
^Naklad(“Группа14”,”Подгруппа2”,0)=1 - инкремент подгруппы
^Naklad(“Группа14”,”Подгруппа2”,1)=$lb(“Товар1”, 30)
^Naklad(“Группа14”,”Подгруппа18”)=60
^Naklad(“Группа14”,”Подгруппа18”,0)=2 - инкремент подгруппы
^Naklad(“Группа14”,”Подгруппа18”,1)=$lb(“Товар33”, 30)
^Naklad(“Группа14”,”Подгруппа18”,2)=$lb(“Товар5”, 30)


Возникнет вопрос – что же будет идентификатором обьекта?
И ответ бы такой: OID – это список - группа, подгруппа и инкремент подгруппы.
т.е.:
OID обьекта (1)=$lb(“Группа4”,”Подгруппа18”, 1)
OID обьекта (2)=$lb(“Группа2”,”Подгруппа3”,1)
OID обьекта (3)=$lb(“Группа2”,”Подгруппа3”,2)
OID обьекта (4)=$lb(“Группа14”,”Подгруппа2”, 1)
OID обьекта (5)=$lb(“Группа14”,”Подгруппа18”, 1)
OID обьекта (6)=$lb(“Группа14”,”Подгруппа18”, 2)

Вообще реально решить такую задачу каким-нибудь образом?
Какой Cache Storage надо изучать?
И вот эти методы %LoadData, %SaveData – их в Studio прямо в классе Поставки надо писать ниже свойств что-ли – дык вроде ошибки компиляции идут?

Одним словом, хотелось бы включить мультидименсион.
VadimF
Дата: 15.08.2005 01:52:19
Для этого не стоит использовать Cache' Storage.
Гораздо правильнее использовать для этой цели стандартный Storage.
Чтобы получить структуру с нуля с подобной стратегией хранения можно сделать следующее:

Создать класс "Товар".
Поле "Группа" - ссылка на отдельный класс "Группа", Поле "Подгруппа" ссылка на отдельный класс "Подгруппа ".
Создать индекс, который будет SQL Primary Key и OID по полям Группа, Подгруппа, Id.
Задать правило вычисления для значения по умолчанию Id (например с помощью $Increment), чтобы не нужно было руками присваивать.

Товары будут храниться в глобале, который Вы описали.
Группы и Подгруппы в отдельных классах.

Если есть существующие данные, то нужно использовать Cache' SQL Storage.

Я точно не знаю Вашу задачу, но скорее всего можно просто сделать класс c обычным Id, ссылками на группу и подгруппу. И построить BitMap-индекс по свойствам группа и подгруппа.
Количество будет вычисляться мгновенно через SQL, так как запрос будет выполняться с помощью индекса.
Можно сделать с помощью встроенного SQL методы, которые будут возвращать количество товаров в каждой группе.

BitMap-индексы в Cache' работают крайне эффективно и их можно применять не только в ХД, но и в OLTP-приложениях.


Вадим
kvasov
Дата: 15.08.2005 14:45:15
Ok!
УУУУУУ
Дата: 05.04.2007 14:46:54
VadimF

Создать индекс, который будет SQL Primary Key и OID по полям Группа, Подгруппа, Id.
Задать правило вычисления для значения по умолчанию Id (например с помощью $Increment), чтобы не нужно было руками присваивать.
Вадим


А можно поподробнее про (например с помощью $Increment)?
krvsa
Дата: 05.04.2007 15:31:08
Имея свое хранение данных мы как раз стремимся перейти на стандартное классовое хранение.
Зачем "городить огород"?

----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
ЙЙЙЙЙЙЙЙЙЙ
Дата: 05.04.2007 15:59:36
Меня интересует вопрос о автоматическом вычислении значения первичного ключа.

Задать правило вычисления для значения по умолчанию Id (например с помощью $Increment), чтобы не нужно было руками присваивать.

Я пробовал делать так:
в тригере BEFORE INSERT
присваивать set {ID} = {%%ID}
но в этом случае получается нежелательная блокировка индекса ,
ее конечно можно снять, но это некрасиво.
Вот и решил поинтересоватся, может кто знает решение поэлегантнее.