Site

Globus


Utilisation des champs d'une table

Tous les champs des tables sont numérotés, avec une description associée. Cette assocation se définit dans les librairies chargées par les programmes qui se présentent sous la forme "I_F.filename". Ce type de librairie constitue donc un ensemble de tables d'équivalence entre des n° et des noms de champs.

Exemple pour la table Money Market :

  • File Layout for MM.MONEY.MARKET
  • PREFIX[MM.] SUFFIX[]
    EQU MM.CUSTOMER.ID TO 1,     MM.CURRENCY TO 2, 
    MM.PRINCIPAL TO 3,           MM.DEAL.DATE TO 4, 
    MM.VALUE.DATE TO 5,          MM.MATURITY.DATE TO 6, 
    MM.CATEGORY TO 7,            MM.INT.RATE.TYPE TO 8, 
    MM.INTEREST.BASIS TO 9,      MM.INTEREST.RATE TO 10, 
    MM.INTEREST.KEY TO 11,       MM.INTEREST.SPREAD.1 TO 12, 
    MM.FIRST.DAY.ACCRUAL TO 13,  MM.TOT.INTEREST.AMT TO 14, 
    MM.INT.DUE.DATE TO 15,       MM.LIQ.DEFER.INTEREST TO 16, 
    MM.BROKER.CODE TO 17,        MM.BROKERAGE TO 18, 
    MM.BROKER.CCY TO 19,         MM.BROKER.AMOUNT TO 20, 
    MM.OUR.REMARKS TO 21,        MM.DRAWDOWN.ACCOUNT TO 22, 

(...)

Dans les programmes, un fois ces bibliothèques chargées on ne manipule plus que des noms de champs. Ainsi après des releases Globus, même si des champs sont "déplacés" i.e. le numéro associé est différent, les bibliothèques permettent de maintenir l'intégrité des équivalences.

  • Pour consulter les mapping entre numéros & noms de champ d'une table:

JED BP I_F.filename

  • Pour récupérer le contenu d'un champ single value :

R.DX.TRADE<DX.TRA.CONTRACT.CODE>

  • Pour un champ sub-valued :

FEES.CCY = R.DX.TRADE<DX.TRA.PRI.COMM.CCY,YY,ZZ>

  • Pour compter le nombre d'occurences d'un SET de multivalues :

NO.CUSTS = COUNT(R.DX.TRADE<DX.TRA.PRI.CUST.NO>,VM)+1 => compte le nombre de délimiteur VM dans la chaine 'R.DX.TRADE<DX.TRA.PRI.CUST.NO>' ou NO.CUSTS = DCOUNT(FEES.AMT,@SM) => compte le nombre de champs séparés par le délimiteur @SM

top

Récupérer un champ d'une table

CALL DBR("TABLE_NAME":@FM:FIELD.NAME,KEY,Y.OUTPUT)

Avec

TABLE_NAME"Nom de la table
@FMséparateur
FIELD.NAMEnom du champs à récupérer
KEYclé à passer pour identifier le record à récupérer
Y.OUTPUTvariable contenant le champs en retour


Exemple :

- object : récupérer le sens BUY/SELL sur un transaction sur dérivés.
- contexte : routine attachée au DE.MAPPING, donc qui exploite les données du HANDOFF standard et les enrichit.

$INSERT I_F.DX.TRANSACTION
Y.VAR = HANDOFF.REC(5)<1,36,1>  ;* clé 
Y.OUTPUT = "" ;* contenu du champ en sortie
CALL DBR("DX.TRANSACTION":@FM:DX.TX.BUY.SELL,Y.VAR,Y.OUTPUT)
IF (Y.OUTPUT = "BUY")
... 

Détails techniques :

SUBROUTINE DBR (CHECKFILE1,I1,ENRI2)

Incoming:

  • CHECKFILE1 = argument array
  • Field 1 = file name (without 'F.')
  • Field 2 = field number
  • Field 3 = miscellanous arguments (delimiter = '.')
        a) ""
            or 'L' = take value field in accordance to language
            or 'F' = take full field
        b) not used
        c) not used
        d) delimiter argument, e.g. 'YM'
        e) ignore error. If set then ETEXT is not set.
  • Field 4-6 = next squence, etc.
  • I1 = ID (for first checkfile)
  • ENRI2 = only used for passing Outgoing

