T2BTT – R06 – 1.0 Copyright 2005 TEMENOS HEADQUARTERS SA1
Agenda
Introduction to Infobasic Arrays and types of arrays
Introduction to subroutines and programs Important functions/commands in Infobasic Steps to create a subroutine in T24
Compiling and cataloguing routines and programs T24 routines – file operations
T24 routines – sequential file access
Introduction To Infobasic
Programming language used for T24 Simple – English like statements
No declaration of variables required No data type specification is required
All variables by default have infinite variable length
– Multi value – Sub Value
Arrays
Continuous allocation of bytes
All bytes in an array have the same name as that of the array
Each byte is uniquely identified with the help of a subscript.
T E M E N O S
Arrays In Infobasic
Dynamic Arrays
– Dynamic in nature – Variable length
– Need not be declared
– Can hold any type of data
– Automatically increase or decrease in size depending on the
data
– All variables in Infobasic are dynamic arrays
Dimensioned arrays
– Have a fixed number of rows and columns – Can hold any type of data
– Needs to be declared
– Used when dimensions and extents are known and are not
Dynamic Array
CUSTOMER.NAME = ‘’ RATE = 0
DATE = “121202”
Can store any type and any amount of data. Only initialisation is required.
Arrays
Dynamic Arrays (Cont.)
– Uses delimiters to store data of various fields
ASCII Decimal Description
254 Field Marker
253 Value Marker
Sample Record From The TEMENOS.TRG 1 Name 2.1 Address 2.2 Address 2.3 Address 3.1 Course Category 4.1.1 Course Name 4.1.2 Course Name 3.2 Course Category 4.2.1 Course Name 4.2.2 Course Name 5 Free Text TemenosTrg India UK Geneva Technical jBASE T24 Functional Lending Financials
Storage In A Dynamic Array
TemenosTrgFMIndiaVMUKVMGenevaFMTechnicalVMFunctionalFM
jBASESMT24VMLendingSMFinancialsFMFMTrainer.1
Copyright 2005 TEMENOS HEADQUARTERS S1A0
Dimensioned Array DIM ARRAY1(4,3) 4 – Rows 3 – Columns Copyright 2005 TEMENOS HEADQUARTERS S1A1
Dimensioned Array (Cont.)
DIM ARRAY2(4) 4 – Rows
Unlimited columns (Each row will be a dynamic array)
Copyright 2005 TEMENOS HEADQUARTERS S1A2
Structure Of An Infobasic Program
PROGRAM – Executed from the database prompt SUBROUTINE – Execute from within Globus
*Comments *Comments
PROGRAM <Programname> SUBROUTINE <Subroutinename>
Statement 1 Statement 1 Statement 2 Statement 2 Statement 3 Statement 3 RETURN END END Copyright 2005 TEMENOS HEADQUARTERS S1A3
lib.so.1 lib.so.2 Compiling And Cataloguing Routines
EB.COMPILE TRG.BP TRG.RTN1
COMPILE CATALOG
Check for errors Error – Exit
No Error
Produce object code $TRG.RTN1 TRG.BP $TRG.RTN1 Check JBCDEV_LIB JBCDEV_LIB = $HOME/lib $HOME/lib Is there place here Is there place here
Compiling And Cataloguing Programs
EB.COMPILE TRG.BP TRG.PRG1
COMPILE CATALOG
Check for errors Error – Exit No Error Produce executable $TRG.PRG1 TRG.BP $TRG.PRG1 Check JBCDEV_BIN JBCDEV_BIN = $HOME/bin $HOME/bin TRG.PRG1 Copyright 2005 TEMENOS HEADQUARTERS S1A5
Executing Routines
Login into T24
Make an entry in the PGM.FILE
At the command line TRG.RTN1
JBCOBJECTLIST =
$HOME/globuslib;$HOME/lib
Execute the routine
Executing Programs Go to the database prompt jsh..> TRG.PRG1 PATH = .;$HOME/globusbin;$HOME/bin;$PATH Execute the program
Writing A Simple Infobasic Program
Program to display ‘Hello World’
JED TRG.BP HELLO PROGRAM HELLO CRT “Hello World” END
Compile And Execute The Program
Compile and catalog
EB.COMPILE TRG.BP HELLO
Execute the program
jsh..>HELLO Hello World
Copyright 2005 TEMENOS HEADQUARTERS S1A9
Workshop 1
Copyright 2005 TEMENOS HEADQUARTERS S2A0
Control Structures IF THEN ELSE IF <condition> THEN <statements> END ELSE <statements> END Copyright 2005 TEMENOS HEADQUARTERS S2A1
BEGIN CASE … END CASE
BEGIN CASE
CASE <variable> = <value> <statements>
CASE <variable> = <value> <statements>
CASE <variable> = <value> <statements> CASE 1
<statements> END CASE
FOR
FOR <variable> = <initialvalue> TO <maximumvalue> <statements>
NEXT <variablename> Copyright 2005 TEMENOS
Open Loop LOOP CRT “Input 2 Numbers” INPUT Y.NUM1 INPUT Y.NUM2 WHILE Y.NUM1:Y.NUM2 CRT “Total “ : Y.NUM1 + Y.NUM2 REPEAT
LEN(e) Length COUNT(e,d)
CHANGE(e,d,c) Change OCONV(e,d) Convert Built In Infobasic Functions
of the text in expression
Number of occurrences of d in e DCOUNT(e,d) Number of occurrences of d in e, +1
UPCASE(e) Converts e to uppercase DOWNCASE(e) Converts e to lowercase
occurrences of d to c in e
e into the format specified in d
Copyright 2005 TEMENOS HEADQUARTERS S2A5
Structure Of A Subroutine SUBROUTINE SubroutineName $INSERT I_COMMON $INSERT I_EQUATE Actual Statements Actual Statements RETURN END Copyright 2005 TEMENOS
Insert Files
I_COMMON
– Defines all common variables
I_EQUATE
– Equates a number of common variables
Insert files are available under GLOBUS.BP
Common variables get loaded when a user signs on
Some common variables are loaded when specific
applications are opened/specific actions are performed Example : R.USER, ID.NEW
Example 2
Write a subroutine that will display the details
(Id, Mnemonic and Nationality)of a customer whose id is 100069
Copyright 2005 TEMENOS HEADQUARTERS S2A8
Algorithm
Step 1. Open the Customer File
Step 2. Read the Customer file and extract the record with id 100069
Step 3. From the extracted record obtain the mnemonic and nationality
Step 4. Display the customer id,mnemonic and nationality.
Copyright 2005 TEMENOS HEADQUARTERS S2A9
Open A File
Use the command OPEN
OPEN FBNK.CUSTOMER…….
But…….
Open A File (Cont.)
OPF – Open File
CALL OPF(FN.CUS,F.CUS)
FN.CUS = ‘F.CUSTOMER’ (File Name) F.CUS = ‘’ (File Path)
Copyright 2005 TEMENOS HEADQUARTERS S3A1
Read A File
Use the Globus subroutine 1 - File name
2 - ID of the record to be read
CALL F.READ(1,2,3,4,5)
3 - Dynamic array that will hold the read record 4 - File Path
5 – Error Variable
CALL F.READ(FN.CUS,”100069”,R.CUSTOMER,F.CUS,CUS.ERR1)
F.READ always checks if the record is in cache. If yes, fetches the record from the cache, else retrieves the record from the databse.
Record Returned By F.READ
Contents of R.CUSTOMER
DAOHENGBK¬DAO HENG BANK INC¬DAO HENG BANK INC¬¬119 ASIAN MANSION 209 DELA ROSA ST¬ LEGASPI VILLAGE MAKATI CITY MAN PH ¬¬¬¬ 1111¬
90¬¬8100¬999¬PH¬4¬ PH¬ 20000101 ¬¬¬¬¬ 20000101
¬¬¬1¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬1¬18_RICKBANAT1ÿ28_ANDREABARNES1¬0006121042¬18_RI CKBANAT1¬US0010001¬1¬¬
Copyright 2005 TEMENOS HEADQUARTERS S3A3
Extract Values
R.CUSTOMER<1> R.CUSTOMER<15>
What happens after an upgrade?
I_F.CUSTOMER File
Copyright 2005 TEMENOS HEADQUARTERS S3A5
Display Parts Of A Record
Y.MNEMONIC = R.CUSTOMER<EB.CUS.MNEMONIC> Y.NATIONALITY = R.CUSTOMER<EB.CUS.NATIONALITY> Copyright 2005 TEMENOS
Display Parts Of A Record(Cont.)
CRT “Customer Id: “:Y.CUS.ID
CRT “Customer Mnemonic: “:Y.MNEMONIC CRT “Customer Nationality: “:Y.NATIONALITY Copyright 2005 TEMENOS
Solution 2
*Subroutine to display the details of customer 100069 SUBROUTINE CUS.DISPLAY.DETAILS $INSERT I_COMMON $INSERT I_EQUATE $INSERT I_F.CUSTOMER GOSUB INIT GOSUB OPENFILES GOSUB PROCESS RETURN INIT: FN.CUS = ‘F.CUSTOMER’ F.CUS = ‘’ Y.CUS.ID = 100069 Y.MNEMONIC = ‘’ Y.NATIONALITY = ‘’ R.CUSTOMER = ‘’ CUS.ERR1 = ‘’ RETURN Copyright 2005 TEMENOS
Solution 2 (Cont.) OPENFILES: CALL OPF(FN.CUS,F.CUS) RETURN PROCESS: CALL F.READ(FN.CUS,Y.CUS.ID,R.CUSTOMER,F.CUS,CUS.ERR1) Y.MNEMONIC = R.CUSTOMER<EB.CUS.MNEMONIC> Y.NATIONALITY = R.CUSTOMER<EB.CUS.NATIONALITY> CRT “Customer Id: “:Y.CUS.ID
CRT “Customer Mnemonic: “:Y.MNEMONIC
CRT ‘Customer Nationality: “:Y.NATIONALITY RETURN
END
Copyright 2005 TEMENOS HEADQUARTERS S3A9
Solution 2
Compile and catalog the routine
– EB.COMPILE TRG.BP CUS.DISPLAY.DETAILS
Make an entry in the PGM.FILE with the type set to ‘M’.
Execute the routine from the command line.
Debugging …….
See the execution of the routine line by line
Insert the ‘DEBUG’ statement anywhere in the routine
Subroutine to display the details of customer 100069 SUBROUTINE CUS.DISPLAY.DETAILS $INSERT I_COMMON $INSERT I_EQUATE $INSERT I_F.CUSTOMER GOSUB INIT GOSUB OPENFILES GOSUB PROCESS RETURN INIT: DEBUG FN.CUS = ‘F.CUSTOMER’ F.CUS = ‘’ Y.CUS.ID = 100069 Copyright 2005 TEMENOS HEADQUARTERS S4A1
Debugging……….
Source changed to BP/CUS.DISPLAY.DETAILS 0011 DEBUG jBASE debugger->S 0012 FN.CUS = 'F.CUSTOMER' jBASE debugger->S 0013 F.CUS = '' jBASE debugger->S 0014 Y.CUS.ID = 1038 jBASE debugger->S 0015 Y.MNEMONIC = '' jBASE debugger->S ---0023 PROCESS:
jBASE debugger->V FN.CUS
FN.CUS : FBNK.CUSTOMER jBASE debugger->V F.CUS
F.CUS : File '../mbdemo.data/st/FBNK.CUST000'
Workshop 2
Copyright 2005 TEMENOS HEADQUARTERS S4A3
Example 3
Modify example 2 to display the mnemonic and nationality of all the customers
Algorithm
Step 1. Open the Customer File Step 2. Select all the customer ids
Step 3. Remove one customer id from the selected list Step 4. For the extracted customer id extract the
corresponding record from the customer file
Step 5. From the extracted record extract the mnemonic and nationality
Step 6. Display the customer id, mnemonic and nationality Repeat Steps 3 to 6 for all customers
Select
Assign the select statement to a variable
SEL.CMD = “SELECT “:FN.CUS
Note the space
Use the Globus subroutine EB.READLIST to execute the select statement
Use SSELECT instead of SELECT if you want data in a sorted order
EB.READLIST
CALL EB.READLIST(1,2,3,4,5)
1 - Select Statement To Be Executed
2 - A dynamic array that will hold the ids of all records selected, separated by field markers.
3 - File that will hold the results of the select statement(Optional)
4 - Variable that will hold the number of records selected
5 - Return Code
Copyright 2005 TEMENOS HEADQUARTERS S4A7
EB.READLIST (Cont.)
CALL EB.READLIST(SEL.CMD,SEL.LIST,’’,NO.OF.REC,RET.CODE) Copyright 2005 TEMENOS
Insight Into EB.READLIST – Execute Select
SEL.CMD = “SELECT “:FN.CUS:” WITH SECTOR > 1000”
CALL EB.READLIST(SEL.CMD,SEL.LIST,’’,NO.OF.REC,RET.CODE)
How does EB.READLIST execute this SELECT statement?
Picks up the SELECT statement
Performs an ‘EXECUTE SEL.CMD’ and store the output on to SEL.LIST
Copyright 2005 TEMENOS HEADQUARTERS S4A9
Insight Into EB.READLIST - Internal Select
SEL.CMD = “SELECT “:FN.CUS
CALL EB.READLIST(SEL.CMD,SEL.LIST,’’,NO.OF.REC,RET.CODE)
How does EB.READLIST execute this SELECT statement?
Picks up the SELECT statement
Realizes that there are no conditions and no sorted select
in SEL.CMD
Performs an OPF for the file that you wish to select CALL OPF(FN.CUS.F.CUS)
Performs ‘SELECT F.CUS’
– This is faster than ‘EXECUTE SEL.CMD’ as it is not actually selecting the file
– It is only positioning the file pointer to the start of the file and then will extract one ID after another and store it in SEL.LIST
Insight Into EB.READLIST - Internal Select
Use the facility of internal select in EB.READLIST when
– You wish to process most of the records of a file – You do not want records in a sorted order
Copyright 2005 TEMENOS HEADQUARTERS S5A1
Repeating A Set Of Statements
Use LOOP and REMOVE(Discussed Earlier) to repeat Steps 3 to 6
Solution 3
*Subroutine to display the mnemonic and nationality of all customers SUBROUTINE CUS.DISPLAY.DETAILS $INSERT I_COMMON $INSERT I_EQUATE $INSERT I_F.CUSTOMER DEBUG GOSUB INIT GOSUB OPENFILES GOSUB PROCESS RETURN INIT: FN.CUS = 'F.CUSTOMER' F.CUS = '' Y.CUS.ID = '' R.CUSTOMER = '‘ CUS.ERR1 = '' Y.MNEMONIC = '' Y.NATIONALITY = '' SEL.CMD = '' SEL.LIST = '' NO.OF.REC = 0 RET.CODE = '' RETURN Copyright 2005 TEMENOS HEADQUARTERS S5A3
Solution 3 (Contd.) OPENFILES:
CALL OPF(FN.CUS,F.CUS) RETURN
PROCESS:
SEL.CMD = "SELECT ":FN.CUS
CALL EB.READLIST(SEL.CMD,SEL.LIST,'',NO.OF.REC,RET.CODE) LOOP
REMOVE Y.CUS.ID FROM SEL.LIST SETTING POS WHILE Y.CUS.ID:POS
CALL F.READ(FN.CUS,Y.CUS.ID,R.CUSTOMER,F.CUS,CUS.ERR1) Y.MNEMONIC = R.CUSTOMER<EB.CUS.MNEMONIC>
Y.NATIONALITY = R.CUSTOMER<EB.CUS.NATIONALITY> CRT "Customer Id: ":Y.CUS.ID
CRT "Customer Mnemonic: ":Y.MNEMONIC
CRT "Customer Nationality: ":Y.NATIONALITY REPEAT
RETURN END
Solution 3
Add a DEBUG statement in the routine
Compile and catalog the routine
Make an entry in the PGM.FILE with the type set to ‘M’.
Execute the routine from the command line.
Copyright 2005 TEMENOS HEADQUARTERS S5A5
Workshop 3
Copyright 2005 TEMENOS HEADQUARTERS S5A6
Example 4
Amend example 3 to store the extracted all the customer Ids, their mnemonics and nationalities in a dynamic array in the following
format
CusId*Mnemonic*NationalityFMCusId*Mnemonic*Nationality
Copyright 2005 TEMENOS HEADQUARTERS S5A7
Algorithm
Step 1. Open the Customer File Step 2. Select all the customer ids
Step 3. Remove one customer id from the selected list Step 4. For the extracted customer id extract the
corresponding record from the customer file
Step 5. From the extracted record extract the mnemonic and nationality
Algorithm
Step 6. Store the customer id, mnemonic and the nationality in a dynamic array
Repeat Steps 3 to 6 for all customers
Copyright 2005 TEMENOS HEADQUARTERS S5A9
Append Data In An Array
ARRAY<-1> = NewValue
ARRAY<-1> = Y.CUS.ID:’*’:Y.MNEMONIC:’*’:Y.NATIONALITY
Append Data In An Array (Cont.)
What if an array delimited with VM’s need to formed? ARRAY<1,-1> = Value
What if an array delimited with SM’s need to be formed? ARRAY<1,1,-1> = Value
Copyright 2005 TEMENOS HEADQUARTERS S6A1
Solution 4
*Subroutine to store the id, mnemonic and nationality of all *customers in an array SUBROUTINE CUS.DISPLAY.DETAILS $INSERT I_COMMON $INSERT I_EQUATE $INSERT I_F.CUSTOMER GOSUB INIT GOSUB OPENFILES GOSUB PROCESS RETURN INIT: FN.CUS = 'F.CUSTOMER' F.CUS = '' Y.CUS.ID = '‘ R.CUSTOMER = '' CUS.ERR1 = '' Y.MNEMONIC = '' Y.NATIONALITY = '' SEL.CMD = '' SEL.LIST = '' NO.OF.REC = 0 RET.CODE = '' CUS.DETAILS.ARRAY = '' RETURN Copyright 2005 TEMENOS
Solution 4 (Cont.) OPENFILES:
CALL OPF(FN.CUS,F.CUS) RETURN
PROCESS:
SEL.CMD = "SELECT ":FN.CUS
CALL EB.READLIST(SEL.CMD,SEL.LIST,'',NO.OF.REC,RET.CODE) LOOP
REMOVE Y.CUS.ID FROM SEL.LIST SETTING POS WHILE Y.CUS.ID:POS CALL F.READ(FN.CUS,Y.CUS.ID,R.CUSTOMER,F.CUS,CUS.ERR1) Y.MNEMONIC = R.CUSTOMER<EB.CUS.MNEMONIC> Y.NATIONALITY = R.CUSTOMER<EB.CUS.NATIONALITY> CUS.DETAILS.ARRAY<-1> = Y.CUS.ID:'*':Y.MNEMONIC:'*':Y.NATIONALITY REPEAT RETURN END Copyright 2005 TEMENOS HEADQUARTERS S6A3
Solution 4
Add a DEBUG statement in the routine
Compile and catalog the routine
Make an entry in the PGM.FILE with the type set to ‘M’.
Execute the routine from the command line.
Are there better ways to read data from a file?
CACHE.READ
Used to read data from the cache.
– It checks if the record is in cache – If yes, retrieves it from the cache
– Else, does a OPF and F.READ to fetch the record and loads it in the cache
– Will not pick up records from cache if they are more than <SPF->CACHE.EXPIRY> seconds old.
Copyright 2005 TEMENOS HEADQUARTERS S8A1
Doesn’t F.READ also perform a similar operation? When should I use CACHE.READ ?
Use CACHE.READ when
– The record that you retrieve will not be frequently updated – Best used for retrieving parameter records
– It is faster than F.READ as it does not require a call to OPF.
• Only when the record is not available in cache, it will perform
an OPF Copyright 2005 TEMENOS
CACHE.READ (Cont.)
CACHE.READ(FileName,ID,Record,Error) FILENAME = Name of file - without the mnemonic
(Example : F.CUSTOMER) ID = Valid values are
ID of a record
‘SelectIDs‘ (List of Ids from the ‘FileName’)
‘SSelectIDs’ (List of sorted Ids)
‘SSelectARs’ (List of sorted Ids in ascending order right justified)
Record = Data returned
Error = RECORD NOT FOUND for example
Copyright 2005 TEMENOS HEADQUARTERS S8A3
CACHE.READ (Cont.)
When
ID is passed to CACHE.READ
– Check if it exists in cache else will read from disk and load
it to cache
If ‘SelectIDs’ is passed to CACHE.READ
– Perform a call to EB.READLIST. Since there are no
conditions and it is not a sorted select, an internal selected will be
executed
If ‘SSelectedID’ or ‘SSelectARs’ is passed