|
1. Интерфейсные функции
1.1. Функция вывода окна
Параметры: координаты левого верхнего и правого нижнего угла окна, [строка символов обрамления]
FUNCTION _OPEN_T parameters Y1,X1,Y2,X2,SBOX private XT1,XT2,XK2,SBOX SBOX=iif(empty(SBOX).and.SBOX<>space(9),"???????? ",SBOX) XT1=iif(X1+2>79,79,X1+2) XT2=iif(X2+2>79,79,X2+2) XK2=iif(X2+1>79,79,X2+1) @ Y1,X1,Y2,X2 BOX SBOX shadow(Y2+1,XT1,Y2+1,XT2,0) shadow(Y1+1,XK2,Y2+1,XT2,0) return 0
1.2. Функция вывода окна с эффектом раскрытия
Параметры: координаты левого верхнего и правого нижнего угла окна, [строка символов обрамления],[строка установки цвета]
FUNCTION _OPEN_N parameters Y1,X1,Y2,X2,S1,COLOR local CL,XT,YT,XC,YC if pcount()=4 COLOR=setcolor() S1="" elseif pcount()=5 COLOR=setcolor() endif YC=Y1+int((Y2-Y1)/2) XC=X1+int((X2-X1)/2) CL=setcolor() if Y2-Y1 >= 2 YC1=YC YC2=YC XT=XC setcolor(COLOR) do while .T. _open_t(YC1,XT,YC2,2*XC-XT,S1) YC1=iif(YC1-2<Y1,Y1,YC1-2) YC2=iif(YC2+2>Y2,Y2,YC2+2) if XT=X1 exit endif XT=iif(XT-3<X1,X1,XT-3) inkey() enddo if YC1<>Y1 YT=YC1 do while .T. _open_t(YT,X1,2*YC-YT,X2,S1) if YT=Y1 exit endif YT=iif(YT-2<Y1,Y1,YT-2) inkey() enddo endif endif _open_t(Y1,X1,Y2,X2,S1) setcolor(CL) return 0
1.2.1. Функция вывода системных сообщений с ожиданием реакции пользователя
Параметры:
координаты левого верхнего угла окна,
строка сообщения 1, строка сообщения 2, строка сообщения 3,
строка выбора 1, строка выбора 2, строка выбора 3,
строка символов обрамления.
FUNCTION _ERR parameters Y1,X1,S1,S2,S3,M1,M2,M3,SB private CLR,STATS,Y1,X1,S1,S2,S3,M1,M2,M3,SB,STAT,KL1,MM1,MM2 save screen CLR=setcolor() STATS=csetall() if pcount()=8 SB="" endif Y2=Y1+iif(empty(S2),5,iif(empty(S3),6,7)) X2=X1+max(len(S1),max(len(S2),max(len(S3),max(len(M1)+len(M2)+; len(M3)+5,31))))+4 setcolor(At_E_F) _open_n(Y1,X1,Y2,X2,SB) @ Y2-3,X1 SAY "|"+replicate("=",X2-X1-1)+"|" setcolor(At_E_N) @ Y1+1,X1+((X2-X1)-len(alltrim(S1)))/2 SAY alltrim(S1) if .not.empty(S2) @ Y1+2,X1+((X2-X1)-len(alltrim(S2)))/2 SAY alltrim(S2) if .not.empty(S3) @ Y1+3,X1+((X2-X1)-len(alltrim(S3)))/2 SAY alltrim(S3) endif endif if empty(M1) setcolor(At_E_S) @ Y2-2,X1+(X2-X1-31)/2 SAY " Нажмите Enter для продолжения " setcolor("N"+substr(AT_E_F,at("/",AT_E_F))) @ Y2-1,X1+(X2-X1-31)/2+1 SAY "-------------------------------" @ Y2-2,X1+(X2-X1-31)/2+31 SAY "-" L_showcurs() KL1=0 do while .T. KL1=inkey() STAT=L_getmstat() if KL1<>0.or.STAT<>0 exit endif enddo L_hidecurs() restore screen csetall(STATS) setcolor(CLR) return 0 elseif empty(M3).and..not.empty(M2) declare MM1[2],MM2[2] MM1[1]=M1 MM1[2]=M2 XX=X1+int((X2-X1-len(M1+M2)-1)/2) MM2[1]=XX MM2[2]=XX+len(M1)+1 do while .T. MM=1 MM=selopt(MM,MM1,MM2,"",Y2-2,.F.,.F.,At_E_S,At_E_U,At_E_F) if MM<>0 restore screen csetall(STATS) setcolor(CLR) return MM endif enddo elseif .not.empty(M1).and..not.empty(M2).and..not.empty(M3) declare MM1[3],MM2[3] MM1[1]=M1 MM1[2]=M2 MM1[3]=M3 XX=X1+int((X2-X1-len(M1+M2+M3)-2)/2) MM2[1]=XX MM2[2]=XX+len(M1)+1 MM2[3]=XX+len(M1+M2)+2 do while .T. MM=1 MM=selopt(MM,MM1,MM2,"",Y2-2,.F.,.F.,At_E_S,At_E_U,At_E_F) if MM<>0 restore screen csetall(STATS) setcolor(CLR) return MM endif enddo endif csetall(STATS) setcolor(CLR) return 0
1.2.2. Функция вывода линей ного индикатор а процесса
FUNCTION _LIN parameters YCOR,XCOR,LENG,LMAX,LUSE private YCOR,XCOR,LENG,LMAX,LUSE,STATS,RW,CL STATS=csetall() RW=row() CL=col() LMAX=iif(LMAX<=0,1,LMAX) XUSE=int((LENG/LMAX)*LUSE)+XCOR CLR=setcolor(AT_S_U) @ YCOR,XCOR,YCOR,XUSE BOX "---------" setcolor(AT_S_S) if XUSE<LENG @ YCOR,XUSE+1,YCOR,XCOR+LENG BOX "---------" endif csetall(STATS) setcolor(CLR) @ RW,CL SAY "" return 0
1.2.3. Функция вывода рамки для всплывающего меню
FUNCTION POPMENU parameters Y1,X1,Y2,X2,OPT,OFFS,COLORF private Y1,X1,Y2,X2,OPT,OFFS,COLORF,I,CLR L_hidecurs() CLR=setcolor(COLORF) @ Y1,X1 SAY "-"+repl("-",OFFS-1) @ Y1,X1+OFFS+len(OPT) SAY repl("-",X2-X1-OFFS-len(OPT))+"¬" shadow(Y1+1,X2+1,Y1+1,X2+2,SHC) _open_t(Y1+1,X1,Y2,X2,"¦ ¦¦--L¦ ") setcolor(CLR) L_showcurs() return 0
1.2.4. Функция вывода строки подсказки
FUNCTION _NORT static NORTSCR parameters BINSTR,NUM private CL,ROW,COL if pcount()=0 restscreen(24,0,24,79,NORTSCR) else if pcount()=1 NUM=0 endif ROW=row() COL=col() NORTSCR=savescreen(24,0,24,79) CL=setcolor(AT_N_I) @ 24,00 say space(80) for I=0 to 9 setcolor(AT_N_I) @ 24,I*8 say str(I+1,iif(I=9,2,1)) setcolor(AT_N_S) if substr(BINSTR,I+1,1)="1" @ 24,I*8+iif(I=9,2,1) say iif(NUM=0,MHP[I+1],MHPA[I+1]) else @ 24,I*8+iif(I=9,2,1) say " " endif next setcolor(CL) @ ROW,COL say "" endif return 0
1.2.5. Функция вывода транспаранта ожидания
FUNCTION _WAIT static WAITSCR parameters STROKE local CL,ROW,COL,X1,LENM if pcount()=0 restscreen(11,0,15,79,WAITSCR) else ROW=row() COL=col() WAITSCR=savescreen(11,0,15,79) CL=setcolor("+BG/B") if empty(STROKE) _open_n(12,20,14,59) else LENM=max(len(STROKE),31) X1=(74-LENM)/2 _open_n(11,X1,14,X1+6+LENM) setcolor("+BG/B") @ 12,X1+3+iif(LENM=31,(31-len(STROKE))/2,0) say STROKE endif setcolor("+BG/B") @ 13,25 say "Ожидайте окончания операции" setcolor("+BG/B*") @ 13,52 say " ..." endif @ ROW,COL say "" setcolor(CL) return 0
1.2.6. Функция выбора опции из меню с использованием м анипулятора "Мышь" или клавиатуры.
Синтаксис :
selopt(expN,arrC,arrN,arrC,expN,expL,expL,expC,expC ,expL )
Параметры:
1 номер начальной опции меню
2 массив опций
3 массив координат опций (строка/столбец)
4 массив подсказок
5 начальная строка/столбец вывода опций
6 флаг вывода (.T. вертикально,.F. горизонтально)
7 флаг вывода подсказок (.T. выводить в 24 строке)
8 цвет выбранной опции
9 цвет невыбранной опции
10 флаг прорисовк и тени опции (default - none)
Возврат:
Номер выбранной опции либо 0 при прерывании выбора
FUNCTION SELOPT parameters NOPT,MO,MC,ME,COLROW,ORIENT,SAYHELP,CLRS,CLRN,CSD local CL private NOPT, COUN, INDO, INDM, INDN, MO, MC, ME, COLROW, ORIENT, SAYHELP, CLRS, CLRN, STAT, KL, ROWMO, IN if pcount()<10 SHD=.F. else CSD="N"+substr(CSD,at("/",CSD)) SHD=.T. endif keyboard chr(0) COLORN="R"+substr(CLRN,at("/",CLRN)) COLORS="R"+substr(CLRS,at("/",CLRS)) L_showcurs() NOPT=iif(NOPT=0,1,NOPT) && Номер начальной опции меню COUN=len(MO) && Количество опций store NOPT to INDO,INDN,INDM CL=setcolor() for IN=1 to COUN setcolor(CLRN) @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW,MC[IN]) ; SAY strtran(MO[IN],"~","") if (POS:=at("~",MO[IN]))>0 setcolor(COLORN) @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW+POS-1,MC[IN]+POS-1); SAY substr(MO[IN],POS+1,1) setcolor(CL) endif if SHD setcolor (CSD) @ iif(ORIENT,MC[IN]+1,COLROW+1),iif(ORIENT,COLROW+1,MC[IN]+1); SAY repl("-",len(strtran(MO[IN],"~",""))) @ iif(ORIENT,MC[IN],COLROW),iif(ORIENT,COLROW+; len(strtran(MO[IN],"~","")),MC[IN]+; len(strtran(MO[IN],"~",""))) SAY "-" setcolor(CL) endif NEXT COLMO=L_getxposn()/8 ROWMO=L_getyposn()/8 setcolor(CLRS) L_hidecurs() @ iif(ORIENT,MC[NOPT],COLROW),iif(ORIENT,COLROW,MC[NOPT]); SAY strtran(MO[NOPT],"~","") if (POS:=at("~",MO[NOPT]))>0 CL= setcolor(COLORS) @ iif(ORIENT,MC[NOPT],COLROW),iif(ORIENT,COLROW+POS-1,MC[NOPT]+POS-1) ; SAY substr(MO[NOPT],POS+1,1) setcolor(CL) endif if SAYHELP setcolor(At_M0_N) @ 24,(80-len(ME[INDN]))/2 SAY ME[INDN] endif L_showcurs() KEYPRESSED=.F. do while .T. COLMN=L_getxposn()/8 ROWMN=L_getyposn()/8 STAT=L_getmstat() KL=inkey() if KL>0 KEYPRESSED=.T. else KEYPRESSED=.F. endif if KL=13 L_hidecurs() return INDN endif if STAT=2.or.KL=27 if KL<>27 for TT=1 to COUN if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+; len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,; ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+; len(strtran(MO[TT],"~",""))) L_hidecurs() return 0 endif next else L_hidecurs() return 0 endif endif if iif(ORIENT,(COLMN>=COLROW.AND.COLMN<=COLROW + ; len(strtran( MO[INDN],"~","")) .AND. ; ROWMN<>ROWMO).or.KEYPRESSED,(ROWMN=COLROW.AND.; COLMN<>COLMO).or.KEYPRESSED) T1=.F. if ORIENT.and.KL=0 TEST=ascan(MC,ROWMN) if TEST<>0 T1=.T. endif elseif .not.ORIENT.and.KL=0 TEST=INDO for TT=1 to COUN if COLMN>=MC[TT].and.COLMN<=MC[TT]+len(strtran(MO[TT],"~","")) TEST=TT T1=.T. exit endif next elseif KL>0 T1=.T. endif if T1 do case case KL=5.or.KL=19 INDN=iif(INDN=1,COUN,INDN-1) case KL=24.or.KL=4 INDN=iif(INDN=COUN,1,INDN+1) case KL>=32.and.KL<=255 STROKE="~"+chr(KL)+"~" for II=1 to COUN if at(STROKE,MO[II])<>0 INDN=II keyboard chr(13) exit endif next otherwise INDN=TEST endcase setcolor(CLRN) L_hidecurs() @ iif(ORIENT,MC[INDO],COLROW),iif(ORIENT,COLROW,MC[INDO]); SAY strtran(MO[INDO],"~","") if (POS:=at("~",MO[INDO]))>0 CL=setcolor(COLORN) @ iif(ORIENT,MC[INDO],COLROW),iif(ORIENT,COLROW+POS-1,MC[INDO]+; POS-1) SAY substr(MO[INDO],POS+1,1) setcolor(CL) endif if SAYHELP setcolor(At_M0_N) @ 24,(80-len(ME[INDN]))/2 SAY ME[INDN] endif setcolor(CLRS) @ iif(ORIENT,MC[INDN],COLROW),iif(ORIENT,COLROW,MC[INDN]); SAY strtran(MO[INDN],"~","") if (POS:=at("~",MO[INDN]))>0 setcolor(COLORS) @ iif(ORIENT,MC[INDN],COLROW),iif(ORIENT,COLROW+POS-1,MC[INDN]+POS-1) SAY substr(MO[INDN],POS+1,1) endif L_showcurs() INDO=INDN ROWMO=ROWMN COLMO=COLMN if STAT=0 loop endif endif elseif COLMN>=COLROW do case case STAT=1 for TT=1 to COUN if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+; len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,; ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+; len(strtran(MO[TT],"~",""))) L_hidecurs() return INDN endif next case STAT=2 for TT=1 to COUN if iif(ORIENT,COLMN>=COLROW.and.COLMN<=COLROW+; len(strtran(MO[TT],"~","")).and.ascan(MC,ROWMN)<>0,; ROWMN=COLROW.and.COLMN>=MC[TT].and.COLMN<=MC[TT]+; len(strtran(MO[TT],"~",""))) L_hidecurs() return 0 endif next endcase endif enddo return 0
1.3. Вспомогательные функции
1.3.1. Функция переключения вида курсора
FUNCTION FINS FINSERT=.not.FINSERT readinsert(FINSERT) if setcursor()<>0 CUR_STYLE=iif(FINSERT,2,1) setcursor(CUR_STYLE) endif clear type return 0
1.3.2. Функция перевод а строки в верхний регистр
FUNCTION UpperR(String) local SRC:={"а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ь","ы","ъ","э","ю","я"," "},; DST:={"А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ь","Ы","Ъ","Э","Ю","Я"," "},; STR:="",KEY:="",INDEXKEY,I for I=1 to len(STRING) KEY=substr(STRING,I,1) if (INDEXKEY:=ascan(SRC,KEY))<>0 STR=STR+DST[INDEXKEY] else STR=STR+KEY endif next return STR
1.3.3. Функция контроля выхода
FUNCTION DOORS private CLR,ME CLR=setcolor() clear type ME=1 ME=_err(07,02,"Вы желаете завершить работу ?","","",; " ~Y~es "," ~N~o ","") if ME=1.or.ME=-1 close databases set color to clear set printer to setcursor(1) showtime() keyboard chr(0) L_showcurs() return .T. else setcolor(CLR) return .F. endif return .T.
1.3.4. Функция перевода числовой величины в строку «Сумма прописью»
Function NUMSTRING parameters NUM1,CODE_CUR local MR:={.T.,.T.,.F.,.T.},CL,; MG:={{"" ,"" ,"" ,"" },; {"миллиард" ,"миллион" ,"тысяча","" },; {"миллиарда" ,"миллиона" ,"тысячи","" },; {"миллиардов","миллионов","тысяч" ,"" }},; SO:=0,DE:=0,ED:=0,TX,NUM,OBL OBL=select() if pcount()<2 CODE_CUR=0 endif use (DATROAD+"Currency") index (DATROAD+"Currency") alias CUR new seek CODE_CUR if found() /*MG[1,4]=alltrim(LONG_NAME0) MG[2,4]=alltrim(LONG_NAME0) MG[3,4]=alltrim(LONG_NAME1) MG[4,4]=alltrim(LONG_NAME2)*/ /*if upperR(substr(trim(LONG_NAME0),len(trim(LONG_NAME0)),1))="А"*/ MR:={.T.,.T.,.F.,.T.} /*endif*/ endif Man_Woman=.F. STROK="" GSTROK="" for I=12 to 3 step -3 NUM=val(substr(str(NUM1,12),I-2,3)) Man_Woman=MR[I/3] SO=int(NUM/100) DE=int((NUM-SO*100)/10) ED=NUM-SO*100-DE*10 TX=4 do case case ED=1 TX=2 case ED>1.and.ED<=4 TX=3 otherwise TX=4 endcase if (DE*10+ED>4.and.DE*10+ED<21) TX=4 endif TITLE=GetShort_Name(CODE_CUR) SUBTITLE=MG[TX,I/3] STROK=num2str(NUM,Man_Woman,SO,DE,ED) GSTROK=iif(!empty(STROK).or.I=12,STROK+" "+SUBTITLE,"")+; " "+GSTROK next GSTROK=alltrim(strtran(GSTROK," "," ")) GSTROK=upperR(substr(GSTROK,1,1))+substr(GSTROK,2) use select(OBL) return GSTROK+" "+TITLE
1.3.5. Функция построения строки «Суммы прописью»
Function NUM2STR PARAMETERS in_num,Man_Woman,SO,DE,ED local UNITS[37] UNITS[ 1] = "" UNITS[ 2] = iif(Man_Woman,"один","одна") UNITS[ 3] = iif(Man_Woman,"два","две") UNITS[ 4] = "три" UNITS[ 5] = "четыре" UNITS[ 6] = "пять" UNITS[ 7] = "шесть" UNITS[ 8] = "семь" UNITS[ 9] = "восемь" UNITS[10] = "девять" UNITS[11] = "десять" UNITS[12] = "одиннадцать" UNITS[13] = "двенадцать" UNITS[14] = "тринадцать" UNITS[15] = "четырнадцать" UNITS[16] = "пятнадцать" UNITS[17] = "шестнадцать" UNITS[18] = "семнадцать" UNITS[19] = "восемнадцать" UNITS[20] = "девятнадцать" UNITS[21] = "двадцать" UNITS[22] = "тридцать" UNITS[23] = "сорок" UNITS[24] = "пятьдесят" UNITS[25] = "шестьдесят" UNITS[26] = "семьдесят" UNITS[27] = "восемьдесят" UNITS[28] = "девяносто" UNITS[29] = "сто" UNITS[30] = "двести" UNITS[31] = "триста" UNITS[32] = "четыреста" UNITS[33] = "пятьсот" UNITS[34] = "шестьсот" UNITS[35] = "семьсот" UNITS[36] = "восемьсот" UNITS[37] = "девятьсот" STRING = "" IN_NUM = int(IN_NUM) SOT=int(In_NUM/100) DES=int((In_NUM-SOT*100)/10) EDN=In_NUM-SOT*100-DES*10 IN_STRING = ltrim(str(IN_NUM)) SCAN_ED=.T. if SOT>0 STRING=STRING+UNITS[SOT+28]+" " endif if DES>1 STRING=STRING+UNITS[DES+19]+" " elseif DES=1 STRING=STRING+UNITS[DES*10+EDN+1]+" " SCAN_ED=.F. endif if SCAN_ED STRING=STRING+UNITS[EDN+1] endif return STRING
1.3.6. Функция получения псевдонима валюты
Function GetShort_Name(CODE) local OBL,MR,ST:=" " OBL=select() select CUR MR=recno() seek CODE if found() ST=SHORT_NAME endif goto MR select(OBL) return ST
1.4. Основные функции и процедуры
1.4.1. Головной модуль программы
FUNCTION MAIN #Include "Box.ch" setcursor(0) if .not.file("V.mem").or..not.file("C.mem") set curs on return 0 // Аварийный выход при отсутствии файлов глобальных переменных else // Объявление глобальных переменных и считывание их из файла public AT_M0_F,AT_M0_N,AT_M0_S,AT_M0_U,AT_M1_F,AT_M1_N,AT_M1_S public AT_M1_U,AT_M2_F,AT_M2_N,AT_M2_S,AT_M2_U,AT_E_F,AT_E_N,AT_E_S public AT_E_U,AT_G_F,AT_G_N,AT_G_S,AT_G_U,AT_S_F,AT_S_N,AT_S_S,AT_S_U public AT_N_I,AT_N_S CLFON="N" clear restore from c.mem addi endif // Глобальные установки setcursor(0) set date german set century on set wrap on set dele off set bell off set confirm on set scoreboard off set message to 24 center restore from v.mem addi public PAROL,DATROAD,USERDSK,PAGELEN,ETLF,UKZGL,UKTXT,ARCROAD public ZEROPRINT,FPREOBR,PAGESIZ,DUBLDSK,KEYCR,C_H public FM,FINSERT,CUR_STYLE,M__EN,MDATE,SETNUM restore from D addi store 0 to CROW,CCOL KEYCR="#4_Ж;V*" PAROL = uncrpt(KEYCR,P__AROL) DATROAD = D__ATROAD ARCROAD = A__RCROAD DUBLDSK = D__UBLDSK USERDSK = U__SERDSK PAGELEN = P__AGELEN PAGESIZ = P__AGESIZ ETLF = E__TLF UKZGL = U__KZGL UKTXT = U__KTXT SETNUM = S__ETNUM FPREOBR = .F. release P__AROL,D__ATROAD,U__SERDSK,S__ETNUM,; P__AGELEN,P__AGESIZ,E__TLF,U__KZGL,U__KTXT,D__UBLDSK,A__RCROAD MEN=1 MEN1=1 FINSERT=.F. CUR_STYLE=1 set key 22 to fins() declare MMS[ 6],MOP[ 6],MCO[ 6],MNT[12],MHP[10] // Массив этикеток строки подсказки MHP[ 1]="Помощь" MHP[ 2]="Добав." MHP[ 3]="Список" MHP[ 4]="Поиск " MHP[ 5]="Фильтр" MHP[ 6]="Сумма " MHP[ 7]="Печать" MHP[ 8]="Удал. " MHP[ 9]="Запись" MHP[10]="Выход " // Массив опций главного меню системы MOP[ 1]=" ~О~перации " MOP[ 2]=" ~С~правочники " MOP[ 3]=" о~Т~четы " MOP[ 4]=" ~А~рхив " MOP[ 5]=" ~Р~азное " MOP[ 6]=" ~В~ыход " // Массив координат главного меню системы MCO[ 1]=2 MCO[ 2]=12 MCO[ 3]=25 MCO[ 4]=33 MCO[ 5]=40 MCO[ 6]=48 // Массив строк помощи MMS[ 1]="Оформление покупки/продажи валюты" MMS[ 2]=" Ввод справочных данных " MMS[ 3]=" Вывод отчетов " MMS[ 4]=" Работа с архивом " MMS[ 5]=" Настройки системы " MMS[ 6]=" Выход в MS DOS " // Массив названий месяцев MNT[ 1]="Января" MNT[ 2]="Февраля" MNT[ 3]="Марта" MNT[ 4]="Апреля" MNT[ 5]="Мая" MNT[ 6]="Июня" MNT[ 7]="Июля" MNT[ 8]="Августа" MNT[ 9]="Сентября" MNT[10]="Октября" MNT[11]="Ноября" MNT[12]="Декабря" setcolor(At_M0_F) @ 00,00,24,79 BOX " - --" setcolor(At_M0_N) @ 00,01 SAY "Обменный пункт банка" // Проверка пароля пользователя (3 попытки) for II=1 to 3 setcursor(CUR_STYLE) setcolor(AT_E_F) _open_n(07,22,11,57) setcolor(AT_E_N) _saystr(09,24,"Введите Ваш пароль :") KL=0 TST="" do while .T. KL=inkey(0) do case case KL=8 TST=substr(TST,1,len(TST)-1) case KL=13 exit otherwise TST=TST+chr(KL) endcase @ 09,45 SAY repl(" ",len(TST)+1) @ 09,45 SAY repl(" »,len(TST)) if len(TST)=10 exit endif enddo if TST=PAROL @ 09,24 SAY «OK « exit else @ 09,24 SAY «Пароль неправильный « tone(1500,2) tone(1700,2) endif next if TST<>PAROL setcolor("W/N") clear screen return endif restore screen // Настройка принтера if M__EN=2 set printer to BUFFER.PRN else M__EN=1 set printer to endif setcursor(0) FM=.F. setcolor(At_M0_F) @ 00,01 SAY space(80) do while .T. // Главное меню системы if FM setcolor(At_M0_F) @ 00,00,24,79 BOX " - --" @ 00,01 SAY space(80) FM=.F. endif setcolor("+W/B,+GR/R,,,+BG/B") MEN=selopt(MEN,MOP,MCO,MMS,0,.F.,.T.,At_M0_S,At_M0_U) if lastkey()=27.or.MEN=0 if doors() exit else loop endif endif MSCR=savescreen(0,0,24,79) do case case MEN=1 operation() case MEN=2 dictonary() case MEN=3 report() case MEN=4 arch() case MEN=5 system() case MEN=6 if doors() exit endif endcase restscreen(0,0,24,79,MSCR) enddo setcolor() release all return 0
1.4.2. Функция вызова меню «Операции»
FUNCTION OPERATION local M1[5],M2[5],M3[5],MENU M1[1]=" ~П~окупка валюты " M1[2]=" п~Р~одажа валюты " M1[3]=" ~К~онверсия валюты " M2[1]=2 M2[2]=3 M2[3]=4 MENU=1 _open_n(1,0,7,23,B_SINGLE+" ",AT_M1_F) do while .T. MENU=selopt(MENU,M1,M2,M3,2,.T.,.F.,AT_M1_S,AT_M1_U) if MENU=0.or.lastkey()=27 clear type exit endif operCurrency(MENU) enddo return 0
1.4.3. Функция вызова меню ведения справочников
FUNCTION DICTONARY local M1[4],M2[4],M3[4],MENU,CL M1[1]=" ~С~писок валют " M1[2]=" ~К~урсоы валют " M1[3]=" коды ~Ц~енностей " M1[4]=" Коды ~Д~окументов " M2[1]=2 M2[2]=3 M2[3]=4 M2[4]=5 MENU=1 _open_n(1,10,6,32,B_SINGLE+" ",AT_M1_F) do while .T. MENU=selopt(MENU,M1,M2,M3,12,.T.,.F.,AT_M1_S,AT_M1_U) if MENU=0.or.lastkey()=27 clear type exit endif dictonEdit(MENU) enddo clear type return 0
1.4.4. Функция вызова меню «Отчеты»
FUNCTION REPORT local M1[4],M2[4],M3[4],MENU,CL M1[1]=" Реестр по по~К~упке валюты " M1[2]=" Реестр по ~П~родаже валюты " M1[3]=" Реестр по ~К~онверсии валюты " M1[4]=" справка об ~О~статках наличной валюты " M2[1]=2 M2[2]=3 M2[3]=4 M2[4]=5 MENU=1 _open_n(1,23,7,64,B_SINGLE+" ",AT_M1_F) do while .T. MENU=selopt(MENU,M1,M2,M3,25,.T.,.F.,AT_M1_S,AT_M1_U) if MENU=0.or.lastkey()=27 clear type exit endif reportOut(MENU) enddo clear type return 0
1.4.5. Функция вызова меню «Разное»
FUNCTION SYSTEM private M1,M2,M3,MENU declare M1[4],M2[4],M3[4] M1[1]=" ~У~становки " M1[2]=" ~К~опия данных " M1[3]=" ~И~ндексные файлы " M1[4]=" ~С~чета банка " M2[1]=2 M2[2]=3 M2[3]=4 M2[4]=5 MENU=1 SCRS=savescreen(0,0,24,79) _open_n(1,38,6,58,B_SINGLE+" ",AT_M1_F) do while .T. MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M1_S,AT_M1_U) if MENU=0.or.lastkey()=27 clear type exit endif do case case MENU=1 setupm(M1[MENU]) case MENU=2 dublicat(M1[MENU]) case MENU=3 case MENU=4 GetAccount() endcase enddo restscreen(0,0,24,79,SCRS) clear type return 0
1.4.6. Функция вызова меню «Установки»
FUNCTION SETUPM parameters OPT private SCR,M1[4],M2[4],M3[4],MENU,OPT,A__RCROAD,P__AROL,D__ATROAD,D__UBLDSK,U__SERDSK,P__AGELEN,P__AGESIZ,E__TLF,U__KZGL,U__KTXT,S__ETNUM,FMOD ROW=row() M1[1]=" ~П~ароль " M1[2]=" пути к ~Д~анным " M1[3]=" ~У~становки принтера " M1[4]=" ~Ц~вета " M2[1]=ROW+2 M2[2]=ROW+3 M2[3]=ROW+4 M2[4]=ROW+5 MENU=1 FMOD=0 SCR=savescreen(0,0,24,79) do while .T. _open_n(ROW+1,38,ROW+6,61,B_SINGLE+" ",AT_M2_F) MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M2_S,AT_M2_U) if MENU=0.or.lastkey()=27 clear type exit endif if MENU=4 FM=.T. endif save screen to SESCR FMOD=setup(MENU) restore screen from SESCR enddo restscreen(0,0,24,79,SCR) if FMOD=1 P__AROL = crpt(KEYCR,trim(P__AROL)) D__ATROAD = trim(D__ATROAD) A__RCROAD = trim(A__RCROAD) U__KZGL = trim(U__KZGL) U__KTXT = trim(U__KTXT) if M__EN=2 set Printer to BUFFER.PRN else M__EN=1 set Printer to endif if Z__PR=2 ZEROPRINT=.F. else Z__PR=1 ZEROPRINT=.T. endif save all like ?__* to v PAROL =uncrpt(KEYCR,P__AROL) DATROAD =D__ATROAD ARCROAD =A__RCROAD DUBLDSK =D__UBLDSK USERDSK =U__SERDSK PAGELEN =P__AGELEN PAGESIZ =P__AGESIZ ETLF =E__TLF UKZGL =U__KZGL SETNUM =S__ETNUM UKTXT =U__KTXT endif clear type return 0
1.4.7. Функция вызова меню «Копия данных»
FUNCTION DUBLICAT parameters OPT private M1,M2,M3,MENU,OPT,DSCR,ROW ROW=row() declare M1[2],M2[2],M3[2] M1[1]=" ~С~охранение данных " M1[2]=" ~В~осстановление данных " M2[1]=ROW+2 M2[2]=ROW+3 MENU=1 popmenu(ROW,38,ROW+5,64,OPT,2,AT_M2_F) do while .T. MENU=selopt(MENU,M1,M2,M3,40,.T.,.F.,AT_M2_S,AT_M2_U) if MENU=0.or.lastkey()=27 clear type exit endif save screen to DSCR do case case MENU=1 OPT=M1[MENU] savedata(OPT) case MENU=2 OPT=M1[MENU] restdata(OPT) endcase restore screen from DSCR enddo clear type return 0
1.4.8. Функция - селектор операций
Function OPERCURRENCY #Include "Inkey.ch" #Include "Box.ch" parameters N_OPER do case case N_OPER=1 ByeCurrency() case N_OPER=2 SaleCurrency() case N_OPER=3 ConvertCurrency() endcase return 0
1.4.9. Функция регистрации покупки валюты
Function ByeCurrency local SCR use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new SCR=savescreen(1,0,23,61) CLR=setcolor(AT_G_F) _open_n(1,0,20,59,B_SINGLE+" ",AT_G_F) @ 08,0 say "+----------------------------------------------------------+" @ 14,0 say "+----------------------------------------------------------+" setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) set key K_F3 to getcode() _nort("1010000001") FINIT=.T. do while .T. if FINIT SER =space(2) NUM =0 FIO =space(35) DOC =space(10) CDOC =0 DSER =space(10) DNUM =0 REZ =space(1) NREZ =space(1) BCODC =10 BCODCUR=2 BSUM =0 SCODC =0 SCODCUR=0 SSUM =0 SSUMS="" BSUMS="" @ 12,2 say space(57) @ 13,2 say space(57) @ 18,2 say space(57) @ 19,2 say space(57) setcolor(AT_G_U) @ 11,8 say 0 picture "999999999999" endif setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER) @ 02,28 say "?" get NUM picture "9999999" valid !empty(NUM) @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+; " "+str(year(date()),4) @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO) @ 05,02 say "Предъявлен" get CDOC picture "9999" @ 05,29 say "серия" get DSER picture "XXXXXXXXXX" @ 05,46 say "?" get DNUM picture "9999999999" @ 06,02 say "Резидент [ ]" @ 06,12 get REZ Picture "L" @ 08,02 say "ПОЛУЧЕНО КЛИЕНТОМ:" @ 09,02 say "Код ценности" get BCODC picture "9999" @ 10,02 say "Код валюты " get BCODCUR picture "9999" @ 11,02 say "Сумма" @ 14,02 say "ПРИНЯТО ОТ КЛИЕНТА:" @ 15,02 say "Код ценности" get SCODC picture "9999" @ 16,02 say "Код валюты " get SCODCUR picture "9999" @ 17,02 say "Сумма" get SSUM picture "999999999999" ; valid saysale(SSUM,18,2,52,AT_G_U,@SSUMS,SCODCUR) setcursor(CUR_STYLE) read setcursor(0) if lastkey()=K_ESC exit endif if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1 append blank replace field->SER_ with SER ,; field->NUM_ with NUM ,; field->FIO_ with FIO ,; field->DOC_ with DOC ,; field->DSER_ with DSER ,; field->DNUM_ with DNUM ,; field->REZ_ with !empty(REZ),; field->BCODC_ with BCODC ,; field->BCODCUR_ with BCODCUR,; field->BSUM_ with BSUM ,; field->SCODC_ with SCODC ,; field->SCODCUR_ with SCODCUR,; field->SSUM_ with SSUM,; field->DATE_ with date(),; field->OPERATION_ with 1 commit if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1 // printspr() endif FINIT=.T. loop else FINIT=.F. endif enddo _nort() set key K_F3 to restscreen(1,0,23,61,SCR) dbcloseall() return 0
1.4.10. Функция регистрации продажи валюты
Function SaleCurrency local SCR use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new SCR=savescreen(1,0,23,61) CLR=setcolor(AT_G_F) _open_n(1,0,20,59,B_SINGLE+" ",AT_G_F) @ 08,0 say "+----------------------------------------------------------+" @ 14,0 say "+----------------------------------------------------------+" setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) set key K_F3 to getcode() _nort("1010000001") FINIT=.T. do while .T. if FINIT SER =space(2) NUM =0 FIO =space(35) DOC =space(10) DSER =space(10) DNUM =0 REZ =space(1) NREZ =space(1) CDOC =0 BCODC =0 BCODCUR=0 BSUM =0 SCODC =0 SCODCUR=0 SSUM =0 SSUMS="" BSUMS="" @ 12,2 say space(57) @ 13,2 say space(57) @ 18,2 say space(57) @ 19,2 say space(57) setcolor(AT_G_U) @ 11,8 say 0 picture "999999999999" endif setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER) @ 02,28 say "?" get NUM picture "9999999" valid !empty(NUM) @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+" "+str(year(date()),4) @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO) @ 05,02 say "Предъявлен" get CDOC picture "9999" @ 05,29 say "серия" get DSER picture "XXXXXXXXXX" @ 05,46 say "?" get DNUM picture "9999999999" @ 06,02 say "Резидент [ ]" @ 06,12 get REZ Picture "L" @ 08,02 say "ПРИНЯТО ОТ КЛИЕНТА:" @ 09,02 say "Код ценности" get SCODC picture "9999" @ 10,02 say "Код валюты " get SCODCUR picture "9999" @ 11,02 say "Сумма" @ 14,02 say "ПОЛУЧЕНО КЛИЕНТОМ:" @ 15,02 say "Код ценности" get BCODC picture "9999" @ 16,02 say "Код валюты " get BCODCUR picture "9999" @ 17,02 say "Сумма" get BSUM picture "999999999999" valid saybye(BSUM,17,2,52,AT_G_U,@BSUMS,BCODCUR) setcursor(CUR_STYLE) read setcursor(0) if lastkey()=K_ESC exit endif if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1 append blank replace field->SER_ with SER ,; field->NUM_ with NUM ,; field->FIO_ with FIO ,; field->DOC_ with DOC ,; field->DSER_ with DSER ,; field->DNUM_ with DNUM ,; field->REZ_ with !empty(REZ),; field->BCODC_ with BCODC ,; field->BCODCUR_ with BCODCUR,; field->BSUM_ with BSUM ,; field->SCODC_ with SCODC ,; field->SCODCUR_ with SCODCUR,; field->SSUM_ with SSUM,; field->DATE_ with date(),; field->OPERATION_ with 1 commit if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1 // printspr() endif FINIT=.T. loop else FINIT=.F. endif enddo _nort() set key K_F3 to restscreen(1,0,23,56,SCR) dbcloseall() return 0
1.4.11. Функция регистрации конверсии валюты
Function ConvertCurrency local SCR use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new SCR=savescreen(1,0,23,61) CLR=setcolor(AT_G_F) _open_n(1,0,20,59,B_SINGLE+" ",AT_G_F) @ 08,0 say "+----------------------------------------------------------+" @ 14,0 say "+----------------------------------------------------------+" setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) set key K_F3 to getcode() _nort("1010000001") FINIT=.T. do while .T. if FINIT SER =space(2) NUM =0 FIO =space(35) DOC =space(10) DSER =space(10) DNUM =0 REZ =space(1) NREZ =space(1) CDOC =0 BCODC =0 BCODCUR=0 BSUM =0 SCODC =0 SCODCUR=0 SSUM =0 SSUMS="" BSUMS="" @ 12,2 say space(57) @ 13,2 say space(57) @ 18,2 say space(57) @ 19,2 say space(57) setcolor(AT_G_U) @ 11,8 say 0 picture "999999999999" endif setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) @ 02,17 say "СПРАВКА" get SER picture "XX" valid !empty(SER) @ 02,28 say "?" get NUM picture "9999999" valid !empty(NUM) @ 03,15 say str(day(date()),2)+" "+MNT[month(date())]+" "+str(year(date()),4) @ 04,02 say "Выдана" get FIO picture "@S30" valid !empty(FIO) @ 05,02 say "Предъявлен" get CDOC picture "9999" @ 05,29 say "серия" get DSER picture "XXXXXXXXXX" @ 05,46 say "?" get DNUM picture "9999999999" @ 06,02 say "Резидент [ ]" @ 06,12 get REZ Picture "L" @ 08,02 say "ПРИНЯТО ОТ КЛИЕНТА:" @ 09,02 say "Код ценности" get SCODC picture "9999" @ 10,02 say "Код валюты " get SCODCUR picture "9999" @ 11,02 say "Сумма" @ 14,02 say "ПОЛУЧЕНО КЛИЕНТОМ:" @ 15,02 say "Код ценности" get BCODC picture "9999" @ 16,02 say "Код валюты " get BCODCUR picture "9999" @ 17,02 say "Сумма" get BSUM picture "999999999999" valid saybye(BSUM,17,2,52,AT_G_U,@BSUMS,BCODCUR) setcursor(CUR_STYLE) read setcursor(0) if lastkey()=K_ESC exit endif if _err(06,40,"Данные введены правильно?","",""," ~Д~а "," ~Н~ет ","")=1 append blank replace field->SER_ with SER ,; field->NUM_ with NUM ,; field->FIO_ with FIO ,; field->DOC_ with DOC ,; field->DSER_ with DSER ,; field->DNUM_ with DNUM ,; field->REZ_ with !empty(REZ),; field->BCODC_ with BCODC ,; field->BCODCUR_ with BCODCUR,; field->BSUM_ with BSUM ,; field->SCODC_ with SCODC ,; field->SCODCUR_ with SCODCUR,; field->SSUM_ with SSUM,; field->DATE_ with date(),; field->OPERATION_ with 1 commit if _err(06,40,"Печатать справку?","",""," ~Д~а "," ~Н~ет ","")=1 // printspr() endif FINIT=.T. loop else FINIT=.F. endif enddo _nort() set key K_F3 to restscreen(1,0,23,56,SCR) dbcloseall() return 0
1.4.12. Функция - определитель текущего поля для получения кода и наименования объекта из справочника
Function GETCODE local CL AKTIV=getactive() RS=row() CS=col()+5 do case case AKTIV:name="BCODCUR" S=incod(1,@BCODCUR) case AKTIV:name="BCODC" S=incod(3,@BCODC) case AKTIV:name="SCODCUR" S=incod(1,@SCODCUR) case AKTIV:name="SCODC" S=incod(3,@SCODC) case AKTIV:name="CDOC" S=incod(4,@CDOC) otherwise S="" endcase CL=setcolor(AT_G_N) @ RS,CS say substr(S,1,30) if !empty(S) keyboard chr(13) endif setcolor(CL) return .T.
1.4.13. Функция вывода суммы покупки прописью
Function SAYB parameters NUM,Y,X,L,C,S,CC local CL S=numstring(NUM,CC) CL=setcolor(C) @ Y,X say padr(substr(S,1,L),L) @ Y+1,2 say padr(substr(S,L+1,57),57) setcolor(AT_G_U) @ Y-1,8 say NUM picture "999999999999" setcolor(CL) return .T.
1.4.14. Функция вывода суммы продажи прописью
Function SAYS parameters NUM,Y,X,L,C,S,CC local CL S=numstring(NUM,CC) CL=setcolor(C) @ Y,X say padr(substr(S,1,L),L) @ Y+1,2 say padr(substr(S,L+1,57),57) setcolor(AT_G_U) @ Y-1,8 say NUM picture "999999999999" setcolor(CL) return .T.
1.4.15. Функция вычисления суммы операции покупки
Function SAYBYE parameters NUM,Y,X,L,C,S,CC local CL,OBL,RESULT RESULT=.F. OBl=select() use (DATROAD+"currency") index (DATROAD+"currency") new seek CC if found() BSUM=KURS*NUM use S=numstring(NUM,CC) CL=setcolor(C) @ Y,X say padr(substr(S,1,L),L) @ Y+1,2 say padr(substr(S,L+1,57),57) says(SSUM,12,2,57,AT_G_U,@SSUMS,SCODCUR) RESULT=.T. else use endif setcolor(CL) select(OBL) return RESULT
1.4.16. Функция вычисления суммы операции продажи
Function SAYSALE parameters NUM,Y,X,L,C,S,CC local CL,OBL,RESULT RESULT=.F. OBl=select() use (DATROAD+"currency") index (DATROAD+"currency") new seek CC if found() BSUM=KURS*NUM use S=numstring(NUM,CC) CL=setcolor(C) @ Y,X say padr(substr(S,1,L),L) @ Y+1,2 say padr(substr(S,L+1,57),57) sayb(BSUM,12,2,57,AT_G_U,@BSUMS,BCODCUR) RESULT=.T. else use endif setcolor(CL) select(OBL) return RESULT
1.4.17. ФУНКЦИЯ ВЫВОДА списка документов дня
Function Docrep local SCR use (DATROAD+"Currency") index (DATROAD+"Currency") alias CUR new use (DATROAD+"Document") index (DATROAD+"Document") alias DOC new set relation to BCODCUR_ into CUR SCR=savescreen(1,0,23,79) _open_n(1,0,22,77,B_SINGLE+" ",AT_S_F) _nort("1000001001") declare MF[5],MZ[5] MF[1]={|| SER_+str(NUM_,9)} MF[2]={|| FIO_ } MF[3]={|| iif(REZ_,"Р","Н")} MF[4]={|| CUR->SHORT_NAME+" "+str(BSUM_)} MF[5]={|| getShort_Name(SCODCUR_)+" "+str(SSUM_)} MZ[1]="Справка" MZ[2]="Фамилия Имя Отчество" MZ[3]="Р/Н" MZ[4]="Выдано" MZ[5]="Принято" TERM=" Проведенные документы дня " setcolor(AT_M1_S) @ 01,(70-len(TERM))/2 SAY TERM setcolor(AT_S_N+","+AT_S_S+",,,"+AT_S_U) clear type oBrow := TBrowseDB(2,1,21,76) oBrow:headSep := "=T=" oBrow:colSep := " ¦ " for i := 1 TO len(MF) oBrow:addColumn(TBColumnNew(MZ[i], MF[i])) next while (!oBrow:stabilize()) ; end lKeyWaiting := .F. lBrowse := .T. do while (lBrowse) if (!lKeyWaiting) do while (!oBrow:stabilize()) // Прервать стабилизацию, если нажата клавиша if ((nKey := Inkey()) != 0) lKeyWaiting := .T. exit endif enddo endif // Если нет нажатия, то ждать его if (!lKeyWaiting) nKey := Inkey(0) endif do case case (nKey == K_DOWN) oBrow:down() case (nKey == K_UP) oBrow:up() case (nKey == K_PGDN) oBrow:pageDown() case (nKey == K_PGUP) oBrow:pageUp() case (nKey == K_CTRL_PGUP) oBrow:goTop() case (nKey == K_CTRL_PGDN) oBrow:goBottom() case (nKey == K_RIGHT) oBrow:right() case (nKey == K_LEFT) oBrow:left() case (nKey == K_HOME) oBrow:home() case (nKey == K_END) oBrow:end() case (nKey == K_CTRL_LEFT) oBrow:panLeft() case (nKey == K_CTRL_RIGHT) oBrow:panRight() case (nKey == K_CTRL_HOME) oBrow:panHome() case (nKey == K_CTRL_END) oBrow:panEnd() case (nKey == K_F7) // printspr() case (nKey == K_ESC).or.(nKey == K_F10) lBrowse := .F. endcase lKeyWaiting := .F. enddo restscreen(1,0,23,79,SCR) dbcloseall() _nort() return 0
1.5. ФУНКЦИЯ ЗАКРЫТИЯ ОПЕРАЦИОННОГО ДНЯ
Function CloseDay() if _err(07,05,"Вы действительно желаете закрыть","операционный день ?",""," Да "," Нет ","")<>1 return 0 endif ArBase=strtran(str(day(MDATE),2)+str(month(MDATE),2)+substr(str(year(MDATE),4),3,2)," ","0") use (DATROAD+"Operatio") copy to (ARCROAD+"Op"+ArBase) delete all pack use (DATROAD+"Document") copy to (ARCROAD+"Do"+ArBase) delete all pack use (DATROAD+"Currency") copy to (ARCROAD+"Cu"+ArBase) use (DATROAD+"Kurses") copy to (ARCROAD+"Ku"+ArBase) use (DATROAD+"Codes") copy to (ARCROAD+"Co"+ArBase) ODATE=MDATE SCR=savescreen(07,05,12,47) _open_n(07,05,10,45,B_SINGLE+" ",AT_G_F) CL=setcolor(AT_G_U) @ 08,22 say ODATE do while(.T.) setcolor(AT_G_N+","+AT_G_S+",,,"+AT_G_U) @ 08,07 say "Текущая дата :" @ 09,07 say " Новая дата :" get MDATE setcursor(CUR_STYLE) read setcursor(0) if _err(10,15,"Дата введена правильно?","",""," Да "," Нет ","")=1 save all like MDATE to d exit endif enddo dbcloseall() restscreen(07,05,12,47,SCR) setcolor(CL) return 0