Вторник, 30 Апр 2024, 05:31
Uchi.ucoz.ru
Меню сайта
Форма входа

Категории раздела
Высшая математика [11]
Экономическая социология [95]
Основы Менеджмента [64]
Бухгалтерский учёт [157]
Философия [163]
Мировая Экономика [603]
Бизнес планирование [29]
Финансирование и кредитование инвест [105]
Ценообразование [46]
Гражданское право [196]
Права Человека [173]
Основы Маркетинга [207]
Основы энергосбережения [55]
Информатика [0]
Экология и устойчивое развитие [0]
Физика для студентов [0]
Основы права [0]
Политология [0]
Не стандартные примеры на Delphi [169]
Примеры на Delphi7 [108]
Алгоритмы [94]
API [110]
Pascal [152]
Базы Данных [6]
Новости
Чего не хватает сайту?
500
Статистика
Зарегистрировано на сайте:
Всего: 51635


Онлайн всего: 5
Гостей: 5
Пользователей: 0
Яндекс.Метрика
Рейтинг@Mail.ru

Каталог статей


Главная » Статьи » Студентам » Не стандартные примеры на Delphi

dBASE - Индексы выражений
dBASE - Индексы выражений (Expression Indexes): Введение

Индексы для таблиц dBASE могут базироваться на значениях из отдельной
области, нередактируемых данных, или на основе выражений. Индексы выражений,
уникальные для индексов dBASE, могут формироваться на основе нескольких полей,
измененных значений полей или их комбинаций. Выражение для dBASE-индекса
создаются с использованием dBASE-функций и синтаксиса для конкатенации
нескольких полей или изменения значений поля для полей, включенных в выражения
индекса.

В конце данного совета включены два небольших раздела, описывающих механику
создания индексов выражений dBASE, один относится к утилите Database Desktop,
другой - к приложениям Delphi.

Индексные выражения на основе множества полей

Функции dBASE доступны для применения в Delphi или Database Desktop для
ускоренного использования в выражениях индекса, и затем только в связи с
индексами dBASE. То есть, вы не сможете использовать функции dBASE или синтаксис
для создания выражения индекса для таблицы Paradox или Local InterBase Server
(LIBS). Функции dBASE не могут использоваться при программировании в Delphi. Они
доступны только для выражений индесов dBASE. Синтаксис и функции dBASE, которые
могут быть использованы для выражений индексов, "расположены" в библиотечном
файле Borland Database Engine (BDE) IDDBAS01.DLL.

При создании индекса dBASE, который должен базироваться на двух или более
полях таблицы, для которой он создается, два или более поля конкатенируются
(связываются вместе) в величине, которая в некоторой степени похожа на Delphi
тип String, с использованием синтакса Delphi: оператор "+". Например, выражению
необходимо создать индекс, который должен базироваться в первую очередь на
основе поля LastName, а затем на основе поля FirstName:

LastName + FirstName
В отличие от самого dBASE, такие индексы,
основанные на нескольких полях, ограничены использованием таких же полей в
таблице. dBASE допускает создание индексов, основанных на нескольких полях,
содержищихся в другой таблице. Это позволяет во время создания индекса иметь
открытую только "другую" таблицу или использовать таблицу, содержащую индекс.

У индексов с несколькими полями для других типов таблиц (например, Paradox и
InterBase), используемые поля должны быть разделены точкой с запятой (;), как
показано ниже:

LastName;FirstName
В выражениях индекса dBASE, в которых
конкатенируются несколько полей, фактическое выражение должно выглядеть
следующим образом:

LastName + FirstName
При создании индексных выражений, которые
конкатенируют два и более поля, все включенные поля должны иметь одинаковый тип.
К тому же, если они должны конкатенироваться, вместо складывания, то все поля
должны иметь тип String. Например, для двух целочисленных полей, Value1 и
Value2, выражение индекса...

Value1 + Value2
...не вызовет ошибку. Но в этом случае произойдет
конкатенация двух значений полей и они суммируются. Таким образом, если Value1
для данной записи содержало 4, а Value2 - 5, результирующий индексный узел будет
целой величиной 9, а не строковой конкантенацией "45".

Если поля, включенные в выражение индекса, имеют не строковый тип, они должны
быть преобразованы. Вот некоторые функции dBASE, преобразовывающие различные
типы данных к строковому типу для использования в выражениях индекса:

STR( [, [, ]])
Преобразовывает
dBASE-тип Float или Numeric в Character (String)

DTOS()
Преобразовывает значение Date к Character, формат
YYYYMMDD

MLINE(, )
Извлекает отдельную строку из
Memo-поля как значение Character

Другое ограничение при создании индексов путем конкантенации нескольких полей
- максимально допустимая длина индексной величины. Величина, возвращаемая
индексным значением, не может превышать 100 символов. Это предел длины значения,
возвращаемого выражением, не длина самого выражения. Например, вы не можете
создать индекс путем конкантенации двух полей, если они оба имееют длину 255
символов.

Индексные выражения на основе модификации значений полей

Дополнительно к созданию индексов, основанных на конкатенации значений двух и
более полей, также возможно создать индекс, основанный на модификации значений
полей. Примером этого может служить создание индекса на основе первых трех
символов поля типа String, года и месяца поля с типом Date, индекс с
использованием конкантенации полей с типами String и Date, где значение поля
типа String отсортировано по возрастающей, а поле, имеющим тип Date - по
убывающей, и даже создание индекса на основе поля с логическим типом.

Создание индексов на основе модификации значений полей требует, по крайней
мере, практическое знание функций dBASE и синтаксиса, поскольку данная
технология использует dBASE, а не функции и синтаксис Delphi. Функция dBASE
SUBSTR() извлекает подстроку из поля типа String. Delphi-эквивалент данной
dBASE-функции - Copy. Но только dBASE функция SUBSTR() может применяться при
создании индексного выражения dBASE.