Outgoing: ENRI2 = field content (or last definition)

Remarque : un message d'erreur est produit si le CALL DBR ne ramène rien. Il est possible de retraiter ce message : "IF (ETEXT) THEN", "ETEXT = ''",...

top

Récupérer un record entier, puis en extraire certains champs :

CALL OPF(YNAME.IN, YNAME.OUT)

 avec 
 * YNAME.IN  : nom de la table
 * YNAME.OUT : nom du record 

puis

CALL F.READ(FILEID, KEY, RECORD,F.FILEID, ER)

avec

  • FILEID : nom de la table
  • KEY : record-id
  • REC : record retourné
  • F.FILEID : variable de la table
  • Return_code : returning error message

Option pour éviter un message d'erreur pouvant faire planter le batch :

FN.FILENAME = 'F.FILENAME':FM:'NO.FATAL.ERROR'

Exemple :

 *  Open and read Contract details
FN.CONTRACT.MASTER = "F.DX.CONTRACT.MASTER"
F.CONTRACT.MASTER = ''
CALL OPF(FN.CONTRACT.MASTER, F.CONTRACT.MASTER)

CONTR.ID = CONTRACT.NO
R.CONTRACT = ''
CALL F.READ(FN.CONTRACT.MASTER, CONTR.ID, R.CONTRACT, F.CONTRACT.MASTER, ETEXT)
IF ETEXT THEN
  ER = ETEXT
END

Ensuite, on traite tous les champs avec :

 R.CONTRACT<champs>

Exemple :

 IF R.CONTRACT<DX.CM.MATURITY.TYPE> = "MONTHLY" THEN...

Détails techniques :

 Incoming: YNAME.IN = Field 1 = Name of file may be 
  a) final name or b) must be enriched by company abbreviation
                    = Field 2 = "" or 'NO.FATAL.ERROR' (it's possible that file does not exist
                    = return with ETEXT)
           YNAME.OUT = "" or any char.

           R.COMPANY(3)                   ; * current mnemonic
           OPF.NO
           R.OPF
           T.OPF

 Outgoing: YNAME.IN = Name may be enriched by company abbreviation
           YNAME.OUT = File specification to be used for READ ... FROM, WRITE ... TO, etc.
                     = unchanged value 'NO.FATAL.ERROR.PARA' when file not available

           ETEXT = ""
                 = 'MISSING FILE' in case of incoming YNAME.IN was
                   'NO.FATAL.ERROR.PARA'


      CALL F.READ(FILEID, KEY, RECORD,F.FILEID, ER)
 Subroutine to read a record from a designated file
 FILEID   = file name
 KEY      = record-id
 REC      = record returned
 F.FILEID = file variable
 ER       = returning error message

top

Extraire un ensemble de clés après un CALL OPF

Y.DATE = TODAY
READ R.DX.DAILY.TRANS FROM F.DX.DAILY.TRANS,Y.DATE 
ELSE R.DX.DAILY.TRANS = ""
Y.DX.NUM = DCOUNT(R.DX.DAILY.TRANS,@FM)
  • Avec une boucle FOR...NEXT :
FOR I = 1 TO Y.DX.NUM
   Y.DX.ID = R.DX.DAILY.TRANS<I>["*",1,1]
   Y.DX.REV = R.DX.DAILY.TRANS<I>["*",2,1]
NEXT I
  • Ou avec une boucle LOOP REPEAT
LOOP

   REMOVE Y.DX.ID FROM R.DX.DAILY.TRANS SETTING TAG

WHILE Y.DX.ITEM:TAG

   Y.DX.REV = Y.DX.ID["*",2,1]

   Y.DX.ID = Y.DX.ID["*",1,1]

REPEAT

Infos complémentaires

En utilisant :

REMOVE variable FROM array SETTING setvar

La variable 'setvar' indique le type de séparateur rencontré lors de l'extraction des variables dans l'array :

valeurindication
0end of the array
1ASCII 255
2ASCII 254=FM
3ASCII 253=VM
4ASCII 252=SM
5ASCII 251
6ASCII 250
7ASCII 249
  • en gras les codes les plus fréquents

