Описание дополнительных (переключаемых) реляционных отношений Назад В начало Вперед

Дополнительное реляционное отношение предназначено для задания альтернативных вариантов реляционных отношений и сортировки.

<дополнительное-реляционное-отношение> =
  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.