Типы запросов
Обычные и NOFILE запросы
o BUILD ROUTINE
Эти процедуры служат для уточнения условий выборки и запускаются до того,
как происходит фактическая выборка данных из файла, и сразу после того, как
пользователь задал условия поиска. Эти процедуры присоединяются к запросу
в поле BUILD.ROUTINE (поле 12) приложения ENQUIRY. Таких процедур может
быть несколько.
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'
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
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 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
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.
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
Создаем запрос
Практические занятия
Полная разработка запроса.
Написание процедуры конвертации отображаемых данных.
Написание процедуры построения запроса (например, для поля версии
выборка значений, в зависимости от значения другого поля)
Полная разработка NOFILE запроса.