3.3.5. Параметры выборки¶
3.3.5.1. Имена параметров¶
3.3.5.1.1. Служебные префиксы¶
Для доступа к параметрам используются следующие префиксы:
- super$, - параметры мастера;
- old$, - предыдущее значение. Используется только для чтения и не может использоваться для установки значений;
- filter$, - параметры фильтрации выборки.
При обращении к параметрам допускается также использование комбинаций префиксов со следующими ограничениями:
- префикс super$ может использоваться несколько раз, но должен всегда находиться перед именем параметра и другими префиксами;
- префикс old$ может использоваться только один раз, должен находиться перед именем параметра и префиксом filter$, если таковой имеется;
- префикс filter$ может встречаться только один раз и указываться непосредственно перед именем параметра.
<pascal>
id1 := GetVar('id'); //получение значения параметра 'id' текущей выборки
id2 := GetVar('super$id'); //получение значения параметра 'id' мастер-выборки
id3 := GetVar('super$super$id'); //получение значения параметра 'id' мастер-выборки мастер-выборки
flt1 := GetVar('filter$flt'); //получение значения параметра фильтрации 'flt' текущей выборки
flt2 := GetVar('super$filter$flt'); //получение значения параметра фильтрации 'flt' мастер-выборки
flt2OldValue := GetVar('super$old$filter$flt'); //получение предыдущего значения параметра фильтрации 'flt' мастер-выборки
</pascal>
Служебные префиксы используются только для получения доступа к уже существующим параметрам и не могут использоваться при создании новых параметров. При необходимости создать внутренний параметр в мастере выборки используйте свойство 'Master'.
<pascal>
Selection.Master.AddVar('param1', 'value', ftString); //Правильно
Selection.AddVar('super$param1', 'value', ftString); //Неправильно
</pascal>
3.3.5.2. Типы параметров¶
TFieldType | Описание | Примечание, допустимые значения |
---|---|---|
ftUnknown | неизвестный / не определённый тип | Используется для добавления параметров, тип которых будет определён по значению |
ftString | символ или строка | |
ftSmallInt | 16-битное целое число | -32767..32768 |
ftInteger | в Global эквивалентен типу ftFloat | |
ftWord | 16-битное беззнаковое целое число | 0..65535 |
ftBoolean | false, true; 0, 1; при установке значения, отличного от перечисленных, будет установлено true | |
ftFloat | число с плавающей точкой | |
ftCurrency | денежный тип | |
ftBCD | ||
ftDate | дата | |
ftTime | время | |
ftDateTime | дата и время | |
ftBytes | ||
ftVarBytes | ||
ftAutoInc | ||
ftBlob | ||
ftMemo | ||
ftGraphic | ||
ftFmtMemo | ||
ftParadoxOle | ||
ftDBaseOle | ||
ftTypedBinary | ||
ftCursor | ||
ftFixedChar | ||
ftWideString | ||
ftLargeInt | ||
ftADT | ||
ftArray | ||
ftReference | ||
ftDataSet | ||
ftOraBlob | ||
ftOraClob | ||
ftVariant | Данные, не привязанные к определённому типу данных | |
ftInterface | ||
ftIDispatch | ||
ftGuid | ||
ftTimeStamp | ||
ftFMTBcd |
3.3.5.3. Стойкость параметров¶
Параметры выборки могут быть "стойкие" (persistent) или "не стойкие" (по умолчанию). Если параметр является стойким, то при закрытии выборки он сохранит свое значение и восстановит его при новом открытии этой выборки, после вызовов OnLoadMeta, OnFilterInit, до вызова BeforeOpen. При закрытии датасета и новом открытии настройки заново не загружаются. У процедуры создания параметров выборки TbtkScriptSelectionObject.AddVar
есть параметр APersistence, который указывает, является ли параметр стойким, а также задаёт место, где будет храниться значение параметра.
procedure TbtkScriptSelectionObject.AddVar(
AName: String;
AValue: Variant;
AType: Variant;
APersistence: TbtkPersistentType default ptNone);
Параметр APersistence имеет тип TbtkPersistentType
. Описание принимаемых им значений:
- ptNone — параметр не является "стойким" и будет удален при закрытии выборки. Является значением по умолчанию.
- ptRegistry — параметр является "стойким", после закрытия выборки его значение будет сохранено в реестре приложения, а при открытии выборки — восстановлено оттуда.
Пример:
<pascal>
AddVar('PersistVar', 'DefaultValue', ftString, ptRegistry);
<pascal>
3.3.5.4. Алгоритм поиска параметров¶
При обращении к параметрам через паскаль операции используется следующий алгоритм поиска параметра:
имя параметра начинается с префикса 'super$'
отбрасываем префикс, ищем параметр в мастере
имя параметра начинается с префикса 'filter$'
отбрасываем префикс, ищем в параметрах фильтрации
если параметр не найден
ищем параметр в мастере
ищем в атрибутах выборки
если параметр не найден
ищем в параметрах фильтрации
ищем во внутренних параметрах
если параметр не найден
ищем параметр в мастере
3.3.5.5. Методы паскаль операций¶
3.3.5.5.1. VarExists¶
Для проверки существования параметров используется функция VarExists
.
procedure VarExists(AName: string);
3.3.5.5.2. SelfVarExists¶
3.3.5.5.3. AddVar¶
Для добавления внутренних параметров выборки используется метод AddVar
.
procedure AddVar(
AName: string;
AValue: Variant;
ADataType: TFieldType;
APersistent: TbtkPersistentType);
- ADataType - тип добавляемого параметра;
- APersistent - флаг стойкости параметра.
Но при добавлении новых внутренних параметров следует избегать использования зарезервированных префиксов в названиях и не использовать в качестве названия пустую строку.
<pascal>
Selection.AddVar('var1', 'Value', ftString, ptRegistry); //добавление строкового стойкого параметра в текущую выборку
AddVar('id', 123, ftInteger, ptNone); //добавление не стойкого целочисленного параметра в текущую выборку
CustomSel.AddVar('anyVar', null, ftUnknown); //добавление не стойкого параметра типа ftUnknown в выборку "CustomSel"
<pascal>
<pascal>
Selection.AddVar('Var1', 'Value', ftFloat); //задаваемое значение ('Value') невозможно представить в указанном типе (ftFloat)
AddVar('', 123, ftInteger); //не указано имя параметра
CustomSel.AddVar('super$anyVar', null, ftUnknown); //в имени параметра используется зарезервированный префикс 'super$'
<pascal>
3.3.5.5.4. SetVar¶
Метод SetVar
используется для установки значений:
- внутренним параметрам;
- параметрам фильтрации;
- полям выборки.
3.3.5.5.5. GetVar¶
3.3.5.5.6. GetSelfVar¶
3.3.5.5.7. SetVarDesc¶
3.3.5.5.8. GetVarDesc¶
3.3.5.6. Макросы выборок¶
3.3.5.6.1. Макросы фильтрации и условия Alias¶
&DefUniFltMacros | Макрос универсального (серверного) фильтра выборки |
&DefUniFltMacrosRO | Условие, дописываемое к условию макроса &DefUniFltMacros |
&ServFilterAliasMacros | Макрос условия Alias |
&LoadData# | Используется, если установлено свойство выборки "Не загружать данные при первом открытии" |
Эти макросы используются для "оборачивания" исходного запроса данных следующим образом:
select ServFilterAliasMacros.*
from (<исходный запрос>) &ServFilterAliasMacros
where &DefUniFltMacros and &DefUniFltMacrosRO
Оборачивание происходит на применении фильтра. Вид обертки может меняться: если в исходном запросе уже имеются некоторые из указанных макросов, или соответствующие им значения пусты, то эти макросы к запросу не приписываются.
Условия добавления макросов:
&ServFilterAliasMacros - добавляется с оборотом запроса только в случае, если выполнены следующие условия:
- значение макроса непусто (недопустим запрос *select .* from ... * с пустотой перед '.');
- в исходном запросе еще не встречается ни один из трех указанных макросов (недопустимо использование макросов фильтрации внутри обертки Alias).
&DefUniFltMacros и &DefUniFltMacrosRO независимо дописываются, если:
- они ещё не встретились в исходном запросе;
- соответствующие им значения непусты или запрос начинается с макроса Alias.
Примечание:
&ServFilterAliasMacros заполняется (может быть прописан в запросе вручную) только при активных операциях универсального фильтра.
Об использовании макросов фильтрации и операций серверного фильтра см. в статье: http://wiki.gs.local/index.php/Фильтрация_серверая#Паскаль-события_фильтрации>
3.3.5.6.2. Макросы сортировки:¶
&SortOrder# | Макрос сортировки |
Макрос сортировки, содержащий накладываемые фильтрами значения. Подробнее см. в статье: http://wiki.gs.local/index.php/Сортировка_серверная
3.3.5.6.3. Свойства выборки, отключающие применение макросов фильтрации и сортировки:¶
ApplyServFilterMacros | Свойство отвечает за наложение макросов фильтрации &DefUniFltMacros и &DefUniFltMacrosRO. По умолчанию включено - значения макросов накладываются при запросе данных. Если свойство выключить, значения макросов все равно соответствуют настройкам фильтров, однако на формирование запроса не влияют. |
ApplyServSortOrderMacros | Аналогичное свойство, отвечающее за применение макроса сортировки &SortOrder#. |
Перечисленные свойства располагаются в свойствах выборки на закладке "дополнительные свойства", в группе "макросы".
3.3.5.6.4. Смена макросов и переоткрытие выборки¶
Во избежание лишних переоткрытий датасета, решено поддерживать следующую логику при смене значений макросов:
- при добавлении нового макроса, или смене значения макроса, не входящего в GST, ничего не происходит.
- при смене значения макроса, входящего в текст запроса, выполняется переоткрытие выборки (если не установлено свойство "Не закрывать датасет при обновлении макроса").