Алгоритмизация и программирование процессов обработки данных в среде СУБД типа Fox
1.Введение
Реляционные системы управления базами данных (СУБД), такие как FoxBase,
FoxBaseplus, FoxPro, Visual FoxPro относятся к новому поколению СУБД
реляционного типаиз семейства dBase – подобных СУБД. Пакеты этого семейства
получили широкое распространение, и многие из них былирусифицированы.
СУБД типа Fox сохраняет преемственность по отношению к более ранним
представителям dBase – подобных СУБД, в отношенииструктуры баз данных, команд
создания и обработки данных, основных типов данных. В тоже время каждая
последующая СУБД обладает большими возможностями посравнению с предыдущими. Так,
например, VisualFoxPro по сравнению с FoxPro обладает более значительными
изобразительнымивозможностями.
Данная работа использует язык команд СУБД семейства Fox. Используемые команды,
восновном, применимы во всех СУБД этого типа, но отладка велась на
русифицированной СУБД FoxPro для Windows версии 2.5b.
2.Задание на курсовой проект
Структура ЗАПИСИ исходного ДОКУМЕНТА:
Код предприятияВид продукцииОбъем выпускаЦена единицы продукции
Необходимо:
1. Определить суммарную стоимость продукции заданного вида и ее средний выпуск
одним предприятием.
2. Для каждого из пяти видов продукции определить суммарную стоимость и
суммарный выпуск.
3. Выдать на печать в порядке возрастания суммарной стоимости продукцию пяти
видов.
3.Анализ и постановка задачи
Исходные данные задачи представляют собой записи заданной структуры, которые
должны вводиться с клавиатуры, а затемвыводиться в файл данных на магнитный
диск. Следовательно, одной из подзадач должна быть задача создания файла данных
на магнитном диске.
Созданный файл данных необходимо просмотреть на экране или вывести на печать в
виде таблицы с печатью заголовкаи шапки этой таблицы. Для этого следующей
подзадачей должна являться задача просмотра файла данных. Также должна быть
возможность добавления записей всозданный файл данных.
Затем необходимы еще три подзадачи, решение которых позволяет выполнить три
пункта курсовой работы:
1. Выдача сведений о суммарной стоимости продукции заданного вида по каждому
предприятию и о среднемвыпуске этой продукции одним предприятием.
2. Выдача сведений о суммарной стоимости и суммарном выпуске каждой продукции.
3. Выдача на печать продукции пяти видов в порядке возрастания ее суммарной
стоимости.
Кроме того, для диалога пользователя с системой необходимо создать так
называемое, «Меню».
6.Программы
6.1. Создание двухуровневого светового меню
* Командный файл иерархического меню MainMenu
set Talk off
set Color to n/W* && Выбор цвета экрана
Clear
* Описание массивов данных меню
Declare GenMenu(3,2), menuFile(3), menuZad(3), menuExit(2)
* Задание значений элементов массивов
GenMenu(1,1)=" Файл данных "
GenMenu(1,2)="Работа с файлом данных"
GenMenu(2,1)=" Задание "
GenMenu(2,2)="Задания на курсовой проект"
GenMenu(3,1)=" Выход "
GenMenu(3,2)="Выход из программы"
menuFile(1)="Создание"
menuFile(2)="Чтение"
menuFile(3)="Добавление"
menuZad(1)="Задание №1"
menuZad(2)="Задание №2"
menuZad(3)="Задание №3"
menuExit(1)="Выход в Fox"
menuExit(2)="Выход из Fox"
* Формировние главного меню
Do While .T.
set Color to gr+/g, gr+/b && Установка цвета меню
Menu Bar GenMenu, 3
Read Menu Bar to L1, L2 && Вывод главного меню на экран
Do While L1 > 0 && открыть подменю, если выбран
&& любой пункт главного меню
* Формирование подменю
set Color to gr+/g, gr+/b && Установка цвета подменю
Menu 1, menuFile, 3,3
Menu 2, menuZad, 3,3
Menu 3, menuExit, 2,2
Read Menu Bar to L1, L2 && Вывод меню на экран
set Color to n/W* && Возврат к цвету экрана
* Обработка выбранного пункта меню
Do Case
Case L1=0
Exit && Выход в панель главного меню
Case L1=1
Do Case
Case L2=1 && Выбрано действие 'Создание нового ФД'
Do CreateFd
Case L2=2 && Выбрано действие 'Чтение данных'
Do ReadFd
Case L2=3 && Выбрано действие 'Добавление новых данных'
Do AddFd
EndCase
Case L1=2
Do Case
Case L2=1 && Выбрано задание №1 из курсового проекта
Do Zad1
Case L2=2 && Выбрано задание №2 из курсового проекта
Do Zad2
Case L2=3 && Выбрано задание №3 из курсового проекта
Do Zad3
EndCase
Case L1=3
Do Case
Case L2=1 && Выбран пункт 'Выход в Fox'
Return
Case L2=2 && Выбран пункт 'Выход из Fox'
Quit
EndCase
EndCase
EndDo
EndDo
6.2. Создание файла данных
* Командный файл CreateFd - создание нового файла данных
set Talk off
set Status off
set Escape off
Clear
Zag='Процесс создания нового файла данных'
@ 4,22 to 4,58 Color u/w*
@ 3,22 Say Zag Color u/w*
@ 12,0
Accept ' Укажите имя создаваемого файла данных: ' to NameFd
If Len(NameFd) > 0 && Если имя файла не ввели, то делать нечего
* Изменение заголовка
Zag=Zag + ': ' + NameFd + '.dbf'
LenZag=Int(Len(Zag))
@ 4,Int((80-lenZag)/2) to 4,Int((80-lenZag)/2)+LenZag Color u/w*
@ 3,Int((80-LenZag)/2) Say Zag Color u/w*
@ 14,0
Text
Хотите автоматически создать пустую структуру
с указанным именем, по заданию курсового проекта (Д/Н)?
EndText
* Ответ на поставленный вопрос
Do While .T.
@ 16,57
Wait '' to ABC && Ожидание нажатия клавиши
If ABC='н' Or ABC='д'
ABC=Chr(Asc(ABC)-32) && Смена регистра
EndIf
If ABC='Н' Or ABC='Д'
Exit
EndIf
EndDo
* Создание ФД
If ABC='Д' && Автоматическое создание ФД
Create Table &NameFd ;
(KodOrg N(3,0), VidProd C(20), Volum N(4,0), Price N(6,2))
@ 8,0
set Talk on
Display Structure && Вывод созданной структуры
set Talk off
Else && Создание ФД с возможностью заполнения полей
Create &NameFd
EndIf
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
6.3.Чтение файла данных
* Командный файл ReadFd - чтение файла данных
set Talk off
set Status off
set Escape off
Clear
@ 4,27 to 4,54 Color u/w*
@ 3,27 Say 'Процесс чтения файла данных' Color u/w*
@ 12,0
Accept ' Введите имя считываемого файла данных: ' to NameFd
If Len(NameFd) >0 && Если имя файла не ввели, то делать нечего
* Изменение заголовка
@ 3,0 Clear to 5,79
Zag='Содержимое файла данных: ' + NameFd + '.dbf'
LenZag=Int(Len(Zag))
@ 4,Int((80-lenZag)/2) to 4,Int((80-lenZag)/2)+LenZag Color u/w*
@ 3,Int((80-LenZag)/2) Say Zag Color u/w*
* Вывод содержимого файла
Use &NameFd
Do While .Not.EOF() && Цикл вывода порций записей ФД
&& В определенную область экрана
@ 7,0
Display Next 15
If EOF()=.F. && В последнем цикле не нужно переводить
&& указатель и держать паузу
Skip && Перевод указателя, чтобы новый экран не начинался
&& с последней записи предыдущего экрана
@ 24,0
Wait 'Нажмите любую клавишу для просмотра следующих 15 записей ...'
EndIf
EndDo
Close DataBases && Закрытие ФД
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
6.4.Добавление данных в файлданных
* Командный файл AddFd - добавление файла данных
set Talk off
set Status off
set Escape off
Clear
@ 4,25 to 4,56 Color u/w*
@ 3,25 Say 'Процесс добавления файла данных' Color u/w*
@ 12,0
Accept ' Введите имя файла данных для добавления данных: ' to NameFd
If Len(NameFd) >0 && Если имя файла не ввели, то делать нечего
* Изменение заголовка
@ 3,0 Clear
Zag='Добавление данных в файл данных: ' + NameFd + '.dbf'
LenZag=Int(Len(Zag))
@ 4,Int((80-lenZag)/2) to 4,Int((80-lenZag)/2)+LenZag Color u/w*
@ 3,Int((80-LenZag)/2) Say Zag Color u/w*
* Добавление данных в ФД
Use &NameFd
Append
Close DataBases && Закрытие ФД
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
6.5.Печать сведений осуммарной стоимости продукции заданного вида по каждому
предприятию и о среднемвыпуске этой продукции одним предприятием.
* Командный файл Zad1 - печать сведений о заданной продукции
set Talk off
set Status off
set Escape off
Clear
@ 4,18 to 4,62 Color u/w*
@ 3,18 Say 'Процесс печати сведений о заданной продукции' Color u/w*
@ 12,0
Accept ' Введите имя файла данных: ' to NameFd
@ 12,0 Clear
@ 12,0
Accept ' Введите вид продукции: ' to TypeProd
If Len(NameFd) >0 And Len(TypeProd) > 0 && Если имя файла или
&& вид продукции не ввели,
&& то делать нечего
* Изменение заголовка
@ 3,0 Clear
Zag='Сведения о продукции: ' + TypeProd
LenZag=Int(Len(Zag))
@ 4,Int((80-lenZag)/2) to 4,Int((80-lenZag)/2)+LenZag Color u/w*
@ 3,Int((80-LenZag)/2) Say Zag Color u/w*
Use &NameFd
* Формирование шапки
L='+-----------------+---------------+--------+-----------+'
@ 7,12 Say L
@ 8,12 Say ' Код предприятия Объем выпуска Цена Стоимость '
@ 9,12 Say L
Row=10 && Текущий номер строки для вывода данных
Do While .Not.EOF()
If VidProd=TypeProd
* Формирование строки
@ Row,12 Say ''
@ Row,20 Say KodOrg
@ Row,30 Say ''
@ Row,36 Say Volum Picture '# ###'
@ Row,46 Say ''
@ Row,48 Say Price Picture '###.##'
@ Row,55 Say ''
@ Row,57 Say Volum*Price Picture '## ###.##'
@ Row,67 Say ''
Row=Row+1
EndIf
Skip
EndDo
* Формирование итоговой части таблицы
@ Row,12 Say L
Row=Row+1
* Расчет суммарной стоимости
Sum Volum*Price For VidProd=TypeProd to AllPrice
* Расчет среднего выпуска
Average Volum For VidProd=TypeProd to AvVol
@ Row,29 Say 'Общая суммарная стоимость:'
@ Row,56 Say AllPrice Picture '### ###.##'
@ Row+1,21 Say 'Средний выпуск одним предприятием:'
@ Row+1,58 Say AvVol Picture '# ###'
Close DataBases && Закрытие ФД
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
6.6. Печать сведений о суммарной стоимости и суммарном выпускекаждой продукции.
* Командный файл Zad2 - печать сведений об объемах и стоимости продукции
set Talk off
set Status off
set Escape off
Clear
@ 4,15 to 4,64 Color u/w*
@ 3,15 Say 'Процесс печати сведений об объемах всей продукции' Color u/w*
@ 12,0
Accept ' Введите имя файла данных: ' to NameFd
@ 12,0 Clear
If Len(NameFd) >0 && Если имя файла не ввели, то печатать нечего
Use &NameFd
* Формирование шапки таблицы
L='+---------------------+---------------+---------------------+'
@ 7,10 Say L
@ 8,10 Say ' Вид продукции Общий объем Суммарная стоимость '
@ 9,10 Say L
* Сортировка данных по виду продукции
Index On VidProd to &NameFd && Создание индексного файла
Use &NameFd Index &NameFd
* Формирование строк таблицы
Row=10 && Текущий номер строки для вывода данных
Do While .Not.EOF()
VP=VidProd
RNom=RecNo() && Запомнить номер текущей записи
Sum Volum For VidProd=VP to AllVol && Общий объем
Sum Volum*Price For VidProd=VP to AllPrice && Суммарная стоимость
GoTo RNom && Вернуться на текущую запись
@ Row,10 Say ''
@ Row,12 Say VidProd
@ Row,32 Say ''
@ Row,37 Say AllVol Picture '### ###'
@ Row,48 Say ''
@ Row,55 Say AllPrice Picture '### ###.##'
@ Row,70 Say ''
* Пропуск записей с отработанным видом продукции
Do While VidProd = VP And .Not.EOF()
Skip
EndDo
Row=Row+1
EndDo
* Формирование итоговой части таблицы
@ Row,10 Say L
Close DataBases && Закрытие ФД
Delete File NameFd + '.idx' && Удаление индексного файла
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
6.7. Печать упорядоченного по суммарной стоимости спискапродукции пяти видов
* Командный файл Zad3 - печать упорядоченных сведений о стоимости продукции
set Talk off
set Status off
set Escape off
Clear
@ 4,9 to 4,71 Color u/w*
@ 3,9 Say 'Печать сведений о суммарной стоимости продукции по возрастанию'
Coloru/w*
@ 12,0
Accept ' Введите имя файла данных: ' to NameFd
@ 12,0 Clear
If Len(NameFd) >0 && Если имя файла не ввели, то печатать нечего
Use &NameFd
* Формирование шапки таблицы
L='+---------------------+---------------------+'
@ 7,17 Say L
@ 8,17 Say ' Вид продукции Суммарная стоимость '
@ 9,17 Say L
* Поиск продукции с наименьшим значением стоимости
Store 0 to MinAP, LastAP
For I=1 to 5 && Цикл для пяти видов продукции
Do While .Not.EOF() && Цикл поиска нового минимума
VP=VidProd && Текущий вид продукции
RNom=RecNo() && Текущая запись
Sum Volum*Price For VidProd=VP to AllPrice
If AllPrice > LastAP
If AllPrice < MinAP Or MinAP=0
MinAP=AllPrice
MinVP=VP
EndIf
EndIf
If RNom < RecCount()
GoTo RNom+1 && Переход на следующую запись
EndIf
EndDo
* Формирование строки таблицы
@ 9+I,17 Say ''
@ 9+I,19 Say MinVP
@ 9+I,39 Say ''
@ 9+I,46 Say MinAP Picture '### ###.##'
@ 9+I,61 Say ''
LastAP=MinAP && Предыдущее минимальное значение
&& (нижняя граница минимальных значений)
MinAP=0
GoTo Top && Возобновить просмотр с первой строки
Next
* Формирование итоговой части таблицы
@ 15,17 Say L
Close DataBases && Закрытие ФД
EndIf
* Конец работы
@ 24,0
Wait 'Для возврата в меню нажмите любую клавишу ...'
@ 24,0 Clear
Return
7.Результаты решений
Выбор создания файла данных
1Ручка 1000 2,00
1Карандаш 500 1,50
1Фломастер 1000 4,70
1Чернила 500 3,00
2Ручка 1200 1,85
2Фломастер 750 5,00
2Ластик 5000 1,20
2Карандаш 1500 1,35
3Чернила 400 3,20
3Ручка 800 1,90
3Карандаш 1200 1,40
3Фломастер 2000 4,50
4Ручка 900 1,85
4Ластик 200 2,00
4Фломастер 1400 4,70
4Чернила 500 3,05
5Карандаш 700 1,45
5Чернила 1100 2,60
5Ластик 1400 1,65
5Фломастер 500 5,3
6Ластик 600 1,55
6Чернила 800 3,10
6Карандаш 1000 1,55
8.Заключение
Реляционные СУБД, такие как FoxPro действительно являются мощным средством
управления большим объемом данных.СУБД этого типа позволяют производить быструю
сортировку большого массива данных, осуществлять быстрый переход по записям в
произвольном порядке, производитьбыструю выборку большого количества данных из
всего массива данных по заданным критериям. В таких реляционных СУБД каждый файл
данных рассматривается какдвумерная таблица, столбцы которой соответствуют полям
записей, а строки соответствуют отдельным записям файла и обращение к данным
идет через указаниеномера записи имени поля. При этом работа с отдельным полем
таблицы данных напоминает работу с переменными – обращение к данным максимально
упрощено, ипользователю не нужно знать всю иерархическую структуру данных.
Язык команд СУБД семейства Fox содержит широкий набор команд, выполняющих
действиясложных конструкций, например, сортировка записей файла сводится только
к двум командам. Помимо этого в СУБД предусмотрены команды создания светового
меню дляорганизации прямого диалога с пользователем. Все это максимально
упрощают написание программ и подтверждает, что реляционные СУБД семейства Fox
действительно являются мощным инструментом длясоздания и обработки баз данных
большого объема.
Список литературы
1. Лемашко Е.В., Романчуков В.Г. Программирование в системе команд СУБД
семейства Fox: учебное пособие / ГАУ, М., 1998.
2. Компьютерный практикум. Программирование в среде Турбо-Паскаль и СУБД типа
Fox. Методические указания к выполнению курсовогопроекта. /Сост.: О.Н.Леонова,
И.А.Несмеянов; ГАУ, М.,1998.