Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горев “Эффективная работа с СУБД”.pdf
Скачиваний:
208
Добавлен:
28.06.2014
Размер:
4.71 Mб
Скачать

converted to PDF by HupBaH9I

чернорабочим, которые строят каркас здания, а отделкой лучше заниматься самостоятельно. Программистов при переходе к Access из процедурного языка или среды с командной строкой

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

Вы можете создать какую-либо процедуру после открытия контейнера БД. Для создания программ в Access используется язык программирования Visual Basic, о котором мы уже говорили. Перейдите на страницу Модули контейнера базы данных и создайте новый модуль. Меню Access слегка видоизменится. Надо привыкнуть, что меню динамически меняется, то есть при смене объекта, с которым вы работаете, загружается новое меню.

Теперь можно набрать следующую строчку

Sub Ясоздаюбазуданныхвручную()

Не забудьте, что каждая процедура должна заканчиваться командой End Sub, но набирать эту строчку не обязательно - после нажатия клавиши Enter она появится автоматически.

Ваша процедура должна выглядеть следующим образом:

Sub ЯсоздаюБазуДанныхВручную() Dim MyDb As DATABASE

Set MyDb =_ DBEngine.Workspaces(0).CreateDatabase("МояБазаДанных",_ dbLangCyrillic) End Sub

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

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

* [Comments]

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

При написании комментария на одной строке с командой текст команды и комментария разделяется двумя амперсендами:

&& [Comments]

Эти знаки можно опустить только после команд, начинающихся на END. В Visual Basic признаком комментария является знак апострофа:

[Comments]

Он может применяться и в начале строки, и после команды на одной строке с ней. Признаком переноса командной строки в Visual Basic является знак подчеркивания, а в Visual

FoxPro - точка с запятой.

4.3. "Горячая десятка"

Если вы следовали руководящим указаниям авторов, то вам не трудно написать простейшую программу. Если вы написали даже очень простую программу, то вы, несомненно, можете сказать, что являетесь программистом. Если вы являетесь программистом, то пришла пора заглянуть в красивую коробку, в которой, мы надеемся, вы принесли от продавца Access, Visual Basic или Visual FoxPro, и вместо Руководства пользователя вытащить оттуда Руководство программиста. Если после всего этого у вас упало настроение и стало рябить в глазах от длинных списков многочисленных объектов, команд и функций, не надо впадать в отчаяние.

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

10. Пока мы учимся программировать, нам очень поможет самая простая команда вывода данных в Visual FoxPro

? | ?? Expression

Мы даем здесь не полный ее синтаксис, так как эта команда вряд ли пригодится вам для чего- то более виртуозного, чем вывод нужного значения в процессе разработки и отладки прикладной программы. Ее очень удобно набирать в окне Command. Один знак вопроса всегда выводит значение выражения Expression с новой строки, два знака вопроса - на той же строке. В Visual Basic этой команде в наибольшей степени соответствует конструкция

converted to PDF by HupBaH9I

Debug.Print Expression

которая выводит значение Expression в окно отладки Debug Window.

9. Для запуска программы или для передачи управления другой программе в Visual FoxPro дайте команду Do из меню Program и выберите файл с нужным именем, или в окне Command

наберите команду

DO ProgramName1 | ProcedureName [WITH ParameterList] [IN ProgramName2]

Если в ProgramName1 расширение не указывается, то Visual FoxPro будет пытаться запустить

эту версию программы в следующей последовательности расширений для файла с одним и тем же именем:

EXE - исполняемая версия.

APP - прикладная программа.

FXP - откомпилированная версия.

PRG - программа.

Опция WITH используется для передачи параметров (заранее определенных данных) в программу (число параметров не должно превышать 27). По умолчанию параметры передаются по ссылке, для передачи по значению необходимо установить SET UDFPARMS TO VALUE. В ProgramName2 можно указать файл, в котором размещается вызываемая программа.

В Visual Basic сходные задачи выполняет команда

Call Name([ParameterList])

Как ее использовать покажем на примере вызова на выполнение подпрограммы:

Call PrintToDebugWindow("Печать в окне отладки")

Sub PrintToDebugWindow(cString)

Debug.Print AnyString

End Sub

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

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

STR(nExpression [, nLength [, nDecimalPlaces]])

Преобразует числовое выражение nExpression в строку символов. Необязательные параметры nLength и nDecimalPlaces позволяют задать длину и число десятичных разрядов соответственно. VAL(cExpression)

Преобразует в число строку символов, представляющую собой набор цифр. В Visual Basic существуют аналогичные функции:

Str(nExpression)

Val(cExpression)

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

