Вы находитесь на странице: 1из 9

Технические курсы.

Лекция 6. Разработка процедур Запросов.


Гутковский В.В. ST-Soft (Минск)

Лекция 6. Разработка процедур Запросов


 Обзор работы подсистемы запросов (ENQUIRY)

Error: Reference source not found

 Типы запросов
Обычные и NOFILE запросы

 Виды процедур запросов


Существует 2 типа процедур для запросов
– build
– conversion.
При разработке любых процедур запросов необходимо использовать файл
I_ENQUIRY.COMMON, где определяются необходимые переменные, например
O.DATA.

o BUILD ROUTINE
Эти процедуры служат для уточнения условий выборки и запускаются до того,
как происходит фактическая выборка данных из файла, и сразу после того, как
пользователь задал условия поиска. Эти процедуры присоединяются к запросу
в поле BUILD.ROUTINE (поле 12) приложения ENQUIRY. Таких процедур может
быть несколько.

Процедура должна иметь один входной параметр – динамический массив,


например ENQ следующей структуры:
ENQ<1> имя запроса, необязательный для обработки параметр
ENQ<2,x> имя поля
ENQ<3,x> операнд
ENQ<4,x> данные

Error: Reference source not found

Первые значения полей этого массива будут содержать данные, введенные


пользователем, поэтому для манипуляций следует использовать значения 2 и
более.

TEMENOS/ST-Soft - Конфиденциально Стр. 1 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

Пример: в запросе по файлу ACCOUNT, в зависимости от введенной категории


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

SUBROUTINE E.B.AC.BUILD.BAL(ENQ.DATA)
* This routine extracts the value (category value) from the 4th
* element in the array and checks if it is in a specified
* range. If it is, then an additional condition which will check
* for the working balance is appended to the selection
* criteria.
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON

LOC.CATEGORY = ENQ.DATA<4,1>
ENQ.DATA<2,2> = 'WORKING.BALANCE'
ENQ.DATA<3,2> = 'RG'

IF LOC.CATEGORY = 6000 THEN ENQ.DATA<4,2> = '60000 70000'


IF LOC.CATEGORY = 7000 THEN ENQ.DATA<4,2> = '20000 30000'
IF LOC.CATEGORY > 7000 THEN ENQ.DATA<4,2> = '50000'
RETURN
END

Пример построения зависимого запроса для экранной Версии:


В приложении VERSION заполняем поле DROP.DOWN (поле 33) именем запроса
И для запроса в приложении ENQUIRY заполняем поле BUILD.ROUTINE (поле 12)
именем процедуры – E.B.TB.FT.ALT.ACCT.CR.CUR.

SUBROUTINE E.B.TB.FT.ALT.ACCT.CR.CUR(ENQ.DATA)
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_F.FUNDS.TRANSFER
$INSERT I_ENQUIRY.COMMON

CURR = R.NEW(FT.CREDIT.CURRENCY)
IF NOT(CURR) THEN CURR = LCCY
LOC.ENQ.N = 2
LOOP WHILE ENQ.DATA<2,LOC.ENQ.N> DO
LOC.ENQ.N++
REPEAT

TEMENOS/ST-Soft - Конфиденциально Стр. 2 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

ENQ.DATA<2,LOC.ENQ.N> = 'CURRENCY'
ENQ.DATA<3,LOC.ENQ.N> = 'EQ'
ENQ.DATA<4,LOC.ENQ.N> = CURR

RETURN
END

o CONVERSION ROUTINE
Конверсионные процедуры позволяют изменять выбранные запросом данные до
того как они будут отображены на экране. Эти процедуры присоединяются к
запросу в поле CONVERSION (поле 18) приложения ENQUIRY. Обязательно
наличие пробела между символом “@” и именем процедуры, например
“@ E.API.GET.TIME”.
Процедура не имеет входных и выходных параметров. В ней доступна глобальная
переменная O.DATA, которая содержит последнее выбранное значение. Так же
могут быть полезными следующие переменные:
ID – ID обрабатываемой записи
R.RECORD – обрабатываемая запись целиком

