こんにちは、開発担当の米原です。

本日は最近XPages開発でハマった時のお話です。

現象

設計の編集などしていると、XPageとカスタムコントーロールの設計が開かなくなり
設計をクリックしても、下のようなエラー画面が表示され設計の中身が見れなくなりました。

設計は開かないが、生成したWebページは設計通りの画面が開きました。

設計

Xpage : xpTest001

<?xml version=”1.0″ encoding=”UTF-8″?>
  <xp:view xmlns:xp=”http://www.ibm.com/xsp/core” xmlns:xc=”http://www.ibm.com/xsp/custom”>
 <xp:this.resources>
  <xp:styleSheet href=”/test001.css”></xp:styleSheet>
  <xp:styleSheet href=”/test002.css”></xp:styleSheet>
 </xp:this.resources>
 <xc:ccTest001></xc:ccTest001>
</xp:view>

CstomControl : ccTest001

<?xml version=”1.0″ encoding=”UTF-8″?>
<xp:view xmlns:xp=”http://www.ibm.com/xsp/core” xmlns:xc=”http://www.ibm.com/xsp/custom”>
 <xp:table styleClass=”tbl_001″>
  <xp:tr>
   <xp:td styleClass=”bk_001″>
    styleClass=”bk_001″
    <xp:inputText id=”inputText1″></xp:inputText>
   </xp:td>
   <xp:td>
   </xp:td>
   </xp:tr>
  <xp:tr>
   <xp:td></xp:td>
   <xp:td styleClass=”bk_002″>
    styleClass=”bk_002″
    <xp:inputText id=”inputText2″></xp:inputText>
   </xp:td>
  </xp:tr>
 </xp:table>
</xp:view>

style sheet : test001.css

.bk_001{
background:rgb(255, 0, 0);
}

.bk_002{
background:rgb(0, 256, 0);
}

.tbl_001 {
width: 90%;
text-align: center;
border-collapse: collapse;
border-spacing: 0;
margin: 50px 50px;
}
.tbl_001 th {
padding: 10px;
background: #e9faf9;
border: solid 1px #778ca3;
}
.tbl_001 td {
padding: 10px;
border: solid 1px #778ca3;
}

どこが原因だったのか

原因ですが

カスタムコントロールの ccTest001内でセットしている
styleClassに設定していました styleClass=”bk_002″ が原因でした。

.bk_002{
background:rgb(0, 256, 0);
}

すごい単純なミスなのですが、RGBの範囲ですが、 0~255 でして、256はダメですね。
今回はWebの画面もちゃんと、緑色も出ていましたので、なぜか設計のみ開くことが出来なくなる現象となりました。

エラー内容が表示されず分からない所だったので、初めはDBがつぶれたかと思い、
再度作成し直したりしたりと色々試行錯誤しておりました。

原因さえ分かれば大したことではないのですが、なかなかはまってしまいましたので、似た様な所でお困りの方がいましたら、参考にしていただければと思います。

設計が開かなくなったら、XPageならまずその中に含有されいるカスタムコントロールを疑い、簡易化しながらどこが怪しいか切り分けて、カスタムコントールに問題が無い場合はその中で呼んでるカスタムコントロールを除外や、今回の様にカスタムコントロール内で使用しているスタイルシートなどを疑っていくと原因が見つけやすいかと思われます。

あとですね、今回はNotesのV9で発生しておりまして、今回のブログを書く際に、V12でも試してみましたら、
何とちょっと画面がかわっておりまして、もう少しエラーが詳しく表示されていました。

エラー内容に

java.lang.IllegalArgumentException: Argument not valid
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.RGB.<init>(Unknown Source)
at com.ibm.etools.xve.renderer.internal.style.CSSColorUtil.stringToRGB(Unknown Source)

CSSのRGBあたりに何かしら問題があるよ的なものがでていますね。
V12ならもしかしらすぐ解決できていたかもしれません。

NotesDominoも進化し続けているので、バージョンを上げる方がより快適に開発できそうですね。

今回はテスト的に単純な設計を作成してでしたが、
実際ハマった設計はもっと複雑なものでして数時間ハマりました。。。

参考にしていただければと思います。

それでは今日はこの辺で失礼いたします。

こんにちは開発担当の米原です。
今回は、日時をユリウス日(ジュリアン日)に変換しないといけないケースがありましたので、その時の備忘です。

ユリウス日(Julian Day、JD)とは

ユリウス暦紀元前4713年1月1日の正午(世界時)からの日数です。
ユリウス日は、日付が長期にわたり連続するため、日数計算やさまざまな暦の関連付けなど、幅広く使われています。

サンプルコード(XPages サーバサイドJavascript)


//ジュリアン日変換
function funcToJulianDay(p_year, p_month, p_day) {
    //月が1月または2月の場合、前の年の13月または14月とみなすみたい
	if (p_month <= 2) {
        p_year -= 1;
        p_month += 12;
    }
    var jDay = 0;
    var seireki = 0;
    var correct = 0;

    //指定された年の世紀部分
    seireki = Math.floor(p_year / 100);
    
    //400年周期での閏年の補正
    correct = 2 - seireki + Math.floor(seireki / 4);

    // 年を365.25日と見なし計算
  //基準年である紀元前4713年からの年数をプラス
  //月の部分を日数に変換(30.6001 を掛けることで、月の平均日数(約30.6日)を使って月数を日数に変換)
    //日の部分をそのまま加算   1524.5(基準日(紀元前4713年1月1日正午)との補正)
    jDay = Math.floor(365.25 * (p_year + 4716)) + 
	   Math.floor(30.6001 * (p_month + 1)) + 
			p_day + correct - 1524.5; 

    return jDay;
}
//呼び出し元サンプル(今日の日付を取得し変換)
function test001(){
	try{
		var year = 0;
		var month = 0;
		var day = 0;
		
		var dt:Date = @Today(); // 今日のの日時を取得してみる
		year = dt.getFullYear();
		month  = dt.getMonth() + 1;
		day = dt.getDate();
		var julianDay = funcToJulianDay(year, month, day);

		print("ユリウス日:", julianDay);
		
	}catch(e){
		print("Error in test001:"+e)
	}
}

参考にどうぞ。