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

Хранение данных

Данные, с которыми вы работаете могут включать в себя какие-то количества времени, денежных единиц и элементов, которые можно подсчитывать, наравне с датами, именами, описаниями и тому подобным. Каждый кусок данных представляет их определенный тип: он принадлежит к категории данных, которыми вы управляете однотипным методом. Вы можете работать с этим данными непосредственно без их хранения, но при этом потеряете гибкость и мощность Visual FoxPro. Visual FoxPro предоставляет многочисленные контейнеры хранения для расширения вашей способности легкого управления данными.

Типы данных определяют, как данные хранятся и как они могут быть использованы. Вы можете умножать два числа, но вы не можете умножить два символа. Вы можете напечатать символы в верхнем регистре, но вы не можете произвести подобное над числами. Некоторые из первичных типов данных, используемых в Visual FoxPro перечислены в приведенной ниже таблице.

Типы данных
Тип Примеры

Numeric

123 3.1415 – 7

Character

"Test String" "123" "01/01/98"

Logical

.T. .F.

Date

DateTime

{^1998-01-01}

{^1998-01-01 12:30:00 p}

Контейнеры данных

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

Тип Описание

Переменные

Простые элементы для хранения данных в оперативной памяти вашего компьютера - RAM (Random Access Memory).

Записи таблицы

Множество строк предопределенных полей, каждое из которых может содержать предварительно определенный кусок данных. Таблицы хранятся на диске.

Массивы

Множество элементов хранения данных в оперативной памяти компьютера - RAM.

Управление данными

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

Использование операторов

Операторы соединяют данные вместе. Ниже представлены наиболее общие операторы, используемые в Visual FoxPro.

Оператор Допустимые типы данных Пример Результат

=

Все

? n = 7

Выводит на экран .T., если значение, хранимое в переменной n равно 7, в противном случае выводит .F.

+

Numeric, Character, Date, DateTime

? "Fox" + "Pro"

Выводит на экран "FoxPro"

! или NOT

Logical

? !.T.

Выводит на экран .F.

*, /

Numeric

? 5 * 5

? 25 / 5

Выводит на экран 25, затем выводит на экран 5

NoteЗамечание

Вопросительный знак (?) в начале выражения вызывает вывод новой строку символов и результат выражения выводится в активное окно вывода, каковым обычно является главное окно Visual FoxPro, иногда упоминаемое в документации, как окно рабочего стола.

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

nFirst = 123

nSecond = 45

Следующие два выражения сохраняют два куска символьных данных  в двух переменных. Данные им имена начинаются с символа c, что указывает, что они содержат символьные данные.

cFirst = "123"

cSecond = "45"

Следующие две операции складывают и соединяют, что приводит к различным результатам, так как типы переменных различаются в обеих операциях.

? nFirst + nSecond

? cFirst + cSecond

Вывод

168

12345

Поскольку cFirst представляет символьные данные, а nSecond представляет численные данные, вы получите ошибку несовпадения типов данных, если попытаетесь исполнить следующую команду:

? cFirst + nSecond

Вы можете избежать этой проблемы с помощью функций преобразования. Наприме, STR() возвращает исмвольный эквивалент численного значения, а VAL() возвращает численный эквивалент строки, состоящей из чисел. Эти функции и функция LTRIM(), которая удаляет ведущие пробелы, позволят нам выполнить следующие операции:

? cFirst + LTRIM(STR(nSecond))

? VAL(cFirst) + nSecond

Вывод

12345

168

Использование команд

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

Например, для открытия и закрытия таблиц используется команда US.

Синтаксис USE Описание

USE

Закрывает таблицу в текущей рабочей области

USE customer

Открывает таблицу CUSTOMER в текущей рабочей области, закрывает любую таблицу, которая была открыта в этой области ранее.

USE customer IN 0

Открывает таблицу CUSTOMER в следующей доступной рабочей области.

USE customer IN 0 ;

ALIAS mycust

Открывает таблицу CUSTOMER в следующей доступной рабочей области и присваивает ей псевдоимя mycust.

В приведенной ниже таблице показаны некоторые примеры команд.

Команда Описание

DELETE

Помечает указанную запись для удаления.

REPLACE

Замещает значение, хранящееся в поле записи, новым значением.

Go

Перемещает указатель записи к конкретной позиции в таблице.

Управление течением исполнения программы

Visual FoxPro включает в себя несколько категорий команд, которые "окружают" другие команды и функции, определяя когда и как будут исполнены другие команды и функции. Эти команды позволяют условное разветвление и циклическое исполнение, два очень мощных инструмента программирования. Приведенная ниже программа показывает условное разветвление и циклическое исполнение. Эти команды описываются более подробно после описания примера.

Предположим, что у вас имеется 10,000 работников и вы желаете дать каждому работнику, имеющему $30,000 или более 3 процентов роста зарплаты, а каждому работнику, чья зарплата меньше $30,000 - 6 процентов роста зарплаты. Приведенный ниже пример выполняет эту задачу.

Эта программа подразумевает, что таблица с численным полем с именем salary открыта в текущей рабочей области. Для получения более подробной информации о рабочих областях прочитайте описание "Использование множества таблиц" в Работа с таблицами.

Простая программа для увеличения значений зарплат работников
Код Комментарии

SCAN

Код между командами SCAN и ENDSCAN исполняется столько раз, сколько имеется записей в таблице. Код исполняется каждый раз, когда происходит перемещение к следующей записи.

