им. КОСЫГИНА
Кафедра ИТ
и ВТ.
К У Р С
О В А Я Р А Б О Т
А
Тема : “Разработка
програмного
обеспечения,
ведение базы
данных и получение
ведомости с
частичными
суммами.“
по курсу:
“Алгоритмические
языки и технология
програмирования
“
Выполнил:
Пономарев
А. Н.
гр. 42-96
Руководитель:
доц.
Стрельников
Б. А.
асс. Степанова
О. П.
МОСКВА
1998
2.
ЗАДАНИЕ:
ИСХОДНЫЕ
ДАННЫЕ:
Индивидуальное
задание с описанием
базы данных
и получаемой
в
ПЕРЕЧЕНЬ
ПОДЛЕЖАЩИХ
РАЗРАБОТКЕ
ВОПРОСОВ (
СОДЕРЖАНИЕ
РАСЧЕТНО-ПОЯСНИТЕЛЬНОЙ
ЗАПИСКИ )
1.
Разработать
структуры
файлов и создать
макет базы
данных.
2.
Разработать
алгоритм обработки
данных для
получения
ведомости.
4.
Разраб. формы
экранных кадров
и меню для ведения
базыданных.
5.
Составить и
отладить программу
реализации
экранного кадра
для
просмотра
основных(ой)
таблиц(ы).
6.
Дополнить
программу п. 5
возможностью
удаления и
добавления
строк в таблицу.
7.
Дополнить
программу п. 5
возможностью
изменения
инф-ии в
таблице.
8.
Составить и
отладить процедуры
оперативного
ведения справочников
9.
Разраб. единую
систему меню
для ведения
базы данных
и ее
обработки
с целью получения
ведомости.
ПЕРЕЧЕНЬ
ГРАФИЧЕСКОГО
МАТЕРИАЛА
1.
Структуры
файлов базы
данных и их
заполнение
для тестового
примера.
2.
Макеты экранных
кадров и состав
подсказок для
пунктов ожидания
ввода
от пользователя.
3.
Ведомость,
получаемая
в результате
выполнения
тестового
примера.
МАТЕМАТИЧЕСКИЕ
МОДЕЛИ
Обеспечить
модульную
структуру
программы.
(
программа
состоит из
нескольких
PRG-файлов, включая
PRG-файл
типовых
утилит. Каждый
PRG-файл состоит
из функций или
процедур,
снабженных
комментариями.
)
ТЕХНИЧЕСКИЕ
СРЕДСТВА:
ПЭВМ IBM
3.
ИНДИВИДУАЛЬНОЕ
ЗАДАНИЕ.
Имеются
файлы: АА - нормативы
профилактики
оборудования,
ВВ
- профилактики
и СС - состав
оборудования
АА:
1. Идентификатор
типа станка
ВВ: 1. Инвентарный
номер станка
2. Наименование
типа станка
2. Вид профилактики
3. Норма
кол-ва дней
между 3. Дата
профилактики
профилактиками
4. Идентификатор
записи
СС:
1. Инвентарный
номер
2. Идентификатор
типа станка
Выявить
все случаи
превышения
нормативных
интервалов
между профилактиками
и вывести их
в выводной файл
DD:
1. Инв.№
2. Фактическое
кол-во дней
между профилактиками
3. Нормативное
кол-во дней
4. Иден-тор
записи пред.
проф-ки
5. Иден-тор записи
след. проф-ки
На
принтер вывести
ведомость,
упорядоченную
по убыванию
кол-ва просроченных
дней:
Нарушения норм
техобслуживания
Инв.№
/Тип Дата/Вид
пред. проф-ки
Дата /Вид след. проф-ки
Просрочено,
дней
Инв.№
/Тип Дата /Вид
пред. проф-ки
Дата /Вид след. проф-ки
Просрочено,
дней
. . . . . . . . . .
Общее
кол-во дней
просрочки
СУММА
4. Анализ
обработки БД
для её получения
:
Главный цикл
обработки в
подпрограмме
vedom - (п. п.,
которая осущест-
вляет
выявление всех
случаев превышения
нормативных
интервалов
между профилактиками,
вывод их в выводной
файл “DD”, а также
осуществляет
выдачу
ведомости на
принтер) проводится
по файлу bb. dbf
.
б)
Как он должен
быть упорядочен
?
Он
должен быть
упорядочен
в хронологическом
порядке.
Пример:
index on bb->invnom + dtoc(bb->
Справка:
<ключевое
выражение>
TO <имя индексного
файла>
INDEX
- команда обработки
базы данных,
которая создает
файлы,
<ключевое
выражение>.
При использовании
индексного
файла записи
базы данных
обрабатываются
в последовательности,
заданной ключевым
выражением,
однако физический
порядок следования
записей базы
данных остается
неизменным.
INDEX обеспечивает
последовательность
записей,
CHARACTER
- в соответствии
со значением
ASCII кода каждого
символа
внутри
строки, для
ключей типа
NUMERIC - в соответствии
с числовым
порядком,
для ключей типа
дата - в хронологическом
порядке и для
логических
- считается,
что истина
(. Т.) - более высокого
порядка.
в)
Применяются
ли фильтры ?
Хотя
команда SET FILTER делает
так, что файл
в рабочей области
выглядит
состоящим из
подмножества
записей, на
самом деле
последовательно
обрабатываются
все его записи.
Фильтры не
применяются,
т. к время работы
с фильтрованной
и нефильтрованной
рабочей областью
оказывается
одним и тем же.
г)
Имеются ли
связи ”хозяин-слуга”
и по каким полям
?
В
подпрограмме
vedom имеются
связи.
Пример:
а) set relat to bb->invnom into cc
Связь по
полю “invnom”.
б) set relat to cc->
Связь по
полю “idst”.
в) set relat to dd->invnom into cc additive
Связь по
полю “invnom”.
...............................................................................................................................
a)
Структура
файла aa. dbf :
2 Сверлильный
15
Имя
Тип Длина
IDST
Символ 3
NAMEST
Символ 12
NORMA
Число 3
б)
Структура
файла bb. dbf :
INVNOM VIDPROF DATEPROF IDZAP
4 Смазка
09-01-98 2
231 Смазка
09-01-98 3
2 Смазка
09-01-98 4
323 Смазка
09-01-98 6
626 Регулировка
01-02-98 7
2 Регулировка
29-01-98 9
231 Регулировка
28-01-98 10
4 Регулировка
19-01-98 11
24 Регулировка
18-01-98 12
626 Чистка
31-03-98 13
2 Чистка
01-04-98 15
231 Чистка
20-03-98 16
4 Чистка
10-03-98 17
......................................................................................................
Имя
Тип Длина
INVNOM
Символ 3
VIDPROF Символ
12
DATEPROF Дата
8
IDZAP
Символ 3
в)
Структура
файла сс. dbf :
323
1
626 1
4
2
231 3
Имя
Тип Длина
INVNOM
Символ 3
г)
Структура
файла dd. dbf :
2
62 20 9
15
231
51 20 10
16
24
74 15 12
18
.....................................................................................................
Имя
Тип Длина
NORMA Число
3
IDZAPPP Символ
3
IDZAPSP Символ
3
.................................................................................................................................
6.
Принципы подготовки
данных для
тестового
примера и
заполнения
исходных данных.
Эти
данные были
выбраны произвольно
- “из головы”:
2)
Инвентарный
номер станка
4)
Наименование
типа станка
Идентификатор
записи в файле
bb. dbf
Норма
кол-ва дней
между профилактиками
была выбрана
произвольна.
Дата
профилактики
выбиралась
так, чтобы норма
кол-ва дней
между профилактиками
была превышена
для всех видов
профилактик.
...............................................................................................................................
7.
Система меню.
Экранный
кадр № 1:
БАЗА
ДАННЫХ Нарушение
норм техобслуживания:
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
студента
гр 42/96 Пономарёва
А. Н.
*************************
Руководитель:
асс.
Степанова О. П.
Заново
построить все
индексы Базы
Данных
Провести
компрессию
Базы Данных
Выход
из Базы Данных Экранный
кадр № 2:
Московская
государственная
текстильная
академия ( МГТА
)
БАЗА
ДАННЫХ Нарушение
норм техобслуживания:
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
студента
гр 42/96 Пономарёва
А. Н.
*************************
доц.
Стрельников
Б. А.
Выберите
одну из следующих
задач
Ведение
файла "Нормативы
профилактики
оборудования"
Ведение
файла "Профилактика"
Получение
ведомости
нарушение норм
техобслуживания
Выход
из Базы Данных
Экранный
кадр № 3:
Нормативы
профилактики
оборудования:
Идент.
типа станка
Наименование
типа станка
Норма,дней
1 ¦
Строгальный
¦ 25
2 ¦
Сверлильный
¦ 15
3 ¦
Токарный
¦ 20
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
-------------------------------------------------------------------------------------------
Тип
станка: Строгальный
/
Ї
/ ®
/ ¬
/ ^®
PgUp / PgDn / ^¬/
Home / End - Перемещение
курсора
¦
Esc - Возврат на
шаг назад ¦F8
- Удалить строку
Enter
- Редактирование
¦ ¦F3
- Вставить строку
Экранный
кадр № 4:
Профилактики:
Инв.№
станка Вид
профилактики
Дата профилактики
----------------------------------------------------------------------------------------
2 ¦
Смазка
¦ 01/09/98
2 ¦
Регулировка
¦ 01/29/98
2 ¦
Чистка
¦ 04/01/98
231 ¦
Смазка
¦ 01/09/98
231 ¦
Регулировка
¦ 01/28/98
231 ¦
Чистка
¦ 03/20/98
24 ¦
Смазка
¦ 01/09/98
24 ¦
Регулировка
¦ 01/18/98
24 ¦
Чистка
¦ 04/02/98
323 ¦
Смазка
¦ 01/09/98
323 ¦
Регулировка
¦ 01/28/98
323 ¦
Чистка
¦ 04/15/98
----------------------------------------------------------------------------------------
Инв.№
станка: 2
Вид
профилактики:
Смазка
Дата
профилактики:
01/09/98
/
Ї
/ ®
/ ¬
/ ^®
PgUp / PgDn / ^¬/
Home / End - Перемещение
курсора
¦
Esc - Возврат на
шаг назад ¦F8
- Удалить строку
Enter
- Редактирование
¦ ¦F3
- Вставить строку
Экранный
кадр № 5:
------------------------------------------------------------------------------------------------------------
¦
Инв. ¦ Наименование
¦ Дата ¦ Вид
предвор. ¦
Дата ¦ вид след.
¦Просроч.¦
¦номер
¦ типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦
¦------------------------------------------------------------------------------------------------------------¦
¦
24 ¦ Сверлильный
¦01/18/98¦ Регулировка
¦04/02/98¦ Чистка
¦ 59 ¦
¦
4 ¦ Сверлильный
¦01/19/98¦ Регулировка
¦03/10/98¦ Чистка
¦ 35 ¦
¦
231 ¦ Токарный
¦01/28/98¦ Регулировка
¦03/20/98¦ Чистка
¦ 31 ¦
-------------------------------------------------------------------------------------------------------------
Всего
просроченно
дней - 252
Экранный
кадр № 6:
Московская
государственная
текстильная
академия ( МГТА
)
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
----------------------------------------------------------------------------------а
А. Н.
¦ Завершить
работу с базой
данных с сохранением
всех ¦. А.
¦
изменений
¦.
¦ Сохранить
и продолжить
Завершить
работу ¦
----------------------------------------------------------------------------------
Выберите
одну из следующих
задач
Ведение
файла "Нормативы
профилактики
оборудования"
Ведение
файла "Профилактика"
Получение
ведомости
нарушение норм
техобслуживания
Выход
из Базы Данных
б)
Пункты меню,
что в них делается
?
Меню
№ 1:
2) Заново
построить все
индексы Базы
Данных
4) Выход
из Базы Данных
При
выборе п. 2 заново
происходит
построение
всех индексов
Б. Д.
При
выборе п. 3 производится
компрессия
(уплотнение)
Б. Д.
При
выборе п. 4 появляется
горизонтальное
подменю:
а) Сохранить
и продолжить
б) Завершить
работу
П. а)
Сохранить все
внесенные
изменения и
продолжить
П. б)
Завершить
работу с базой
данных с сохранением
всех изменений
Меню
№ 2:
1) Ведение
файла "Нормативы
профилактики
оборудования"
"Профилактика"
3) Получение
ведомости
нарушение норм
техобслуживания
При
выборе п. 1 мы
попадаем в
редактор файла
aa. dbf - (“Нормативы
профилактики
оборудования”),
где мы можем
его просматривать
и редактировать.
При
выборе п. 2 мы
попадаем в
редактор файла
bb. dbf - (“Профилактика”),
где мы можем
его просматривать
и редактировать.
При
выборе п. 3 происходит
выявление всех
случаев превышения
нормативных
интервалов
между профилактиками,
вывод их в выводной
файл “DD”, а также
выдача ведомости
на принтер.
При
выборе п. 4 выполняются
действия аналогичные
п. 4 в меню № 1.
8.
Ведение БД.
Какими табл.
представлено
ведение БД, по
какой табл.
указывается
текущая рабочая
область, её
слуги, колонки
таблицы, набор
клавиш на которые
предусмотрена
реакция системы.
Клавиши на
которые реагирует
система:
/
Ї
/ ®
/ ¬
/; PgUp / PgDn; Home / End
- Перемещение
курсора
Esc
- Возврат на
шаг назад. Отмена
редактирования
(без сохранения
изменненого
значения)
F8
- Удалить строку
F3
- Вставить строку
F10
- Выход из задачи
с сохранением
всей информации
или выход без
сохранения
информации
Таблицы
ведения Б. Д.:
Табл.
№1
Нормативы
профилактики
оборудования:
-----------------------------------------------------------------------------------------------
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
Тип
станка:
Табл.
№2
Профилактики:
Инв.№
станка Вид
профилактики
Дата профилактики
----------------------------------------------------------------------------------------------
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
Инв.№
станка:
Вид
профилактики:
Дата
профилактики:
.................................................................................................................................
9.
Структура
программы :
а)
Содержимое
rmk-файла “kursv. rmk”:
objs
= main2,aa,util,bb
. prg. obj:
< /a/m/n
RTLINK OUTPUT $* FI $(objs) /PLL:base52
main2. obj
: main2. prg
aa. obj
: aa. prg
util. obj
: util. prg
bb. obj
: bb. prg
kursok. exe
: main2. obj aa. obj util. obj bb. obj
Программные
файлы:
1)
aa. prg
В
этой программе
реализовано:
2)
bb. prg
1.
Создание
TBrowse-объекта для
просмотра-редактирования
файла bb. dbf в окне.
3)
main2. prg
1. Организация
меню.
2.
Индексирование
файлов.
3.
Уплотнение
файла.
4.
Выявление всех
случаев превышения
нормативных
интервалов
между
профилактиками,
вывод их в выводной
файл “DD”, а также
выдача ведомости
на принтер.
5.
Вывод на экран
информации
о “горячих”
клавишах.
4)
util. prg
Эта
программа
содержит набор
стандартных
утилит:
1. Сохранение
экрана, восстановление
экрана.
2. Перевод в
верхний регистр
как латиницы,
так и кириллицы.
4. Выход из
задачи с сохранением
всей информации
- реакция на
клавишу F10.
5. Подача звукового
сигнала для
сигнализации
успешного
выполнения
поставленной
задачи:
Описание
основных
подпрограмм:
1)
п. п. постоения
индексов:
func
dbindex(prm)
sscr(24,0,25,79)
CLOSE
ALL
SETCOLOR
("w/n")
@
24,0 CLEAR TO 25,79
@
24,6 SAY "Ждите идет
индексирование!
" COLOR "w+*/n"
use
bb
index
on bb->invnom + dtoc(bb->dateprof) to bb0001
use
aa
index
on aa->idst to aa0002
use
cc
index
on cc->
index
on dd->(norma-fkdn) to dd0004
rscr()
return
nil
2)
п. п. открытия
индексов:
func
dbopen
close
all
use
aa index aa0002
use
bb index bb0001 new
use
cc index cc0003 new
use
dd index dd0004 new
3)
п. п. уплотнения
Б. Д. :
FUNCTION
dbcompress()
sscr(24,0,25,79)
CLOSE
ALL
SETCOLOR("w/n")
@
24,0 CLEAR TO 25,79
@
24,6 SAY "Ждите идет
уплотнение
!" COLOR ("w+*/n")
USE
aa // уплотнение
файла aa. dbf
COPY
TO work
USE
DELETE FILE aa. dbf
RENAME work. dbf TO aa. dbf
ENDIF
COPY
TO work
IF
ERRORLEVEL() = 0
USE
RENAME work. dbf TO bb. dbf
ENDIF
USE
cc // уплотнение
файла cc. dbf
COPY
TO work
IF
ERRORLEVEL() = 0
USE
DELETE FILE cc. dbf
RENAME work. dbf TO cc. dbf
ENDIF
COPY
TO work
USE
DELETE FILE dd. dbf
RENAME work. dbf TO dd. dbf
ENDIF
rscr()
RETURN
NIL
4)
п. п. выдачи
информации
о клавишах, на
которые реагирует
система
”Help”:
PROCEDURE
hlp(callpnt,prm)
LOCAL
retcol,crow,ccol
IF
prm = NIL
prm := . F.
ENDIF
ccol
= COL()
retcol
= SETCOLOR("w/n")
@
22,0 CLEAR TO 24,79
IF
callpnt = "GET"
// исправленный
HLP для GET 26. 09. 96
@
22,0 SAY "Enter/" + CHR(24) + '/' + CHR(25) +
'/PgUp/PgDn' ;
+
" -Завершить
редактирование
с сохранением
измененного
значения"
@
22,0 SAY "Enter/"+ CHR(24) + '/' + CHR(25) +
'/PgUp/PgDn' COLOR "r+/n"
@
23,1 SAY CHR(26) + ' / ' + CHR(27) + ' / ^' + CHR(26) ;
+
' / ^' + CHR(27) + ' / Home / End - Перемещение
курсора'
@
23,1 SAY CHR(26) + ' / ' + CHR(27) + ' / ^' + CHR(26) ;
+
' / ^' + CHR(27) + ' / Home / End' COLOR "r+/n"
@
24,1 SAY 'Esc - Отменить
редактирование
' ;
+ '( без
сохранения
измененного
значения )'
@
24,1 SAY "Esc" COLOR "r+/n"
ENDIF
IF
callpnt="AAED" . OR. callpnt="BBED"
SET
COLOR TO ("w/n")
" / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
+
' / ^' + CHR(27) + '/ Home / End - Перемещение
курсора'
@
24,0 SAY 'Enter - Редактирование
'
@
23,23 TO 24,23 DOUBLE
@
23,25 SAY 'Esc - Возврат
на шаг назад
' COLOR "w/n"
@
23,25 SAY 'Esc' COLOR "r+/n"
@
23,54 TO 24,54 DOUBLE
@
23,55 SAY 'F8 - Удалить
строку '
@
24,55 SAY 'F3 - Вставить
строку '
SET
COLOR TO ("r+/n")
" / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
@
24,0 SAY 'Enter'
@
24,55 SAY 'F3'
ENDIF
IF
callpnt="CCED" . OR. callpnt="DDED"
SET
COLOR TO ("w/n")
@
22,1 SAY chr(24) + " / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
@
24,0 SAY 'Enter - Редактирование
'
@
23,23 TO 24,23 DOUBLE
@
23,25 SAY 'Esc - Возврат
на шаг назад
' COLOR "w/n"
@
23,25 SAY 'Esc' COLOR "r+/n"
@
24,25 SAY '^Enter - Выбор значения
' COLOR "w/n"
@
24,25 SAY '^Enter' COLOR "r+/n"
@
23,54 TO 24,54 DOUBLE
@
24,55 SAY 'F3 - Вставить
строку '
SET
COLOR TO ("r+/n")
" / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
+
' / ^' + CHR(27) + '/ Home / End '
@
24,0 SAY 'Enter'
@
23,55 SAY 'F8'
@
24,55 SAY 'F3'
ENDIF
SET
COLOR TO (retcol)
SETPOS(crow,ccol)
5)
п. п. выявления
всех случаев
превышения
нормативных
интервалов
между
профилактиками,
вывода их в
выводной файл
“DD”, а также выдачи
ведомости на
принтер:
local
tinvnom,sitog,tdata,tidzap,tidst,idpop
set
printer on
select
dd
zap
lin:=space(17)+"Таблица
нарушение норм
техобслуживания:"
?
lin
set
relat to bb->invnom into cc
set
relat to cc->idst into aa additive
go
top
sitog:=0
do
while. not. eof()
tinvnom:=bb->invnom
tdata:=bb->dateprof
tidzap:=bb->idzap
tidst:=cc->idst
skip
if(bb->invnom=tinvnom). and.(bb->dateprof-tdata>aa->
select
dd
replace
dd->invnom with tinvnom
replace
dd->fkdn with bb->dateprof-tdata
replace
dd->norma with aa->norma
replace
dd->
replace
dd->idzapsp with bb->idzap
sitog:=sitog+(dd->fkdn-dd->norma)
select
bb
endif
enddo
lin:="+-----------------------------------------------------------------------------+"
?
lin
lin:="¦
Инв.¦ Наименование
¦ Дата ¦ Вид
предвор. ¦ Дата
¦ вид след.
¦Просроч.¦"
lin:="¦номер¦
типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦"
lin:="¦-----+--------------+--------+--------------+--------+--------------+--------¦"
?
lin
select
dd
set
relat to dd->invnom into cc additive
go
top
do
while. not. eof()
tinvnom:=dd->invnom
idpop:=dd->idzappp
lin:="¦
"+dd->invnom+" ¦ "
select
bb
go
top
if(tinvnom=bb->invnom). and.(idpop=bb->idzap)
lin:=lin+aa->namest+"
¦"+dtoc(bb->dateprof)+"¦ "+bb->vidprof
endif
skip
enddo
idpop:=dd->
go
top
if(tinvnom=bb->invnom). and.(idpop=bb->idzap)
lin:=lin+"
¦"+dtoc(bb->dateprof)+"¦ "+bb->"¦
"
endif
skip
enddo
select
dd
lin:=lin+str(dd->fkdn-dd->norma,4)+"
¦"
skip
enddo
lin:="+-----------------------------------------------------------------------------+"
?
lin
set
color to w+/b
lin:="
Всего просроченно
дней -"+str(sitog,5)
?
lin
set
printer off
inkey(0)
return
nil
6)
п. п. подачи звукового
сигнала для
сигнализации
успешного
выполнения
поставленной
задачи:
func
sound
tone(300,1)
tone(100,1)
tone(300,1)
tone(100,1)
return
nil
7)
п. п. сохранения
зкрана:
FUNC
sscr(t,l,b,r)
IF
t = NIL
t
:= 0
ENDIF
IF
l = NIL
l
:= 0
ENDIF
IF
b = NIL
b
:= MAXROW()
ENDIF
IF
r = NIL
ENDIF
AADD(
wind[2], l )
AADD(
wind[3], b )
AADD(
wind[4], r )
AADD(
wind[5], SAVESCREEN(t,l,b,r) )
AADD(
pos[1], ROW() )
AADD(
colr, SETCOLOR() )
AADD(
curs, SETCURSOR() )
RETURN
. T.
8)
п. п. восстановления
зкрана:
FUNC
rscr()
LOCAL
ln
IF
ln == 0
INKEY(0)
@
24,0
ENDIF
RESTSCREEN(wind[1,ln], wind[2,ln], wind[3,ln],
wind[4,ln], wind[5,ln] )
ASIZE(wind[1],ln-1)
ASIZE(wind[5],ln-1)
ASIZE(pos[1],ln-1)
ASIZE(pos[2],ln-1)
SETCOLOR(colr[ln])
ASIZE(curs,ln-1)
RETURN
. T.
9)
п. п. определения
- нажата ли клавиша
типового метода,
если да - то
возвращает
блок кода с
соответствующим
методом, если
нет - то возвращает
NIL. Параметр функции
- INKEY-код нажатой
клавиши.
LOCAL
ret , ei , i
LOCAL
crsm:={ ;
, {KUP , {o o:up() } } ;
, {KPGDN , {o o:pagedown() } } ;
, {KRIGHT , {o o:right() } } ;
, {KLEFT , {o o:left() } } ;
, {KCTRLRIGHT , {o o:panright() } } ;
, {KCTRLLEFT , {o o:panleft() } } ;
, {KEND , {o o:end() } } ;
, {KHOME , {o o:home() } } ;
, {KCTRLEND , {o o:panend() } } ;
, {KCTRLHOME , {o o:panhome() } } }
i
:= ASCAN( crsm, {ei cod = ei[1] } )
IF
i <> 0
ELSE
ret := NIL
ENDIF
RETURN
ret
10)
п. п. переключения
режима вставка/замена
и вида курсора:
IF
READINSERT()
READINSERT(. F.)
SETCURSOR(SCINSERT)
ELSE
READINSERT(. T.)
SETCURSOR(SCNORMAL)
ENDIF
RETURN
11)
п. п. перевода
в верхний регистр
латиницы и
кириллицы:
FUNC
UpperC(prm)
LOCAL
n , i , smb , cs
FOR
i = 1 TO n
cs
:= ASC( smb )
DO
CASE
CASE cs >= 97. AND. cs <= 122
cs := cs - 32
prm := STUFF( prm , i , 1 , CHR( cs ) )
CASE cs >= 160. AND. cs <= 175
cs := cs - 32
prm := STUFF( prm , i , 1 , CHR( cs ) )
CASE cs >= 224. AND. cs <= 239
prm := STUFF( prm , i , 1 , CHR( cs ) )
ENDCASE
NEXT
RETURN
prm
12)
п. п. выхода из
задачи с сохранением
всей информации
- реакция на
клавишу F10:
PROCEDURE
fquit()
LOCAL
reply
"Сохранить
все внесенные
изменения и
продолжить;"
;
+ "работу с
Базой данных
- т. е. сделать
промежуточный
SAVE или;" ;
+ " Завершить
работу с базой
данных с сохранением
всех изменений
;";
, {" Сохранить
и продолжить
" , " Завершить
работу " } )
IF ( reply = 1 ) . OR. ( reply = 0 )
ELSE
QUIT
ENDIF
RETURN
13)
п. п. вывода сообщения
на экран с заданными
координатами
и цветом:
PROCEDURE
msgs(x,y,m,color)
LOCAL
ml,c
IF
m = NIL
RETURN
ENDIF
IF
ml=0 && . OR. ml > 80
RETURN
ENDIF
x
:= (80-ml)/2
ENDIF
y
:= 24/2 - 1
ENDIF
<> NIL
c
:= SETCOLOR(color)
@
y,x SAY m
SETCOLOR(c)
ELSE
@
y,x SAY m
ENDIF
RETURN
14)
п. п. создания
TBrowse-объекта для
просмотра-редактирования
FUNCTION
aaCr(t,l,b,r)
LOCAL
brws,coln,cblk,chdr
brws
:= TBrowseDb(t,l,b,r)
cblk
:= { " " + aa->idst }
chdr
:= "Идент. типа
станка"
coln
:= TBColumnNew(chdr,cblk)
brws:AddColumn(coln)
cblk
:= { " " + aa->namest}
chdr
:= " Наименование
типа станка"
coln:width := 35
brws:AddColumn(coln)
cblk
:= { STR( aa->norma,7) }
" Норма,дней"
coln:width := 12
brws:AddColumn(coln)
brws:colsep := CHR(186)
brws:headsep := CHR(205)
brws:colorspec := "w+/b,gr+/rb"
RETURN
brws
15)
п. п. просмотра
файла aa. dbf с обработкой
нажимаемых
клавиш и вызовом
соответствующих
методов или
пользовательских
функций:
FUNCTION
aaEd(brws)
LOCAL
retfl,sel,otb , w
LOCAL
cc,rr,nrc:=0,i
LOCAL
ret:=NIL
LOCAL
t := brws:nTop , l := brws:nLeft , b := brws:nBottom , r :=
brws:nRight
LOCAL
t_ := 5 , l_ := 6 , b_ := 15 , r_ := 74
sscr()
srs()
SETCOLOR( "N/W" )
CLS
SETCOLOR( "gr+/b,w+/gr")
hlp("AAED")
SELECT
aa
SET
ORDER TO 2
@
t-2 , l-1 CLEAR TO b+2 , r+1
@
b+1, l TO b+1, r
retfl
:= . F.
DO
WHILE. NOT. retfl
**
оптимизированная
с использованием
буфера клавиатуры
стабилизация
DO
WHILE ( NEXTKEY() == 0 ) . AND. ( . NOT. brws:stabilize() )
ENDDO
IF
( NEXTKEY() == 0 ) . AND. ( RECNO() <> nrc)
nrc
:= RECNO()
rr
:= ROW()
cc
:= COL()
SETCOLOR("bg+/b")
@
t-2 , l+1 SAY " Нормативы
профилактики
оборудования:"
@
b+2 , l+1 SAY " Тип станка:
"
@
b+2 , COL()+1 SAY aa->namest COLOR "w+/b"
SETPOS(rr,cc)
ENDIF
SETCOLOR("gr+/rb")
nkey
:= Inkey(0)
//
если нажата
клавиша типового
метода - вызовем
его
IF
blk <> NIL
ELSE
DO
CASE
CASE ( bHotkey := SETKEY( nKey ) ) <> NIL
// потрогаем
файловый указатель,
если
// возвращаетя
EOF() -. T. после Down-Up,
// значит
файл пуст
SKIP
IF RECNO() = RECCOUNT()+1
retfl := . T. // завершение
просмотра
ENDIF
nrc := 0
CASE nKey = KESC
retfl := . T. // завершение
просмотра
CASE ( nKey = KENTER )
// Редактирование
текущего элемента
данных
aaGet(brws ;
, " Редактирование
файла aa. dbf" )
nrc := 0 // обновить
верхнюю строку
CASE nKey == KF3
APPEND BLANK
brws:RefreshAll()
ENDCASE
ENDIF
ENDDO
SET
RELAT TO
srs(. T.)
rscr()
RETURN
ret
16)
п. п. выполнения
GET в текущей колонке
файла aa. dbf:
PROCEDURE
aaGet( brws , z0 )
LOCAL
retcurs,retexit // форма курсора
и режим выхода
из READ
LOCAL
retins, retcol // режим
вставка-замена
в READ
LOCAL
indch := . F. // флаг изменений
значений полей,
входящих в
// индекснове
выражение
(тогда нужно
REFRESHALL(),
// а не
REFRESHCURRENT() )
LOCAL
col
r
:= ROW()
c
:= COL()
//
Проверка обновления
экрана, корректности
базы и т. д.
ForceStable(brws)
//
Установка
клавиш Up-Arrow и
Down-Arrow как клавиш
выхода из
//
команды
READ
retexit := READEXIT(. T.)
// Установка
клавиши INS для
переключения
// режима
вставка/замена
// и соответствующего
изменения вида
курсора
retins
:= SetKey( KINS, { ReplIns()} )
// эквивалентно
Set Key KINS To Procedure ReplIns
// Установка
вида курсора
по текущему
состоянию
режима
retcurs := SetCursor( IF(ReadInsert(), SCNORMAL,
SCINSERT ) )
sscr()
retcol
:= SETCOLOR("w+/g")
@
brws:nTop-3,0
@
brws:nTop-3,0 SAY z0
hlp("GET")
SETCOLOR("gr+/n,w+/g")
indch
:= . F.
CASE
brws:colpos = 1
w
:= aa->idst
@
r,c+2 GET w
READ
IF. NOT.( LASTKEY() = KESC ). OR.( aa->idst == w )
REPLACE aa->idst WITH w
indch := . T.
ENDIF
CASE
brws:colpos = 2
n := aa->namest
@ r,c+2 GET n
READ
IF. NOT.( LASTKEY() = KESC ). OR.( aa->
REPLACE aa->namest WITH n
ENDIF
CASE
brws:colpos = 3
w
:= aa->norma
@
r,c+1 GET w
READ
IF. NOT.( ( LASTKEY() = KESC ) . OR. ( aa->norma = w
) )
REPLACE aa->norma WITH w
ENDIF
ENDCASE
SETCOLOR(retcol)
SETPOS(r,c)
IF
indch
ELSE
brws:RefreshCurrent() // Обеспечить
перерисовку
текущей строки,
ENDIF
// поскольку
изменялся
элемент данных
//
Восстановление
формы курсора
и режима выхода
из READ по стрелкам
//
и процедуры
по клавише
KINS
SetCursor(retcurs)
READEXIT(retexit)
SetKey(KINS, retIns)
//
Проверка требования
ухода с текущей
записи после
GET
nKey
:= LASTKEY()
IF
nKey == KUP. OR. nKey == KDOWN. OR. ;
nKey == KPGUP. OR. nKey == KPGDN
//
управление
курсором -- переход
к другой записи
ENDIF
RETURN
Примечание:
В отчёте не
описаны п. п.:
а) для создания
TBrowse-объекта для
просмотра-редактирования
файла bb. dbf в окне
t,l,b,r ;
б) для просмотра
файла bb. dbf с обработкой
нажимаемых
клавиш и вызовом
соответствующих
методов или
пользовательских
функций;
в) для выполнения
GET в текущей колонке
файла bb. dbf:
Т. к. эти подпрограммы
практически
аналогичны
подпрограммам
для файла aa. dbf !!!
.................................................................................................................................
10.
Результаты
тестового
примера:
а)
Содержимое
выводного
файла dd. dbf:
INVNOM
FKDN NORMA IDZAPPP IDZAPSP
2
62 20 9
15
24
74 15 12
18
323
77 25 8
14
4
50 15 11
17
626
58 25 7
13
б)
Содержимое
файла (print. prn), выводимого
на принтер:
Таблица
нарушение норм
техобслуживания:
-----------------------------------------------------------------------------------------------------------------
¦
Инв. ¦ Наименование
¦ Дата ¦ Вид
предвор. ¦ Дата
¦ вид след.
¦ Просроч.¦
¦номер
¦ типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦
¦
24 ¦ Сверлильный
¦01/18/98 ¦ Регулировка
¦04/02/98 ¦ Чистка
¦ 59 ¦
¦
323 ¦ Строгальный
¦01/28/98 ¦ Регулировка
¦04/15/98 ¦ Чистка
¦ 52 ¦
¦
2 ¦ Токарный
¦01/29/98 ¦ Регулировка
¦04/01/98 ¦ Чистка
¦ 42 ¦
¦
626 ¦ Строгальный
¦02/01/98 ¦ Регулировка
¦03/31/98 ¦ Чистка
¦ 33 ¦
Всего
просроченно
дней - 252
МОСКОВСКАЯ
ГОСУДАРСТВЕННАЯ
ТЕКСТИЛЬНАЯ
АКАДЕМИЯ
им. КОСЫГИНА
К У Р С
О В А Я Р А Б О Т
А
Тема : “Разработка
програмного
обеспечения,
ведение базы
данных и получение
ведомости с
частичными
суммами.“
“Алгоритмические
языки и технология
програмирования
“
Выполнил:
Пономарев
А. Н.
Руководитель:
доц.
Стрельников
Б. А.
асс. Степанова
О. П.
МОСКВА
1998
2.
ЗАДАНИЕ:
ТЕМА
КУРСОВОЙ РАБОТЫ:
Реализация
алгоритма
обработки
данных
и ведения
реляционной
базы данных.
ИСХОДНЫЕ
ДАННЫЕ:
Индивидуальное
задание с описанием
базы данных
и получаемой
в
результате
ее обработки
ведомости с
частичными
и полными суммами.
1.
Разработать
структуры
файлов и создать
макет базы
данных.
3.
Составить и
отладить программу
получения
ведомости.
4.
Разраб. формы
экранных кадров
и меню для ведения
базыданных.
6.
Дополнить
программу п. 5
возможностью
удаления и
добавления
строк в таблицу.
7.
Дополнить
программу п. 5
возможностью
изменения
инф-ии в
таблице.
8.
Составить и
отладить процедуры
оперативного
ведения справочников
базы данных.
9.
Разраб. единую
систему меню
для ведения
базы данных
и ее
обработки
с целью получения
ведомости.
10.
Разработать
систему интерфейса
пользователя
(подсказки о
клавишах,
на которые
предусмотрена
реакция системы
и помощь пользователю).
ПЕРЕЧЕНЬ
ГРАФИЧЕСКОГО
МАТЕРИАЛА
1.
Структуры
файлов базы
данных и их
заполнение
для тестового
примера.
ввода
от пользователя.
3.
Ведомость,
получаемая
в результате
выполнения
тестового
примера.
МАТЕМАТИЧЕСКИЕ
МОДЕЛИ
Обеспечить
модульную
структуру
программы.
(
программа
состоит из
нескольких
PRG-файлов, включая
PRG-файл
типовых
утилит. Каждый
PRG-файл состоит
из функций или
процедур,
снабженных
комментариями.
)
ТЕХНИЧЕСКИЕ
СРЕДСТВА:
ПЭВМ IBM
Система
программирования
Clipper 5. 2
Имеются
файлы: АА - нормативы
профилактики
оборудования,
ВВ
- профилактики
и СС - состав
оборудования
АА:
1. Идентификатор
типа станка
ВВ: 1. Инвентарный
номер станка
2. Наименование
типа станка
2. Вид профилактики
3. Норма
кол-ва дней
между 3. Дата
профилактики
профилактиками
4. Идентификатор
записи
2. Идентификатор
типа станка
Выявить
все случаи
превышения
нормативных
интервалов
между профилактиками
и вывести их
в выводной файл
DD:
1. Инв.№
2. Фактическое
кол-во дней
3. Нормативное
кол-во дней
4. Иден-тор
записи пред.
проф-ки
5. Иден-тор записи
след. проф-ки
На
принтер вывести
ведомость,
упорядоченную
по убыванию
кол-ва просроченных
дней:
Нарушения норм
техобслуживания
Инв.№
/Тип Дата/Вид
пред. проф-ки
Дата /Вид след. проф-ки
Просрочено,
дней
Инв.№
/Тип Дата /Вид
пред. проф-ки
Дата /Вид след. проф-ки
Просрочено,
дней
. . . . . . . . . .
Общее
кол-во дней
просрочки
СУММА
4. Анализ
обработки БД
для её получения
:
Главный цикл
обработки в
подпрограмме
vedom - (п. п.,
которая осущест-
вляет
выявление всех
случаев превышения
нормативных
интервалов
между профилактиками,
вывод их в выводной
файл “DD”, а также
осуществляет
выдачу
ведомости на
принтер) проводится
по файлу bb. dbf
.
б)
Как он должен
быть упорядочен
?
Он
должен быть
упорядочен
в хронологическом
порядке.
Пример:
index on bb->invnom + dtoc(bb->dateprof) to
bb0001
Справка:
<ключевое
выражение>
TO <имя индексного
файла>
INDEX
- команда обработки
базы данных,
которая создает
файлы,
содержащие
индексы базы
данных на основе
значения аргумента
<ключевое
выражение>.
При использовании
индексного
файла записи
базы данных
обрабатываются
в последовательности,
заданной ключевым
выражением,
однако физический
порядок следования
записей базы
данных остается
неизменным.
INDEX обеспечивает
последовательность
записей,
упорядоченную
по значениям
ключевого
выражения. Для
ключей типа
CHARACTER
- в соответствии
со значением
ASCII кода каждого
символа
порядком,
для ключей типа
дата - в хронологическом
порядке и для
логических
- считается,
что истина
(. Т.) - более высокого
порядка.
Memo-поля
не могут быть
индексированы.
в)
Применяются
ли фильтры ?
Хотя
команда SET FILTER делает
так, что файл
в рабочей области
выглядит
состоящим из
подмножества
записей, на
самом деле
Фильтры не
применяются,
т. к время работы
с фильтрованной
и нефильтрованной
рабочей областью
оказывается
одним и тем же.
г)
Имеются ли
связи ”хозяин-слуга”
и по каким полям
?
В
подпрограмме
vedom
Пример:
а) set relat to bb->invnom into cc
“invnom”.
б) set relat to cc->idst into aa additive
Связь по
полю “idst”.
в) set relat to dd->invnom into cc additive
Связь по
полю “invnom”.
...............................................................................................................................
5. Структура
dbf-файлов (имя,
тип, формат,
каждого поля
):
IDST
NAMEST NORMA
1 Строгальный
25
2 Сверлильный
15
3 Токарный
20
......................................................................................................
Имя
Тип Длина
IDST
Символ 3
NORMA
Число 3
б)
Структура
файла bb. dbf :
INVNOM VIDPROF DATEPROF IDZAP
24 Смазка
09-01-98 1
4 Смазка
09-01-98 2
231 Смазка
09-01-98 3
2 Смазка
09-01-98 4
323 Смазка
09-01-98 6
626 Регулировка
01-02-98 7
323 Регулировка
28-01-98 8
2 Регулировка
29-01-98 9
231 Регулировка
28-01-98 10
4 Регулировка
19-01-98 11
24 Регулировка
18-01-98 12
626 Чистка
31-03-98 13
323 Чистка
15-04-98 14
2 Чистка
01-04-98 15
231 Чистка
20-03-98 16
4 Чистка
10-03-98 17
......................................................................................................
Имя
Тип Длина
VIDPROF Символ
12
DATEPROF Дата
8
в)
Структура
файла сс. dbf :
626 1
4
2
231 3
2
3
Имя
Тип Длина
INVNOM
Символ 3
IDST
Символ 3
г)
Структура
файла dd. dbf :
231
51 20 10
16
24
74 15 12
18
323
77 25 8
14
4
50 15 11
17
626
58 25 7
13
.....................................................................................................
INVNOM Символ
3
FKDN
Число 3
NORMA Число
3
IDZAPPP Символ
3
IDZAPSP Символ
3
.................................................................................................................................
Эти
данные были
выбраны произвольно
- “из головы”:
1)
Идентификатор
типа станка
2)
Инвентарный
номер станка
3)
Вид профилактики
Идентификатор
записи в файле
bb. dbf заполнялся
по убыванию
(от 1 до 18), где 1- первая
запись, а 18- последняя.
Норма
кол-ва дней
между профилактиками
была выбрана
произвольна.
...............................................................................................................................
7.
Система меню.
а)
Какие экранные
кадры ?
Экранный
кадр № 1:
Московская
государственная
текстильная
академия ( МГТА
)
БАЗА
ДАННЫХ Нарушение
норм техобслуживания:
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
*************************
Руководитель:
доц.
Стрельников
Б. А.
асс.
Степанова О. П.
Сразу
приступить
к работе с Базой
Данных
Заново
построить все
индексы Базы
Данных
Провести
компрессию
Базы Данных
Экранный
кадр № 2:
Московская
государственная
текстильная
академия ( МГТА
)
БАЗА
ДАННЫХ Нарушение
норм техобслуживания:
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
студента
гр 42/96 Пономарёва
А. Н.
*************************
Руководитель:
Выберите
одну из следующих
задач
"Нормативы
профилактики
оборудования"
Ведение
файла "Профилактика"
Получение
ведомости
нарушение норм
техобслуживания
Выход
из Базы Данных
Экранный
кадр № 3:
Нормативы
профилактики
оборудования:
Идент.
типа станка
Наименование
типа станка
Норма,дней
------------------------------------------------------------------------------------------
1 ¦
Строгальный
¦ 25
3 ¦
Токарный
¦ 20
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
Тип
станка: Строгальный
/
Ї
/ ®
/ ¬
/ ^®
PgUp / PgDn / ^¬/
Home / End - Перемещение
курсора
¦
Esc - Возврат на
шаг назад ¦F8
- Удалить строку
Enter
- Редактирование
¦ ¦F3
- Вставить строку
Экранный
кадр № 4:
Профилактики:
Инв.№
станка Вид
профилактики
Дата профилактики
----------------------------------------------------------------------------------------
2 ¦
Смазка
¦ 01/09/98
2 ¦
Регулировка
¦ 01/29/98
2 ¦
Чистка
¦ 04/01/98
231 ¦
Регулировка
¦ 01/28/98
231 ¦
Чистка
¦ 03/20/98
24 ¦
Смазка
¦ 01/09/98
24 ¦
Регулировка
¦ 01/18/98
24 ¦
Чистка
¦ 04/02/98
323 ¦
Смазка
¦ 01/09/98
323 ¦
Регулировка
¦ 01/28/98
323 ¦
Чистка
¦ 04/15/98
----------------------------------------------------------------------------------------
Инв.№
станка: 2
Дата
профилактики:
01/09/98
¦
Esc - Возврат на
шаг назад ¦F8
- Удалить строку
Enter
- Редактирование
¦ ¦F3
- Вставить строку
Таблица
нарушение норм
техобслуживания:
------------------------------------------------------------------------------------------------------------
¦номер
¦ типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦
¦
24 ¦ Сверлильный
¦01/18/98¦ Регулировка
¦04/02/98¦ Чистка
¦ 59 ¦
¦
323 ¦ Строгальный
¦01/28/98¦ Регулировка
¦04/15/98¦ Чистка
¦ 52 ¦
¦
2 ¦ Токарный
¦01/29/98¦ Регулировка
¦04/01/98¦ Чистка
¦ 42 ¦
¦
626 ¦ Строгальный
¦02/01/98¦ Регулировка
¦03/31/98¦ Чистка
¦ 33 ¦
¦
231 ¦ Токарный
¦01/28/98¦ Регулировка
¦03/20/98¦ Чистка
¦ 31 ¦
-------------------------------------------------------------------------------------------------------------
Всего
просроченно
дней - 252
Экранный
кадр № 6:
Курсовая
работа по курсу
:
"Алгоритмические
языки обработки
данных и технология
программирования"
¦ Сохранить
все внесенные
изменения и
продолжить
¦*****
¦
или ¦
¦ Завершить
работу с базой
данных с сохранением
всех ¦. А.
¦
изменений
¦.
¦ Сохранить
и продолжить
Завершить
работу ¦
----------------------------------------------------------------------------------
Выберите
одну из следующих
задач
"Нормативы
профилактики
оборудования"
Ведение
файла "Профилактика"
Выход
из Базы Данных
б)
Пункты меню,
что в них делается
?
Меню
№ 1:
1) Сразу
приступить
к работе с Базой
Данных
2) Заново
построить все
индексы Базы
Данных
3) Провести
компрессию
Базы Данных
4) Выход
из Базы Данных
При
выборе п. 1, если
индексы уже
имеются мы
попадаем в меню
№ 2.
При
выборе п. 2 заново
происходит
построение
всех индексов
Б. Д.
П. а)
Сохранить все
внесенные
изменения и
продолжить
П. б)
Завершить
работу с базой
данных с сохранением
всех изменений
Меню
№ 2:
1) Ведение
файла "Нормативы
профилактики
оборудования"
"Профилактика"
3) Получение
ведомости
нарушение норм
техобслуживания
“Нормативы
профилактики
оборудования”),
где мы можем
его просматривать
и редактировать.
При
выборе п. 2 мы
попадаем в
редактор файла
bb. dbf - (“Профилактика”),
где мы можем
его просматривать
и редактировать.
При
выборе п. 3 происходит
выявление всех
случаев превышения
нормативных
интервалов
между профилактиками,
вывод их в выводной
файл “DD”, а также
выдача ведомости
на принтер.
При
выборе п. 4 выполняются
действия аналогичные
п. 4 в меню № 1.
8.
Ведение БД.
Какими табл.
представлено
ведение БД, по
какой табл.
указывается
текущая рабочая
область, её
слуги, колонки
таблицы, набор
клавиш на которые
предусмотрена
реакция системы.
Клавиши на
которые реагирует
система:
/
Ї
/ ®
/ ¬
/; PgUp / PgDn; Home / End
- Перемещение
курсора
Esc
- Возврат на
шаг назад. Отмена
редактирования
(без сохранения
изменненого
значения)
F8
- Удалить строку
F10
- Выход из задачи
с сохранением
всей информации
или выход без
сохранения
информации
Табл.
№1
Нормативы
профилактики
оборудования:
Идент.
типа станка
Наименование
типа станка
Норма, дней
-----------------------------------------------------------------------------------------------
¦
¦
¦
¦
------------------------------------------------------------------------------------------------
Тип
станка:
Табл.
№2
Профилактики:
Инв.№
станка Вид
профилактики
Дата профилактики
----------------------------------------------------------------------------------------------
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
------------------------------------------------------------------------------------------------
Инв.№
станка:
Вид
профилактики:
Дата
профилактики:
.................................................................................................................................
9.
Структура
программы :
а)
Содержимое
rmk-файла “kursv. rmk”:
objs
= main2,aa,util,bb
. prg. obj:
CLIPPER $< /a/m/n
RTLINK OUTPUT $* FI $(objs) /PLL:base52
util. obj
: util. prg
bb. obj
: bb. prg
б)
Имена и содержание
prg-файлов. По каждой
функции: имя,
назначение,
параметры, тип
данных и смысл,
возвращенное
значение, рабочие
перемен-ные
и их назначение.
Программные
файлы:
1.
Создание
TBrowse-объекта для
просмотра-редактирования
файла aa. dbf в окне.
В
этой программе
реализовано:
3)
main2. prg
В
этой программе
реализовано:
1. Организация
меню.
2.
Индексирование
файлов.
4.
Выявление всех
случаев превышения
нормативных
интервалов
между
профилактиками,
вывод их в выводной
файл “DD”, а также
выдача ведомости
на принтер.
“горячих”
клавишах.
4)
util. prg
Эта
программа
содержит набор
стандартных
утилит:
1. Сохранение
экрана, восстановление
экрана.
2. Перевод в
верхний регистр
как латиницы,
так и кириллицы.
3. Координаты,
сообщение,
цвет.
5. Подача звукового
сигнала для
сигнализации
успешного
выполнения
поставленной
задачи:
Описание
основных
подпрограмм:
1)
п. п. постоения
индексов:
sscr(24,0,25,79)
CLOSE
ALL
SETCOLOR
("w/n")
@
24,0 CLEAR TO 25,79
@
24,6 SAY "Ждите идет
индексирование!
" COLOR "w+*/n"
use
bb
index
on bb->invnom + dtoc(bb->
use
aa
index
on aa->idst to aa0002
use
cc
index
on cc->invnom to cc0003
index
on dd->(norma-fkdn) to dd0004
close
all
return
nil
2)
п. п. открытия
индексов:
func
dbopen
close
all
use
bb index bb0001 new
use
cc index cc0003 new
use
dd index dd0004 new
return
nil
3)
п. п. уплотнения
Б. Д. :
FUNCTION
dbcompress()
"w/n")
@
24,0 CLEAR TO 25,79
@
24,6 SAY "Ждите идет
уплотнение
!" COLOR ("w+*/n")
USE
aa // уплотнение
файла aa. dbf
COPY
TO work
IF
ERRORLEVEL() = 0
USE
DELETE FILE aa. dbf
RENAME work. dbf TO aa. dbf
ENDIF
USE
bb // уплотнение
файла bb. dbf
IF
ERRORLEVEL() = 0
USE
DELETE FILE bb. dbf
RENAME work. dbf TO bb. dbf
ENDIF
IF
ERRORLEVEL() = 0
USE
DELETE FILE cc. dbf
RENAME work. dbf TO cc. dbf
ENDIF
USE
dd // уплотнение
файла dd. dbf
COPY
TO work
IF
ERRORLEVEL() = 0
USE
DELETE FILE dd. dbf
RENAME work. dbf TO dd. dbf
ENDIF
CLOSE
ALL
rscr()
4)
п. п. выдачи
информации
о клавишах, на
которые реагирует
система
”Help”:
PROCEDURE
hlp(callpnt,prm)
LOCAL
retcol,crow,ccol
prm := . F.
ENDIF
crow
= ROW()
ccol
= COL()
retcol
= SETCOLOR("w/n")
IF
callpnt = "GET"
// исправленный
HLP для GET 26. 09. 96
@
22,0 SAY "Enter/" + CHR(24) + '/' + CHR(25) +
'/PgUp/PgDn' ;
+
" -Завершить
редактирование
с сохранением
измененного
значения"
@
22,0 SAY "Enter/"+ CHR(24) + '/' + CHR(25) +
'/PgUp/PgDn' COLOR "r+/n"
@
23,1 SAY CHR(26) + ' / ' + CHR(27) + ' / ^' + CHR(26) ;
+
' / ^' + CHR(27) + ' / Home / End - Перемещение
курсора'
@
23,1 SAY CHR(26) + ' / ' + CHR(27) + ' / ^' + CHR(26) ;
+
' / ^' + CHR(27) + ' / Home / End' COLOR "r+/n"
@
24,1 SAY 'Esc - Отменить
редактирование
' ;
+ '( без
сохранения
измененного
значения )'
@
24,1 SAY "Esc" COLOR "r+/n"
ENDIF
IF
callpnt="AAED" . OR. callpnt="BBED"
SET
COLOR TO ("w/n")
@
22,1 SAY chr(24) + " / " + chr(25) + " / " +
CHR(26) + ' / ' ;
" PgUp / PgDn
" ;
@
24,0 SAY 'Enter - Редактирование
'
@
23,23 TO 24,23 DOUBLE
"w/n"
"r+/n"
@
23,54 TO 24,54 DOUBLE
@
23,55 SAY 'F8 - Удалить
строку '
@
24,55 SAY 'F3 - Вставить
строку '
"r+/n")
@
22,1 SAY chr(24) + " / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
@
24,0 SAY 'Enter'
ENDIF
IF
callpnt="CCED" . OR. callpnt="DDED"
SET
COLOR TO ("w/n")
@
22,1 SAY chr(24) + " / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
@
24,0 SAY 'Enter - Редактирование
'
@
23,23 TO 24,23 DOUBLE
"w/n"
@
23,25 SAY 'Esc' COLOR "r+/n"
@
24,25 SAY '^Enter - Выбор значения
' COLOR "w/n"
@
24,25 SAY '^Enter' COLOR "r+/n"
@
23,55 SAY 'F8 - Удалить
строку '
SET
COLOR TO ("r+/n")
@
22,1 SAY chr(24) + " / " + chr(25) + " / " +
CHR(26) + ' / ' ;
+ CHR(27) + ' / ^' + CHR(26) + " PgUp / PgDn
" ;
+
' / ^' + CHR(27) + '/ Home / End '
@
24,0 SAY 'Enter'
@
24,55 SAY 'F3'
ENDIF
SET
COLOR TO (retcol)
SETPOS(crow,ccol)
RETURN
“DD”, а также выдачи
ведомости на
принтер:
func
vedom
local
tinvnom,sitog,tdata,tidzap,tidst,idpop
set
printer on
select
dd
zap
lin:=space(17)+"Таблица
нарушение норм
техобслуживания:"
?
lin
select
bb
set
relat to bb->invnom into cc
set
relat to cc->idst into aa additive
go
top
sitog:=0
do
while. not. eof()
tinvnom:=bb->
tdata:=bb->dateprof
tidzap:=bb->idzap
tidst:=cc->idst
skip
if(bb->invnom=tinvnom). and.(bb->dateprof-tdata>aa->norma)
select
dd
append
blank
replace
dd->invnom with tinvnom
replace
dd->fkdn with bb->dateprof-tdata
replace
dd->norma with aa->norma
replace
dd->
replace
dd->idzapsp with bb->idzap
sitog:=sitog+(dd->fkdn-dd->norma)
select
bb
endif
enddo
lin:="+-----------------------------------------------------------------------------+"
?
lin
lin:="¦
Инв.¦ Наименование
¦ Дата ¦ Вид
предвор. ¦ Дата
¦ вид след.
¦Просроч.¦"
lin:="¦номер¦
типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦"
?
lin
lin:="¦-----+--------------+--------+--------------+--------+--------------+--------¦"
?
lin
select
dd
set
relat to dd->invnom into cc additive
go
top
do
while. not. eof()
tinvnom:=dd->invnom
idpop:=dd->idzappp
lin:="¦
"+dd->invnom+" ¦ "
select
bb
go
top
do
while. not. eof()
if(tinvnom=bb->invnom). and.(idpop=bb->idzap)
lin:=lin+aa->namest+"
¦"+dtoc(bb->dateprof)+"¦ "+bb->vidprof
endif
skip
enddo
idpop:=dd->idzapsp
go
top
if(tinvnom=bb->invnom). and.(idpop=bb->idzap)
lin:=lin+"
¦"+dtoc(bb->dateprof)+"¦ "+bb->vidprof+"¦
"
endif
skip
enddo
select
dd
lin:=lin+str(dd->fkdn-dd->norma,4)+"
¦"
?
lin
skip
enddo
lin:="+-----------------------------------------------------------------------------+"
?
lin
set
color to w+/b
lin:="
Всего просроченно
дней -"+str(sitog,5)
?
lin
set
printer off
sound()
inkey(0)
return
nil
поставленной
задачи:
func
sound
tone(100,1)
tone(300,1)
tone(100,1)
return
nil
7)
п. п. сохранения
зкрана:
IF
t = NIL
ENDIF
IF
l = NIL
l
:= 0
ENDIF
b
:= MAXROW()
ENDIF
r
:= MAXCOL()
ENDIF
AADD(
wind[3], b )
AADD(
wind[5], SAVESCREEN(t,l,b,r) )
AADD(
pos[1], ROW() )
AADD(
pos[2], COL() )
AADD(
colr, SETCOLOR() )
AADD(
curs, SETCURSOR() )
RETURN
. T.
LOCAL
ln
ln
:= LEN(wind[1])
IF
ln == 0
@
24,0 SAY ' Ошибка - стек
для восстановления
параметров
пуст '
INKEY(0)
@
24,0
ENDIF
RESTSCREEN(wind[1,ln], wind[2,ln], wind[3,ln],
wind[4,ln], wind[5,ln] )
ASIZE(wind[1],ln-1)
ASIZE(wind[2],ln-1)
ASIZE(wind[3],ln-1)
ASIZE(wind[4],ln-1)
ASIZE(wind[5],ln-1)
SETPOS( pos[1,ln], pos[2,ln] )
ASIZE(pos[1],ln-1)
ASIZE(pos[2],ln-1)
SETCOLOR(colr[ln])
SETCURSOR(curs[ln])
RETURN
. T.
9)
п. п. определения
- нажата ли клавиша
типового метода,
если да - то
возвращает
блок кода с
соответствующим
методом, если
нет - то возвращает
NIL. Параметр функции
- INKEY-код нажатой
клавиши.
FUNC
basemet(cod)
LOCAL
crsm:={ ;
{KDOWN , {o o:down() } } ;
, {KUP , {o o:up() } } ;
, {KPGDN , {o o:pagedown() } } ;
, {KRIGHT , {o o:right() } } ;
, {KCTRLRIGHT , {o o:panright() } } ;
, {KCTRLLEFT , {o o:panleft() } } ;
, {KEND , {o o:end() } } ;
, {KHOME , {o o:home() } } ;
, {KCTRLEND , {o o:panend() } } ;
, {KCTRLHOME , {o o:panhome() } } }
IF
i <> 0
ret := crsm[i,2]
ELSE
ENDIF
RETURN
ret
10)
п. п. переключения
режима вставка/замена
и вида курсора:
PROCEDURE
ReplIns()
IF
READINSERT()
READINSERT(. F.)
ELSE
READINSERT(. T.)
SETCURSOR(SCNORMAL)
ENDIF
RETURN
FUNC
UpperC(prm)
LOCAL
n , i , smb , cs
n
:= LEN( prm )
smb
:= SUBSTR( prm , i , 1 )
cs
:= ASC( smb )
DO
CASE
CASE cs >= 97. AND. cs <= 122
cs := cs - 32
prm := STUFF( prm , i , 1 , CHR( cs ) )
CASE cs >= 160. AND. cs <= 175
prm := STUFF( prm , i , 1 , CHR( cs ) )
CASE cs >= 224. AND. cs <= 239
cs := cs - 80
prm := STUFF( prm , i , 1 , CHR( cs ) )
ENDCASE
NEXT
12)
п. п. выхода из
задачи с сохранением
всей информации
- реакция на
клавишу F10:
PROCEDURE
fquit()
LOCAL
reply
"Сохранить
все внесенные
изменения и
продолжить;"
;
+ "работу с
Базой данных
- т. е. сделать
промежуточный
SAVE или;" ;
+ " Завершить
работу с базой
данных с сохранением
всех изменений
;";
, {" Сохранить
и продолжить
" , " Завершить
работу " } )
IF ( reply = 1 ) . OR. ( reply = 0 )
ELSE
QUIT
ENDIF
RETURN
PROCEDURE
msgs(x,y,m,color)
LOCAL
ml,c
IF
m = NIL
RETURN
ENDIF
ml=LEN(m)
IF
ml=0 && . OR. ml > 80
RETURN
ENDIF
IF
x=NIL // Центр по X
x
:= (80-ml)/2
ENDIF
IF
y=NIL // Центр по Y
y
:= 24/2 - 1
ENDIF
IF
color <> NIL
c
:= SETCOLOR(color)
@
y,x SAY m
SETCOLOR(c)
ELSE
@
y,x SAY m
ENDIF
RETURN
14)
п. п. создания
TBrowse-объекта для
просмотра-редактирования
FUNCTION
aaCr(t,l,b,r)
LOCAL
brws,coln,cblk,chdr
brws
:= TBrowseDb(t,l,b,r)
cblk
:= { " " + aa->
chdr
:= "Идент. типа
станка"
coln
:= TBColumnNew(chdr,cblk)
coln:width := 19
cblk
:= { " " + aa->namest}
chdr
:= " Наименование
типа станка"
coln
:= TBColumnNew(chdr,cblk)
coln:width := 35
cblk
:= { STR( aa->
" Норма,дней"
coln
:= TBColumnNew(chdr,cblk)
coln:width := 12
brws:AddColumn(coln)
brws:colsep := CHR(186)
brws:headsep := CHR(205)
"w+/b,gr+/rb"
RETURN
brws
FUNCTION
aaEd(brws)
LOCAL
retfl,sel,otb , w
LOCAL
ret:=NIL
srs()
SETCOLOR( "N/W" )
CLS
SETCOLOR( "gr+/b,w+/gr")
hlp("AAED")
SELECT
aa
@
t-2 , l-1 CLEAR TO b+2 , r+1
@
b+1, l TO b+1, r
retfl
:= . F.
DO
WHILE. NOT. retfl
**
оптимизированная
с использованием
буфера клавиатуры
стабилизация
ENDDO
IF
( NEXTKEY() == 0 ) . AND. ( RECNO() <> nrc)
nrc
:= RECNO()
rr
:= ROW()
SETCOLOR("bg+/b")
" Нормативы
профилактики
оборудования:"
" Тип станка:
"
@
b+2 , COL()+1 SAY aa->namest COLOR "w+/b"
SETPOS(rr,cc)
ENDIF
SETCOLOR("gr+/rb")
**
ожидаем нажатия
клавиши
nkey
:= Inkey(0)
//
если нажата
клавиша типового
метода - вызовем
его
IF
blk <> NIL
ELSE
DO
CASE
CASE ( bHotkey := SETKEY( nKey ) ) <> NIL
CASE ( nKey = KF8 )
DELETE
// потрогаем
файловый указатель,
если
// возвращаетя
EOF() -. T. после Down-Up,
// значит
файл пуст
SKIP
SKIP -1
retfl := . T. // завершение
просмотра
ENDIF
brws:RefreshAll()
nrc := 0
CASE nKey = KESC
retfl := . T. // завершение
просмотра
CASE ( nKey = KENTER )
// Редактирование
текущего элемента
данных
" Редактирование
файла aa. dbf" )
nrc := 0 // обновить
верхнюю строку
CASE nKey == KF3
APPEND BLANK
brws:RefreshAll()
ENDCASE
ENDIF
ENDDO
srs(. T.)
rscr()
RETURN
ret
16)
п. п. выполнения
GET в текущей колонке
файла aa. dbf:
PROCEDURE
aaGet( brws , z0 )
LOCAL
r , c , w , w2 , otb
LOCAL
retcurs,retexit // форма курсора
и режим выхода
из READ
LOCAL
indch := . F. // флаг изменений
значений полей,
входящих в
// индекснове
выражение
(тогда нужно
REFRESHALL(),
// а не
REFRESHCURRENT() )
LOCAL
col
r
:= ROW()
c
:= COL()
//
Проверка обновления
экрана, корректности
базы и т. д.
ForceStable(brws)
//
Установка
клавиш Up-Arrow и
Down-Arrow как клавиш
выхода из
//
команды
READ
retexit := READEXIT(. T.)
// Установка
клавиши INS для
переключения
// режима
вставка/замена
// и соответствующего
изменения вида
курсора
retins
:= SetKey( KINS, { ReplIns()} )
// эквивалентно
Set Key KINS To Procedure ReplIns
// Установка
вида курсора
по текущему
состоянию
режима
sscr()
retcol
:= SETCOLOR("w+/g")
@
brws:nTop-3,0
@
brws:nTop-3,0 SAY z0
hlp("GET")
SETCOLOR("gr+/n,w+/g")
indch
:= . F.
DO
CASE
CASE
brws:colpos = 1
w
:= aa->idst
READ
IF. NOT.( LASTKEY() = KESC ). OR.( aa->idst == w )
REPLACE aa->idst WITH w
indch := . T.
ENDIF
n := aa->namest
@ r,c+2 GET n
READ
IF. NOT.( LASTKEY() = KESC ). OR.( aa->namest == n )
REPLACE aa->namest WITH n
ENDIF
CASE
brws:colpos = 3
w
:= aa->norma
READ
IF. NOT.( ( LASTKEY() = KESC ) . OR. ( aa->norma = w
) )
REPLACE aa->
ENDIF
ENDCASE
SETCOLOR(retcol)
rscr()
SETPOS(r,c)
ELSE
brws:RefreshCurrent() // Обеспечить
перерисовку
текущей строки,
ENDIF
// поскольку
изменялся
элемент данных
//
Восстановление
формы курсора
и режима выхода
из READ по стрелкам
//
и процедуры
по клавише
KINS
SetCursor(retcurs)
READEXIT(retexit)
SetKey(KINS, retIns)
//
Проверка требования
ухода с текущей
записи после
GET
IF
nKey == KUP. OR. nKey == KDOWN. OR. ;
nKey == KPGUP. OR. nKey == KPGDN
//
управление
курсором -- переход
к другой записи
KEYBOARD( CHR(nKey) )
ENDIF
а) для создания
TBrowse-объекта для
просмотра-редактирования
файла bb. dbf в окне
t,l,b,r ;
б) для просмотра
файла bb. dbf с обработкой
нажимаемых
клавиш и вызовом
соответствующих
методов или
пользовательских
функций;
в) для выполнения
GET в текущей колонке
файла bb. dbf:
Т. к. эти подпрограммы
практически
аналогичны
подпрограммам
для файла aa. dbf !!!
.................................................................................................................................
а)
Содержимое
выводного
файла dd. dbf:
INVNOM
FKDN NORMA IDZAPPP IDZAPSP
2
62 20 9
15
231
51 20 10
16
24
74 15 12
18
323
77 25 8
14
4
50 15 11
17
б)
Содержимое
файла (print. prn), выводимого
на принтер:
Таблица
нарушение норм
техобслуживания:
-----------------------------------------------------------------------------------------------------------------
¦
Инв. ¦ Наименование
¦ Дата ¦ Вид
предвор. ¦ Дата
¦ вид след.
¦ Просроч.¦
¦номер
¦ типа станка
¦ ¦ профилактики
¦ ¦ профилактики
¦ дней ¦
¦----------------------------------------------------------------------------------------------------------------¦
¦
323 ¦ Строгальный
¦01/28/98 ¦ Регулировка
¦04/15/98 ¦ Чистка
¦ 52 ¦
¦
2 ¦ Токарный
¦01/29/98 ¦ Регулировка
¦04/01/98 ¦ Чистка
¦ 42 ¦
¦
626 ¦ Строгальный
¦02/01/98 ¦ Регулировка
¦03/31/98 ¦ Чистка
¦ 33 ¦
¦
231 ¦ Токарный
¦01/28/98 ¦ Регулировка
¦03/20/98 ¦ Чистка
¦ 31 ¦
Всего
просроченно
дней - 252
|