|
||||||||||||
|
||||||||||||
|
|||||||||
МЕНЮ
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА - РЕФЕРАТЫ - Ведение реляционной БД на яз. CLIPPER 5.02Ведение реляционной БД на яз. 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 $< /a/m/n .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 , } ; , {K_UP , o:up() } ; , {K_PGDN , } ; , {K_PGUP , o:pageup() } ; , {K_CTRL_PGDN , o:gobottom() } ; , {K_CTRL_PGUP , o } ; , {K_RIGHT , o } ; , {K_LEFT , } ; , {K_CTRL_RIGHT , o } ; , {K_CTRL_LEFT , o:panleft() } ; , {K_END , o } ; , {K_HOME , o:home() } ; , {K_CTRL_END , } ; , {K_CTRL_HOME , } } i := ASCAN( crsm, 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 <= 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 cs := cs - 80 prm := STUFF( prm , i , 1 , CHR( cs ) ) ENDCASE NEXT RETURN prm 12) п.п. выхода из задачи с сохранением всей информации - реакция на клавишу F10: PROCEDURE fquit() LOCAL reply reply := ALERT("Сохранить все внесенные изменения и продолжить;" ; + "работу с Базой данных - т.е. сделать промежуточный SAVE или;" ; + " Завершить работу с базой данных с сохранением всех изменений ;"; , {" Сохранить и продолжить " , " Завершить работу " } ) IF ( reply = 1 ) .OR. ( reply = 0 ) DBCOMMITALL() ELSE QUIT ENDIF RETURN 13) п.п. вывода сообщения на экран с заданными координатами и цветом: 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-объекта для просмотра-редактирования файла aa.dbf в окне t,l,b,r : FUNCTION aaCr(t,l,b,r) LOCAL brws,coln,cblk,chdr brws := TBrowseDb(t,l,b,r) cblk := 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 := 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, ) // эквивалентно 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 |
РЕКЛАМА
|
|||||||||||||||||
|
БОЛЬШАЯ ЛЕНИНГРАДСКАЯ БИБЛИОТЕКА | ||
© 2010 |