Описание дополнительных (переключаемых) реляционных отношений |
Дополнительное реляционное отношение предназначено для задания альтернативных вариантов реляционных отношений и сортировки.
<дополнительное-реляционное-отношение> = bounds <имя-диапазона> ( as | = ) <условия-подцепки> [ <порядок-сортировки-узла> ]
<имя-диапазона> - идентификатор.
<условия-подцепки> - см. "Конструкция where. ".
<порядок-сортировки-узла> -
<порядок-сортировки-узла> = ordered [ by ] ( index | tableOrder | <поля-порядка> )
TableOrder - использовать сортировку логической таблицы. Такой bounds не конфликтует с порядком сортировки, указанном при описании логической таблицы.
<поля порядка> - см. "Описание порядков сортировки записей. ".
Включение одного из дополнительных реляционных отношений отменяет текущее реляционное отношение и сортировку для узла. Включение диапазона осуществляется функцией PushBounds, восстановление стандартного реляционного отношения - функцией PopBounds. Функциями ResetBounds и SetBounds можно, не трогая порядок сортировки, снять и восстановить все ограничения для узла. Кроме того, функции AddBounds и SubBounds не отменяют, а добавляют дополнительное реляционное отношение. При использовании этих функций необходимо иметь в виду, что компилятор не проверяет возможность подбора индекса, и Вам придется предварительно убедиться в том, что индекс существует, либо поставить атрибут noindex.
Если в главной логической таблице интерфейса нет баундов по умолчанию, а есть только описанные баунды, которые устанавливаются по ходу работы (например в cmInit), то при обращении в том же cmInit к видимой части интерфейса (API конфигуратора, работа со свойствами полей и пр.) запросы к БД идут без ограничений, что может приводить к существенным замедлениям на этапе загрузки.
При генерации Pascal-заготовок константы для номеров диапазонов получаются путем добавления к имени диапазона префикса "tb".
Пример 1. В примере описан диапазон на таблицу Employee по кодам от minCode до maxCode.
create view var maxCode,minCode : longint as select * from Employee bounds Bn1 = minCode <<= Employee.code and maxCode >>= Employee.code;
Пример 2.
interface boundTest; create view bTest as select * from SaldoMC order by SaldoMC.cParty // Указание в Bounds'е порядка без ограничений. bounds onlyOrder ordered by SaldoMC.cPodr // Bounds, конфликтующий с порядком сортировки таблицы. bounds conflict as 0 <<= SaldoMC.srPrice (noindex) // Bounds, не конфликтующий с порядком сортировки таблицы. bounds noConflict as 0 <<= SaldoMC.srPrice (noindex) ordered by tableOrder ; screen scr1; show at (,16) buttons cmOnlyOrder; cmConflict; cmNoConflict; << <. OnlyOrder .> <. Conflict .> <. NoConflict .> >> end; browse br1; show at(,,,15) table SaldoMc; fields SaldoMc.NRec; SaldoMC.cParty; SaldoMc.cPodr; SaldoMc.srPrice; end; handleEvent cmOnlyOrder : begin PushBounds (tbOnlyOrder); // Меняет сортировку. ReReadRecord (tnSaldoMC); // Вызывается для перерисовки панели. end; cmConflict : begin PushBounds (tbConflict); // Разрушает сортировку. ReReadRecord (tnSaldoMC); // Вызывается для перерисовки панели. end; cmNoConflict : begin PushBounds (tbNoConflict); // Меняет сортировку на указанную в описании таблицы. ReReadRecord (tnSaldoMC); // Вызывается для перерисовки панели. end; end; end.