В Visual FoxPro по частоте употребления можно выделить следующие функции: SUBSTR(cExpression, nStartPosition [, nCharactersReturned])

Возвращает фрагмент строки символов из строкового выражения cExpression, начинающийся с позиции nStartPosition и длиной nCharactersReturned.

LEFT(cExpression, nExpression)

Возвращает из строкового выражения cExpression фрагмент, включающий первые nExpression символов.

RIGHT(cExpression, nExpression)

Возвращает из строкового выражения cExpression фрагмент, включающий последние nExpression символов.

ALLTRIM(cExpression)

Исключает все начальные и конечные пробелы из строкового выражения. В Visual Basic существуют аналогичные функции:

converted to PDF by HupBaH9I

Mid(cExpression, nStartPosition [, nCharactersReturned])

Left(cExpression, nExpression)

Right(cExpression, nExpression)

Trim(cExpression)

6. При работе с данными нам постоянно приходится думать об их "свежести", поэтому мы никак не можем обойти вниманием функции, связанные с определением текущей даты и времени.

В Visual FoxPro для этого можно использовать следующие функции:

Для определения текущей даты

DATE()

Для определения текущего времени

TIME([nExpression])

Для определения текущей даты и времени в формате дата и время

DATETIME()

Если в функции TIME() в качестве выражения задать любую числовую величину, значение текущего времени будет возвращено с сотыми долями секунд, хотя тогда лучше уж обратиться к функции SECONDS().

В Visual Basic существуют аналогичные функции:

Date

Time

Now

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

выглядит вот так

DO WHILE lExpression Commands [LOOP] [EXIT]

ENDDO

Каждый раз, когда программа достигает строки с командой DO WHILE, она проверяет значение выражения lExpression, и если оно равно .T., то выполняются команды внутри структуры, если .F., то управление передается строке, следующей за ENDDO. Опция LOOP позволяет после ее указания вернуть управление к строке DO WHILE, а опция EXIT - прекратить выполнение цикла, невзирая на значение lExpression.

Наиболее часто в качестве условия используют выражения:

DO WHILE .NOT. EOF() - до исчерпания записей в таблице;

DO WHILE nMin<<10 .AND. nMax>>100 - пока переменная nMin меньше 10 и переменная nMax больше 100;

DO WHILE .T. - бесконечно выполняемый цикл (выход только по EXIT).

Естественно, что в случае использования опций LOOP и (или) EXIT перед ними должны быть записаны свои условия их выполнения (чаще всего команда IF...ENDIF). Приведем простой пример организации цикла для реакции на действия пользователя.

DO WHILE .T.

CLEAR

WAIT "Наберите цифру 1 или 2" TO cNumber

DO CASE

CASE cNumber = "1"

?"Вы набрали цифру 1" CASE cNumber = "2"

?"Вы набрали цифру 2" OTHERWISE

?"Ошибка: введенное значение не 1 или 2!"

ENDCASE

WAIT "Хотите попробовать еще раз (Y/N)" TO cYesNo

IF UPPER(cYesNo) <<>> "Y"

EXIT

ENDIF

ENDDO

converted to PDF by HupBaH9I

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

вопции TO.

ВVisual Basic для записи этой команды надо использовать один из следующих эквивалентных вариантов синтаксиса:

Do [{While | Until} Expression] [Commands] [Exit Do] [Commands]

Loop

или

Do [Commands] [Exit Do] [Commands]

Loop [{While | Until} Expression]

Как правильно использовать эту команду, видно из следующего примера:

lCheck = True nCounter = 0

Do ` Первый (внешний) цикл

Do While nCounter << 20 ` Второй (внутренний) цикл nCounter = nCounter + 1

If nCounter = 10 Then lCheck = False

Exit Do ` Выход из второго цикла

End If Loop

Loop Until lCheck = False ` Выход из первого цикла

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

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

IF lExpression Commands

[ELSE

Commands]

ENDIF

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

вкоманде не используется, выполняются команды, следующие за ENDIF.

ВVisual Basic эту команду можно записать на одной строке:

If lExpression Then Commands [Else Commands]

или в более сложном виде:

If Expression Then [Commands]

[ElseIf Expression_n Then [Commands]] ...

[Else

[Commands]]

End If

Если выражение Expression имеет значение True, выполняются команды, следующие за ключевым словом THEN. В противном случае выполняется один из блоков, в котором

converted to PDF by HupBaH9I

Expression_n будет соответствовать выражению Expression. Если и этого не произойдет, будет выполнен блок команд, следующих за ключевым словом ELSE.