top

Retourner une liste de clés après un SELECT

CALL EB.READLIST (SELECT.STATEMENT, KEY.LIST, LIST.NAME, SELECTED, SYSTEM.RETURN.CODE)

Routine to return a list of keys from a select statement. Introduced to cater for a change of syntax in the READLIST statement from rev 5 to rev 6. The routine allows both versions of the syntax.

ParameterDescription
SELECT.STATEMENTExecute statement (optional - select can be active)
KEY.LISTId list returned, null if error
LIST.NAMEUsed as part of SAVE.LIST id
SELECTEDNumber of records selected
SYSTEM.RETURN.CODE@SYSTEM.RETURN.CODE after select statement


Exemple :

SELECTED.FILE = "F":MNEMO.COMPANY:".":"DX.ITEM.STATUS"
CMND = 'SELECT ' : SELECTED.FILE :' WITH CURR.APPLICATION = "DX.ORDER" AND CURR.STATUS = "FLL" '
CALL EB.READLIST(CMND,KEY.LIST,'',SELECTED,SYSTEM.RET.CODE)

Ceci remplit la variable KEY.LIST avec toutes les clés résultant du SELECT
top

même option avec un QSELECT

Le CALL EB.READLIST fonctionne également après un QSELECT. L'intérêt du QSELECT est qu'il sélectionne tous les champs d'une table, pas uniquement les clés (@ID) contrairement au SELECT. Ceci est particulièrement utile pour lire un CONCAT.FILE, dans lequel chaque enregistrement (@RECORD)ne contient généralement qu'un seul champ.

Exemple de CONCAT.FILE:

LIST FBNK.DX.ORD.VERSION.NO @RECORD

@ID................................ @RECORD.......................

                    DXORD0931005013    DXORD0931005013-0             
                    DXORD0931005016    DXORD0931005016-1             
                    DXORD0931005019    DXORD0931005019-0             
                    DXORD0931005009    DXORD0931005009-0             
                    DXORD0931005010    DXORD0931005010-0             
                    DXORD0931005011    DXORD0931005011-1             
                    DXORD0931005033    DXORD0931005033-0             
                    DXORD0931005034    DXORD0931005034-0             

Exemple :

SELECTED.FILE = "F":MNEMO.COMPANY:".":"DX.ORD.VERSION.NO"
CMND = 'QSELECT ' : SELECTED.FILE : ' *'
CALL EB.READLIST(CMND,KEY.LIST,'',SELECTED,SYSTEM.RET.CODE)
REMOVE DXO.KEY.FULL FROM KEY.LIST SETTING MORE

Ceci remplit la variable KEY.LIST avec tous les champs des clés sélectionnées par le QSELECT.
top

Formatage de Date

CALL DIETER.DATE(DATE.IN,DATE.OUT,'D')

Exemple :

ORD.DATE = R.DXO<DX.ORD.TRADE.DATE>
(par exemple = '20091106')
ORDER.DATE = ''
IF (ORD.DATE) THEN CALL DIETER.DATE(ORD.DATE,ORDER.DATE,'D')
=> donnera ORDER.DATE = '06 NOV 2009'

top

DEBUGGER

2 manières d'invoquer le debugger:

  1. déclencher le debugger quand un programne est appelé et atteint une ligne identifiée :

lancer une commande de "Break" (ou Shift + Backspace si le break est désactivé) puis indiquer :
B + no de ligne, nom du programme'
Le no de ligne doit correspondre à une ligne d'instruction (pas une ligne de commentaire !). Le debugger enregistre alors le point d'arrêt à appliquer.
Taper '"C"' pour continuer et quitter le debugger.
Exécuter ensuite les actions voulues dans Globus, si le programme spécifié est invoqué et passe par la ligne avec point d'arrêt, le mode debug sera activé.

Exemple :

 b 127,MM.MONEY.MARKET

va lancer le debugger sur le programme "MM.MONEY.MARKET" st stoppera sur la ligne 127.

  1. ajouter "DEBUG" directement dans un programme.

