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
0 комментариев