Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Частное образовательное учреждение.docx
Скачиваний:
6
Добавлен:
01.05.2025
Размер:
1.48 Mб
Скачать

Практическая часть Описание работы.

На данный момент в каждом банке или же филиале банка есть так называемый операционный зал – это помещение в банке, где осуществляются клиентские операции в течение банковского дня. На каждого бухгалтера в таком операционном зале есть определенная группа организаций которые они обслуживают. И естественно есть единая программа по обработки таких операций. В нашем банке данная программа написана на Oracle, что позволяет гибкое обслуживание данной программы, т.к. есть детальная раздача прав, вплоть до ограничения определённого пути, и сама структура Oracle хорошо подходит для банковских операций.

Принцип в программе следующий: Клиент оплатив платежное поручение через систему СДБО (система дистанционного банковского обслуживания) подписав платежное поручение своей подписью СКЗИ (средства криптографической защиты информации), отправляет платеж в банк, в банке же он изначального с почтового сервера падает в СУБД Oracle, где его обрабатывает демон (функция автоматической обработки), демон проверяет платеж на наличие ошибок, такие как корректно указанный счет, бик банка, ИНН, КПП и естественно подпись клиента, если на данном этапе возникли ошибки то платеж автоматически уходит отправителю, с причиной отказа, если же демон ошибок не заметил, то платеж попадает дальше в иерархическую структуру СУБД, на этом этапе платеж присваивается к определенному бухгалтеру, иными словами исполнителю, т.е. программно за ранее распределен каждый клиент по группам. Бухгалтер увидев платеж принимает меры, в зависимости он суммы платежа, оплатив и подтвердив что оплата платежа прошла СУБД так же отправляет отчет на клиент сервер СДБО об отчете проплаченной операции, после чего так же формируеться выписка по данному счету и так же отправляется через клиент сервер на СДБО клиента.

Время от времени возникают проблемы с определением групп в операционном зале, т.к. сотрудники не роботы, и могут элементарно заболеть, или же пойти в отпуск, в таких случаях группа распускается, данная ситуация еще не отработана и приводит каждый раз в затруднение инженеров и бухгалтеров операционного зала.

Техническое задание

Автоматизировать процесс перевода групп бухгалтеров с возможностью восстановления предыдущего значения групп, т.е. если сотрудник ушел в отпуск, его группу «распускают», а по приходу собирают вновь ту же группу.

Этап 1: Сбор информации по группам:

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

Код программы:

set tab off heading on feed on

set echo off termout on

linesize 230 pagesize 400

col acc for a15 heading 'старый счет'

col accn for a21 heading 'счет'

col exeold for a6 heading 'откуда'

col exenew for a6 heading 'куда'

col name for a150 heading 'Наименование счета'

accept EXE_OLD number prompt 'ИСПОЛНИТЕЛЬ: '

spool &EXE_OLD.v.txt

select to_char(c.acc,'9999999999999') acc,

c.accn accn,

'<'||to_char(c.exe,'99')||'>' exeold,

'< >' exenew,

substr(c.name,1,150) name

from cr_acc c

where c.exe = &EXE_OLD

and not b2n in ('90901','90902')

and c.dtc is null

order by substr(accn,17,4), substr(accn,1,5), substr(accn,14,3);

;

exit;

По запросу данной программы через СУБД Oracle вытягиваем нужную нам информацию из таблицы, и формируем ее в наглядный вид, запуск программы осуществляется командной строкой: sql exe_ved.sql

После чего получаем исходящий файл в зависимости от группы которую мы раскидываем. Пример: 4 группа имя 4v.txt

После чего распечатываем данный файл и предаем на группу, после того как его отредактирует какие счета на какую группу перевести отдают нам файл обратно

Рисунок 1 – счета клиентов с иполнителем.

Этап 2: Разброс группы

Для разброса группы так же была написана программа для реализации загрузки предыдущего сформированного файла и обработки его для переброса по информации операционного зала.

Код программы:

* Входной файл: Файл 99v.txt, где 99 - номер исполнителя

* Выходной файл: exe_upl.sql - этот файл загрузить в /u/home/sgv/rep/exe_move

