目次

定型処理テンプレートの詳細

定型処理テンプレートの概要

 定型処理テンプレート(*.tpl)は、説明部、テンプレート定義部、デフォルト定義部の3パートで構成されます。定義部の構造は下記の通りで、これ以外の部分は全て説明部となります。

 テンプレートのファイル形式は、060808 版以前はテキスト、060810 版以降は HTML (060810~: HTML4.01, Shift_JIS; 221013~: HTML5, UTF-8)になっています。060810 版以降でも従来のテキスト形式テンプレートを使用することが可能です。

 ご自分でテンプレートを作成する場合、下記の基本構造をご利用ください。

テンプレート定義部の構造

#template {
  処理内容
}

デフォルト定義部の構造

#default {
  設定内容
}

説明部

 テンプレートの概要や使用方法を HTML で記述します。テンプレート定義部やデフォルト定義部も、HTML の中に埋め込まれる形になっています。

テンプレート定義部

 テンプレート定義部は、実際の処理内容を記述します。処理内容は、基本的には SQLite の SQL 文そのものですが、ユーザが設定した値を検索条件とする部分をメタフィールドで記述するところが通常の SQL と異なります。

 メタフィールドとして使用可能なフィールドは、登録適用部テーブル内の次の5種類です。sonota メタフィールドは、sakumotsu, byochu, yoto, zaikei 以外の検索条件を直接記述します。

sakumotsu : 作物名
byochu    : 病害虫名
yoto      : 用途
zaikei    : 剤型
sonota    : その他

 メタフィールドには、SQL 文への展開方法が異なるリスト型メタフィールドとエレメント型メタフィールドの2種類があります。

リスト型メタフィールド

 リスト型メタフィールドは、設定値をそのまま in 演算子の引数とする場合に使用し、<field> の形で指定します。

 たとえば、作物名をユーザ指定する場合は、

sakumotsu in (<sakumotsu>)

と指定しておけば、作物名テキストボックスが「なす, ピーマン, トマト」の場合は、

sakumotsu in ('なす', 'ピーマン', 'トマト')

と展開されます。

 リスト型メタフィールドは、1行内に異なる複数のメタフィールドを記述することができます。

エレメント型メタフィールド

 エレメント型メタフィールドは、設定値を要素ごとに集約関数の引数とするような場合に使用し、[field] の形で指定します。

 たとえば、病害虫名をユーザ指定する場合は、

