4.8   Создание новых таблиц и арифметические действия

При копировании открытого файла DBF в новый файл, который этой командой создаётся, используется команда

COPY TO <имя нового файла>

[<границы>] [FIELDS <поля>]

[FOR < условие>] [WHILE <условие>]

[TYPE <тип файла>] [WITH CDX]

В новый файл могут копироваться как все поля базы данных, так и только перечисленные в списке FIELDS. Копируемые поля могут находиться не только в файле из рабочей активной области, но и в любом другом файле БД из других рабочих областей. В этом случае имена полей – составные (имя базы и имя поля).

Существует команда, выполняющая физическое упорядочение файла:

SORT TO <имя нового файла>

[ASCENDING/DESСENDING]

ON <поле> [/A] [/D] [/C] [,<поле> [/A] [/D] [/C]...]

[<границы>] [FOR <условие>] [WHILE <условие>]

[FIELDS <список полей>]

Команда создает из активной БД новый файл , в котором записи расположены в возрастающем (/А) или убывающем (/D) порядке относительно указанного поля /полей. Если параметр сортировки не указан, по умолчанию подразумевается /А - возрастание. Ключ /С означает, что при сортировке будет игнорироваться регистр букв (строчные /заглавные). Допускается соединение ключа С с другими ключами, например /DC.

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

COUNT [<границы >][WHILE <условие>]

[FOR <условие>][TO <переменная>]

По команде COUNT подсчитывается число записей в заданных границах, удовлетворяющих условиям, которое заносится в указанную <переменную>.

SUM [<границы>][WHILE <условие>]

[FOR <условие>] <список выражений>

[ТО <переменные>/ТО ARRAY <массив>]

По команде SUM суммируются значения перечисленных числовых полей указанные <переменные> или <массив>. В списке выражений разрешается указывать не только имена числовых полей, но и функции от них и функции от нескольких полей одновременно. Это значит, что можно воспользоваться функцией STR() и просуммировать символьные поля с цифровыми данными. Можно просуммировать квадратные корни величин и т.д. Если <переменных> не было к моменту исполнения команды, то они будут созданы, однако <массив> должен уже существовать.

AVERAGE [<границы>][WHILE <условие>]

[FOR <условие>] <список выражений>

[TO <переменные>/TO ARRAY <массив>]

По этой команде подсчитывается среднее арифметическое при тех же допущениях, что и для предыдущей команды.

По условию требуется:

–    Создать файл New_goods с полями Name_unit, Price_unit, Amount, Unit_measure для всех товаров с ценой > 50;

–    Создать файл Sort_goods с полями Name_unit, Price_unit, Amount, Quality_goods. Файл отсортировать по полям: Price_unit – по возрастанию, Name_unit – по алфавиту;

–    Подсчитать число товаров на ’С…’, общую сумму всех товаров и среднее арифметическое цены товаров.

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

Полный текст программы приведен в приложении Ж, а результаты работы программы – на рисунках 4.8.1 – 4.8.3.

Рисунок 4.8.1 – Структура таблицы New_Goods.

Рисунок 4.8.2 – Структура таблицы Sort_Goods.

Рисунок 4.8.3 – Результаты работы программы.

ЗАКЛЮЧЕНИЕ

В курсовой работе были рассмотрены приемы проектирования и реализации реляционных баз данных и таблиц в СУБД Visual FoxPro 6.0. Была спроектирована структура реляционной таблицы, в нее были внесены данные с помощью специальных запросов. Операции над данными таблицы были выполнены программным путем с помощью создания автономных модулей *.prg, входящих в состав проекта Visual FoxPro.

СПИСОК ЛИТЕРАТУРЫ

1.   Попов А.А. Создание приложений для FoxPro 2.5/2.6 в DOS и WINDOWS.– М .: Издательство ”Калашников и К”, 1997. – 660 с.: илл.

2.   FoxPro. Language Refrence. – Microsoft Corp., 1994.