* и отработать (в командной строке запустить ...>sql exe_upl.sql)

*

PROCEDURE upl

PARAMETERS infile

SET ALTERNATE TO exe_upl.sql

SET ALTERNATE ON

SET CONSOLE ON

loadfb3_(infile)

db_name=token(infile,[.],1)+[.dbf]

USE &db_name

GO TOP

DO WHILE !EOF()

DO CASE

CASE SUBSTR(pole_01,46,1) = "<" .and. SUBSTR(pole_01,47,3)#' '

? "execute cr_upexe("+SUBSTR(pole_01,2,13)+","+SUBSTR(pole_01,47,3)+");"

ENDCASE

SKIP

ENDDO

CLOSE DATABASES

?

? "commit;"

?

? "exit;"

erase &db_name

RETURN

PROCEDURE loadfb3_

PARAMETERS c

LOCAL k1, maxlen:=0, step_wh:=1, fl_name, db

LOCAL bufer, handle, block, area, tec_pos, strn_tec, bytes

LOCAL end_area, end_file, filelen

set scoreboard off

Fl_name = c

block=4096

bufer=space(block)

handle=fopen(fl_name)

if handle=-1

? [невозможно открыть файл, ошибка DOS]

endif

filelen=fseek(handle,0,2)

do while step_wh <= 2

fseek(handle,0,0)

area =[]

tec_pos=1

strn_tec = 0

end_file = .f.

end_area = .f.

if step_wh = 1

else

db_name=token(fl_name,[.],1)+[.dbf]

crt_dbf( db_name + [ pole_01, ] + [c,]+ STR( maxlen, 3) + [ , 0 ] )

USE &db_name

endif

do while !end_file

bytes=fread(handle,@bufer,block)

end_area=.f.

if bytes<>block

end_file=.t.

if bytes=0

end_area=.t.

else

area=substr(area,tec_pos)+substr(bufer,1,bytes)

endif

else

area=substr(area,tec_pos)+bufer

endif

tec_pos=1

do while .not.(end_area)

k1=atnum(chr(13)+chr(10),area,1,tec_pos-1)

if k1=0

k1=atnum(chr(26),area,1,tec_pos-1)

if k1<>0

end_file=.t.

if k1=tec_pos

exit

endif

else

end_area=.t.

loop

endif

endif

strn_tec=strn_tec+1

fl_rec=substr(area,tec_pos,k1-tec_pos)

tec_pos=k1+2

if step_wh = 1

maxlen=max(maxlen,LEN(fl_rec))

else

append blank

replace pole_01 with fl_rec

endif

enddo

enddo

step_wh = step_wh + 1

enddo

fclose(fl_name)

RETURN

*---Процедура crt_dbf ---------------------------------------------------------

PROCEDURE crt_dbf

PARAMETERS c

LOCAL k1,k2,i,db_name

CREATE new_stru

USE new_stru

k1=NUMTOKEN(c,[ ,])

FOR i=1 to (k1-1)/4

APPEND BLANK

k2=(i-1)*4+2

REPLACE field_name WITH TOKEN(c,[ ,],k2)

REPLACE field_type WITH TOKEN(c,[ ,],k2+1)

REPLACE field_len WITH VAL(TOKEN(c,[ ,],k2+2))

REPLACE field_dec WITH VAL(TOKEN(c,[ ,],k2+3))

NEXT

db_name=TOKEN(TOKEN(c,[ ,],1),[.],1)+[.DBF]

CREATE &db_name FROM new_stru

* CLOSE DATABASES

erase new_stru.dbf

RETURN(NIL)

Программа работает следующим способом: запускается сама программа со свойством файла сформированного предыдущего этапа, после чего программа создает файл EXE_UPL.SQL. Этот файл содержит непосредственно функцию и группу для переброса группы, после формирования данного файла можно запускать запрос SQL в СУБД следующей командой: SQL EXE_UPL.SQL, после чего СУБД Oracle обработает данный запрос и перенесет группы по им новым местам.

Рисунок 2 – сформированный файл EXE_UPL.SQL

