式の仕様

式を利用することで、帳票に与えられたデータの取得や集計などを行うことができます。

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 引数の最小値を返します
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 引数に日付値を与えると、秒の部分を返します
dateadd 引数1に指定された日付値に対し、引数2の単位で、引数3の値を加算します。
引数2には、以下の値のいずれかを文字列型で指定できます。
指定値単位
y
M
d
h時間
m
s
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) => え」お

丸め処理の例を以下に示します。

  (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') 'ネコ') 'その他')