Instructions les plus courantes:
P : définit le chemin d'accès (path) au source; utile quand les n° de lignes debug/source ne coïncident pas. Exemple "P BPT"
S : passe à la ligne d'instruction suivante.
s : passe à la ligne d'instruction suivante + entre dans les appells type CALL / GOSUB.
C : continue l'exécution du programme.
V : <variable> : afficher le contenu d'une variable.
W : montre où on est dans le programme (ligne courante +/- 5 lignes).
J -G : montre tout le contexte des programmes invoqués, appelés, etc...
B : afficher les points d'arrêt.
D pour détruire les points d'arrêts créés(ou pour sortir d'un loop).

Affichage des séparateurs :

sépar.sous debuggeravec un CRT
FM^? à l'envers
VM]ÿ
SM\à tester
 More resources on Jbase Debugger:

offical Jbase materials

top

Editor

Après un SELECT + EDIT, pour sortir immédiatement de l'éditeur :
Escape
!EXK + Return
Escape
EXK + Return
top

Script Designer

List of available objects that can be used in the Globus Desktop SCRIPT.DESIGNER:

1. In Excel open the VB Editor
2. In "Tools", open "References"
3. Select the "Globus Desktop" Reference
4. In View, open the "Object Browser"
5. In the Library drop list, select "Desktop"
=> You get the list of all objects & classes, with a short description of the syntax

InvokeRoutine Function

Execute a Globus Routine. {code} InvokeRoutine (RoutineName As String, ParamArray Parameters() As Variant) As String {code}
Arguments

 *RoutineName*  Required

 *ParamArray*   Optional, depends on the arguments needed by the Globus Routine. All routine's parameters (arguments) must be separated with a coma. Note that a maximum of 4 arguments can be used.

Remarks

The following example uses the *InvokeRoutine* function to call the routine SS.DX.DATE.CALC, transmitting 4 arguments:

Dim sRegion
Dim sMat
Dim sCode
Dim sResultat
Dim sRtn
Dim sParamD
Dim sRet
Dim sYYYY
Dim sMM
Dim sDD
Dim sCalc
Dim Slash

Slash = "/"
sRegion = desktop.InputBox("Please enter Region: (ex. : US02)")
sMat = desktop.InputBox("Please enter Maturity: (ex. : 200912)")
sCode = desktop.InputBox("Please enter Maturity Code: (ex. : LBD,-3FR)")

sRtn = "SS.DX.DATE.CALC"
sResultat = ""

sRet = Desktop.InvokeRoutine(sRtn, sResultat, sRegion, sMat, sCode)

sRet = Left(sRet,8)
sYYYY = Left(sRet,4)
sMM = Mid(sRet,5,2)
sDD = Right(sRet,2)
sCalc = sDD & Slash & sMM & Slash & sYYYY
MsgBox sCalc,VbInformation,"Computed Date"

Note that the Globus Routine looks like:

SUBROUTINE SS.DX.DATE.CALC(RESULTAT, REGION.ID, MAT.DATE, DFORMULA)

top

Resizer une table

  • Laisser Jbase analyser automatiquement une table :

jrf -R FBNK.SEC.TRADE

  • Laisser Jbase appliquer son analyse :

jrf -V FBNK.SEC.TRADE

  • Forcer un resize avec un autre modulo/separateur (m) (les 2 notions étaient distinctes avec Universe, plus avec Jbase) :

jrf -V Sm -D FBNK.SEC.TRADE

top

Copier les clés d'un SELECT vers 1 fichier

>SELECT F.XXX WITH YYY
>XYZ RECORDS SELECTED
>SAVE.LIST POPO

Le fichier est créé dans bnk.run/&SAVEDLIST&/POPO

top

"black belt" LIST command

SQL: select left(value_date,6), count(*) from security_transfer where broker_no = '595701'and transaction_type like 'F%' and value_date like '2010%' group by left(value_date,6)

JBASE translation>LIST FBNK.SECURITY.TRANSFER EVAL '"1"' AS NB BREAK.ON EVAL 'VALUE.DATE[1,6]' AS DATE TOTAL NB WITH DATE LIKE "2010..." AND BROKER.NO EQ "595701" AND TRANSACTION.TYPE LIKE "F..." BY DATE ID.SUP DET.SUP

top


Modifier le Handoff