Пример: процедура доклеивает значение текущего времени в некоторое поле.


SUBROUTINE E.API.GET.TIME
* Author: V.Gutkovsky (ST Soft, Minsk) 26.07.2005
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON
O.DATA := TIME()
RETURN
END

 NOFILE запросы и их регистрация


Случается, что информации содержится ни в одном файле, а в нескольких, в
таком случае можно построить запрос, который будет строиться на основе данных
сформированных процедурой.
Давайте подробнее рассмотрим механизм работы подсистемы запросов. При
запуске запроса, система проверяет имя файла указанное в поле FILE.NAME
(поле 2) – система проверяет есть, существует ли запись с таким ID в приложении
STANDARD.SELECTION, а затем проверят, есть ли соответствующая запись в
FILE.CONTROL, уточняется: существуют ли файлы $HIS и $NAU. Далее строится
список записей из этого файла, на основе данных в поле FIXED.SELECTION
(поле 2). Потом этот список уточняется согласно условию, введенному
пользователем. Далее считывается каждая запись из списка, выбираются

TEMENOS/ST-Soft - Конфиденциально Стр. 3 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

необходимые поля и выполняются преобразования и затем данные отображаются


пользователю.
В случае запроса по нескольким файла мы не можем указать в поле FILE.NAME
(поле 2) имена всех этих файлов, и поэтому нам надо указывать некий псевдо
файл или промежуточный файл в поле FILE.NAME. Далее подсистема запросов
будет проверять имя этого промежуточного файла в приложении
STANDARD.SELECTION, приложение SS в свою очередь будет проверять
приложение FILE.CONTROL. Данные для нашего псевдо файла будут
формироваться процедурой и физически такого файла не будет, поэтому запись
для него в приложении FILE.CONTROL будет отсутствовать. Необходимо
создавать запись в приложении STANDARD.SELECTION префиксом “NOFILE.”
Таким образом, чтобы создать NOFILE запрос необходимо создать запись в
приложении SS, в ней определить как минимум одно поле типа “R”, в поле
FIELD.NO указать процедуру, которая будет возвращать динамический массив.
Далее в самом запросе данные представленные в этом динамическом массиве
могут быть разбиты на составляющие, при помощи стандартных инструментов
запросов (ENQUIRY), либо же на основе данных из динамического массива в
CONVERSION ROUTINE будет заполняться R.RECORD (см. ранее). Рассмотрим
оба вариант чуть подробнее.

1. Процедура, разработанная нами для NOFILE запроса будет формировать


массив, каждый элемент которого будет иметь вид:
ID*D1*D2
где ID – некий идентификатор, например идентификатор клиента
D1 – данные из одного файла, например суммарный баланс по всем
текущим счетам клиент
D2 – данные из другого файл, например суммарный баланс клиента по всем
кредитным и депозитным договорам.
“*” – вместо звездочки можно использовать другой удобный разделитель.
Далее в запросе можно получить доступ к каждому из ID, D1 и D2 по
отдельности используя conversion вида FIELD X,N1,N2:
ID – F ‘*’,1,1
D1 – F ‘*’,2,1
D2 – F ‘*’,3,1

2. Процедура, разработанная нами для NOFILE запроса, будет формировать


массив, каждый элемент которого будет иметь вид:
ID*FILENAME
где ID – некий идентификатор, например идентификатор клиента
FILENAME – имя файла
“*” – вместо звездочки можно использовать другой удобный
разделитель.
Далее в запросе используется CONVERSION ROUTINE, которая на основе
ID и FILENAME заполняет массив R.RECORD, причем логическая структура
должна быть описана в приложении STANDARD.SELECTION. Данная

TEMENOS/ST-Soft - Конфиденциально Стр. 4 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

процедура должна отрабатывать первой, чтобы была возможна


дальнейшая работа запроса.

Пример NOFILE запроса.