Этап 3: Возврат группы обратно

Для возращения на «круги своя» так же была разработана программа

Работает она следующим образом. Файл который сформирован на первом этапе и расписан бухгалтерами операционного зала запускаем свойствам к написанной программе с наименованием UPL_BACK.

Код программы:

PROCEDURE upl_back

PARAMETERS infile

SET ALTERNATE TO exe_upl.sql

SET ALTERNATE ON

SET CONSOLE ON

loadfb3_(infile)

db_name=token(infile,[.],1)+[.dbf]

USE &db_name

GO TOP

DO WHILE !EOF()

DO CASE

CASE SUBSTR(pole_01,46,1) = "<" .and. SUBSTR(pole_01,47,3)#' '

? "execute cr_upexe("+SUBSTR(pole_01,2,13)+","+SUBSTR(pole_01,40,3)+");"

ENDCASE

SKIP

ENDDO

CLOSE DATABASES

?

? "commit;"

?

? "exit;"

erase &db_name

RETURN

PROCEDURE loadfb3_

PARAMETERS c

LOCAL k1, maxlen:=0, step_wh:=1, fl_name, db

LOCAL bufer, handle, block, area, tec_pos, strn_tec, bytes

LOCAL end_area, end_file, filelen

set scoreboard off

Fl_name = c

block=4096

bufer=space(block)

handle=fopen(fl_name)

if handle=-1

? [невозможно открыть файл, ошибка DOS]

endif

filelen=fseek(handle,0,2)

do while step_wh <= 2

fseek(handle,0,0)

area =[]

tec_pos=1

strn_tec = 0

end_file = .f.

end_area = .f.

if step_wh = 1

else

db_name=token(fl_name,[.],1)+[.dbf]

crt_dbf( db_name + [ pole_01, ] + [c,]+ STR( maxlen, 3) + [ , 0 ] )

USE &db_name

endif

do while !end_file

bytes=fread(handle,@bufer,block)

end_area=.f.

if bytes<>block

end_file=.t.

if bytes=0

end_area=.t.

else

area=substr(area,tec_pos)+substr(bufer,1,bytes)

endif

else

area=substr(area,tec_pos)+bufer

endif

tec_pos=1

do while .not.(end_area)

k1=atnum(chr(13)+chr(10),area,1,tec_pos-1)

if k1=0

k1=atnum(chr(26),area,1,tec_pos-1)

if k1<>0

end_file=.t.

if k1=tec_pos

exit

endif

else

end_area=.t.

loop

endif

endif

strn_tec=strn_tec+1

fl_rec=substr(area,tec_pos,k1-tec_pos)

tec_pos=k1+2

if step_wh = 1

maxlen=max(maxlen,LEN(fl_rec))

else

append blank

replace pole_01 with fl_rec

endif

enddo

enddo

step_wh = step_wh + 1

enddo

fclose(fl_name)

RETURN

*---Процедура crt_dbf ---------------------------------------------------------

PROCEDURE crt_dbf

PARAMETERS c

LOCAL k1,k2,i,db_name

CREATE new_stru

USE new_stru

k1=NUMTOKEN(c,[ ,])

FOR i=1 to (k1-1)/4

APPEND BLANK

k2=(i-1)*4+2

REPLACE field_name WITH TOKEN(c,[ ,],k2)

REPLACE field_type WITH TOKEN(c,[ ,],k2+1)

REPLACE field_len WITH VAL(TOKEN(c,[ ,],k2+2))

REPLACE field_dec WITH VAL(TOKEN(c,[ ,],k2+3))

NEXT

db_name=TOKEN(TOKEN(c,[ ,],1),[.],1)+[.DBF]

CREATE &db_name FROM new_stru

* CLOSE DATABASES

erase new_stru.dbf

RETURN(NIL)

Программа работает следующим образом запускаем программу UPL_BACK с параметром сформированным на первом этапе. Пример UPL_BACK 4v.txt

После чего формируется файл EXE_UPL.SQL его так же запускаем в СУБД Oracle следующей командой SQL EXE_UPL.SQL после чего в СУБД вернется все в изначальное значение, до переброса.