Программирование и комп-ры

Ведение реляционной БД на яз. 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        ,   {|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 <= 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 := {||  "     " + 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


смотреть на рефераты похожие на "Ведение реляционной БД на яз. CLIPPER 5.02"