3.   Пинтер Лес. Разработка приложений в Microsoft FoxPro 2.5. – М.: ТОО Эдель, 1995.

4.   Дейт К. Руководство по реляционной СУБД DB2. – М.: Финансы и статистика, 1988.

ПРИЛОЖЕНИЕ А

Текст программы фильтрации, индексации и поиска

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Выполняем фильтрацию по полю 'Поставщик'

SET FILTER to supplier='Россия'

BROWSE

* Выполняем индексирование по полю 'Количество' (только по возрастанию)

INDEX on amount to C:\MY_WORKS\TRANSF~1\MYPROJ~1\indtab

* Выводим записи

LIST amount,name_unit,price_unit

* Выбираем из таблицы все записи о товарах низкого качества

BROWSE FOR quality_goods='низкое'

* Выбираем из таблицы первую запись о товаре в количестве 10

LOCATE FOR amount=10

ПРИЛОЖЕНИЕ Б

Текст программы поиска с помощью циклов WHILE и SCAN

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Ищем все товары, поставленные из России, с помощью цикла WHILE

?'Товары из России (цикл WHILE) :'

* Ищем первый товар

LOCATE FOR supplier='Россия'

* Если нашли...

IF FOUND()

* Печатаем название

?name_unit

ENDIF

* Продолжаем поиск до исчерпания записей

DO WHILE .NOT. EOF()

CONTINUE

IF FOUND()

?name_unit

ENDIF

ENDDO

* Ищем все товары из России с помощью SCAN-цикла

?'Товары из России (цикл SCAN) :'

SCAN FOR supplier='Россия'

* Выводим наименование, цену и количество товара

? name_unit+' '+STR(price_unit)+' '+STR(amount)

ENDSCAN

* С помощью WHILE находим общую цену товаров, поступивших

* в период с 15.01.2001 по 15.03.2001

* _SUM - переменная суммирования

_SUM=0

* Находим первую запись

LOCATE FOR date_recep>={^2001/01/15} .AND. date_recep<={^2001/03/15}

IF FOUND()

* Если нашли - суммируем

_SUM=_SUM+NTOM(price_unit)*amount

ENDIF

* Продолжаем поиск

DO WHILE .NOT. EOF()

CONTINUE

IF FOUND()

_SUM=_SUM+NTOM(price_unit)*amount

ENDIF

ENDDO

?'Общая стоимость искомых товаров равна (цикл WHILE) :'+STR(_SUM)

* Вычисляем то же самое с помощью SCAN-цикла

_SUM=0

SCAN FOR date_recep>={^2001/01/15} .AND. date_recep<={^2001/03/15}

_SUM=_SUM+NTOM(price_unit)*amount

ENDSCAN

?'Общая стоимость искомых товаров равна (цикл SCAN) :'+STR(_SUM)

ПРИЛОЖЕНИЕ В

Текст программы построения меню и выдачи сообщений

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Определяем параметры POPUP-меню:

DEFINE POPUP _Menu FROM 1,10 TO 15,70;

TITLE 'Наименование Качество Поставщик';

SCROLL;

PROMPT FIELD name_unit+' '+quality_goods+' '+supplier

* Определяем, нужно ли активизировать POPUP-меню

LOCATE FOR price_unit<100

* Если нашли хоть один требуемый товар...

IF FOUND()

IF price_unit<>0

* и если это не нулевая строка, то

ACTIVATE POPUP _Menu

ENDIF

ENDIF

* Отслеживаем нажатие сочетания клавиш Alt+F1

ON KEY LABEL ALT+F1 MESSAGEBOX("Ошибка памяти!")

ПРИЛОЖЕНИЕ Г

Текст программы построения диаграммы

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Определяем количество записей в текущей таблице

_Number_records=RECCOUNT()

* Заносим в соответствующие массивы наименования и количества товаров

DIMENSION _Names (_Number_records)

DIMENSION _Amounts (_Number_records)

* Переменная - max высота столбца

_Max_col_height=0