Построить отчет следующего вида

Customer Id Total Credit Balance


xxxxx xxxxxx
xxxxx xxxxxx
xxxxx xxxxxx
где:
Total Credit Balance = суммарный баланс всех счетов клиента + суммарный
баланс всех депозитов клиента + суммарный баланс всех MM депозитов клиента.
Примерный алгоритм:
 Выбрать все ID клиентов из файла CUSTOMER.ACCOUNT
 Вычитать запись из CUSTOMER.ACCOUNT, т.к. в ней содержаться ID счетов
принадлежащих клиенту
 Для каждого счета вычитать запись из ACCOUNT
 Получить значение поля WORKING.BALANCE если оно отлично от 0.
Проделать это для всех счетов клиента
 Для всех клиентов выбранных на первом шаге прочитать запись из файла
LMM.CUSTOMER, в ней будут содержаться ID всех LD и MM контрактов этого
клиента
 Для каждого контракта прочитать запись из LD или MM файла
соответственно.
 Убедиться, что категория контракта находиться в диапазоне от 21001 до
21039 (депозиты)
 Для подходящих контрактов извлечь суммы. Проделать для всех контрактов
клиента.
 До получения следующего ID клиента просуммировать все суммы.
 Сохранить результаты в массиве вида
CustomerID*Amount<FM>CustomerID*Amount<FM>CustomerID*Amount

SUBROUTINE NOFILE.CUS.BALANCE(YID.LIST)
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_F.ACCOUNT
$INSERT I_F.CUSTOMER.ACCOUNT
$INSERT I_F.MM.MONEY.MARKET
$INSERT I_F.LD.LOANS.AND.DEPOSITS

GOSUB INIT

TEMENOS/ST-Soft - Конфиденциально Стр. 5 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

GOSUB OPENFILES
GOSUB PROCESS
RETURN

INIT:
*Initialization of variables
FN.CUS.ACC = ‘F.CUSTOMER.ACCOUNT’
F.CUS.ACC = ‘’
FN.ACC = ‘F.ACCOUNT’
F.ACC = ‘’
FN.LD = ‘F.LD.LOANS.AND.DEPOSITS’
F.LD = ‘’
FN.MM = ‘F.MM.MONEY.MARKET’
F.MM = ‘’
Y.CUS.ID = ‘’
Y.ACC.ID = ‘’
Y.LD.ID = ‘’
Y.MM.ID = ‘’
R.CUS.ACC.REC = ‘’
R.ACC.REC = ‘’
R.LD.REC = ‘’
R.MM.REC = ‘’
CUS.ERR = 0
ACC.ERR = 0
LD.ERR = 0
MM.ERR = 0
RETURN

OPENFILES:
*Open necessary files
CALL OPF(FN.CUS.ACC,F.CUS.ACC)
CALL OPF(FN.ACC,F.ACC)
CALL OPF(FN.LD,F.LD)
CALL OPF(FN.MM,F.MM)
RETURN

PROCESS:
*Select all the customer ids from the CUSTOMER.ACCOUNT
*concat file.
*Extract all the accounts pertaining to that customer.

TEMENOS/ST-Soft - Конфиденциально Стр. 6 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

*Extract all the LD and MM ids pertaining to that customer form