IF salary >= 30000.00

REPLACE salary WITH ;

salary * 1.03

Для каждой записи, если зарплата больше или равна 30,000, значение поля заменяется новым значением, увеличенным на 3%.

Точка с запятой (;) после WITH указывает, что команда разбита на несколько строк и ее синтакиси продолжается на следующей строке.

ELSE

REPLACE salary WITH ;

salary * 1.06

Для каждой записи, если зарплата меньше 30,000, значение поля заменяется новым значением, увеличенным на 6%.

ENDIF

ENDSCAN

Конец условного оператора IF.

Конец кода, который исполнялся для каждой записи в таблице.

Этот пример использовал оба типа команд- условного разветвления и циклического исполнения для управления течением исполнения программы.

Условное разветвление

Условное разветвление позволяет вам протестировать условие и затем, в зависимости от результатов этого теста, производить различные операции. В Visual FoxPro имеется две команды, которые осуществляют условное разветвление:

  • IF ... ELSE ... ENDIF

  • DO CASE ... ENDCASE

Код между начальными операторами и оператторами ENDIF или ENDCASE исполняется только в том случае, если логическое условие оценивается в True (.T.). В примере программы, команда IF используется для разделения двух штатов сотрудников: одних - с зарплатой в $30,000 или более, и других, зарплата которых меньше $30,000. В зависимостри от размера зарплаты производятся разные действия.

В следующей примере, в случае, если значение, хранящееся в переменной nWaterTemp менее 100, не предпринимается никаких действий:

 CopyCode imageСкопировать код
* устанавливает логическую переменную в значение true, если выполняется условие.
IF nWaterTemp >= 100
   lBoiling = .T.
ENDIF
NoteЗамечание

Звездочка в начале первой строки примера указывает на то, что данная строка программы представляет собой комментарий. Комментарии помогают программисту помнить, для чего разработан каждый сегмент кода, а при исполнении программы игнорируются Visual FoxPro.

Если имеется несколько возможных условий для проверки чего-либо, то блок DO CASE ... ENDCASE может быть более эффективным и легко отслеживаемым, по сравнению со множественными операторами IF.

Циклы

Циклы позволяют вам исполнять одну или более строк столько раз, сколько требуется. В Visual FoxPro имеются три команды, которые обеспечивают циклическое исполнение команд:

  • DO WHILE ... ENDDO

  • FOR ... ENDFOR

  • FOR EACH ... ENDFOR

  • SCAN ... ENDSCAN

Используйте SCAN, если вы производите серию действий для каждой записи в таблиц, подобно только что разобранному примеру с зарплатой. Цикл SCAN позволяет вам написать код только раз и исполнять его для каждой записи по мере перемещения по таблице указателя записи.

Используйте FOR, если вы знаете сколько раз должна быть исполнена секция кода. Например, вы знаете, что конкретное число полей в таблице. Поскольку функция Visual FoxPro FCOUNT() возвращает это число, вы можете использовать цикл FOR для печати имен всех полей таблицы:

 CopyCode imageСкопировать код
FOR nCnt = 1 TO FCOUNT( )
   ? FIELD(nCnt)
ENDFOR

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

Для решения этой проблемы, вы можете добавить число к инициалам. Например, идентификационный код для Michael Suyama мог бы быть равным MS. Следующая персона с такими же инициалами, Margaret Sun, могла бы иметь код равный MS1. Если вы затем добавляете в таблицу Michelle Smith, то ее идентификационным кодом мог бы быть MS2. Цикл DO WHILE позволяет вам найти правильный номер, который можно добавить к инициалам.

Простая программа с DO WHILE для генерации уникального ID
Код Комментарии

nHere = RECNO()

Сохраняет местонахождение записи.

cInitials = LEFT(firstname,1) + ;

LEFT(lastname,1)

nSuffix = 0

Получает инициалы персоны из первых букв значений полей firstname и lastname.

Устанавливает переменную для хранения числа, которок будет добавлено при необходимости к инициалам персоны.

LOCATE FOR person_id = cInitials

Ищется другая персона, занесенная в таблицу с теми же самыми инициалами.

DO WHILE FOUND( )

Если у другой персоны в таблице имеется значение person_id точно такое же, как у cInitials, то функция FOUND() возвратит true (.T.) и код в цикле DO WHILE исполнится. Если не найдено совпадения, то следующей строкой, которая будет исполнена, является строка следующая за оператором ENDDO.

nSuffix = nSuffix + 1

cInitials = ;

LEFT(cInitials,2);

+ ALLTRIM(STR(nSuffix))

Подготавливает свежий суффикс и добавляет его в конце инициалов.

CONTINUE

CONTINUE вызывает повторное исполнение последней команды LOCATE. Программа проверяет, не имеется ли в таблице нового значения cInitials в поле person_id field другой записи. Если имеется, то FOUND( ) вновь вернет .T. и код в цикле DO WHILE будет повторно исполнен. Если новое значение cInitials является действительно уникальным, FOUND() возвратит .F. и исполнение программы продолжится со строки, следующей за ENDDO.

ENDDO

Конец цикла DO WHILE.

GOTO nHere

REPLACE person_id WITH cInitials

Возврат к записи и сохранение уникального идентификационного кода в поле person_id.

Поскольку вы не знаете заранее, сколько идентификационных кодов уже используется, вы используете в этом примере цикл DO WHILE.

Смотрите также