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

Infobasic Programming

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
T24 Creation of functions and routines with arguments

T2BTT R06 1.0

Copyright 2005 TEMENOS HEADQUARTERS SA2

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

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
likely to change

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
254
253
252

Description
Field Marker
Value Marker
Sub-Value Marker

Sample Record From The TEMENOS.TRG


1 Name

TemenosTrg

2.1 Address

India

2.2 Address

UK

2.3 Address

Geneva

3.1 Course Category

Technical

4.1.1 Course Name

jBASE

4.1.2 Course Name

T24

3.2 Course Category

Functional

4.2.1 Course Name

Lending

4.2.2 Course Name

Financials

5 Free Text
6 Inputter

TRAINER.1

How will this record get stored in a dynamic array?

Storage In A Dynamic Array

TemenosTrgFMIndiaVMUKVMGenevaFMTechnicalVMFunctionalFM
jBASESMT24VMLendingSMFinancialsFMFMTrainer.1
Copyright 2005 TEMENOS
HEADQUARTERS S1A0

T2BTT R06 1.0

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
PROGRAM <Programname>
Statement 1
Statement 2
Statement 3
END
Copyright 2005 TEMENOS
HEADQUARTERS S1A3

*Comments
SUBROUTINE <Subroutinename>
Statement 1
Statement 2
Statement 3
RETURN
END

Compiling And Cataloguing Routines


EB.COMPILE TRG.BP TRG.RTN1

COMPILE

CATALOG

Check for errors

Check JBCDEV_LIB

Error Exit
No Error

JBCDEV_LIB
= $HOME/lib

Produce object code


$TRG.RTN1

$HOME/lib
TRG.BP
$TRG.RTN1

Copyright 2005 TEMENOS

Is there place
here
lib.so.1
Is there place
here
lib.so.2
HEADQUARTERS S1A4

Compiling And Cataloguing Programs


EB.COMPILE TRG.BP TRG.PRG1

COMPILE

CATALOG
Check JBCDEV_BIN

Check for errors


Error Exit
No Error

JBCDEV_BIN
= $HOME/bin

Produce executable
$TRG.PRG1

Copyright 2005 TEMENOS


HEADQUARTERS S1A5

TRG.BP

$HOME/bin

$TRG.PRG1

TRG.PRG1

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
Copyright 2005 TEMENOS

HEADQUARTERS S1A6

Executing Programs
Go to the
database prompt
jsh..> TRG.PRG1

PATH =
.;$HOME/globusbin;$HOME/bin;$PATH

Execute the
program
Copyright 2005 TEMENOS

HEADQUARTERS S1A7

Writing A Simple Infobasic Program

Program to display Hello World


JED TRG.BP HELLO
PROGRAM HELLO
CRT Hello World
END
Copyright 2005 TEMENOS
HEADQUARTERS S1A8

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

Copyright 2005 TEMENOS


HEADQUARTERS S2A2

FOR

FOR <variable> = <initialvalue> TO <maximumvalue>


<statements>
NEXT <variablename>

Copyright 2005 TEMENOS


HEADQUARTERS S2A3

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

Copyright 2005 TEMENOS


HEADQUARTERS S2A4

Built In Infobasic Functions

LEN(e)
COUNT(e,d)

Length 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

CHANGE(e,d,c)

Change occurrences of d to c in e

OCONV(e,d)

Convert 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
HEADQUARTERS S2A6

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
Copyright 2005 TEMENOS

HEADQUARTERS S2A7

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.
Copyright 2005 TEMENOS
HEADQUARTERS S3A0

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
CALL F.READ(1,2,3,4,5)
1 - File name
2 - ID of the record to be read
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.
Copyright 2005 TEMENOS
HEADQUARTERS S3A2

Record Returned By F.READ

Contents of R.CUSTOMER
DAOHENGBKDAO HENG BANK INCDAO HENG BANK INC119 ASIAN MANSION 209
DELA ROSA ST LEGASPI VILLAGE MAKATI CITY MAN PH 1111
908100999PH4 PH 20000101 20000101
1118_RICKBANAT128_ANDREABARNES1000612104218_RI
CKBANAT1US00100011
Copyright 2005 TEMENOS
HEADQUARTERS S3A3

Extract Values

R.CUSTOMER<1>
R.CUSTOMER<15>
What happens after an upgrade?
Copyright 2005 TEMENOS
HEADQUARTERS S3A4

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
HEADQUARTERS S3A6

Display Parts Of A Record(Cont.)

Copyright 2005 TEMENOS


HEADQUARTERS S3A7

CRT Customer Id: :Y.CUS.ID


CRT Customer Mnemonic: :Y.MNEMONIC
CRT Customer Nationality: :Y.NATIONALITY

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
HEADQUARTERS S3A8

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.


Copyright 2005 TEMENOS
HEADQUARTERS S4A0

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'
Copyright 2005 TEMENOS
HEADQUARTERS S4A2

Workshop 2
Copyright 2005 TEMENOS
HEADQUARTERS S4A3

Example 3

Modify example 2 to display the mnemonic and nationality of all the


customers
Copyright 2005 TEMENOS
HEADQUARTERS S4A4

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
Copyright 2005 TEMENOS

HEADQUARTERS S4A5

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
Copyright 2005 TEMENOS
HEADQUARTERS S4A6

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.)

Copyright 2005 TEMENOS


HEADQUARTERS S4A8

CALL EB.READLIST(SEL.CMD,SEL.LIST,,NO.OF.REC,RET.CODE)

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
Copyright 2005 TEMENOS
HEADQUARTERS S5A0

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
Copyright 2005 TEMENOS
HEADQUARTERS S5A2

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

Copyright 2005 TEMENOS


HEADQUARTERS S5A4

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

Copyright 2005 TEMENOS


HEADQUARTERS S5A8

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
Copyright 2005 TEMENOS
HEADQUARTERS S6A0

Append Data In An Array (Cont.)

What if an array delimited with VMs need to formed?


ARRAY<1,-1> = Value
What if an array delimited with SMs 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
HEADQUARTERS S6A2

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.
Copyright 2005 TEMENOS
HEADQUARTERS S6A4

Workshop 4

Are there better ways to read data from a file?


Copyright 2005 TEMENOS
HEADQUARTERS S8A0

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

Doesnt 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
HEADQUARTERS S8A2

CACHE.READ (Cont.)

CACHE.READ(FileName,ID,Record,Error)
FILENAME
ID

Record
Error
Copyright 2005 TEMENOS
HEADQUARTERS S8A3

= Name of file - without the mnemonic


(Example : F.CUSTOMER)
= 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)
= Data returned
= RECORD NOT FOUND for example

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


Perform a call to EB.READLIST. Since it is sorted select,
will actually select the file