FileMaker Pro 11からグラフ機能が実装されたのは周知のとおり。わずかな操作で「棒」「水平棒」「線」「面」「円」グラフを簡単に作成することが可能だ。FileMakerの武器のひとつである「帳票の組みやすさ」「設計~運用までのスタートアップの早さ」にくわえて、このグラフもWebアプリ上で表現できれば活用の幅が広がりそうだ。このグラフを何とかしてWeb公開エンジン経由で取得できないだろうか。

Web公開でのグラフ表示にチャレンジ

PHPを使ったWebアプリケーションでグラフを実装したい場合は、おもに以下の方法が考えられる。

FileMakerを使ってWebアプリケーションを実装しているのなら、FileMaker Pro 11から用意されたグラフ機能をぜひ使ってみたいところ。FileMaker Pro 11で作成したグラフはいまのところインスタントWeb公開でしかサポートされていないようだ。このグラフを何とかしてXML Web公開から動的に使えるようにできないかチャレンジしてみた。

FileMaker Pro 11ではわずかな操作でグラフを簡単に作成することが可能。このグラフをWebアプリでも表示できれば、帳票のWeb化や各種レポートの実装がさらに簡単になるだろう

グラフオブジェクトが配置されているレイアウトにアクセス

フラグが立っているレコードのみを対象にしたグラフを作成した。Webアプリ上からこのレイアウトに対して検索をおこない、戻り値を確かめる。

このグラフは「現在の対象レコード」を範囲として描画される。Webアプリ上からこのレイアウトに対して検索をおこない、戻り値を確かめる

実際に使用したPHPコードは次のとおり。

<?php
include_once('../fx/FX.php');
include_once('../fx/FX_Fuzzy_Debugger.php');

$data = new FX('localhost', 80, 'FMPro9', 'http');

$data->SetDBData('fxphp_tips.fp7','graph');
$data->SetDBUserPass('admin','');

$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');

$data->AddDBParam('グラフ表示対象', 1);

$result = $data->FMFind();
echo '<pre>';
var_dump($result);
echo '</pre>';
?>

実行結果を確認してみよう。

array(9) {
  ["data"]=>
  array(5) {
    ["1.28"]=>
    array(1) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
    }
    ["2.14"]=>
    array(1) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
    }
    ["10.13"]=>
    array(1) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
    }
    ["16.14"]=>
    array(1) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
    }
    ["74.7"]=>
    array(1) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
    }
  }
  ["linkNext"]=>
  string(0) ""
  ["linkPrevious"]=>
  string(0) ""
  ["foundCount"]=>
  int(5)
  ["fields"]=>
  array(1) {
    [0]=>
    array(5) {
      ["emptyok"]=>
      string(3) "YES"
      ["maxrepeat"]=>
      string(1) "1"
      ["name"]=>
      string(21) "グラフ表示対象"
      ["type"]=>
      string(6) "NUMBER"
      ["extra"]=>
      string(0) ""
    }
  }
  ["URL"]=>
  string(161) "http://admin:@localhost:80/fmi/xml/FMPXMLRESULT.xml?-db=fxphp_tips.fp7&-lay=graph&-max=50&%E3%82%B0%E3%83%A9%E3%83%95%E8%A1%A8%E7%A4%BA%E5%AF%BE%E8%B1%A1=1&-find"
  ["query"]=>
  string(0) ""
  ["errorCode"]=>
  string(1) "0"
  ["valueLists"]=>
  array(0) {
  }
}

残念ながら返り値にはグラフに関連する情報はふくまれなかった。

グラフオブジェクトの内容を格納する、タイプがオブジェクトの非保存計算フィールドを用意

タイプ「オブジェクト」の非保存計算フィールドを作成し、グラフオブジェクトの内容を格納。オブジェクトフィールドであれば、オブジェクトフィールド内のファイルにアクセスするためのURL(/fmi/xml/cnt/data.jpg)が返るはず。

グラフオブジェクトにオブジェクト名「graph_obj」を設定し、オブジェクトタイプの計算フィールド「graph」を作成。計算式は次のとおり。

GetLayoutObjectAttribute ( "graph_obj" ; "content" )

GetLayoutObjectAttributeは指定されたレイアウトオブジェクトの属性を返す関数。第二引数に"content"と指定するとグラフオブジェクトの場合は、グラフオブジェクトのビットマップ表示が返る。FileMaker Pro 11上でこの計算フィールドの動作を確認する。

計算フィールドに描画されたグラフが格納された

計算フィールドにはグラフが画像として格納されたことが確認できた。この状態でさきほどのPHPを実行し、結果を確認してみよう。