Le nom physique du handoff est F.DE.O.HANDOFF. Pas très utile d'éditer ce fichier sous Jbase.Utiliser plutôt l'enquiry "DE.HANDOFF.DETS" qui montre tout le contenu du handoff en lui passant la référence du message produit (i.e. la clé de DOH). Le Handoff est organisé en 9 sections (records). Chaque section est dédiée à un aspect particluier de l'application concernée.
Achtung: La handoff est appelé par chaque programme de transaction: ceci implique qu'en cas de modification du handoff, il faut impérativement ressaisir une nouvelle transaction pour en voir l'effet.

  • Modifier le Handoff

Ceci s'effectue à l'aide d'une subroutine, en la déclarant dans DE.MAPPING concerné par le message/application. Le champ dédié à ça est le 16 ROUTINE.
Procédure:

  1. Paramètres à passer + libraries minimum requises:
SUBROUTINE XXXXXX(MAT HANDOFF.REC, ERR.MSG)
$INSERT I_COMMON \\
$INSERT I_EQUATE \\
$INSERT I_DEOCOM \\
  1. Alimentation des champs locaux en utilisant la syntaxe suivante:
 HANDOFF.REC(9)<1,1> = "nimportenaouak"

alimentera le champ 9.1.1 avec le contenu de la variable nimportenaouak.

  1. Ensuite dans DE.MAPPING on peut ajouter ce champ 9.1.1:
5.xx INPUT.POSITION. 9.1.1 \\
7.xx. 1 FIELD.DESCR. MON.PREMIER.CHAMP.LOCAL \\
8.xx FIELD.NAME..... MON.PREMIER.CHAMP.LOCAL \\

top

  • Debugging le handoff

Le mapping est lancé en mode phantom avec DE.PHANTOM DE.O.SELECT.NEXT.MESSAGE Si on a besoin de debugger online, lancer en online: DE.O.SELECT.NEXT.MESSAGE.

top

Modifier l'enrichissmenent standard d'un champ

STANDARD.SELECTION

Créer un I-desc qui contient l'enrichissment modifié
DX.CONTRACT.MASTER
15. 5 USR.FIELD.NAME. SHORT.NAME.SIZE

 16. 5 USR.TYPE....... I
 17. 5. 1 USR.FIELD.NO SHORT.NAME;
 17. 5. 2 USR.FIELD.NO CONTRACT.SIZE;
 17. 5. 3 USR.FIELD.NO @1:" - Contract Size: ":@2
 20. 5 USR.DISPLAY.FMT 50L
 24. 5 USR.SINGLE.MULT S

Créer une subroutine pour modifier l'enrichissement Exemple :

SUBROUTINE V.DXT.CONT.SIZE
$INSERT I_F.DX.CONTRACT.MASTER
 CHECKFILE(DX.TRA.CONTRACT.CODE) = 'DX.CONTRACT.MASTER':FM:'SHORT.NAME.SIZE'
  1. Attacher cette routine dans le champ 75 :

VERSION DX.TRADE,FUT.INP 75. 1 CHECK.REC.RTN.. @V.DXT.CONT.SIZE

Ce qui donne dans la version :

 Contract..... 10309        SMI FUTURE - Contract Size: 10       

top

JBase Programmer's Guides

Programmers_Reference_Manual.pdf:

 

Advanced Programmers Reference Manual.pdf :

 

top

Local Ref table @ EFG

When a new local element has to be used in a routine:

  1. . Create a local element in LOCAL.TABLE then assign it in a Globus application with LOCAL.REF.TABLE.
  2. . Create a variable equivalent in I_EFG.LOCAL.REF
  3. . Set this variable with its position in LOCAL.REF.TABLE through the various Globus companies in EFG.LRF.INIT.NEW

Full Example:

1.LOCAL.TABLE + LOCAL.REF.TABLE

      LOCAL.TABLE SEE

    TABLE.NO.......... 722

  1. 1 GB DESCRIPTION. MAIL.ADDRESS
  2. 1 GB SHORT.NAME.. MAIL.ADDRESS
  3 MAXIMUM.CHAR...... 65
  5 CHAR.TYPE......... MAIL

			LOCAL.REF.TABLE SEE

    APPLICATION....... DX.ORDER            DX ORDER

  1. 1 LOCAL.TABLE.NO. 761                 DEAL.TYPE
  1. 2 LOCAL.TABLE.NO. 762                 SENT.TO.TRADER
  1. 3 LOCAL.TABLE.NO. 208                 ORDER.ORIGIN
  1. 4 LOCAL.TABLE.NO. 515                 ORIGIN.COMMENT
  1. 5 LOCAL.TABLE.NO. 2074                SPECIAL.FEES
  1. 6 LOCAL.TABLE.NO. 2044                SOO.EXT.REF
  1. 7 LOCAL.TABLE.NO. 790                 EFG EXT CUST
  1. 8 LOCAL.TABLE.NO. 2067                EFG.EXT.SAM
  1. 9 LOCAL.TABLE.NO. 2122                COMM.FORMAT
  1.10 LOCAL.TABLE.NO. 2123                COMM.AMOUNT
  1.11 LOCAL.TABLE.NO. 722                 MAIL.ADDRESS

2. I_EFG.LOCAL.REF

WARNING: NEVER CREATE A NEW LINE IN THIS LIBRARY, NEVER! You can just re-use existing lines which have not been used yet such as "xxxRESERVEDxxx". The idea is to take a free block of available variables, never to add new ones.

Example:

  • DX.ORDER
    EFG.LRF.DXO.MAIL.ADDRESS,		* this variable is now declared for DX.ORDER purpose
    EFG.LRF.DXO.COMM.FORMAT,		* this variable is now declared for DX.ORDER purpose
    EFG.LRF.DXO.COMM.AMOUNT,		* this variable is now declared for DX.ORDER purpose
    EFG.LRF.DXO.RESERVED.043,   * this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.044,		* this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.045,		* this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.046,		* this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.047,		* this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.048,		* this line is now "allocated to DXO but will be really assigned later.
    EFG.LRF.DXO.RESERVED.049,		* this line is now "allocated to DXO but will be really assigned later.

3. EFG.LRF.INIT.NEW

Two updates have to be done here:

	a) Set the position of the local.ref.table for all companies to a local variable regarding the element created in step 1
	b) Assign the value of this to the global variable as defined in step 2

Example:

  • DX.ORDER
    EFG.LRF.ALL.DXO.COMM.FORMAT =  9: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999
    EFG.LRF.ALL.DXO.COMM.AMOUNT =  10: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999
    EFG.LRF.ALL.DXO.MAIL.ADDRESS = 11: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999: VM :999
  • DX.ORDER
    EFG.LRF.DXO.MAIL.ADDRESS = EFG.LRF.ALL.DXO.MAIL.ADDRESS<1,EFG.RNG.COMPANY>
    EFG.LRF.DXO.COMM.FORMAT = EFG.LRF.ALL.DXO.COMM.FORMAT<1,EFG.RNG.COMPANY>
    EFG.LRF.DXO.COMM.AMOUNT = EFG.LRF.ALL.DXO.COMM.AMOUNT<1,EFG.RNG.COMPANY>

Utilization in a subroutine :

Exemple 1 :

    
$INSERT I_EFG.LOCAL.REF

 IF R.NEW(SC.SOO.LOCAL.REF)<1,EFG.LRF.SOO.OMS.STATUS> MATCHES "NEW":VM:"ACK" THEN ...

Exemple 2 :

    
 $INSERT I_EFG.LOCAL.REF
 NPV.DEALER.DESK = R$SWAP.PARAMETER<SW.PARAM.LOCAL.REF,EFG.LRF.SWPARAM.NPV.DD> 
 CALL CACHE.READ('F.DEALER.DESK',NPV.DEALER.DESK,R.DEALER.DESK,"") 

top

Script launching an URL from a version

Example of SCRIPT Designer : LOAD.DX.LINK

    
Dim sAppName
Dim MyCommand
Set oApp = Desktop.GetCurrentWindow
sID = oApp.ID
Select Case sID
  Case "10305"
    MyCommand = "http://www.euronext.com/trader/contractspecifications/wide/contractSpecifications-3503-EN.html?docid=47403"
  Case "12014"
    MyCommand = "http://cfe.cboe.com/Products/Spec_VIX.aspx"