* the LMM.CUSTOMER file.
SEL.CMD = “SELECT “:FN.CUS.ACC
CALL EB.READLIST(SEL.CMD,SEL.LIST,’’,NO.OF.REC,RET.CODE)
LOOP
REMOVE Y.CUS.ID FROM SEL.LIST SETTING CUS.ACC.POS
WHILE Y.CUS.ID:CUS.ACC.POS
CALL F.READ(FN.CUS.ACC, Y.CUS.ID, R.CUS.ACC.REC, F.CUS.ACC,
CUS.ACC.ERR)
LOOP
REMOVE Y.AC.ID FROM R.CUS.ACC.REC SETTING AC.POS
WHILE Y.AC.ID:AC.POS
GOSUB AC.PROCESS
Y.AC.ID = ‘’
R.CUS.ACC.REC = ‘’
AC.POS = ‘’
REPEAT
CALL F.READ(FN.LMM.CUS, Y.CUS.ID, R.LMM.REC,
F.LMM.CUS, LMM.ERR)
LOOP
REMOVE Y.LMM.ID FROM R.LMM.REC SETTING LMM.POS2
WHILE Y.LMM.ID:LMM.POS2
IF LEFT(Y.LMM.ID,2) = “LD” THEN
GOSUB LD.PROCESS
END ELSE
GOSUB MM.PROCESS
END
Y.LMM.ID = ‘’
LMM.POS2 = ‘’
REPEAT
Y.TOTAL.BALANCE = Y.WORKING.BALANCE + Y.LD.AMOUNT + Y.MM.AMOUNT
YID.LIST<-1> = Y.CUS.ID:’*’:Y.TOTAL.BALANCE
Y.CUS.ID = ‘’
Y.TOTAL.BALANCE = 0
Y.WORKING.BALANCE = 0
Y.LD.AMOUNT = 0
Y.MM.AMOUNT = 0
CUS.ACC.POS = ‘’
R.CUS.ACC.REC = ‘’
CUS.ACC.ERR = 0
REPEAT
RETURN

TEMENOS/ST-Soft - Конфиденциально Стр. 7 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

AC.PROCESS:
*Extract the working balance of the account provided it is not
* equal to 0.
CALL F.READ(FN.ACC,Y.AC.ID,R.AC.REC,F.ACC,ACC.ERR)
IF R.AC.REC<AC.WORKING.BALANCE> NE 0 THEN
Y.WORKING.BALANCE += R.AC.REC<AC.WORKING.BALANCE>
END
ACC.ERR = 0
R.AC.REC = ‘’
RETURN

LD.PROCESS:
*Extract the loan amount from the LD file provided the category
*is in the range 21001 to 21039 as that is the range for LD
*deposits
CALL F.READ(FN.LD,Y.LMM.ID,R.LD.REC,F.LD,LD.ERR)
IF R.LD.REC<LD.CATEGORY> >= 21001 AND \
R.LD.REC<LD.CATEGORY> <= 21039 THEN
Y.LD.BALANCE += R.LD.REC<LD.AMOUNT>
END
R.LD.REC = ‘’
LD.ERR = ‘’
RETURN

MM.PROCESS:
*Extract the principal amount from the MM file provided the
*category is in the range 21001 to 21039 as that is the range
*for MM deposits

CALL F.READ(FN.MM,Y.LMM.ID,R.MM.REC,F.MM,MM.ERR)
IF R.MM.REC<MM.CATEGORY> >= 21001 AND \
R.MM.REC<MM.CATEGORY> <= 21039 THEN
Y.MM.BALANCE += R.MM.REC<MM.PRINCIPAL>
END
R.MM.REC = ‘’
MM.ERR = ‘’
RETURN

END

TEMENOS/ST-Soft - Конфиденциально Стр. 8 из 9 Апрель 2006


Технические курсы.
Лекция 6. Разработка процедур Запросов.
Гутковский В.В. ST-Soft (Минск)

Создаем запись в приложении STANDARD.SELECTION примерно такого вида

Создаем запрос

Обратите внимание на поле Operation, «0» значит, что мы должны использовать


значение нулевого поля, в нашем случае это будет CustomerID*Amount. Далее в
поле CONVERSION используя F *,1,1 и F *,2,1 мы для двух полей извлекаем
ID клиента и суммарный баланс соответственно.

Практические занятия
 Полная разработка запроса.
 Написание процедуры конвертации отображаемых данных.
 Написание процедуры построения запроса (например, для поля версии
выборка значений, в зависимости от значения другого поля)
 Полная разработка NOFILE запроса.

TEMENOS/ST-Soft - Конфиденциально Стр. 9 из 9 Апрель 2006

Вам также может понравиться