Для выбора по условию очень эффективно можно использовать функцию, которая по смыслу похожа на рассматриваемую команду и имеет совершенно одинаковый синтаксис как в Visual FoxPro, так и в Visual Basic

IIF(lExpression, Expression1, Expression2)

Возвращает значение Expression1, если lExpression =.T., и значение Expression2, если lExpression =.F.; Expression1 и Expression2 должны быть одного типа, например:

TITLE = IIF(nSign=0,"автомобиль","автопоезд") + cModel

Эта функция может использоваться и для выбора выполняемых подпрограмм, например:

cProc_var = IIF(nVid>>5,cProc_1,IIF(nVid<<2,cProc_2,cProc_3))

DO (cProc_var)

Здесь, в зависимости от значения переменной nVid, будет выполняться та или другая процедура, причем для увеличения числа вариантов в качестве Expression2 используется еще одна - вложенная функция IIF(). Использование этой функции для программного ветвления, там где это возможно, значительно увеличивает быстродействие программы и делает ее значительно меньше, чем при употреблении команды IF...ENDIF.

3. Более сложное ветвление, когда есть несколько условий, в зависимости от которых надо выполнить ту или иную группу команд, организуется стpуктуpной командой, которая в Visual FoxPro выглядит так:

DO CASE

CASE lExpression1

Commands [CASE lExpression2 Commands]

...

[OTHERWISE

Commands] ENDCASE

Команда выполняет проверку условий, заданных в операторах CASE. Они просматриваются последовательно сверху вниз, и, как только первое из них оказывается верным (логическое выражение равно .T.), выполняется блок команд для этого CASE, после чего управление передается строке программы, следующей за ENDCASE. Если ни одно из условий не истинно, выполняется опция OTHERWISE, пpи отсутствии этой опции команда игнорируется.

Например:

nChoice = 3 DO CASE

CASE nChoice = 1

?"Выбрано значение 1" CASE nChoice = 2

?"Выбрано значение 2"

OTHERWISE

? "Выбрано неправильное значение!" RETURN

ENDCASE

В Visual Basic синтаксис этой структурной команды организован несколько по-иному:

Select Case Expression

[Case Expression_n

[Commands]] ...

[Case Else

[Commands]]

End Select

Выполняются те блоки CASE, в которых выражение Expression_n соответствует выражению Expression. Если такого соответствия не обнаруживается, то выполняется блок CASE ELSE.

Приведенный выше пример можно записать примерно так:

converted to PDF by HupBaH9I

Dim nChoice As Integer

Select Case nChoice

Case 1

Debug.Print "Выбрано значение 1"

Case 2

Debug.Print "Выбрано значение 2"

Case Else

Debug.Print "Выбрано неправильное значение"

End

End Select

2. Цикл, помимо структуры DO WHILE, можно организовать и стандартным для большинства языков программирования способом.

Поэтому следующая команда куда популярнее предыдущей:

FOR MemVarName = nInitialValue TO nFinalValue [STEP nIncrement] Commands

[LOOP]

[EXIT]

NEXT

Команда FOR...NEXT обеспечивает выполнение блока команд для каждого значения переменной, начиная со значения, равного nInitialValue, до значения nFinalValue, пошаговое увеличение или уменьшение происходит на величину, заданную nIncrement, которая по умолчанию равна 1. Опция LOOP приводит к передаче управления на начало следующего цикла, а EXIT - к прекращению действия

команды.

В Visual Basic синтаксис этой команды выглядит очень похоже:

For MemVarName = nInitialValue To nFinalValue [Step nIncrement] [Commands]

[Exit For] [Commands]

Next [MemVarName]

По сравнению с Visual FoxPro здесь нет возможности "досрочно" начать новый цикл с помощью опции LOOP.

Циклы FOR...NEXT могут быть вложены, но в этом случае в каждом цикле должен использоваться уникальный параметр MemVarName. В синтаксисе Visual FoxPro пример организации вложенного цикла приведен ниже. В переменную MyString десять раз записываются значения от 0 до 9.

MyString = " "

FOR Words = 10 TO 1 Step -1

FOR Chars = 0 To 9

MyString = MyString + STR(Chars)

NEXT

MyString = MyString + " "

NEXT

? MyString

В синтаксисе Visual Basic этот же пример будет иметь лишь незначительные отличия:

Public Sub Main()

For Words = 10 To 1 Step -1

For Chars = 0 To 9

MyString = MyString & Chars

Next

MyString = MyString & " "

Next

converted to PDF by HupBaH9I

Debug.Print MyString

End Sub

В Visual Basic есть очень похожая на рассматриваемую команду команда организации цикла:

For Each MemVarName In ArrayName

[Commands] [Exit For] [Commands]

