Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
96
Добавлен:
15.06.2014
Размер:
11.96 Mб
Скачать

2.1.5 Программные prg-файлы и процедуры

Обычно программные файлы содержат бизнес-логику приложения. Программный файл можно запустить на выполнение по выбору пункта меню либо по событию (например, щелчка мыши на рисунке). Для создания программного файла следует в окне Дизайнера проектов (Project Designer) выбрать закладку Code, а затем выделить элементProgramи нажать кнопкуNew. Откроется окно редактора кода, в котором и следует написать код процедуры.

Напишем следующую простую процедуру

Select*fromSclad

Сохраним эту программу, нажав комбинацию клавиш CTRL+W.Система запросит имя файла с расширениемprg, в который следует записать эту процедуру. Укажем имя файла showTable. Сделаем теперь этот файл главным (Main) в приложении. Для этого нужно раскрыть элементProgram в окнеCodeщелчком правой кнопки мыши, выделить имя программного файла showTable и выбрать пунктSet Mainконтекстного меню (при щелчке на этом пункте он выделяется слева галочкой). Теперь наше приложение будет запускаться с программы showTable. Чтобы выполнить приложение, нажмите кнопку Run в окне Дизайнера проектов.

Теперь рассмотрим, как использовать процедурный вызов и передать в процедуру параметры. Для этого создадим в тексте нашей программы еще одну процедуру, к которой будет производится обращение и передача ей параметра – единственного числа. Изменим процедуру showTable так, чтобы она выдавала таблицу с названиями товаров, цена на которые не меньше значения переданного числа.

x=0

do internproc with x

y=”select * from sclad where price > “

y=stuff(y,34,0,x)

&y

Procedure internproc

Parameters x

x=”1000”

Return x

endproc

На этой программе следует остановиться более подробно, поскольку она содержит ряд новых мест. Итак, мы написали пограммный файл и сохранили его на диске под именем showTable.prg. Этот программный файл теперь содержит внутреннюю процедуру с именем internproc. Имеется и обращение к этой процедуре:

dointernprocwithx

Обращение реализуется стандартным образом с помощью команды doи с передачей параметров через ключевое словоwith. Если убрать строку сверху x=0, то останется неработоспособный текст:

dointernprocwithx

y=”select * from sclad where price > “

y=stuff(y,34,0,x)

&y

Procedure internproc

Parameters x

x=”1000”

Return x

endproc

Ошибка будет связана с тем, что переменная х при вызове не имеет значения. В основной части нашей программе формируется только часть SQL- запроса в переменной y:

y=”select * from sclad where price > “

Затем используется очень интересная функция stuff. Эта функция работает по- разному в зависимости от передаваемых ей аргументов. Суть ее в том, что она выполняет вставку одной строки в другую и при этом заменяет некоторую часть исходной строки. Наш вариант использования этой функции таков: в строку y вставляется строка x с позиции 34. Нулевое значение третьего параметра указывает на то, что строка просто вставляется без замены содержимого исходной строки, начиная с позиции с номером 34. В результате действия функции stuff строка y станет равной

y=”select*fromscladwhereprice> 1000“

Заметим при этом, что переменная x будет равна 1000, а не 0. Это произойдет в результате вызова внутренней процедуры с именем internproc. Теперь обратимся к тексту этой процедуры:

Procedureinternproc

Parametersx

x=”1000”

Return x

endproc

Если в процедуру передаются параметры, то начальная ее часть должна содержать строку объявления параметров:

Parametersx

Замечательным фактом является то, что типы параметров в FoxProне указываются, ибо эта система достаточно умна, чтобы определять тип параметров из ситуации. Если процедура изменяет значение параметра и должна возвратить это измененное значение, то последняя команда должна быть

Return x

Рекомендуем писать эту команду, т.к.в противном случае не исключено (хотя и не обязательно), что вместо х будет возвращено логическое значение .F. Все же с типами надо быть осторожным. Не пройдет, например, такой вариант

Procedureinternproc

Parametersx

x=1000

Return x

Endproc

Здесь FoxPro примет, что x – это не строковая переменная (строковые значения берутся в двойные или одиночные кавычки) а число. Поэтому команда stuff даст осечку. Наконец, последнее заслуживающее внимания обстоятельство состоит в команде

&y

Эта команда дословно интерпретируется, как “выполнить то, что представляет из себя y”. В нашем случае y представляет собой SQL- команду. Если опустить символ амперсанда (&), то будет ошибка.

Не очень сильно отличается от всего рассмотренного механизм хранимых процедур. Хранимая процедура находится в самой БД, а не в отдельном файле на диске. И это по существу единственное и принципиальное отличие от программного файла. Выгода от этого состоит в том, что при переносе системы можно потерять внешний файл с программой. Хранимая процедура может быть утеряна только в месте с самой БД. Для создания хранимой процедуры откройте вкладку Data в окне дизайнера проектов и найдите компонент Stored Procedure. Выберите его щелчком мыши и нажмите кнопку New. Откроется окно редактора кода. Напишите в нем следующий текст:

Parameters x

y=”select * from sclad where price > “

y=stuff(y,34,0,x)

&y

Return

Сохраните процедуру, нажав комбинацию клавиш CTRL+W. Присвойте ей имя, например, st_1.

Измените текст программного файла showTable

x=”1000”

dost_1withx

Теперь выполните программный файл showTable. Результат должен быть тем же самым, что и ранее.