Реферат: Ведение реляционной БД на яз. CLIPPER 5.02
МОСКОВСКАЯ ГОСУДАРСТВЕННАЯ ТЕКСТИЛЬНАЯ АКАДЕМИЯ им. КОСЫГИНА
Кафедра ИТ и ВТ.
К У Р С О В А Я Р А Б О Т А
Тема : “Разработка програмного обеспечения, ведение базы данных и получение ведомости с частичными суммами.“
по курсу: “Алгоритмические языки и технология програмирования “
Выполнил:
Пономарев А.Н. гр.42-96
Руководитель: доц. Стрельников Б.А. асс. Степанова О.П.
МОСКВА
1998
2. ЗАДАНИЕ:
ТЕМА КУРСОВОЙ РАБОТЫ: Реализация алгоритма обработки данных и ведения реляционной базы данных.
ИСХОДНЫЕ ДАННЫЕ:
Индивидуальное задание с описанием базы данных и получаемой в результате ее обработки ведомости с частичными и полными суммами.
ПЕРЕЧЕНЬ ПОДЛЕЖАЩИХ РАЗРАБОТКЕ ВОПРОСОВ ( СОДЕРЖАНИЕ РАСЧЕТНО-
ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ )
1. Разработать структуры файлов и создать макет базы данных.
2. Разработать алгоритм обработки данных для получения ведомости.
3. Составить и отладить программу получения ведомости.
4. Разраб. формы экранных кадров и меню для ведения базыданных.
5. Составить и отладить программу реализации экранного кадра для просмотра основных(ой) таблиц(ы).
6. Дополнить программу п.5 возможностью удаления и добавления строк в таблицу.
7. Дополнить программу п.5 возможностью изменения инф-ии в таблице.
8. Составить и отладить процедуры оперативного ведения справочников базы данных.
9. Разраб.единую систему меню для ведения базы данных и ее обработки с целью получения ведомости.
10. Разработать систему интерфейса пользователя (подсказки о клавишах, на которые предусмотрена реакция системы и помощь пользователю).
ПЕРЕЧЕНЬ ГРАФИЧЕСКОГО МАТЕРИАЛА
1. Структуры файлов базы данных и их заполнение для тестового примера.
2. Макеты экранных кадров и состав подсказок для пунктов ожидания ввода от пользователя.
3. Ведомость, получаемая в результате выполнения тестового примера.
МАТЕМАТИЧЕСКИЕ МОДЕЛИ
Обеспечить модульную структуру программы.
( программа состоит из нескольких PRG-файлов, включая PRG-файл типовых утилит. Каждый PRG-файл состоит из функций или процедур, снабженных комментариями. )
ТЕХНИЧЕСКИЕ СРЕДСТВА:
ПЭВМ IBM
Система программирования Clipper 5.2
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->dateprof) to bb0001
Справка:
Синтаксис:
INDEX ON TO
INDEX — команда обработки базы данных, которая создает файлы, содержащие индексы базы данных на основе значения аргумента . При использовании индексного файла записи базы данных обрабатываются в последовательности, заданной ключевым выражением, однако физический порядок следования записей базы данных остается неизменным.
INDEX обеспечивает последовательность записей, упорядоченную по значениям ключевого выражения. Для ключей типа
CHARACTER — в соответствии со значением ASCII кода каждого символа внутри строки, для ключей типа NUMERIC — в соответствии с числовым порядком, для ключей типа дата — в хронологическом порядке и для логических — считается, что истина (.Т.) — более высокого порядка.
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-файлов (имя, тип, формат, каждого поля ):
a) Структура файла aa.dbf :
IDST NAMEST NORMA
1 Строгальный 25
2 Сверлильный 15
3 Токарный 20
…………………………………………………………………
………………………
Имя Тип Длина
IDST Символ 3
NAMEST Символ 12
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
626 Смазка 09-01-98
5
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
24 Чистка 02-04-98
18
…………………………………………………………………
………………………
Имя Тип Длина
INVNOM Символ 3
VIDPROF Символ 12
DATEPROF Дата 8
IDZAP Символ 3
в) Структура файла сс.dbf :
INVNOM IDST
323 1
626 1
4 2
231 3
24 2
2 3
…………………………………………………………………
………………………
Имя Тип Длина
INVNOM Символ 3
IDST Символ 3
г) Структура файла 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
626 58 25 7
13
………………………………………………………………….
…………………….
Имя Тип Длина
INVNOM Символ 3
FKDN Число 3
NORMA Число 3
IDZAPPP Символ 3
IDZAPSP Символ 3
………………………………………………………………….
……………………………………………..
6. Принципы подготовки данных для тестового примера и заполнения исходных данных.
Эти данные были выбраны произвольно — “из головы”:
1) Идентификатор типа станка
2) Инвентарный номер станка
3) Вид профилактики
4) Наименование типа станка
Идентификатор записи в файле bb.dbf заполнялся по убыванию (от 1 до 18), где 1- первая запись, а 18- последняя.
Норма кол-ва дней между профилактиками была выбрана произвольна.
Дата профилактики выбиралась так, чтобы норма кол-ва дней между профилактиками была превышена для всех видов профилактик.
………………………………………………………………….
……………………………………………
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 ¦
¦ 323 ¦ Строгальный ¦01/28/98¦ Регулировка ¦04/15/98¦ Чистка
¦ 52 ¦
¦ 2 ¦ Токарный ¦01/29/98¦ Регулировка ¦04/01/98¦ Чистка
¦ 42 ¦
¦ 4 ¦ Сверлильный ¦01/19/98¦ Регулировка ¦03/10/98¦ Чистка
¦ 35 ¦
¦ 626 ¦ Строгальный ¦02/01/98¦ Регулировка ¦03/31/98¦ Чистка
¦ 33 ¦
¦ 231 ¦ Токарный ¦01/28/98¦ Регулировка ¦03/20/98¦ Чистка
¦ 31 ¦
—————————————————————————-
———————————
Всего просроченно дней — 252
Экранный кадр № 6:
Московская государственная текстильная академия ( МГТА )
БАЗА ДАННЫХ Нарушение норм техобслуживания:
Курсовая работа по курсу :
«Алгоритмические языки обработки данных и технология программирования»
——————————————————————
—————-а А.Н.
¦ Сохранить все внесенные изменения и продолжить
¦*****
¦ работу с Базой данных — т.е. сделать промежуточный SAVE ¦
¦ или
¦
¦ Завершить работу с базой данных с сохранением всех
¦.А.
¦ изменений
¦.
¦ Сохранить и продолжить Завершить работу
¦
——————————————————————
—————-
Выберите одну из следующих задач
Ведение файла «Нормативы профилактики оборудования»
Ведение файла «Профилактика»
Получение ведомости нарушение норм техобслуживания
Выход из Базы Данных
б) Пункты меню, что в них делается ?
Меню № 1:
1) Сразу приступить к работе с Базой
Данных
2) Заново построить все индексы Базы Данных
3) Провести компрессию Базы Данных
4) Выход из Базы Данных
При выборе п.1, если индексы уже имеются мы попадаем в меню № 2.
При выборе п.2 заново происходит построение всех индексов Б.Д .
При выборе п.3 производится компрессия (уплотнение) Б.Д .
При выборе п.4 появляется горизонтальное подменю:
а) Сохранить и продолжить б) Завершить работу
П.а) Сохранить все внесенные изменения и продолжить
П.б) Завершить работу с базой данных с сохранением всех изменений
Меню № 2:
1) Ведение файла «Нормативы профилактики оборудования»
2) Ведение файла «Профилактика»
3) Получение ведомости нарушение норм техобслуживания
4) Выход из Базы Данных
При выборе п.1 мы попадаем в редактор файла aa.dbf — (“Нормативы
профилактики оборудования”), где мы можем его просматривать и редактировать.
При выборе п.2 мы попадаем в редактор файла bb.dbf — (“Профилактика”), где мы можем его просматривать и редактировать.
При выборе п.3 происходит выявление всех случаев превышения нормативных интервалов между профилактиками, вывод их в выводной файл “DD”, а также выдача ведомости на принтер.
При выборе п.4 выполняются действия аналогичные п.4 в меню № 1.
………………………………………………………………….
……………………………………………..
8. Ведение БД .
Какими табл. представлено ведение БД, по какой табл. указывается текущая рабочая область, её слуги, колонки таблицы, набор клавиш на которые предусмотрена реакция системы.
Клавиши на которые реагирует система:
(/ ( / ( / ( /; PgUp / PgDn; Home / End — Перемещение курсора
Enter — Выбор задачи в меню и редактирование полей в редакторе
Esc — Возврат на шаг назад. Отмена редактирования (без сохранения изменненого значения)
F8 — Удалить строку
F3 — Вставить строку
F10 — Выход из задачи с сохранением всей информации или выход без сохранения информации
Таблицы ведения Б.Д.:
Табл. №1
Нормативы профилактики оборудования:
Идент. типа станка Наименование типа станка Норма, дней
—————————————————————————
———————
¦
¦
¦
¦
¦
¦
¦
¦
¦
¦
—————————————————————————
———————
Тип станка:
Табл. №2
Профилактики:
Инв.№ станка Вид профилактики Дата профилактики
—————————————————————————
———————
¦
¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
¦ ¦
—————————————————————————-
———————
Инв.№ станка:
Вид профилактики:
Дата профилактики:
………………………………………………………………….
……………………………………………..
9. Структура программы :
а) Содержимое rmk-файла “kursv.rmk”:
objs = main2,aa,util,bb
.prg.obj:
CLIPPER $
.obj.exe:
RTLINK OUTPUT $* FI $(objs) /PLL:base52
main2.obj : main2.prg aa.obj : aa.prg util.obj : util.prg bb.obj : bb.prg
kurs_ok.exe : main2.obj aa.obj util.obj bb.obj
б) Имена и содержание prg-файлов. По каждой функции: имя, назначение, параметры, тип данных и смысл, возвращенное значение, рабочие перемен-ные и их назначение.
Программные файлы:
1) aa.prg
В этой программе реализовано:
1. Создание TBrowse-объекта для просмотра-редактирования файла aa.dbf в окне.
2) bb.prg
В этой программе реализовано:
1. Создание TBrowse-объекта для просмотра-редактирования файла bb.dbf в окне.
3) main2.prg
В этой программе реализовано:
1.Организация меню.
2. Индексирование файлов.
3. Уплотнение файла .
4. Выявление всех случаев превышения нормативных интервалов между профилактиками, вывод их в выводной файл
“DD”, а также выдача ведомости на принтер.
5. Вывод на экран информации о “горячих” клавишах.
4) util.prg
Эта программа содержит набор стандартных утилит:
1. Сохранение экрана, восстановление экрана.
2. Перевод в верхний регистр как латиницы, так и кириллицы.
3. Координаты, сообщение, цвет.
4. Выход из задачи с сохранением всей информации — реакция на клавишу F10.
5. Подача звукового сигнала для сигнализации успешного выполнения поставленной задачи:
Описание основных подпрограмм:
1) п.п. постоения индексов: func db_index(prm) s_scr(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->invnom to cc0003 use dd index on dd->(norma-fkdn) to dd0004 close all r_scr() return nil
2) п.п. открытия индексов: func db_open close all use aa index aa0002 use bb index bb0001 new use cc index cc0003 new use dd index dd0004 new return nil
3) п.п. уплотнения Б.Д. :
FUNCTION db_compress() s_scr(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
IF ERRORLEVEL() = 0
USE
DELETE FILE aa.dbf
RENAME work.dbf TO aa.dbf
ENDIF
USE bb // уплотнение файла bb.dbf
COPY TO work
IF ERRORLEVEL() = 0
USE
DELETE FILE bb.dbf
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
USE dd // уплотнение файла dd.dbf
COPY TO work
IF ERRORLEVEL() = 0
USE
DELETE FILE dd.dbf
RENAME work.dbf TO dd.dbf
ENDIF
CLOSE ALL r_scr()
RETURN NIL
4) п.п. выдачи информации о клавишах, на которые реагирует система
”Help”:
PROCEDURE hlp(callpnt,prm)
LOCAL retcol,crow,ccol
IF prm = NIL prm := .F.
ENDIF crow = ROW() 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»)
@ 22,1 SAY chr(24) + » / » + 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»)
@ 22,1 SAY chr(24) + » / » + 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
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 » ;
+ ‘ / ^’ + 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»
@ 24,25 SAY ‘^Enter — Выбор значения ‘ COLOR «w/n»
@ 24,25 SAY ‘^Enter’ COLOR «r+/n»
@ 23,54 TO 24,54 DOUBLE
@ 23,55 SAY ‘F8 — Удалить строку ‘
@ 24,55 SAY ‘F3 — Вставить строку ‘
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’
@ 23,55 SAY ‘F8’
@ 24,55 SAY ‘F3’
ENDIF
SET COLOR TO (retcol)
SETPOS(crow,ccol)
RETURN
5) п.п. выявления всех случаев превышения нормативных интервалов между профилактиками, вывода их в выводной файл
“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->invnom 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->idzappp with tidzap replace dd->idzapsp with bb->idzap sitog:=sitog+(dd->fkdn-dd->norma) select bb endif enddo lin:=»+———————————————————————
———+»
? 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 select dd idpop:=dd->idzapsp select bb go top do while .not. eof() 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
6) п.п. подачи звукового сигнала для сигнализации успешного выполнения поставленной задачи: func sound tone(300,1) tone(100,1) tone(300,1) tone(100,1) return nil
7) п.п. сохранения зкрана:
FUNC s_scr(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 r := MAXCOL()
ENDIF
AADD( wind[1], t )
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( pos[2], COL() )
AADD( colr, SETCOLOR() )
AADD( curs, SETCURSOR() )
RETURN .T.
8) п.п. восстановления зкрана:
FUNC r_scr()
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])
ASIZE(colr,ln-1)
SETCURSOR(curs[ln])
ASIZE(curs,ln-1)
RETURN .T.
9) п.п. определения — нажата ли клавиша типового метода, если да — то возвращает блок кода с соответствующим методом, если нет — то возвращает
NIL. Параметр функции — INKEY-код нажатой клавиши.
FUNC basemet(cod)
LOCAL ret , ei , i
LOCAL crsm:={ ;
{K_DOWN , {|o| o:down() } } ;
, {K_UP , {|o| o:up() } } ;
, {K_PGDN , {|o| o:pagedown() } } ;
, {K_PGUP , {|o| o:pageup() } } ;
, {K_CTRL_PGDN , {|o| o:gobottom() } } ;
, {K_CTRL_PGUP , {|o| o:gotop() } } ;
, {K_RIGHT , {|o| o:right() } } ;
, {K_LEFT , {|o| o:left() } } ;
, {K_CTRL_RIGHT , {|o| o:panright() } } ;
, {K_CTRL_LEFT , {|o| o:panleft() } } ;
, {K_END , {|o| o:end() } } ;
, {K_HOME , {|o| o:home() } } ;
, {K_CTRL_END , {|o| o:panend() } } ;
, {K_CTRL_HOME , {|o| o:panhome() } } } i := ASCAN( crsm, {|ei| cod = ei[1] } )
IF i 0 ret := crsm[i,2]
ELSE ret := NIL
ENDIF
RETURN ret
10) п.п. переключения режима вставка/замена и вида курсора:
PROCEDURE Repl_Ins()
IF READINSERT()
READINSERT(.F.)
SETCURSOR(SC_INSERT)
ELSE
READINSERT(.T.)
SETCURSOR(SC_NORMAL)
ENDIF
RETURN
11) п.п. перевода в верхний регистр латиницы и кириллицы:
FUNC UpperC(prm)
LOCAL n , i , smb , cs n := LEN( prm )
FOR i = 1 TO n smb := SUBSTR( prm , i , 1 ) cs := ASC( smb )
DO CASE
CASE cs >= 97 .AND. cs = 160 .AND. cs = 224 .AND. cs 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-объекта для просмотра-редактирования файла aa.dbf в окне t,l,b,r :
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) coln:width := 19 brws:AddColumn(coln) cblk := {|| » » + aa->namest} chdr := » Наименование типа станка» coln := TBColumnNew(chdr,cblk) coln:width := 35 brws:AddColumn(coln) cblk := {|| STR( aa->norma,7) } chdr := » Норма,дней» coln := TBColumnNew(chdr,cblk) 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 ret_fl,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 s_scr() s_r_s()
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 ret_fl := .F.
DO WHILE .NOT. ret_fl
** оптимизированная с использованием буфера клавиатуры стабилизация
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)
// если нажата клавиша типового метода — вызовем его blk := basemet( nKey )
IF blk NIL
EVAL( blk , brws )
ELSE
DO CASE
CASE ( bHotkey := SETKEY( nKey ) ) NIL
EVAL( bHotkey , PROCNAME() , PROCLINE() , READVAR() )
CASE ( nKey = K_F8 )
DELETE
// потрогаем файловый указатель, если
// возвращаетя EOF() — .T. после Down-Up,
// значит файл пуст
SKIP
SKIP -1
IF RECNO() = RECCOUNT()+1 ret_fl := .T. // завершение просмотра
ENDIF brws:RefreshAll() nrc := 0
CASE nKey = K_ESC ret_fl := .T. // завершение просмотра
CASE ( nKey = K_ENTER )
// Редактирование текущего элемента данных aaGet(brws ;
, » Редактирование файла aa.dbf» ) nrc := 0 // обновить верхнюю строку
CASE nKey == K_F3
APPEND BLANK brws:RefreshAll()
ENDCASE
ENDIF
ENDDO
SET RELAT TO s_r_s(.T.) r_scr()
RETURN ret
16) п.п. выполнения GET в текущей колонке файла aa.dbf:
PROCEDURE aaGet( brws , z0 )
LOCAL r , c , w , w2 , otb
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( K_INS, {|| Repl_Ins()} )
// эквивалентно Set Key K_INS To Procedure
Repl_Ins
// Установка вида курсора по текущему состоянию режима retcurs := SetCursor( IF(ReadInsert(), SC_NORMAL, SC_INSERT ) ) s_scr() 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
@ r,c+2 GET w
READ
IF .NOT.( LASTKEY() = K_ESC ).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() = K_ESC ).OR.( aa->namest == n )
REPLACE aa->namest WITH n
ENDIF
CASE brws:colpos = 3 w := aa->norma
@ r,c+1 GET w
READ
IF .NOT.( ( LASTKEY() = K_ESC ) .OR. ( aa->norma = w ) )
REPLACE aa->norma WITH w
ENDIF
ENDCASE
SETCOLOR(retcol) r_scr()
SETPOS(r,c)
IF indch brws:RefreshAll()
ELSE brws:RefreshCurrent() // Обеспечить перерисовку текущей строки,
ENDIF // поскольку изменялся элемент данных
// Восстановление формы курсора и режима выхода из READ по стрелкам
// и процедуры по клавише K_INS
SetCursor(retcurs)
READEXIT(retexit)
SetKey(K_INS, retIns)
// Проверка требования ухода с текущей записи после GET nKey := LASTKEY()
IF nKey == K_UP .OR. nKey == K_DOWN .OR. ; nKey == K_PGUP .OR. nKey == K_PGDN
// управление курсором — переход к другой записи
KEYBOARD( CHR(nKey) )
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
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
б) Содержимое файла (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 ¦
¦ 4 ¦ Сверлильный ¦01/19/98 ¦ Регулировка ¦03/10/98 ¦ Чистка
¦ 35 ¦
¦ 626 ¦ Строгальный ¦02/01/98 ¦ Регулировка ¦03/31/98 ¦ Чистка
¦ 33 ¦
¦ 231 ¦ Токарный ¦01/28/98 ¦ Регулировка ¦03/20/98 ¦ Чистка
¦ 31 ¦
—————————————————————————-
————————————-
Всего просроченно дней — 252