Next [MemVarName]

Эта команда позволяет выполнить какие-либо действия для группы элементов массива, имя которого указывается в параметре ArrayName. Вместо массива может использоваться коллекция объектов, о чем мы будем более подробно говорить позднее.

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

MESSAGEBOX(cMessageText [, nDialogBoxType [, cTitleBarText]])

Выводит на экран определяемое пользователем диалоговое окно. Параметр cMessageText определяет текст, который появляется в этом окне. Чтобы переместить часть сообщения на следующую строку в диалоговом окне, используйте в cMessageText символ возврата каретки (CHR(13)). Высота и ширина диалогового окна увеличиваются по мере необходимости, чтобы вместить содержимое заданного в cMessageText текста.

Параметр nDialogBoxType определяет кнопки и пиктограммы, которые появляются в диалоговом окне, а также первоначально выбранную после вывода диалогового окна на экран кнопку.

В следующей таблице приведены возможные значения для этих элементов.

Значение nDialogBoxType

0

1

2

3

4

5

16

32

48

64

0

256

512

Элементы

Кнопки диалогового окна Только кнопка OK

Кнопки OK и Cancel

Кнопки Abort, Retry и Ignore

Кнопки Yes, No и Cancel

Кнопки Yes и No

Кнопки Retry и Cancel

Пиктограмма Знак "Стоп" Знак "Вопрос"

Знак "Восклицание"

Пиктограмма "Информация

(i)"

Кнопка по умолчанию Первая кнопка Вторая кнопка Третья кнопка

Пропуск значения nDialogBoxType идентичен определению для него значения 0. Параметр nDialogBoxType должен представлять собой сумму трех значений - по одному из

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

Параметр cTitleBarText определяет текст, который появляется в заголовке диалогового окна. Если вы опускаете cTitleBarText, в названии окна появится заглавие "Microsoft Visual FoxPro".

Возвращаемое значение функции MESSAGEBOX() указывает, какая кнопка была выбрана в

converted to PDF by HupBaH9I

диалоговом окне. В диалоговых окнах с кнопкой Cancel при нажатии клавиши Esc будет возвращаться то же самое значение (2), что и при выборе Cancel.

Следующая таблица содержит список возвращаемых функцией MESSAGEBOX() значений.

Возвращаемое Кнопка значение

1OK

2Cancel

3Abort

4Retry

5Ignore

6Yes

7No

ВVisual Basic рассматриваемая функция имеет чуть-чуть другое написание и несколько более богатый синтаксис:

MsgBox(cMessageText [, nDialogBoxType [, cTitleBarText] [, cHelpFileName, nContext])

Условия использования этой функции и задания ее параметров идентичны описанным выше для Visual FoxPro. В Visual Basic для некоторых параметров можно устанавливать дополнительные значения. Так, параметр nDialogBoxType дополнительно может принимать значение 4096, что устанавливает модальность появляющегося сообщения на системном уровне, и пользователь не может продолжить работать не только в текущем, но и ни в каком другом из запущенных приложений, пока не отреагирует на данное сообщение.

Параметры cHelpFileName и nContext позволяют задать имя файла контекстной помощи и номер темы, которая будет выведена на экран при нажатии пользователем клавиши F1.

4.4. Еще несколько навязчивых советов

Когда вы напишете пусть даже небольшую программу, посмотрите, сколько имен вы использовали. А если программа достаточно сложная? Что бы не запутаться в громадном количестве имен, используемых в программе, программисты давно выработали негласные соглашения, с помощью которых здесь можно навести хоть какой-то порядок. Надо отметить, что, начиная с версии 3.0, такие рекомендации включены и в руководство по Visual FoxPro и по Visual Basic. Их основная идея заключается в систематизации всех имен переменных или массивов по диапазону действия и типу хранимых в них данных.

Таким образом, структура имени должна иметь следующий вид: ДиапазонТип_данныхИмя

Для указания дипазона рекомендуется использовать следующие символы:

l

- внутренняя (local) lnCounter

p

- локальная (private)

pnStatus

r

- региональная (region)

rnCounter

g

- глобальная (public)

gnOldRecno

t

- параметр (parameter)

tnRecNo

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

Для указания типа данных рекомендуется использовать следующие символы:

a

- массив

aMonths

 

c

- символьные данные

cLastName

y

- денежная единица

yCurrentValue

d

- дата

dBirthDay

 

t

- данные типа "дата и время" tLastModified

b

- двойной точности

bValue

l

- логические

lFlag

 

n

- числовые

nCounter

o

- ссылка на объект

oEmployee

Соседние файлы в предмете Программирование на Delphi