2010/08/19

サイボウズデヂエ8 年齢自動計算をなんとかしてみる

サイボウズコミュニティにこんな書き込みがあった。
ライブラリの一覧表示に生年月日とならんで、今日現在での満年齢を表示したいのですが、やり方がわかりませんでした。
(中略)
しょうがないので、当面はCSV書き出し後、エクセルのdatedif関数の結果を満年齢フィールドとして書き戻していますが、これだと手動更新ですね。
日々更新するほどの必要はないのですが、できれば自動更新したいところです。

確かにどうやってもデヂエ8だけでは実装できない。
デヂエ8では一覧ビューではシステム変数的なものは使えず、定期的な値の自動更新もできないからだ。

ただ、今回おそらく「表示したい」ということで、年齢を値として格納したいわけではないようだ。
ってことで頭をひねって考えてみたら「javascript」という手があった。
サーバーサイドでダメならクライアントサイド。





アイデア
こんな感じかな?

1.生年月日の値をDOMで取得
2.今日の日付との比較で満年齢を計算
3.DOMでどこかに表示させる
4.これをグルグル
5.実行するボタンかリンクを用意

うん、いけそう。



1.生年月日をDOMで取得
一覧表示のHTMLソースを見てみると、フィールドを表示するtdタグごとに同じclass名が指定されている。
このクラス名指定で生年月日を表示するTDを全部取得しよう。
といってもgetElementsByClassName的なものはないし、Jqueryのセレクタを使えば簡単なんだが、サーバーに用意できるとは限らない。
仕方ないのでgetElementsByTagName("td")でTD全部を持ってきて、class名がマッチするものだけ適用する方向で。
class名の取得はgetAttribute("class")だと思ってたが、IE先生はIE7までgetAttribute("className")だという罠があるので注意。


2.今日の日付との比較で満年齢を計算
満年齢の計算+javascriptで検索したら簡単なのが落ちていたので拝借することにする。
考え方は生年月日と今日の日付をyyyymmddの8桁の数字にして引き算し、それを10000で割って小数点切り捨て。
なるほど。これは簡単だ。
ってことでまず今日の日付をyyyymmddの8桁の数字にしておく。
で、グルグルまわすときに生年月日も8桁の数字にしながら計算しよう。


3.DOMでどこかに表示させる
さて計算した満年齢をどこかに表示しないといけない。
専用の列を用意しておくのも考えたがなんとなくしっくりこないので、生年月日の横に表示を追加する方向で。
それならすでに取得済みだし返しやすい。
+=演算子で追記する形で返してあげよう。


4.これをグルグル
まよわずfor ~ inで。


5.実行するボタンかリンクを用意
簡単にjavascriptを実行させるにはブックマークレットという手もあるが、利用者全員に配布するのは面倒。
デヂエ8の「関連リンク」というやつがその代わりになってくれた。
onloadで実行させる方法を考えたが、ちょっと無茶なので断念。


ってことで半分やっつけで完成したので投稿してみた

あとから考えたら「生年月日が表示されてない場合」を考慮してなかったなぁ。
反省。



参考
サイボウズコミュニティ
サイボウズコミュニティ「デヂエ8で年齢自動計算」
サイボウズデヂエ8
真夜中のプログラミングTips「Javascriptだとハマる~生年月日から年齢を計算する簡単な計算式~」

0 件のコメント:

コメントを投稿