Использование фунций dBASE в индексных выражениях dBASE заключается в простом
включении в индексное выражение функции, использование в функциях
dBASE-синтаксиса и имени (имен) поля (полей), использующихся в функциях.
Например, индексное выражение на основе трех последних символов значения поля
типа String с именем Code, имеющим длину 20 символов выглядит так:

RIGHT(Code, 3)
Важно соблюдение следующего правила: конструкции
индексных выражений dBASE, модифицирующих значения полей, должны возвращать
величину с "последовательной длиной" для каждой записи таблицы, т.е. результат
не должен содержать граничных пробелов. Например, функция dBASE TRIM() удаляет
граничные пробелы (ASCII код 32) из значения поля типа String. Если это было
использовано вместе с конкантенацией двух полей, имеющих тип String, где поле не
имеет постоянной длины для разных записей, длина результирующего значения будет
различная для всех записей. В свете этого рассмотрим следующий пример: построим
индексное выражение на основе конкантенации полей LastName и FirstName field,
где функция TRIM() применена к полю LastName:

TRIM(LastName) + FirstName
Данное выражение не возратит значения
"последовательной длины" для всех записей. Если поля LastName и FirstName
содержали значения...

LastName FirstName
-------- ---------
Smith Jonas
Wesson Nancy
...то результат использования индексного выражения может
быть таким:

SmithJonas
WessonNancy

Как вы можете наблюдать, длина значения первого поля равна 10 символов,
тогда как второго - 11 символов. Узлы индекса для данного индексного выражения
должны базироваться на значении поля первой ненумерованной записи.
Следовательно, результат выражения индекса для каждого узла должен быть равен 10
символов. В нашем примере результат вычисления для второй записи округляется до
"WessonNanc". Все это приводит к тому, что поиск, основанный на поиске полных
значений в полях, окончится неудачей.

Решение это дилеммы кроется в не использовании функции TRIM(), а в
использовании полной длины значений поля LastName, включая граничные пробелы. В
индексах, которые используют функции IIF() для установления порядка одного поля
или другого, основанных на сравнении логических выражений в IIF(), если два поля
имеют различную длину, более короткое поле должно быть заполнено пробелами до
длины большей области. Для примера, создавая индекс с использованием функции
IIF(), и индексируя поля Company или Name, базирующийся на поле Category, и где
поле Company длиной 40 символов, а поле Name длиной 25 симловов, поле Name
необходимо дополнять 15-ю пробелами; например, с помощью dBASE-функции SPACE().
Выражение индекса в этом случае будет таким:

IIF(Category = "B", Company, Name + SPACE(15))
Поиск и выражения
индексов dBASE

Выражения индексов dBASE являются исключениями из правил в том, как они
обрабатываются Delphi и BDE, по сравнению с обработкой индексов таблиц другого
типа, также основанных на множестве полей.

Это вынуждает вынести dBASE-индексы в отдельный класс. Обработка таких
индексов в Delphi и BDE отличается от обработки индексов для других типов
таблиц. Одно из самых существенных различий заключается в том, что не все
поисковые инструменты, основанные на индексах и использующие синтаксис Delphi,
могут использовать выражения индексов dBASE. FindKey, FindNearest и GotoKey
методы компонента TTable не годятся для работы с выражениями индексов. При
попытке использования FindKey вы получите сообщение об ошибке: "Field index out
of range." (Индекс поля за границами диапазона). При попытке использования
метода GotoKey может произойти та же ошибка, или табличный курсор может остаться
на месте (визуально искомая величина не найдена). С выражениями индексов может
использоваться только метод GotoNearest. Но даже GotoNearest может не работать с
некоторыми индексными выражениями. Только с помощью эксперимента можно
установить - работает ли метод GotoNearest с данным индексным выражением.

Фильтрация индексных выражений dBASE

Как и основанный на индексах поиск, индексные выражения dBASE при
использовании фильтров Delphi также имеют некоторые исключения.

С активным индексным выражением метод SetRange компонента TTable приводит к
следующей ошибке: "Field index out of range." (Индекс поля за границами
диапазона). Тем не менее, с тем же активным индексным выражением методы
SetRangeStart и SetRangeEnd успешно фильтруют набор данных.

Например, выражение индекса с конкантенацией поля LastName и активного
FirstName, в приведенном ниже коде, использующем метод FindKey (предполагающий
фильтрацию тех записей, где первый символ поля LastName содержит "S"), "вылетит"
с ошибкой:

begin
Table1.SetRange(['S'], ['Szzz'])
end;
Категория: Не стандартные примеры на Delphi | Добавил: Lerka (22 Ноя 2012)
Просмотров: 714 | Рейтинг: 1.0/ 5 Оштрафовать | Жаловаться на материал
Похожие материалы
Всего комментариев: 0

Для блога (HTML)


Для форума (BB-Code)


Прямая ссылка

Профиль
Вторник
30 Апр 2024
05:31


Вы из группы: Гости
Вы уже дней на сайте
У вас: непрочитанных сообщений
Добавить статью
Прочитать сообщения
Регистрация
Вход
Улучшенный поиск
Поиск по сайту Поиск по всему интернету
Наши партнеры
Интересное
Популярное статьи
Портфолио ученика начальной школы
УХОД ЗА ВОЛОСАМИ ОЧЕНЬ ПРОСТ — ХОЧУ Я ЭТИМ ПОДЕЛИТ...
Диктанты 2 класс
Детство Л.Н. Толстого
Библиографический обзор литературы о музыке
Авторская программа элективного курса "Практи...
Контрольная работа по теме «Углеводороды»
Поиск
Главная страница
Используются технологии uCoz