* Устанавливаемся на первую запись

GOTO 1

* Ищем самый дорогой и самый дешевый товары (_Max_price и _Min_price),

* а также их порядковые номера (_Number_max_price и _Number_min_price)

_Names(1)=name_unit

_Amounts(1)=amount

_Min_price=price_unit

_Max_price=0

_Number_min_price=1

_Number_max_price=1

* Цикл по всем записям

FOR I=2 TO _Number_records

* Устанавливаемся на I-ю запись

GOTO I

* Заносим имя и количество в массивы

_Names(I)=name_unit

_Amounts(I)=amount

* Если текущая цена>максимальной...

IF price_unit>_Max_price

* то делаем текущую максимальной

_Max_price=price_unit

* и запоминаем ее номер

_Number_max_price=I

ENDIF

* Если текущая цена<минимальной...

IF price_unit<_Min_price

* то делаем текущую минимальной

_Min_price=price_unit

* и запоминаем ее номер

_Number_min_price=I

ENDIF

IF amount>_Max_col_height

* Ищем max количество товара

_Max_col_height=amount

ENDIF

ENDFOR

* ==============Построение диаграммы=============

* Рисуем оси

@3,20 TO 25,20

@25,20 TO 25,120

* Надписываем оси

@13,1 SAY 'Количество товара' COLOR B+/W*

@4,10 SAY _Max_col_height COLOR B+/W*

@28,60 SAY 'Номер товара'

* Рисуем легенду

@1,80 FILL TO 2,83 COLOR W/G*

@3,80 FILL TO 4,83 COLOR W/R*

@1,84 SAY 'Самый дешевый товар'

@3,84 SAY 'Самый дорогой товар'

* Расстояние между столбцами диаграммы

_Diagram_step_size=2

* Ширина одного столбца диаграммы

_Diagram_col_width=(100-_Diagram_step_size*(_Number_records+1))/_Number_records

* Масштабный множитель

_Scale_factor=20/_Max_col_height

* Рисуем столбцы

FOR I=1 TO _Number_records

* Вычисляем координаты вершин для текущего столбца

_Y1=ROUND(25-_Amounts(I)*_Scale_factor,0)

_X1=ROUND(20+_Diagram_step_size*I+_Diagram_col_width*(I-1),0)

_Y2=25

_X2=ROUND(20+(_Diagram_step_size+_Diagram_col_width)*I,0)

* Если высота нулевая...(из-за округления)

IF _Y1=25

* то делаем высоту = 1

_Y1=24

ENDIF

* Если рисуем столбец, соответствующий самому дешевому товару...

IF I=_Number_min_price

* то закрашиваем его зеленым цветом

@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/G*

* Иначе если рисуем столбец, соответствующий самому дорогому товару...

ELSE

IF I=_Number_max_price

* то закрашиваем его красным цветом

@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/R*

ELSE

* Иначе закрашиваем синим цветом

@_Y1,_X1 FILL TO _Y2,_X2 COLOR W/B*

ENDIF

ENDIF

* Ставим по оси X номера товаров

@26,_X1-ROUND(_Diagram_col_width/2,0) SAY I

ENDFOR

ПРИЛОЖЕНИЕ Д

Текст программы, использующей модули

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Вызов процедуры, выводящей сведения об искомых товарах

DO Show_units_for_date

?''

* Вызов процедуры, показывающей товары с единицей измерения 'шт.'

DO Show_units_for_measure

* Описание процедуры Show_units_for_date

PROCEDURE Show_units_for_date

?'Товары, поступившие позже 15.02.2001.'

?''

?'Наименование цена  количество'

SCAN FOR date_recep>{^2001/02/15}

* Выводим наименование, цену и количество товара

? name_unit+' '+STR(price_unit)+' '+STR(amount)

ENDSCAN

ENDPROC

* Описание процедуры Show_units_for_measure

PROCEDURE Show_units_for_measure

?'Товары, у которых единица измерения - шт.'

?''

