Реализация алгоритма обработки данных

Разработка программного обеспечения, ведение базы данных и получение ведомости с частичными суммами.

Реализация алгоритма обработки данныхи ведения реляционной базы данных.

Анализ обработки БД для ее получения :

А) По какому файлу проводится главный цикл обработки?

Главный цикл обработки в подпрограмме 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”.

Принципы подготовки данных для тестового примера и заполнения исходных данных.

Эти данные были выбраны произвольно – “из головы”:

1) Идентификатор типа станка

2) Инвентарный номер станка

3) Вид профилактики

4) Наименование типа станка

Идентификатор записи в файле bb. dbf заполнялся по убыванию (от 1 до 18), где 1- первая запись, а 18- последняя.

Норма кол-ва дней между профилактиками была выбрана произвольна.

Дата профилактики выбиралась так, чтобы норма кол-ва дней между профилактиками была превышена для всех видов профилактик.

Б) Пункты меню, что в них делается?

Меню № 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.

Ведение БД.

Какими табл. представлено ведение БД, по какой табл. указывается текущая рабочая область, ее слуги, колонки таблицы, набор клавиш на которые предусмотрена реакция системы.

Клавиши на которые реагирует система:

­/ ¯ / ® / /; PgUp / PgDn; Home / End – Перемещение курсора

Enter – Выбор задачи в меню и редактирование полей в редакторе

Esc – Возврат на шаг назад. Отмена редактирования (без сохранения изменненого значения)

F8 – Удалить строку

F3 – Вставить строку

F10 – Выход из задачи с сохранением всей информации или выход без сохранения информации

Структура программы :

А) Содержимое 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


1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...
Реализация алгоритма обработки данных