array(9) {
  ["data"]=>
  array(5) {
    ["1.32"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["graph"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["2.14"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["graph"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["10.13"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["graph"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["16.14"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["graph"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["74.7"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["graph"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
  }
  ["linkNext"]=>
  string(0) ""
  ["linkPrevious"]=>
  string(0) ""
  ["foundCount"]=>
  int(5)
  ["fields"]=>
  array(2) {
    [0]=>
    array(5) {
      ["emptyok"]=>
      string(3) "YES"
      ["maxrepeat"]=>
      string(1) "1"
      ["name"]=>
      string(21) "グラフ表示対象"
      ["type"]=>
      string(6) "NUMBER"
      ["extra"]=>
      string(0) ""
    }
    [1]=>
    array(5) {
      ["emptyok"]=>
      string(3) "YES"
      ["maxrepeat"]=>
      string(1) "1"
      ["name"]=>
      string(5) "graph"
      ["type"]=>
      string(9) "CONTAINER"
      ["extra"]=>
      string(0) ""
    }
  }
  ["URL"]=>
  string(161) "http://admin:@localhost:80/fmi/xml/FMPXMLRESULT.xml?-db=fxphp_tips.fp7&-lay=graph&-max=50&%E3%82%B0%E3%83%A9%E3%83%95%E8%A1%A8%E7%A4%BA%E5%AF%BE%E8%B1%A1=1&-find"
  ["query"]=>
  string(0) ""
  ["errorCode"]=>
  string(1) "0"
  ["valueLists"]=>
  array(0) {
  }
}

残念ながらこれでもまだ返り値にはグラフの情報がふくまれなかった。

オブジェクトフィールドを用意。WebアプリからFileMakerスクリプトを起動し、フィールド設定をおこなう

オブジェクトフィールドを用意し、WebアプリからさきほどのGetLayoutObjectAttribute ( "graph_obj" ; "content" )がおこなわれるスクリプトをFMFind()時に実行。

スクリプト名「graphObjToField_web」。オブジェクトフィールドに対して、GetLayoutObjectAttricuteでグラフの画像を取得し、フィールド設定する

オブジェクトフィールド「obj」を作成し、レイアウト上に配置。FileMaker Pro 11上でこのスクリプトを実行すると、問題無くオブジェクトフィールドにグラフの画像が格納される。

スクリプト「graphObjToField_web」をFileMaker Pro 11上で実行すると、グラフの画像がオブジェクトフィールドに格納される

さきほどのPHPにスクリプトを起動する一文、$data->AddDBParam('-script', 'graphObjToField_web');を追記して、実行結果を確認する。

array(9) {
  ["data"]=>
  array(5) {
    ["1.36"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["obj"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["2.14"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["obj"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["10.13"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["obj"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["16.14"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["obj"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    ["74.7"]=>
    array(2) {
      ["グラフ表示対象"]=>
      array(1) {
        [0]=>
        string(1) "1"
      }
      ["obj"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
  }
  ["linkNext"]=>
  string(0) ""
  ["linkPrevious"]=>
  string(0) ""
  ["foundCount"]=>
  int(5)
  ["fields"]=>
  array(2) {
    [0]=>
    array(5) {
      ["emptyok"]=>
      string(3) "YES"
      ["maxrepeat"]=>
      string(1) "1"
      ["name"]=>
      string(21) "グラフ表示対象"
      ["type"]=>
      string(6) "NUMBER"
      ["extra"]=>
      string(0) ""
    }
    [1]=>
    array(5) {
      ["emptyok"]=>
      string(3) "YES"
      ["maxrepeat"]=>
      string(1) "1"
      ["name"]=>
      string(3) "obj"
      ["type"]=>
      string(9) "CONTAINER"
      ["extra"]=>
      string(0) ""
    }
  }
  ["URL"]=>
  string(189) "http://admin:@localhost:80/fmi/xml/FMPXMLRESULT.xml?-db=fxphp_tips.fp7&-lay=graph&-max=50&%E3%82%B0%E3%83%A9%E3%83%95%E8%A1%A8%E7%A4%BA%E5%AF%BE%E8%B1%A1=1&-script=graphObjToField_web&-find"
  ["query"]=>
  string(0) ""
  ["errorCode"]=>
  string(1) "0"
  ["valueLists"]=>
  array(0) {
  }
}

結果はNG。PHPを実行するたびにレコード修正IDが増えていくことから、スクリプトが実行されていることは分かる。また、あらかじめオブジェクトフィールドにグラフの画像を格納した状態でPHPを実行すると画像を表示するためのURIが返ることが確認できた。

fmsadmin run scheduleをWeb上から実行し、オブジェクトフィールドにグラフの画像を格納

さきほどのスクリプトと同じような動作をするFileMakerスクリプト「graphObjToField_schedule」を作成。これをFileMaker Serverのスケジュールに登録しておく。fmsadmin run scheduleをWebアプリ上から実行し、サーバースクリプトとして起動することでオブジェクトフィールドにグラフ画像が格納できないかを試してみた。

スクリプト「graphObjToField_schedule」。スクリプト内はすべてサーバー上での互換性があるもので構成されている

作成したスクリプトをFileMaker Serverのスケジュールとして登録

スケジュールのIDはターミナル上でfmsadmin list schedulesと実行することで確認できる。この場合fmsadmin run schedule 4とすれば、graphObjToField_scheduleスクリプトが起動する

これも結果はNG。FileMaker Pro 11上でスクリプトを起動すると問題無く動作するが、スケジュールからスクリプトを実行した場合は、オブジェクトフィールドにグラフ画像が格納されなかった。

いまのところFileMakerで作成したグラフをWeb上で活用するには、インスタントWeb公開を利用する以外になさそうだ。ファイルを開いた際にスクリプトを実行するFileMakerファイルを用意しておき、タスクやcronなどのバッチでFileMaker Proを起動するようにすればグラフの画像を取得できるようになるかも知れないが、あまり汎用性の高い実装方法とは言えないだろう。次回のメジャーバージョンアップに期待したいところだ。