式の仕様
式を利用することで、帳票に与えられたデータの取得や集計などを行うことができます。
FIELDというデータ列から値を取得するには、以下のように書きます。
先頭にドットを付ける必要があることに注意してください。
.FIELD
FIELD列の集計値を得るには以下のように書きます。
sum.FIELD
sumはグループ全体の集計値を得ます。
グループの途中で集計行を出力する場合で、
その時点までに出力された明細の集計値を得るには以下のように書きます。
sum_at.FIELD
同じページに含まれる範囲での集計を行うには、以下のように書きます。
sum_page.FIELD
集計は、現在所属しているグループの範囲で行われます。
1つ上のグループの範囲で集計を行う必要があれば、以下のように最後に@を付けます。
sum.FIELD@
集計範囲を指定するには以下のように書きます。
scope_idは集計範囲としたいグループまたはレポートの識別子です。
sum.FIELD@scope_id
重複したデータを除いて集計を行うには以下のように書きます。
自身の1つ下のレベルにある明細グループの単位で集計されます。
sum.FIELD#
指定したグループの単位で重複を除いた集計を行いたい場合は次のように書きます。
unit_idは集計単位としたいグループの識別子です。
sum.FIELD#unit_id
@指定と#指定を同時に行う場合は、@を先に書いてください。
sum.FIELD@scope_id#
sum.FIELD@scope_id#unit_id
sum_at/sum_pageには#指定を行うことはできません。
メソッド
式内で動的な値を記述するには、以下の形式に従います。
[メソッド][.パラメータ][@集計範囲][#集計単位]
例えば、式"sum.FIELD"では、"sum"がメソッドで、パラメータは"FIELD"になります。
メソッドにはいくつかの種類があり、それぞれ固有の機能を持っています。
例えばpage_countというメソッドを用いるとページ数を得ることができます。
現在のページ数を得る場合はパラメータを必要としないので、
ドット以降の部分を省略します。
page_count
page_countにtotalというパラメータを与えると、
レポート全体のページ数を得ることができます。
page_count.total
式を書くことのできる場所は、以下の3つに分類することができます。
分類 |
設定箇所 |
式が評価されるタイミング |
any |
Report.custom_fields.exp
(レポート.カスタム列.式)
Group.custom_fields.exp
(グループ.カスタム列.式)
Content.existence_cond
(コンテント.生成条件)
|
いつでも
|
content |
Content.visibility_cond
(コンテント.表示条件)
|
コンテントが生成された後
|
page |
Content.vars.exp
(コンテント.変数.式)
Element(要素)内の各プロパティ
|
ページ分割された後
|
この分類ごとに、利用可能なメソッドは異なります。
例えばpage_countはページ分割がなされた後でのみ利用可能なので、
要素内の式では呼ぶことができますが、カスタム列からは呼ぶことができません。
デフォルトで用意されているメソッドおよび、それらがいつ利用可能かの一覧を以下に示します。
メソッド |
説明 |
@指定 |
#指定 |
any |
content |
element |
field |
指定されたパラメータに対応するデータ列の値を取得します
メソッド指定を省略するとこれが用いられます
例えば、".HOGE" は "field.HOGE" と同義です
|
○ |
|
○ |
○ |
○ |
sum
|
指定されたパラメータに対応するデータ列の集計値を取得します
グループまたはレポート全体が集計対象になります
|
○ |
○ |
○ |
○ |
○ |
sum_at
|
指定されたパラメータに対応するデータ列の集計値を取得します
その時点までに出力された明細が集計対象になります
|
○ |
|
|
|
○ |
sum_page
|
指定されたパラメータに対応するデータ列の集計値を取得します
同じページに含まれる明細が集計対象になります
|
○ |
|
|
|
○ |
avr
|
指定されたパラメータに対応するデータ列の平均値を取得します
グループまたはレポート全体が集計対象になります
|
○ |
○ |
○ |
○ |
○ |
avr_at
|
指定されたパラメータに対応するデータ列の平均値を取得します
その時点までに出力された明細が集計対象になります
|
○ |
|
|
|
○ |
avr_page
|
指定されたパラメータに対応するデータ列の平均値を取得します
同じページに含まれる明細が集計対象になります
|
○ |
|
|
|
○ |
count
|
割り当てられたデータに含まれるレコード数を取得します
パラメータとしてデータ列を指定すると
その値がNULL以外のレコードだけがカウントされます
グループまたはレポート全体が集計対象になります
|
○ |
○ |
○ |
○ |
○ |
count_at
|
割り当てられたデータに含まれるレコード数を取得します
パラメータとしてデータ列を指定すると
その値がNULL以外のレコードだけがカウントされます
その時点までに出力された明細が集計対象になります
|
○ |
|
|
|
○ |
count_page
|
割り当てられたデータに含まれるレコード数を取得します
パラメータとしてデータ列を指定すると
その値がNULL以外のレコードだけがカウントされます
同じページに含まれる明細が集計対象になります
|
○ |
|
|
|
○ |
prev |
直前のGroupに割り当てられたデータから
指定されたパラメータに対応する列の値を取得します
|
|
|
|
○ |
○ |
next |
直後のGroupに割り当てられたデータから
指定されたパラメータに対応する列の値を取得します
|
|
|
|
○ |
○ |
global |
GlobalScopeに格納されているデータを取得します
|
|
|
○ |
○ |
○ |
page |
現在のページのPageScopeに格納されているデータを取得します
|
|
|
|
|
○ |
var |
コンテントのvarsで定義された変数の値を取得します
|
|
|
|
|
○ |
toggle |
True,Falseを交互に取得します
改ページの度に状態はリセットされます
|
|
|
|
|
○ |
current_time |
現在の時刻を取得します
具体的には、Reportオブジェクトが生成された時刻を返します
|
|
|
|
|
○ |
page_count |
帳票のページ数を取得します
以下のパラメータを指定することができます
パラメータ |
説明 |
(パラメータを省略) |
現在のページ数
|
total |
総ページ数
|
entire |
reset_page_countを無視した現在のページ数
|
entire_total |
reset_page_countを無視した総ページ数
|
|
|
|
|
|
○ |
state |
グループまたはコンテントの状態を取得します
以下のパラメータを指定することができます
パラメータ |
説明 |
first |
ページ内で最初のグループかを取得します
|
last |
ページ内で最後のグループかを取得します
ブランクグループ以外で最後のグループかが判断されます
|
last2 |
ページ内で最後のグループかを取得します
ブランクグループを含めて最後のグループかが判断されます
|
index |
ページ内のグループのインデックスを取得します
|
group_first |
最初のグループかを取得します
|
group_last |
最後のグループかを取得します
ブランクグループ以外で最後のグループかが判断されます
|
group_last2 |
最後のグループかを取得します
ブランクグループを含めて最後のグループかが判断されます
|
group_index |
グループのインデックスを取得します
|
first_page |
グループの最初のページかを取得します
|
last_page |
グループの最後のページかを取得します
|
intrinsic |
ページの範囲内に含まれているグループかを取得します
|
blank |
ブランクグループかを取得します
|
blank_first |
最初のブランクグループかを取得します
|
blank_last |
最後のブランクグループかを取得します
|
header |
ページ内でのグループの最初のコンテントかを取得します
|
footer |
ページ内でのグループの最後のコンテントかを取得します
|
|
○ |
|
|
○ |
○ |
page_group_count |
Group.layout.max_count_exp (グループ.配置.並べる最大値(式))
に指定した式でのみ利用可能なメソッドです。
同じページに出力されるグループの数を返します。
|
|
|
※特殊
|
リテラル定数
以下のリテラル定数を式内に書くことができます。
型 |
形式 |
数値 |
100
-10
123.45
0
|
文字列値 |
'hoge'
'あいうえお'
|
ブール値 |
true
false
|
日付値 |
#20110204 => 2011年2月4日
#20110204142901 => 2011年2月4日 14時29分1秒
|
NULL値 |
null
|
文字列内では、以下のエスケープ文字が利用可能です。
エスケープ文字 |
値 |
\' |
' |
\\ |
\ |
\n |
改行 |
オペレータ
カッコで囲んだ式はオペレータの実行として評価されます。
この形式を用いることで値の計算や条件分岐などを行うことができます。
(+ 1 1) => 2
(* 2 (- 3 1)) => 4
(if .FLAG 'OK' 'NG') => FLAG列の値がtrueなら'OK'、falseなら'NG'
(round5 .NUM -1) => NUM列の値を小数点以下1位で四捨五入
カッコ内の最初の要素がオペレータで、それ以降は引数です。
引数には式をネストして書くことができます。
一般形式を以下に示します。
(オペレータ 引数1 引数2 引数3...)
以下のオペレータが用意されています。
オペレータ |
説明 |
+ |
引数の和を返します
|
- |
引数の差を返します
引数を1つだけ渡すと、符号反転した値を返します
|
* |
引数の積を返します
|
/ |
引数の商を返します
|
& |
引数を文字列連結した結果を返します
|
mod または % |
引数を除算した余りを返します
|
eq または = または in |
引数1が引数2以降のいずれかと等しいかを返します
複数の候補を指定する場合はin
そうでなければ eq か = を利用するのが自然です
(in .value0 .value1 .value2 .value3)
(eq .value0 .value1)
(= .value0 .value1)
|
neq または != または nin |
引数1が引数2以降のいずれとも等しくないかを返します
複数の候補を指定する場合はnin
そうでなければ neq か != を利用するのが自然です
(nin .value0 .value1 .value2 .value3)
(neq .value0 .value1)
(!= .value0 .value1)
|
< |
引数1が引数2よりも小さいかを返します
|
<= |
引数1が引数2以下かを返します
|
> |
引数1が引数2よりも大きいかを返します
|
>= |
引数1が引数2以上かを返します
|
not または ! |
引数のブール値を反転して返します
|
and または && |
引数が全て真かを返します
|
or または || |
引数のいずれかが真かを返します
|
if |
引数1が真なら引数2を返します
偽ならば引数3か、指定されていなければnullを返します
|
nvl |
nullではない最初の引数を返します
|
abs |
引数の絶対値を返します
|
max |
引数の最大値を返します
|
min |
引数の最小値を返します
|
num |
引数を数値化して返します
|
round5 |
引数1の値を引数2で指定された桁数に四捨五入します
引数2は省略可能で、デフォルト値は0です
|
round5e |
引数1の値を引数2で指定された桁数に最近接偶数への丸めを行います
最近接偶数への丸めでは、端数が0.5の場合には結果が偶数となるように丸め、
それ以外の場合は四捨五入を行います
この丸め方法は「銀行丸め」「JIS丸め」「ISO丸め」とも呼ばれます
引数2は省略可能で、デフォルト値は0です
|
round6 |
引数1の値を引数2で指定された桁数に五捨六入します
引数2は省略可能で、デフォルト値は0です
|
roundup |
引数1の値を引数2で指定された桁数に切り上げます
丸めを行う桁よりも下の桁は無視されます
引数2は省略可能で、デフォルト値は0です
|
roundup2 |
引数1の値を引数2で指定された桁数に切り上げます
丸めを行う桁よりも下の桁も考慮されます
引数2は省略可能で、デフォルト値は0です
|
rounddown |
引数1の値を引数2で指定された桁数に切り捨てます
引数2は省略可能で、デフォルト値は0です
|
year |
引数に日付値を与えると、年の部分を返します
|
month |
引数に日付値を与えると、月の部分を返します
|
day |
引数に日付値を与えると、日の部分を返します
|
hour |
引数に日付値を与えると、時の部分を返します
|
minute |
引数に日付値を与えると、分の部分を返します
|
second |
引数に日付値を与えると、秒の部分を返します
|
weekday |
引数に日付値を与えると、曜日の部分を示す0から6の定数を返します
0:日曜日
1:月曜日
2:火曜日
3:水曜日
4:木曜日
5:金曜日
6:土曜日
|
dateadd |
引数1に指定された日付値に対し、引数2の単位で、引数3の値を加算します。
引数2には、以下の値のいずれかを文字列型で指定できます。
|
date |
引数に指定された値を日付型の値として返します。
例:
(date '220610') => 2022/06/10
(date '20220711') => 2022/07/11
(date '200509020304') => 2020/05/09 02:03:04
(date '20200711161514') => 2020/07/11 16:15:14
(date '22-06-10') => 2022/06/10
(date '2022/7/11') => 2022/07/11
(date '20-5-9 2:3:4') => 2020/05/09 02:03:04
(date '2020/07/11 16:15:14') => 2020/07/11 16:15:14
(date 2022 6 10) => 2022/06/10
(date 2020 7 11 16 15 14) => 2020/07/11 16:15:14
|
sub |
引数1の部分文字列を返します
引数2に開始位置、引数3に長さを指定します
引数2に負数を指定すると、末尾からの位置を指定できます
引数3を省略すると、文字列の最後までが対象となります
文字数に基づいて処理されます
|
wsub |
引数1の部分文字列を返します
引数2に開始位置、引数3に長さを指定します
引数2に負数を指定すると、末尾からの位置を指定できます
引数3を省略すると、文字列の最後までが対象となります 文字の幅に基づいて処理されます
文字幅は 半角文字:1 全角文字:2 とカウントされます
|
len |
引数の文字数を返します
|
wlen |
引数の文字列の幅を返します
文字幅は 半角文字:1 全角文字:2 とカウントされます
|
digit |
引数1で指定した数値から、引数2で指定した桁の値を文字列として取得します
引数2に負数を指定すると、小数点以下の桁を得ることができます
引数1の数値が負数だった場合、最大桁の1つ上で符号を得ます
引数3に負数の符号として使われる文字列を指定できます
引数3を省略すると、符号は'-'となります
このオペレータを利用することで、
数値の各桁を切り出し、それぞれ任意の場所に割り付けることができます
例1:
(digit 123.45 2) => '1'
(digit 123.45 1) => '2'
(digit 123.45 0) => '3'
(digit 123.45 -1) => '4'
(digit 123.45 -2) => '5'
例2:
(digit -12 2) => '-'
(digit -12 1) => '1'
(digit -12 0) => '2'
例3:
(digit -10 2 '▲') => '▲'
(digit -10 1 '▲') => '1'
(digit -10 0 '▲') => '0'
|
wsplit |
引数1で指定した文字列を、引数2で指定した長さ毎に分割し、
引数3で指定した部分の文字列を取得します
文字列の途中に改行が含まれていた場合も分割が行われます
分割は、文字の幅に基づいて行われます
文字幅は 半角文字:1 全角文字:2 とカウントされます
このオペレータを利用することで
文字列を任意の幅内に表示した場合での各行の値を得ることができ、
それぞれ任意の場所に割り付けることができます
例: v の内容が以下の文字列ならば
---------------------------
開発者のための
帳票ツール
---------------------------
(wsplit .v 10 0) => '開発者のた'
(wsplit .v 10 1) => 'めの'
(wsplit .v 10 2) => '帳票ツール'
改行ルールを有効にすると、単語(半角)の途中、句読点の直前、開きカッコの直後、閉じカッコの直前等での改行ができるだけ避けられます。
例: v の内容が以下の文字列ならば
---------------------------
1234567890
ABCDE ABCDEFG
あいうえお。
あいうえ「お」
「あいうえ」お
---------------------------
(wsplit .v 10 0 true) => 1234567890
(wsplit .v 10 1 true) => ABCDE
(wsplit .v 10 2 true) => ABCDEFG
(wsplit .v 10 3 true) => あいうえ
(wsplit .v 10 4 true) => お。
(wsplit .v 10 5 true) => あいうえ
(wsplit .v 10 6 true) => 「お」
(wsplit .v 10 7 true) => 「あいう
(wsplit .v 10 8 true) => え」お
|
ybcode |
引数1に郵便番号を表す文字列、引数2に住所を表す文字列を指定すると、郵便バーコードとしてコード化すべき内容を返します。
具体的には、引数1の内容からは数字のみを抜き出し、引数2の内容からは数字とその間の文字を'-'(ハイフン)に変換して抜き出します。
全角の数字も抜き出し可能です。ただし、漢字での数字を抜き出すことはできません。
例:
(ybcode '024-0004' '岩手県北上市村崎野19地割116−4') => 024000419-116-4
|
丸め処理の例を以下に示します。
(round5 5.4) => 5
(round5 5.5) => 6
(round5 0.05 -1) => 0.1
(round5 15 1) => 20
(round5e 1.5) => 2
(round5e 2.5) => 2
(round6 0.5) => 0
(round6 0.6) => 1
(rounddown 0.9) => 0
(roundup 0.1) => 1
(roundup 0.01) => 0
(roundup2 0.1) => 1
(roundup2 0.01) => 1
丸め処理は絶対値に基づいて行われます。
(round5 -1.4) => -1
(round5 -1.5) => -2
(rounddown -1.1) => -1
(roundup -1.1) => -2
nvlオペレータを利用することで複数の条件分岐を以下のように書くことができます。
(nvl (if (= .ANIMAL 'dog') 'イヌ') (if (= .ANIMAL 'cat') 'ネコ') 'その他')
|