max(case byochu when [byochu] then '●' else '' end) as [#byochu#],

と指定しておけば、病害虫雑草名テキストボックスが「べと病, うどんこ病」の場合は、

max(case byochu when 'べと病' then '●' else '' end) as べと病,
max(case byochu when 'うどんこ病' then '●' else '' end) as うどんこ病,

と展開されます。

 エレメント型メタフィールドは、要素数に応じて行数も増えるため、1行に1種類のみしか記述できません(同一種類であれば、複数記述することは可能)。また、SQL の構文上の制限から、FROM 節直前の一番最後のフィールドとして指定することもできませんので、ご注意ください。

メタフィールド修飾子

 メタフィールドは、フィールド名を '#', '/', '%', '!' で挟むことにより、フィールド内容の展開方法が変わります。

'#' 修飾子

 シングルクォートで囲まれた部分の最初のカンマ(,)の前までを取り出します。上位分類一括検索時に、フィールド名として代表作物名を取り出すときに使用します。

 たとえば、

'なす(露地栽培),なす,なす科野菜,野菜'

なす(露地栽培)

となります。AS 節のフィールドエリアスとして使用することが多いため、抽出結果にシングルクォート(')は付与されません。

'/' 修飾子

 フィールド内容を REGEXP 演算子用の正規表現として展開します。たとえば、

べと病,うどんこ病,灰色かび病,菌核病,斑点細菌病,褐斑病,炭疽病

なら

'べと病|うどんこ病|灰色かび病|菌核病|斑点細菌病|褐斑病|炭疽病'

のように、単純に区切り文字を ',' から '|' に変換してシングルクォート(')で括るだけです。「○○ムシ」を指定しただけで「○○ムシ幼虫」や「○○ムシ成虫」まで含めてマッチさせたい場合などに使用します。
 ただし、REGEXP 演算子によるマッチングは遅いので、成虫や幼虫を全てを指定してカンマ区切りのまま IN 演算子を用いた方が高速です。

'%' 修飾子

 フィールド内容を sakumotu, byochu メタフィールド向きの REGEXP 演算子用の正規表現として展開します。たとえば、

なす(露地栽培),なす,なす科野菜,野菜類

'(^|、|\()(なす\(?露地栽培\)?|なす|なす科野菜|野菜(類)?.*?).*?(\)|、|$)'

のように展開します。これで、上位分類一括検索が可能となるとともに、「ねぎ」で「たまねぎ」までマッチすることはなくなります。

'!' 修飾子

 フィールド内容を sakumotsu, byochu メタフィールド向きの NOT REGEXP 演算子用の正規表現に展開します。たとえば、

なす(露地栽培),なす,なす科野菜,野菜類

'\((.*、)?(なす\(?露地栽培\)?|なす|なす科野菜|野菜(類)?)(、.*)?を除く|施設|水耕'

のように展開します。sakumotsu メタフィールドでは、指定文字列に「露地」が含まれる場合は「施設」及び「水耕」が、指定文字列に「施設」または「水耕」が含まれる場合は「露地」が除外文字列として追加されます。

デフォルト定義部

 デフォルト定義部は、ユーザが条件を設定する項目の内、初期値を設定しておいた方が便利な項目の値を記述します。設定内容は、 フィールド名 = 設定値 の形で列挙します。

 たとえば、用途に「殺虫剤, 殺菌剤, 殺虫殺菌剤」、剤型に「粒剤, 粉剤」を初期値として設定したい場合は、

yoto = '殺虫剤, 殺菌剤, 殺虫殺菌剤'
zaikei = '粒剤, 粉剤'

と記述します。

一時開発者モード

 処理内容によっては、テンポラリテーブルを作成した方が高速になったり、あるいはレコード-フィールド変換などのためにテンポラリテーブルを作成せざるを得ないときがあります。
 しかし、ACFinder を開発者モードオプション(/d)付きで起動していない場合は、テーブル作成などの SQL 文は使用できません。このため、特定のテンプレートを実行するときだけ、一時的に開発者モードが使用できるコマンドが用意されています。
 テンプレート定義部の先頭に下記のように記述することで、そのテンプレートは開発者モードで動作します。このコマンドは ACFinder に独自のもので、一般的な SQL データベースエンジンは '--' 以下をコメントとして扱います。
 なお、このコマンドはSQLタブでも使用可能です。

#template {
  --/d
  処理内容
}

基本構造

 テンプレートファイルの拡張子は .tpl となります。

template.tpl
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="Author" content="**作成者名**">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<link rel="stylesheet" href="template.css" type="text/css">
<title>ACFinder Template</title>
<script type="text/javascript" src="template.js"></script>
</head>
<body onload="init();">
<h1>**テンプレートタイトル** (**バージョン(日付)**版)</h1>
<p>**テンプレートの説明**</p>
<form name="F1" action="#" id="cbox"></form>
<!-- 混合剤出力形式:列分割 表示サンプル -->
<table border="1" id="tcol">
<tr class="header">
	<th>**カラム名1**</th>
	<th>**カラム名2**</th>
	<th>**カラム名3**</th>
	<th>**……**</th>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="even">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
</table>
<!-- 混合剤出力形式:行分割 表示サンプル -->
<table border="1" id="trow">
<tr class="header">
	<th>**カラム名1**</th>
	<th>**カラム名2**</th>
	<th>**カラム名3**</th>
	<th>**……**</th>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="even">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
</table>
<!-- 混合剤出力形式:セル内改行 表示サンプル -->
<table border="1" id="tclb">
<tr class="header">
	<th>**カラム名1**</th>
	<th>**カラム名2**</th>
	<th>**カラム名3**</th>
	<th>**……**</th>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="even">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
<tr class="odd">
	<td></td>
	<td></td>
	<td></td>
	<td></td>
</tr>
</table>
<h2>設定項目</h2>
<dl>
<dt>■ **必須項目1**</dt>
<dd>
<p>**必須項目1の簡易説明**を指定します。<em>[必須]</em>
<p>**必須項目1の詳細説明**</p>
</dd>
<dt>■ **必須項目2**</dt>
<dd>
<p>**必須項目2の簡易説明**を指定します。<em>[必須]</em>
<p>**必須項目2の詳細説明**</p>
</dd>
<dt>□ **任意項目1**</dt>
<dd>
<p>**任意項目1の簡易説明**を指定します。</p>
<p>**任意項目1の補足説明**</p>
</dd>
<dt>□ **任意項目2**</dt>
<dd>
<p>**任意項目2の簡易説明**を指定します。</p>
<p>**任意項目2の補足説明**</p>
</dd>
</dl>
<h2>設定例</h2>
<div>
<p><span class="button">設定読込</span>ボタンをクリックして、下記ファイルを選択してください。</p>
<pre>
**サンプル設定ファイル名**.arg
</pre>
</div>
<h2>定義</h2>
<dl>
<dt>テンプレート定義</dt>
<dd><xmp id="sql">
#template {
/** ここにテンプレートの SQL を記載 **/
}
</xmp></dd>
<dt>デフォルト定義</dt>
<dd><pre>
#default {
}
</pre></dd>
</dl>
</body>
</html>