REXX Tips & Tricks:Miscellaneous: Difference between revisions
| Line 212: | Line 212: | ||
|7||cursor wrap off (7l) or on (7h) | |7||cursor wrap off (7l) or on (7h) | ||
|} | |} | ||
===Key Codes for key redefinitions=== | |||
{|class="wikitable" | |||
|+Keycodes for key redefinitions (extract) | |||
!ASCII Key Codes||Code||SHIFT+Code||CTRL+Code||ALT+Code | |||
|- | |||
|F1||0;59||0;84||0;94||0;104 | |||
|- | |||
|F2||0;60||0;85||0;95||0;105 | |||
|- | |||
|F3||0;61||0;86||0;96||0;106 | |||
|- | |||
|F4||0;62||0;87||0;97||0;107 | |||
|- | |||
|F5||0;63||0;88||0;98||0;108 | |||
|- | |||
|F6||0;64||0;89||0;99||0;109 | |||
|- | |||
|F7||0;65||0;90||0;100||0;110 | |||
|- | |||
|F8||0;66||0;91||0;101||0;111 | |||
|- | |||
|F9||0;67||0;92||0;102||0;112 | |||
|- | |||
|F10||0;68||0;93||0;103||0;113 | |||
|- | |||
|F11||0;133||0;135||0;137||0;139 | |||
|- | |||
|F12||0;134||0;136||0;138||0;140 | |||
|- | |||
|Home (numeric key)||0;71||55||0;119||— | |||
|- | |||
|Up Arrow (numeric key)||0;72||56||(0;141)||— | |||
|- | |||
|Page Up (numeric key)||0;73||57||0;132||— | |||
|- | |||
|Left Arrow (numeric key)||0;75||52||0;115||— | |||
|- | |||
|Right Arrow (numeric key)||0;77||54||0;116||— | |||
|- | |||
|End (numeric key)||0;79||49||0;117||— | |||
|- | |||
|Down Arrow (numeric key)||0;80||50||(0;145)||— | |||
|- | |||
|Page Down (numeric key)||0;81||51||0;118||— | |||
|- | |||
|Ins (numeric key)||0;82||48||(0;146)||— | |||
|- | |||
|Del (numeric key)||0;83||46||(0;147)||— | |||
|- | |||
|Home||(224;71)||(224;71)||(224;119)||(224;151) | |||
|- | |||
|Up Arrow||(224;72)||(224;72)||(224;141)||(224;152) | |||
|- | |||
|Page Up||(224;73)||(224;73)||(224;132)||(224;153) | |||
|- | |||
|Left Arrow||(224;75)||(224;75)||(224;115)||(224;155) | |||
|- | |||
|Right Arrow||(224;77)||(224;77)||(224;116)||(224;157) | |||
|- | |||
|End||(224;79)||(224;79)||(224;117)||(224;159) | |||
|- | |||
|Down Arrow||(224;80)||(224;80)||(224;145)||(224;154) | |||
|- | |||
|Page Down||(224;81)||(224;81)||(224;118)||(224;161) | |||
|- | |||
|Insert||(224;82)||(224;82)||(224;146)||(224;162) | |||
|- | |||
|Delete||(224;83)||(224;83)||(224;147)||(224;163) | |||
|- | |||
|Print Screen||—||—||0;114||— | |||
|- | |||
|Pause/Break||—||—||0;0||— | |||
|- | |||
|Backspace||8||8||127||(0) | |||
|- | |||
|Enter||13||—||10||(0,28) | |||
|- | |||
|Tab||9||0;15||(0;148)||(0;165) | |||
|- | |||
|Null||0;3||—||—||— | |||
|- | |||
|ESC||27||27||27||27 | |||
|- | |||
|Space||32||32||32||23 | |||
|- | |||
|A||97||65||1||0;30 | |||
|- | |||
|B||98||66||2||0;48 | |||
|- | |||
|C||99||67||3||0;46 | |||
|- | |||
|D||100||68||4||0;32 | |||
|- | |||
|E||101||69||5||0;18 | |||
|- | |||
|F||102||70||6||0;33 | |||
|- | |||
|G||103||71||7||0;34 | |||
|- | |||
|H||104||72||8||0;35 | |||
|- | |||
|I||105||73||9||0;23 | |||
|- | |||
|J||106||74||10||0;36 | |||
|- | |||
|K||107||75||11||0;37 | |||
|- | |||
|L||108||76||12||0;38 | |||
|- | |||
|M||109||77||13||0;50 | |||
|- | |||
|N||110||78||14||0;49 | |||
|- | |||
|O||111||79||15||0;24 | |||
|- | |||
|P||112||80||16||0;25 | |||
|- | |||
|Q||113||81||17||0;16 | |||
|- | |||
|R||114||82||18||0;19 | |||
|- | |||
|S||115||83||19||0;31 | |||
|- | |||
|T||116||84||20||0;20 | |||
|- | |||
|U||117||85||21||0;22 | |||
|- | |||
|V||118||86||22||0;47 | |||
|- | |||
|W||119||87||23||0;17 | |||
|- | |||
|X||120||88||24||0;45 | |||
|- | |||
|Y||121||89||25||0;21 | |||
|- | |||
|Z||122||90||26||0;44 | |||
|- | |||
|1||49||(*)||—||0;120 | |||
|- | |||
|2||50||(*)||—||0;121 | |||
|- | |||
|3||51||(*)||—||0;122 | |||
|- | |||
|4||52||(*)||—||0;123 | |||
|- | |||
|5||53||(*)||—||0;124 | |||
|- | |||
|6||54||(*)||—||0;125 | |||
|- | |||
|7||55||(*)||—||0;126 | |||
|- | |||
|8||56||(*)||—||0;126 | |||
|- | |||
|9||57||(*)||—||0;127 | |||
|- | |||
|0||48||(*)||—||0;129 | |||
|- | |||
| !||33||—||—||(*) | |||
|- | |||
| " ||34||—||—||(*) | |||
|- | |||
| � ||21||—||—||(*) | |||
|- | |||
| $ ||36||—||—||(*) | |||
|- | |||
| % ||37||—||—||(*) | |||
|- | |||
| & ||38||—||—||(*) | |||
|- | |||
| / ||47||—||—||(*) | |||
|- | |||
| ( ||40||—||—||(*) | |||
|- | |||
| ) ||41||—||—||(*) | |||
|- | |||
| = ||61||—||—||(*) | |||
|- | |||
| ? ||63||—||—||(*) | |||
|- | |||
| ` ||96||—||—||— | |||
|- | |||
| ' ||39||—||—||— | |||
|- | |||
| * ||42||—||—||— | |||
|- | |||
| + ||43||—||—||— | |||
|- | |||
| # ||35||—||—||— | |||
|- | |||
| , ||44||—||—||— | |||
|- | |||
| ; ||59||—||—||— | |||
|- | |||
| . ||46||—||—||— | |||
|- | |||
| : ||58||—||—||— | |||
|- | |||
| - ||45||—||—||— | |||
|- | |||
| _ ||95||—||—||— | |||
|- | |||
| < ||60||—||—||— | |||
|- | |||
| > ||62||—||—||— | |||
|- | |||
| ^ ||94||—||—||— | |||
|- | |||
| ° ||248||—||—||— | |||
|- | |||
| \ ||92||—||—||— | |||
|- | |||
| [ ||91||—||—||— | |||
|- | |||
| ] ||93||—||—||— | |||
|- | |||
| { ||123||—||—||— | |||
|- | |||
| } ||125||—||—||— | |||
|- | |||
|<nowiki>|</nowiki>||124||—||—||— | |||
|- | |||
|~ ||126||—||—||— | |||
|- | |||
|@ ||64||—||—||— | |||
|- | |||
|ENTER (keypad)||13||—||10||(0;166) | |||
|- | |||
|/ (keypad)||47||47||(0;142)||(0;74) | |||
|- | |||
|* (keypad)||42||(0;144)||(0;78)||— | |||
|- | |||
| - (keypad)||45||45||(0;149)||(0;164) | |||
|- | |||
| + (keypad)||43||43||(0;150)||(0;55) | |||
|- | |||
|5 (keypad)||(0;76)||53||(0;143)||— | |||
|- | |||
|ä (German umlaut)||132||142||—||— | |||
|- | |||
|ö (German umlaut)||148||153||—||— | |||
|- | |||
|ü (German umlaut)||129||154||—||— | |||
|- | |||
|ß (German special)||225||—||—||— | |||
|} | |||
;Note:Use the values in parenthesis with care - they may work or may not work. | |||
=="Compiling" REXX programs== | =="Compiling" REXX programs== | ||
Revision as of 18:46, 27 January 2020
This section contains some further useful information.
Using PMREXX
The syntax for PMREXX is:
>>──PMREXX───┬────┬──┬─────────────┬─┬───────────┬─><
├─/Q─┤ └─rexxprogram─┘ └─parameter─┘
└─/T─┘
Where:
- /Q
- Close PMREXX after the REXX program ends (no "The program has ended" message box)
- /T
- Start PMREXX in trace mode
- rexxprogram
- Name of the rexx program
- parameter
- Parameter for the REXX program
All parameters, except rexxprogram, are optional.
Using PMREXX with the parameter /Q is useful for simple programs which only need to show a PM messagebox (using RxMessageBox). For an example see Saving the Desktop (3.0)
(see Run a REXX program under a specific environment on how to force a program to run under PMREXX)
Please note that you cannot use OS/2 commands that change the environment in a REXX program running under PMREXX. You have to use a similar REXX function for that purpose (e.g. directory() instead of CD, VALUE() instead of SET, etc.).
Warning: The default address environment for a REXX program started via PMREXX in WARP 3 is PMREXX; the default environment in WARP 4 is CMD. Therefore, you cannot distinguish between the environments using ADDRESS() in WARP 4!
- Note
- see also PMPopup/2 if you only want to use simple dialog boxes in REXX programs.
The RXQUEUE filter
The purpose of the RXQUEUE filter is to copy the output of an OS/2 program into a REXX queue (The RXQUEUE filter is the external program RXQUEUE.EXE - not the built-in function RXQUEUE!) The syntax for RXQUEUE filter is:
>>──RXQUEUE──┬───────────┬──┬────────┬──────><
└─queuename─┘ ├─/FIFO──┤
├─/LIFO──┤
└─/CLEAR─┘
The RXQUEUE filter usually operates on the default queue named "SESSION". However, if an environment variable named "RXQUEUE" exists, the RXQUEUE value is used for the queue name.
Parameters
- queuename
- This is the name of the queue to use. The queue must already exist. The name of a queue can only contain the following characters: 'A'...'Z', '0'...'9', '.', '!', '?' and '_'. Lowercase letters are converted to uppercase letters.
- /LIFO
- Stacks items from STDIN last in, first out (LIFO) on a REXX queue.
- /FIFO
- Queues items from STDIN first in, first out (FIFO) on a REXX queue.
- /CLEAR
- Removes all lines from a REXX queue.
- Note
- Again, do not confuse the RXQUEUE filter with the RXQUEUE built-in function! Note further that you cannot use the RXQUEUE filter to write a REXX queue to STDOUT - you've to write a REXX program to do this task. (see Write the REXX Queue to STDOUT for an example).
Return code of the function ADDRESS
A REXX program can use the function ADDRESS to detect the current environment. Following is a list of environments I know about (see Passing parameter to Rexx Dialog programs and Run a REXX program under a specific environment for examples for using this function.):
| Return code of ADDRESS | Environment | Comments |
|---|---|---|
| CMD | OS/2 REXX Interpreter; also Object REXX for Win95/WinNT | use PARSE SOURCE to distinguish between the interpreter: OS/2 REXX returns OS/2; Object REXX for WinNT returns WIN32 |
| CMS | VM/ESA 1.1 REXX Interpreter | |
| COMMAND | Bill's REXX for DOS IBM PC DOS 7 REXX Interpreter |
Use PARSE VERSION to distinguish between the environments. |
| CPEDIT | CPEDIT, an XEDIT clone from IBM | |
| CPICOMM | SAA common environment especially used with communications | |
| DFS | Display File Systems | |
| DOS | Bill's REXX for DOS IBM PC DOS 7 REXX Interpreter |
Use PARSE VERSION to distinguish between the environments. |
| EPM | EPM, OS/2 Editor | |
| GLOBE | PMGlobe 2.18 | IBM EWS Graphic program from Mike Cowlishaw, IBM UK Laboratories |
| FLEETSTREET | FleetStreet v1.03 | Msg Reader & Editor for Squish msg bases |
| INT2E | Bill's REXX for DOS | |
| ispcir | OS/2 DialogManager, IBM | |
| IPSEXEC | Tritus SPF, Tritus Inc. | |
| ISREDIT | SPF/2, CTC | |
| KEDIT | KEDIT, an XEDIT clone from Mansfield Software | |
| ksh | IBM's AIX REXX | The value is independent from the current shell |
| MVS | OS/390 v1.2 (PGM=IRXJCL) REXX Interpreter | |
| NULL | DrDialog | this is an alternate SubCommand-Handler for DrDialog programs |
| PMREXX | PMREXX, OS/2 PMREXX.EXE (see the warning in the section Using PMREXX) | |
| REXXTERM | REXXTERM, Quercus Software | |
| RXDLG | Rexx Dialog | |
| SAY | DrDialog | this is an alternate SubCommand-Handler for DrDialog programs |
| STARTDOS | StartDOS | a program to start DOS VDMs by Monte Copeland |
| SYSTEM | Bill's REXX for DOS Mark Hesslings's Regina REXX for Windows NT |
use PARSE SOURCE to distinguish between the interpreter: Bill's REXX returns MSDOS, Mark's REXX returns WIN32 |
| TE2 | TE/2, Oberon Software | |
| THE | THE Hessling Editor by Mark Hessling | THE is an XEDIT clone for various operating systems |
| TSO | OS/390 v1.2 (TSO) REXX Interpreter | |
| VISION | ObjectVision, Borland | |
| UNIX | uniREXX on Solaris v2.6 | |
| ZOC | ZOC 2.x, Markus Schmidt | One of the best OS/2 terminal programs available! |
ANSI ESC Sequences
ANSI ESC Sequences - also called ANSI commands - are useful for doing some display I/O control in REXX.
To use ANSI commands the OS/2 ANSI support must be active. To activate the ANSI support use the OS/2 command ANSI ON and to deactivate the ANSI support use the OS/2 command ANSI OFF. To get the current status of the ANSI support use the OS/2 command ANSI without a parameter. The default for the ANSI support is ON. (see Check if ANSI is active - 1 - or Check if ANSI is active - 2 - for REXX source to detect if ANSI support is active from within a REXX program)
Each ANSI command begins with the sequence ESC[. where ESC represents the ASCII code 1Bh (= 27 decimal). If there is more than one parameter for an ANSI command, use a semicolon (;) to separate the parameter.
To output ANSI commands you can use the functions LINEOUT and CHAROUT or the statement SAY. Example:
say "1B"x || "[30;41m" || "This text is black on red" call lineOut , "1B"x || "[31;40m" || "This text is red on black" call charOut , "1B"x || "[0m" || "This text is in default color"
(see Using ANSI sequences for some sample code using ANSI sequences and RxLBox - menu routine in REXX is a menu program using only ANSI sequences to implement the navigation with cursor keys and function keys)
- Note
- To use the ANSI commands to set or get the cursor position you must use the function CHAROUT! (see SysCls for another minor restriction)
- Further Note
- Almost all ANSI Control Characters are documented in the command reference of WARP version 4.
| Command | Function |
|---|---|
| ESC[colsA | Cursor up # lines |
| ESC[colsB | Cursor down # lines |
| ESC[rowsC | Cursor right # columns |
| ESC[rowsD | Cursor left # columns |
| ESC[row;colH | Position the cursor (the upper left corner is 1,1) |
| ESC[2J | Clear the whole screen |
| ESC[K | Clear the rest of the line |
| ESC[6n | Get the current cursor position (see Get the current cursor position) |
| ESC[row;colf | Position the cursor (like "H") |
| ESC[row;colR | Report current cursor line and column (*) |
| ESC[=modeh | Set the display mode (see below) |
| ESC[=model | Set the display mode (see below) |
| ESC[attr;attr;..m | Set the color attribute (see below) |
| ESC[key;"str"p | Redefine the key "key" with the string "str" (see Key redefinitions and Key Codes for key redefinitions) |
| ESC[s | Save the current cursor position (nested calls are not allowed) |
| ESC[u | Restore the cursor position (nested calls are not allowed) |
| Attribute | Description |
|---|---|
| 0 | all attributes off (white on black) |
| 1 | bold |
| 2 | normal |
| 4 | underline (only on b/w displays) |
| 5 | blink |
| 7 | reverse video |
| 8 | invisible |
| 30-37 | set the foreground color:
|
| 40-47 | set the background color:
|
| Mode | Description |
|---|---|
| 0 | Text 40x25 monochrome |
| 1 | Text 40x25 color |
| 2 | Text 80x25 monochrome |
| 3 | Text 80x25 color |
| 4 | Graphics 320x200 4 colors |
| 5 | Graphics 320x200 2 color |
| 6 | Graphics 640x200 2-color |
| 7 | cursor wrap off (7l) or on (7h) |
Key Codes for key redefinitions
| ASCII Key Codes | Code | SHIFT+Code | CTRL+Code | ALT+Code |
|---|---|---|---|---|
| F1 | 0;59 | 0;84 | 0;94 | 0;104 |
| F2 | 0;60 | 0;85 | 0;95 | 0;105 |
| F3 | 0;61 | 0;86 | 0;96 | 0;106 |
| F4 | 0;62 | 0;87 | 0;97 | 0;107 |
| F5 | 0;63 | 0;88 | 0;98 | 0;108 |
| F6 | 0;64 | 0;89 | 0;99 | 0;109 |
| F7 | 0;65 | 0;90 | 0;100 | 0;110 |
| F8 | 0;66 | 0;91 | 0;101 | 0;111 |
| F9 | 0;67 | 0;92 | 0;102 | 0;112 |
| F10 | 0;68 | 0;93 | 0;103 | 0;113 |
| F11 | 0;133 | 0;135 | 0;137 | 0;139 |
| F12 | 0;134 | 0;136 | 0;138 | 0;140 |
| Home (numeric key) | 0;71 | 55 | 0;119 | — |
| Up Arrow (numeric key) | 0;72 | 56 | (0;141) | — |
| Page Up (numeric key) | 0;73 | 57 | 0;132 | — |
| Left Arrow (numeric key) | 0;75 | 52 | 0;115 | — |
| Right Arrow (numeric key) | 0;77 | 54 | 0;116 | — |
| End (numeric key) | 0;79 | 49 | 0;117 | — |
| Down Arrow (numeric key) | 0;80 | 50 | (0;145) | — |
| Page Down (numeric key) | 0;81 | 51 | 0;118 | — |
| Ins (numeric key) | 0;82 | 48 | (0;146) | — |
| Del (numeric key) | 0;83 | 46 | (0;147) | — |
| Home | (224;71) | (224;71) | (224;119) | (224;151) |
| Up Arrow | (224;72) | (224;72) | (224;141) | (224;152) |
| Page Up | (224;73) | (224;73) | (224;132) | (224;153) |
| Left Arrow | (224;75) | (224;75) | (224;115) | (224;155) |
| Right Arrow | (224;77) | (224;77) | (224;116) | (224;157) |
| End | (224;79) | (224;79) | (224;117) | (224;159) |
| Down Arrow | (224;80) | (224;80) | (224;145) | (224;154) |
| Page Down | (224;81) | (224;81) | (224;118) | (224;161) |
| Insert | (224;82) | (224;82) | (224;146) | (224;162) |
| Delete | (224;83) | (224;83) | (224;147) | (224;163) |
| Print Screen | — | — | 0;114 | — |
| Pause/Break | — | — | 0;0 | — |
| Backspace | 8 | 8 | 127 | (0) |
| Enter | 13 | — | 10 | (0,28) |
| Tab | 9 | 0;15 | (0;148) | (0;165) |
| Null | 0;3 | — | — | — |
| ESC | 27 | 27 | 27 | 27 |
| Space | 32 | 32 | 32 | 23 |
| A | 97 | 65 | 1 | 0;30 |
| B | 98 | 66 | 2 | 0;48 |
| C | 99 | 67 | 3 | 0;46 |
| D | 100 | 68 | 4 | 0;32 |
| E | 101 | 69 | 5 | 0;18 |
| F | 102 | 70 | 6 | 0;33 |
| G | 103 | 71 | 7 | 0;34 |
| H | 104 | 72 | 8 | 0;35 |
| I | 105 | 73 | 9 | 0;23 |
| J | 106 | 74 | 10 | 0;36 |
| K | 107 | 75 | 11 | 0;37 |
| L | 108 | 76 | 12 | 0;38 |
| M | 109 | 77 | 13 | 0;50 |
| N | 110 | 78 | 14 | 0;49 |
| O | 111 | 79 | 15 | 0;24 |
| P | 112 | 80 | 16 | 0;25 |
| Q | 113 | 81 | 17 | 0;16 |
| R | 114 | 82 | 18 | 0;19 |
| S | 115 | 83 | 19 | 0;31 |
| T | 116 | 84 | 20 | 0;20 |
| U | 117 | 85 | 21 | 0;22 |
| V | 118 | 86 | 22 | 0;47 |
| W | 119 | 87 | 23 | 0;17 |
| X | 120 | 88 | 24 | 0;45 |
| Y | 121 | 89 | 25 | 0;21 |
| Z | 122 | 90 | 26 | 0;44 |
| 1 | 49 | (*) | — | 0;120 |
| 2 | 50 | (*) | — | 0;121 |
| 3 | 51 | (*) | — | 0;122 |
| 4 | 52 | (*) | — | 0;123 |
| 5 | 53 | (*) | — | 0;124 |
| 6 | 54 | (*) | — | 0;125 |
| 7 | 55 | (*) | — | 0;126 |
| 8 | 56 | (*) | — | 0;126 |
| 9 | 57 | (*) | — | 0;127 |
| 0 | 48 | (*) | — | 0;129 |
| ! | 33 | — | — | (*) |
| " | 34 | — | — | (*) |
| � | 21 | — | — | (*) |
| $ | 36 | — | — | (*) |
| % | 37 | — | — | (*) |
| & | 38 | — | — | (*) |
| / | 47 | — | — | (*) |
| ( | 40 | — | — | (*) |
| ) | 41 | — | — | (*) |
| = | 61 | — | — | (*) |
| ? | 63 | — | — | (*) |
| ` | 96 | — | — | — |
| ' | 39 | — | — | — |
| * | 42 | — | — | — |
| + | 43 | — | — | — |
| # | 35 | — | — | — |
| , | 44 | — | — | — |
| ; | 59 | — | — | — |
| . | 46 | — | — | — |
| : | 58 | — | — | — |
| - | 45 | — | — | — |
| _ | 95 | — | — | — |
| < | 60 | — | — | — |
| > | 62 | — | — | — |
| ^ | 94 | — | — | — |
| ° | 248 | — | — | — |
| \ | 92 | — | — | — |
| [ | 91 | — | — | — |
| ] | 93 | — | — | — |
| { | 123 | — | — | — |
| } | 125 | — | — | — |
| | | 124 | — | — | — |
| ~ | 126 | — | — | — |
| @ | 64 | — | — | — |
| ENTER (keypad) | 13 | — | 10 | (0;166) |
| / (keypad) | 47 | 47 | (0;142) | (0;74) |
| * (keypad) | 42 | (0;144) | (0;78) | — |
| - (keypad) | 45 | 45 | (0;149) | (0;164) |
| + (keypad) | 43 | 43 | (0;150) | (0;55) |
| 5 (keypad) | (0;76) | 53 | (0;143) | — |
| ä (German umlaut) | 132 | 142 | — | — |
| ö (German umlaut) | 148 | 153 | — | — |
| ü (German umlaut) | 129 | 154 | — | — |
| ß (German special) | 225 | — | — | — |
- Note
- Use the values in parenthesis with care - they may work or may not work.
"Compiling" REXX programs
Prevent REXX from creating a token image
Set the read-only attribute of REXX cmds for which the REXX interpreter should not create a token image (or copy them to a read-only disk or to a filesystem not supporting Extended Attributes).
"Undocumented" REXX functions
The following REXX functions to work with DBCS mixed Strings are only documented in the IBM: OS/2 2.0 Procedures Language/2 Reference Manual and in the Object-Oriented REXX online documentation:
- DBADJUST
- DBBRACKET
- DBCENTER
- DBLEFT
- DBRIGHT
- DBRLEFT
- DBRRIGHT
- DBTODBCS
- DBTOSBCS
- DBUNBRACKET
- DBVALIDATE
- DBWIDTH
Well, for the "normal" REXX programmer only two of these functions are interesting (The functions also work with SBCS strings):
Name DBRLEFT( string, n {,option} )
Function Delete n chars beginning with the first char
Example DBRLEFT( "ABCDEFG", 2 ) gives "CDEFG"
Note The parameter option is only needed for DBCS strings)
For SBCS strings you should not use this parameter.
Name DBRRIGHT( string, n {,option} )
Function Delete n chars beginning with the last char
Example DBRRIGHT( "ABCDEFG", 3 ) gives "ABCD"
Note The parameter option is only needed for DBCS strings)
For SBCS strings you should not use this parameter.