Инициализация и пустое значение переменной

Содержание

  1. Основные понятия
  2. Источник пустого значения

Основные понятия

Считается, что поле базы данных или переменная не инициализировано(а), если его (ее) значение не было определено тем или иным способом. Для массива понятие инициализированности относится к каждой ячейке массива в отдельности. Если в момент старта программы позиция в файле не определена или запись файла недоступна, все поля такого файла считаются неинициализированными. Также, если в результате операции позиционирования текущая позиция в файле становится неопределенной (состояние ~OCCURE()), значения всех полей такого файла считаются неинициализированными. Поле становится инициализированным в случае успешной файловой операции, или в результате присваивания ему значения. Переменная языка с момента объявления до момента первого присваивания ей значения также считается неинициализированной.

Поскольку значение неинициализированной переменной (поля) не определено, при любой попытке обращения к значению будет выброшено исключение. Для переменной это будет исключение 77 класса Exc_RunTime, для поля - исключение 61 класса Exc_NotOccure.

Под пустым значением понимают специальное значение поля базы данных или переменной языка, означающее отсутствие данных. Не следует путать понятия инициализированности и пустого значения: если поле или переменная не инициализированы, то они вообще не имеют никакого значения, даже пустого. Поле или переменную можно инициализировать пустым значением при помощи встроенной процедуры SETEMPTY.

Реальное представление пустого значения зависит от типа данных. Для типов NUMERIC, FLOAT, SCAL, DATE, TIME/LONGTIME/LTIME, TIMESTAMP пустое значение представляется специальным значением, не входящим в диапазон допустимых значений; для типа STRING пустое значение есть пустая строка "", для типа OBJECT - пустая ссылка.

Применение пустого значения в функции или операции, не поддерживающей работу с пустыми значениями, приведет к выбросу исключений класса Exc_RunTime. Выше сказанное не касается типа STRING; для строк пустое значение считается вполне "рабочим" и с ним разрешены все манипуляции, какие разрешены с непустым значением.

Пустое значение (кроме пустого значения типа STRING) не может являться операндом арифметических и логических операций. Однако пустые значения можно сравнивать. Для типов NUMERIC, FLOAT и STRING пустое значение меньше, чем все непустые, а для типов SCAL, DATE, TIME/LONGTIME/LTIME и TIMESTAMP - больше, чем все непустые. Пустые значения разрешены в правой части оператора присваивания. В результате выполнения такого оператора присваивания, переменная, указанная в левой части, получит пустое значение. Также разрешается передача пустых значений в качестве параметров процедур и функций, как по значению, так и по ссылке, и возврат пустого значения функциями.

Большинство встроенных функций не рассчитывают на пустые значения параметров, передаваемых по значению, за исключением, разумеется, параметров типа STRING. Как исключение, пустые значения разрешены в качестве значений ключа для функций SEARCH, SELECT, SRCINSEL, CHANGESEL, REMSEL, ADD и REP, CONCURRENTADD, CONCURRENTADDONLY, CONCURRENTRESET, FREEZESEL, DEFROSTSEL. Кроме того, FLDTOSTR, MAKEPART и STDFORM также разрешают передачу пустого значения в качестве основного(ых) параметра(ов). С параметрами нестроковых типов, передаваемыми встроенной процедуре (функции) по ссылке, могут возникнуть проблемы, только если процедуре (функции) нужно входное значение параметра, как например функции Convert_FromReal6, но такое поведение - исключительная редкость.

Проверить, является ли значение переменной или поля пустым, можно при помощи оператора !. Строго говоря, операндом оператора ! является выражение, т.к. пустым может быть и результат функции.

Источник пустого значения

Программист не обязан перед первым использованием проверять каждое поле базы данных на пустоту, хотя и может сделать это. Если пустое значение поля было использовано недопустимым образом, клиент ASB выдает сообщение о том, что необходимо заполнить поле. Однако программа может быть написана например так, что сначала некой переменной присваивается значение поля, а затем уже переменная используется в арифметическом выражении. Если поле имело пустое значение, то причиной возниковения ошибки является не переменная, а поле. Т.о. приходим к понятию источника пустого значения - точки и объекта в программе, где пустое значение было получено впервые.

Источником пустого значения может быть поле БД, если пользователь не определил значение поля, или перманентная переменная, если ее значение не определил программист. Источником пустого значения может быть также встроенная функция, вернувшая пустое значение в качестве результата (например STRTOFLD) или заполнившая пустым значением переменную, переданную по ссылке (например SETEMPTY). Источником пустого значения может быть свойство объекта ASB или объекта автоматизации COM. Наконец, пустое значение может возникнуть в результате неявного преобразования типов, например при присваивании скаляру пустой строки (использование пустой строки в арифметическом выражении - не ошибка, а пустого скаляра  - ошибка).

В идеальном варианте, переменные, поля БД и свойства объектов должны "помнить", каким образом они получили пустое значение, и передавать эту информацию по цепочке при присваивании, а в случае недопустимого применения пустого значения указывать источник пустого значения в сообщении об ошибке. В существующей реализации источник пустого значения хранят только неперманентные переменные; поля БД, перманентные переменные, а также большая часть свойств объектов "не помнят", как получили пустое значение.

Если источником пустого значения является поле БД, то вид сообщения, выдаваемого клиентом ASB по факту недопустимого использования пустого значения, зависит от того, является ли оператор программистом. Если оператор не программист, то он получит сообщение о том, что необходимо заполнить поле-источник пустого значения с указанием "пользовательского" имени поля. Программист же увидит развернутое сообщение вида "... - пустое значение. Источник - поле File.Field".

Если переменная или поле является массивом, то каждая ячейка массива может иметь свой источник пустого значения, отличный от других.