А нельзя поподробнее, как вы храните период. реквизиты? а то вот тоже надо сделать, а с чего начать- не знаю.


Я в результате остановился на хранении "версий" записи с диапазоном дат, указывающим когда запись актуальна. То есть примерно так:

create table kl
 IdKl integer not null
 DtStart  date
 DtEnd date
 ...
 прочие реквизиты.

Таким образом все реквизиты становятся переодическими. DtStart и DtEnd отслеживаются в триггерах.

соответственно выборка данных справочника на заданную дату :

select * From Kl where :dt beetwin DtStart and Coalesce(DtEnd, '01.01.2100')

В join - ах вот так получается:

Select ... From Docs D
Inner Join Kl K on D.Idkl = K.IdKl and D.Dat beetwin K.DtStart and Coalesce(K.DtEnd, '01.01.2100')


У Деда, насколько помню, по другому сделано. У него есть поле
IdVersion integer
указывающее номер "версии" записи, а в документах ссылка на справочник по IdKl, IdVersion. То бишь селекты у него шустрее должны работать. Но при этом надо как-то обрабатывать ситуации, когда меняется дата документа и новое значение даты соответствует другой версии записи в справочнике клиентов. Ну и соответственно наоборот, когда меняется диапазон "актуальности" записи в справочнике - нужно прошерстить документы... И вроде как он одной датой обходится - датой начала. Хотя я мог и напутать чего-нибудь. Ежели что - Alex поправит... :)

With b/r. Gleb.

Ответить