?'Наименование цена количество'

SCAN FOR unit_measure='Штука'

* Выводим наименование, цену и количество товара

? name_unit+' '+STR(price_unit)+' '+STR(amount)

ENDSCAN

ENDPROC

ПРИЛОЖЕНИЕ Е

Текст программы страхового копирования и контекстной справки

* ----Использование страхового копирования данных

SET CLEAR OFF

SET SAFETY OFF

* Если файл NORM.MEM есть...

IF FILE('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')

* ...он загружается в память.

RESTORE FROM('C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm.mem')

* Если переменная завершения истинна...

IF normz

* ...копируем все файлы таблиц в страховую директорию

!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf>NUL

* иначе сообщение.

ELSE

WAIT normd+' было аварийное завершение .'+;

'Восстановить (ENTER) данные?' WINDOW

* В случае нажатия Enter файлы восстанавливаются из страховой директории.

IF LASTKEY()=13

!COPY C:\MY_WORKS\TRANSF~1\MYPROJ~1\Insure\*.dbf C:\MY_WORKS\TRANSF~1\MYPROJ~1\*.dbf>NUL

ENDIF

ENDIF

ENDIF

* Устанавливается переменная завершения, переменная текущей даты и обе запоминаются в файл.

normz= .T.

normd=DTOC( DATE( ))

SAVE ALL LIKE norm? TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\norm

*===============================================================

* ----Вызов контекстно-зависимой экранной подсказки по нажатию F1.

* ----Esc - выход из программы.

* ----Справка выдается по названию поля таблицы.

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* По нажатию F1 вызываем процедуру Helper

ON KEY LABEL F1 DO Helper WITH VARREAD()

* Бесконечный цикл BROWSE

DO WHILE .T.

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Отображаем таблицу

BROWSE

* Если нажата клавиша Esc...

IF LASTKEY()=27

* ... то на выход.

EXIT

ENDIF

ENDDO

* Описание процедуры Helper

PROCEDURE Helper

* Параметр процедуры - имя поля, которое требуется пояснить

PARAMETERS _Item

* Открываем базу помощи

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_Help

* Ищем нужное поле

LOCATE FOR index_help=_Item

* Если нашли нужное поле (оно одно) - выводим

IF FOUND()

_Out_text=text_help

MESSAGEBOX(_Out_text)

ELSE

MESSAGEBOX('Справка по данному разделу не предусмотрена. Извините.')

ENDIF

RETURN

ПРИЛОЖЕНИЕ Ж

Текст программы создания новых таблиц и арифметических действий

* Очищаем экран

CLEAR

* Открываем таблицу из базы данных

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Создаем новую таблицу, вкоторую входят все товары с ценой>50

COPY TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\New_Goods FIELDS name_unit,price_unit,amount,unit_measure FOR price_unit>50

* Обращаемся к новой таблице

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\New_Goods

* Просматриваем ее

BROWSE

* Создаем новый файл, отсортированный в соответствии с заданием

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

SORT TO C:\MY_WORKS\TRANSF~1\MYPROJ~1\Sort_Goods ON price_unit/A,name_unit/A

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Sort_Goods

* Выводим отсортированную таблицу

LIST OFF price_unit,name_unit

USE C:\MY_WORKS\TRANSF~1\MYPROJ~1\Table_goods

* Выводим количество товаров на букву 'С'

COUNT FOR (LEFT(name_unit,1)='С') TO _Count

?'В исходной таблице содержится'+STR(_Count)+' товара(-ов) на букву `С`'

* Выводим общую стоимость всех товаров

?'Общая стоимость всех товаров равна'

SUM price_unit*amount

* Выводим среднее арифметическое цен всех товаров

?'Среднее арифметическое цен всех товаров равно'

AVERAGE price_unit


Информация о работе «Курсовик по FoxPro»
Раздел: Информатика, программирование
Количество знаков с пробелами: 35714
Количество таблиц: 5
Количество изображений: 0

0 комментариев


Наверх