End Select
call desktop.Sexecute(MyCommand)

Then in VERSION :

 13.15 FIELD.NO....... *
 16.15 TEXT.CHAR.MAX.. 13
 17.15. 1 TEXT........ Contract Link
 23.15 TABLE.LINE..... 9
 37.15 HYPE SPT LOAD.DX.LINK

top

Faire un CALL dans un I-descriptor

Le premier argument attendu dans un I-descriptor est le paramètre de retour, donc il ne faut pas l'indiquer. Exemple d'une routine avec les paramètres suivants :

SUBROUTINE DX.GET.CONTRACT.DATES(RETURN.DATE, CONTRACT.CODE, MAT.PERIOD, DATE.TO.RETURN, RETURN.CODE)

Dans le I-descriptor, le paramètre RETURN.DATE sera à ommettre.

Ce qui donnera :

 15. 4 USR.FIELD.NAME. FIRST.NOTICE
 16. 4 USR.TYPE....... I
 17. 4. 1 USR.FIELD.NO CONTRACT;
 17. 4. 2 USR.FIELD.NO SUBR("BDD.TRANS","DX.CONTRACT.MASTER"
 17. 4. 3 USR.FIELD.NO ,@1,"FIRST.NOTICE");
 17. 4. 4 USR.FIELD.NO MATURITY.DATE;
 17. 4. 5 USR.FIELD.NO "FIRST.NOTICE";
 17. 4. 6 USR.FIELD.NO SUBR("DX.GET.CONTRACT.DATES",@1,@3,@4,"");
 17. 4. 7 USR.FIELD.NO IF @2 NE "" THEN @5 ELSE ""

top

Enquiry: tips & tricks

Détails techniques :

    
 12. 7. 1 OPERATION... INPUTTER
 13. 7 COLUMN......... 52
 14. 7 LENGTH.MASK.... 28L
 15. 7. 1 CONVERSION.. V 1
 15. 7. 2 CONVERSION.. F _,2

Formattage de date ex. " :

    
 12. 3. 1 OPERATION... DATE.TIME
 13. 3 COLUMN......... 35
 14. 3 LENGTH.MASK.... 10L
 15. 3. 1 CONVERSION.. E 1,6
 15. 3. 2 CONVERSION.. I D
 15. 3. 3 CONVERSION.. O D2/E

top

Afficher un message et stocker un override si un user l'outrepasse

   IF (SUM(R.NEW(SC.ESO.NOMINAL.RECD)) > SUM(R.NEW(SC.ESO.NOMINAL.BALANCE))) THEN
      OUT.TEXT = 'NOMINAL GREATER THAN THE ORDER'
      TEXT     = OUT.TEXT
      CURR.NO  = R.NEW(SC.ESO.CURR.NO)
      CALL STORE.OVERRIDE(CURR.NO)
      IF TEXT = 'NO' THEN
         ETEXT = OUT.TEXT
         CALL STORE.END.ERROR
      END
   END

top

Créer une nouvelle application depuis un TEMPLATE standard

Exemple de Template pour EFG.DX.CLOSEOUT

Etapes :
=======
a. Créer le programme tel que ci dessous
b. Compiler en mettant le I_F. de la nouvelle applic. en remarque.
c. Logoff
d. EFG.CALL FILE.LAYOUT -FILE BPT
-> indiquer le nom de l'application'
-> préciser le code du suffixe à utiliser dans le I_
e. Recompiler en incluant le I_F. de la nouvelle applic.
f. Créer un PGM.FILE - ici type = H (maintains three files- the unauthorised, live and history file)
g. Créer un FILE.CONTROL (type "FIN" avec 2 suffixes $NAU & $HIS)
h. CREATE.FILES pour chaque company.
i. STANDARD.SELECTION : créer le record + champs 28 = Yes pour rebuild system fields
top

Checker les queues d'impression @EFG

EFG.JOB.CONTROL,ALL L

top

Lancer un équivalent de SELECT avec JOIN

SELECT xxxx
SAVE.LIST xx
SELECT yyyy
SAVE.LIST yy
GET.LIST xx TO 1
GET.LIST yy TO 2
BDD.MERGE.LIST 1 INTERSECTION 2
SAVE.LIST RES

top\\