Professional Documents
Culture Documents
Build An Enquiry With A Nofile
Build An Enquiry With A Nofile
When you can't use standard conversion and calculation functions to get what you need, you still
have a programming solution. It occurs typically when you need data spreaded in multiple tables,
because ENQUIRY tool is single-table by essence. You can use links to other tables when you
have foreign keys in the requested table, but no more. Using a subroutine, you access to any kind
and number of extra tables.
Example :
1. ENQUIRY
ENQUIRY........... DX.CLOSEOUT.FINAL.FUT.HIS
2. STANDARD SELECTION
FILE.NAME......... NOFILE.DX.CLOSEOUT
3. SUBROUTINE E.NOFILE.DX.CLOSEOUT(RETURN.ARRAY)
(...)
TEMP.DATA = POS.KEY : "*" : POS.DATE : "*" : POS.CONTRACT : "*" :
POS.MATURITY : "*" : POS.CURR : "*" etc...
RETURN.ARRAY<-1> = TEMP.DATA
4. ENQUIRY
ENQUIRY........... DX.CLOSEOUT.FINAL.FUT.HIS
---------------------------------------------------
1 PAGE.SIZE ........ 4,19
2 FILE.NAME......... NOFILE.DX.CLOSEOUT
3. 1 FIXED.SELECTION RTN.CALL NE NULL
11. 1 FIELD.NAME..... RET.ID
12. 1. 1 OPERATION... RET.ID
14. 1 LENGTH.MASK.... 1000L
32. 1 SINGLE.MULTI... S
11. 2 FIELD.NAME..... POS.KEY
12. 2. 1 OPERATION... F RET.ID
13. 2 COLUMN......... 1
15. 2. 1 CONVERSION.. F *,1,1
19. 2. 1 GB FIELD.LBL Key
32. 2 SINGLE.MULTI... S
11. 3 FIELD.NAME..... POS.DATE
12. 3. 1 OPERATION... F RET.ID
15. 3. 1 CONVERSION.. F *,2,1
top
1 = EQ
2 = RG
3 = LT
4 = GT
5 = NE
6 = LK
7 = UL
8 = LE
9 = GE
10 = NR
D.RANGE.AND.VALUE : contains values of selection input by the user.
Detailed explanations :
Y.SEL.CRITERIA = ''
Y.FIELD = 'SELECTION.FIELD.1'
GOSUB BUILD.CRITERIA.CMD
Y.FIELD = 'SELECTION.FIELD.2'
GOSUB BUILD.CRITERIA.CMD
Y.FIELD = 'SELECTION.FIELD.3'
GOSUB BUILD.CRITERIA.CMD
4) BUILD.CRITERIA.CMD:
Y.OPERAND = D.LOGICAL.OPERANDS<POS>
Y.RANGE.AND.VALUE = D.RANGE.AND.VALUE<POS>
Y.I = 0
BEGIN CASE
CASE Y.OPERAND = 1 ; * EQual to ALL.
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' EQ'
LOOP
Y.I += 1
Y.X = Y.RANGE.AND.VALUE<1,1,Y.I>
WHILE Y.X
Y.SEL.CRITERIA := ' ':Y.X
REPEAT
CASE Y.OPERAND = 2 ; * RanGe
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' GE ':Y.RANGE.AND.VALUE<1,1,1>
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' LE ':Y.RANGE.AND.VALUE<1,1,2>
CASE Y.OPERAND = 3 ; * Less Than
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' LT ':Y.RANGE.AND.VALUE<1,1>
CASE Y.OPERAND = 4 ; * Greater Than
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' GT ':Y.RANGE.AND.VALUE<1,1>
CASE Y.OPERAND = 5 ; * Not Equal to
LOOP
Y.I += 1
Y.X = Y.RANGE.AND.VALUE<1,1,Y.I>
WHILE Y.X
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' NE ':Y.X
REPEAT
CASE Y.OPERAND = 6 ; * LiKe
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' LIKE'
LOOP
Y.I += 1
Y.X = Y.RANGE.AND.VALUE<1,1,Y.I>
WHILE Y.X
Y.SEL.CRITERIA := ' ':Y.X
REPEAT
CASE Y.OPERAND = 7 ; * UnLike
LOOP
Y.I += 1
Y.X = Y.RANGE.AND.VALUE<1,1,Y.I>
WHILE Y.X
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' UNLIKE ':Y.X
REPEAT
CASE Y.OPERAND = 8 ; * Less than or Equal
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' LE ':Y.RANGE.AND.VALUE<1,1>
CASE Y.OPERAND = 9 ; * Greater than or Equal
Y.SEL.CRITERIA := ' AND ':Y.FIELD:' GE ':Y.RANGE.AND.VALUE<1,1>
CASE Y.OPERAND = 10
Y.SEL.CRITERIA := ' AND (':Y.FIELD:' LT ':Y.RANGE.AND.VALUE<1,1,1>
Y.SEL.CRITERIA := ' OR ':Y.FIELD:' GT ':Y.RANGE.AND.VALUE<1,1,2>:')'
*
END CASE
RETURN
top
top
top
Call a subroutine
Usage description:
You can call a subroutine from an enquiry field. You have to invoke it using @
E.Subroutine.Name in the Conversion field. The argument to be processed by the enquiry must
be set in the Operation field. Inside the subroutine, the argument will be transmitted in a
dedicated variable named O.DATA. This is defined in the I_ENQUIRY.COMMON library.
Example :
We are displaying an historical transaction ID in an enquiry. We need to get the latest trans ID if
exists.
SUBROUTINE E.DX.GET.LATEST.TRANS
$INSERT I_COMMON
$INSERT I_EQUATE
$INSERT I_ENQUIRY.COMMON
IN.R.DX.TRANS.KEYS = ""
IN.DX.TRADE.ID = FIELD(O.DATA,".",1)
IN.CUST.PORT = FIELD(O.DATA,".",2)
IF (IN.CUST.PORT # "") THEN
CALL DX.GET.LATEST.TRANSACTION.ID( IN.R.DX.TRANS.KEYS, IN.DX.TRADE.ID,
IN.CUST.PORT, LAST.TXN.ID)
O.DATA = LAST.TXN.ID
END
RETURN
END