ci-server-engineer/knowledge/manuals/IM36K10P20-01EN.md
cliu 5e77aada8e Record phase 11 manuals, progress and issues ISS-043 to ISS-047
Summaries of IM 36K10L50, P30, P20, R40, C30 and E10 (R1.03).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:17:02 +10:00

134 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
manual: IM 36K10P20-01EN
title: Report Generation Language
edition: 3rd Edition, Sep. 2023
version: R1.03
status: SELECT/WHERE/ORDER/GROUP BY, COLUMN, HEADER/FOOTER, SET, IF, LOOP, cursors, SPOOL with @EXPORT, functions (GPV_*, CHAR, DECODE, SUBSTR, NUMBER, DRAW, LINE, LOGBOOK_TEXT, TO_GMT …) and dates verified in the interactive generator and in loaded reports on the test system 2026-10-01; SEND/RECEIVE, BREAK, INCLUDE, FLAG PAGE, SPV_* from docs
---
# Report Generation Language — RQL (R1.03)
RQL is the SQL-like language of REPORT Service. A report definition (`REPORT_DF.QUERY`) is a list
of RQL statements, each ending with `;`. Data comes from datasets (`IM36K10L50-01EN.md`).
REPORT Service setup: `IM36K10R40-01EN.md`; report definitions in the Engineering Module:
`IM36K10C30-01EN.md`. Section numbers refer to the manual.
## 1. Basics (§1, §2, §9.2–9.5)
- A report description: layout statements, calculations, queries, end. A **set-up description**
(`tls\sup\rptge1.rpt` etc.) runs once when a generator starts and sets defaults for every report
(layout, header/footer, dictionary, `LOGIN`). Output of a SELECT in it goes to the system log.
- Names: letters, digits, `_`; variables start with `@` (≤ 32 characters); report names ≤ 16.
Reserved words (list with `SHOW RESERVED;`) can be used as field names in double quotes.
- Data types: string (`'text'`, `''` for an apostrophe, max 512 characters), integer, real
(needs a decimal point: `12.`). **Dates are integers**: seconds since 1970 in **local time**
(verified: `@DATE` was 10 h ahead of Unix time on a UTC+10 system; `TO_GMT()` gives Unix time).
Date constants without quotes: `01-Oct-2026 15:00`, `12:00` (today), `12-Jan-90` (years < 70
are 20xx).
- Dataset field types become: char → string; boolean/short/ushort/long/ulong/ubyte → integer;
float/double → real. Hidden fields need `SET @CONCEAL 0;`.
- Errors in a statement stop that statement (some stop the report); they are written into the
report (`RPT-E-…`, with a caret under the position in interactive mode). Fatal errors go to the
system log.
## 2. Queries (§3, §9.12 SELECT)
```
SELECT [DISTINCT] <expr> [<alias>], … [FROM <dataset> [<alias>], …]
[WHERE <conditions>] [ORDER BY <col|n> [ASC|DESC]] | [GROUP BY <n>… [HAVING <cond>]];
```
- Operators: `= != <> > >= < <= LIKE` (`%` any, `_` one character; change with `@WC_ANY`,
`@WC_SINGLE`), `AND`, `OR`, parentheses. String values are case-sensitive.
- Joins: list several datasets; the first is primary; join conditions (`a.f = b.f`) come first in
WHERE, joined by `AND`.
- `SELECT 'text', @var;` without FROM just prints (no headings).
- Group functions `AVG COUNT MAX MIN STDDEV SUM VARIANCE` (null values ignored, `DISTINCT`
allowed) cannot be mixed with plain columns without GROUP BY and cannot be used in WHERE; put
their result into a variable first (`SELECT SET @max MAX(item_value) FROM …;`).
- **Verified:** an alias may appear only once per SELECT (`RPT-E-ALIASSEL`); with no matching
rows a group function prints the count 0 and blanks.
- Reading history: `FROM item_history WHERE item_name = '<item>' AND sample_time > @date - 3600`;
add `group_name = '<group>'` to read one storage group (else rows of all groups the item is in);
aggregates with `interpolation = '30Minutes'|'Hour'|…` and `attribute = 'Maximum'|…`
(`IM36K10C40-01EN.md` §5). Do not use `OR` with `item_name` (DSS appendix).
## 3. Layout (§4)
| Statement / variable | Effect |
|---|---|
| `COLUMN <alias> [AT n] [AS '<format>'] [HEADING 'a|b'];` | Format of a column (`|` splits the heading) |
| `HEADER` / `FOOTER <expr> [AT n|LEFT|CENTER|RIGHT] [AS '<fmt>'] [SKIP n], …;` | Page header/footer; empty `HEADER '';` removes it |
| `BREAK <alias> [SKIP n|SKIP PAGE] [CALCULATE SUM|AVG|… <aliases>];` | Group breaks with subtotals |
| `FLAG PAGE '<file>';` | Text file printed before everything |
| `@PAGE_SIZE` (0 = no page breaks), `@WIDTH` (40–512 per R40; 40–5000 per §9.6), `@TOP_MARGIN`, `@BOTTOM_MARGIN`, `@LEFT_MARGIN`, `@RIGHT_MARGIN` | Page geometry |
| `@EXPORT 1` | Comma-separated output: only rows, strings quoted |
| `@DECIMAL 44` | Decimal comma |
Formats: numbers `9` digit, `0` leading zero, `+` sign, `.` decimal point, `EEEE` exponent;
dates `D DD DDD M MM MMM Y YY YYYY hh mm ss` (e.g. `'DD-MMM-YYYY hh:mm:ss'`); strings `A…`, `R`
right, `C` centre, `A20`; `\` copies the next character; C formats (`%5d`, `%.1f`, `%s`). An integer
with a real format prints oddly (e.g. `+99.9` on 12 → `+12.12`); formats are minimum widths.
## 4. Flow control and cursors (§5)
`IF <cond> THEN … [ELSE …] ENDIF;` (no field names in the condition), `LOOP … ENDLOOP;` with
`EXIT;` — loops only work in stored reports (verified: typed or piped into the interactive
generator they give `RPT-E-LPNOTAL, LOOP only allowed in report definition FILES and DIRECT
mode`). Cursors:
```
SET @n ''; SET @v 0.;
DECLARE @c IS SELECT name, item_value FROM item_val WHERE name LIKE 'CI-Eng-Sample.TANK1.%';
OPEN @c;
LOOP FETCH @c INTO @n, @v; IF @rqlcount = 0 THEN EXIT; ENDIF; SELECT @n, @v; ENDLOOP;
CLOSE @c; DECLARE; /* DECLARE without arguments removes all cursors - always end with it */
```
Variables used in `FETCH … INTO` must exist first (`SET`). `@RQLCOUNT` = rows of the last
SELECT/FETCH; `@RQLERROR` counts errors. Verified in `CIENG_HTML`.
## 5. Data manipulation (§6, §9.11)
Arithmetic `+ - * /` (integer arithmetic until a real appears: `12/5+10.0` = 12, `12/5.0+10.0` =
12.4, verified), `||` concatenation, variables (`SET @v <expr>;`, type follows the value; some
system variables are read-only). Functions verified on R1.03: `GPV_VALUE(<item>, 0)` (second
argument non-zero **resets the item to 0** after reading — use 0), `GPV_STATUS` (status number,
e.g. 9), `GPV_QUALITY`, `CHAR(<n>[, '<fmt>'])`, `NUMBER('<text or date>')`, `DECODE`, `SUBSTR`,
`UPPER`, `LOWER`, `LENGTH`, `LINE(n)`, `DRAW(n, '*')`, `MONTH_DAYS`, `TO_GMT`, `LOGBOOK_TEXT('<report>')`.
Also documented: `ABS`, `ADD_MONTHS`, `ASCII_FILE` (≤ 511 characters), `BAND/BOR/BXOR/BNOT/BSHIFT`,
`CHR`, `TO_LCT`, `TO_INTEGER`, `TO_REAL`, `SPV_VALUE/SPV_STATUS/SPV_QUALITY` (**write** an item —
only with approval).
System variables: `@DATE`/`@TIME` (now), `@GEN_TIME` (scheduled time of this generation),
`@PAGE`, `@LINE`, `@CUSTOMER`, `@VERSION` (`'1.03.00'`), `@NAME`, `@DESCRIPTION`, `@P0`–`@P7`
(ad-hoc parameters, strings, not available in the interactive generator), `@NEXT` (1 = pause each
page in interactive mode), `@WORKSPACE`, `@SORTSPACE`, `@FORMFEED`.
## 6. Output to files (§6, §9.12 SPOOL)
```
SPOOL 'C:\Users\Public\Yokogawa\tls\lst\cieng_levels.csv';
SET @EXPORT 1;
SELECT name, item_value, status FROM item_val WHERE name LIKE 'CI-Eng-Sample.TANK1.%';
SPOOL;
SET @EXPORT 0;
```
Verified: the file gets `"name",value,"status"` lines; the output also still appears in the
report. File name ≤ 79 characters, overwritten if it exists, never deleted by CI Server.
Environment variables are not expanded.
## 7. Communication and miscellaneous (§7, §8)
`SEND [<node>:]<process> [REPLY] [CODE n] [NO] PACKING <expr> AS 'I1|I2|I4|F4|F8|Ann', …;` and
`RECEIVE [FROM …] [CODE n] [NO] PACKING [TIMEOUT s] @v AS '…', …;` exchange BUS Service messages
with applications (system integrators). `DICTIONARY rpidis.'tlsdic';` (default),
`INCLUDE '<report>' | FILE '<file>';`, `LOGIN rptman[, <prio>];` (set-up files only, last
statement), `QUIT;`, `SHOW [FULL] VARS|COLUMN|CURSOR|HEADER|FOOTER|BREAKS|RESERVED|STAT|WORKSPACE|*;`.
## 8. Building queries (Appendix 1)
Field names: `dssqld -f -d <DATASET>`, the `.dss` files in `tls\src`, or *Ctrl+Space* in the
Engineering Module query editor (keywords, datasets, fields). Example in the appendix: current
alarms from `alarm_current` with a header.