2009年11月12日木曜日

印鑑証明書の電子申請に挑戦

以前から総務で印鑑証明書の申請を電子化したい、という話があったのですが、急に印鑑証明書が必要になるといったケースばかりでなかなかできませんでした。
そんな感じで1年程保留になっていたのですが、今回の印鑑証明書は取得に余裕があるとの事だったので挑戦してみました。
電子証明書はe-Taxを使う時に取得していたのと、必要なソフトも1年前に入れていたので手順に沿って申請を行いました。
手順は結構面倒くさかったのですが、無事申請でき翌日には印鑑証明書が郵送されてきたので良かったですが、そうなるまでに他の問題に引っかかったのが大変でした。

・申請書作成支援ソフトのバージョン
ソフト自体は1年前に入れていてそのままだったのですが、バージョンアップがある事を知らずにそのままデータを作成。
データの作成は問題なく出来てホームページ上から申請をしてみたのですが、開くときに「様式のバージョンチェック」でエラーになってしまいました。
そこでバージョンが古い事がわかり、支援ソフトのメニューから更新を行ったのですが、書式等は正常に更新出来たものの、ソフト自体は更新がエラーになり続行できませんでした。
しょうがないので法務省のホームページから最新版をダウンロードし、旧バージョンを削除した後にインストール。
先ほど作成したファイルを読み込み、保存をして再度申請を試みたのですが、また同様のバージョンチェックでエラーに...
まさかと思い、支援ソフトで新規に作成し直した所、開けるようになりました。

古い形式のファイルを読み込めるのはいいのですが、保存時に最新版の書式にはしてくれないようです。
今後同様にバージョンアップされた時にこの仕様では再利用しての申請が出来ないと思うので対応してもらいたい所です。

・Javaの実行環境
無事にデータを開けたので納付情報を設定して「デジタル署名」のボタンをクリックし、電子証明書の種類で「ファイル」選択した所、マウスカーソルが砂時計になったままになってしまいました。
処理が遅いのかな?と思ったのですが周りのボタンが押せるのでどうやらファイル選択ダイアログが表示できなくなっているようです。

申請を行ったパソコンはJava(TM) 6 Update 7 と Update 15が入っています。
法務省のホームページを見るとUpdate15まで対応済みとあったのですが、
なんだか怪しいのでUpdate 15を削除して再起動し、同様の作業をした所無事にファイル選択ダイアログアが表示され作業を続ける事が出来ました。

単にJava のバージョンの問題なのか、それともほかに要因があるのか分からないので切り分けていきたい所ですが、法務省のシステムの更新を待ちたい所です。

2009年11月2日月曜日

ACCESSとJavaの日付の扱い

ACCESSでは"09/10/27"という日付の文字列を 以下のコードでフォーマットすると、"2009/10/27"という結果になるが、

Dim strFormattedDate As String
strFormattedDate = $Format("09/10/27", "yyyy/mm/dd")

Javaで同様の処理を行うと、strFormattedDate の値が"0009/10/27" となってしまう。

SimpleDateFormat dateFormat =
  (SimpleDateFormat)DateFormat.getDateInstance();
dateFormat.applyPattern("yyyy/MM/dd");
Date date = DateFormat.getDateInstance().parse("09/10/27");
   String formattedDate = dataFormat.format(date);

09年という情報が入ってきた時に
ACCESSは2009年
Javaは           9年

と判定するのが今回の違いの原因なのだが、人間的な感覚ではACCESSが正しいが、システム仕様としてはJavaの方が正しくなる。

ちなみにACCESSの方は基準が1930年になっているようで、
ACCESSのコードで年数を増やしていくと、"30/01/01"から "1930/01/01"となってしまう。
さすがにそこまで同じシステムを使うとは思えないが、こういった仕様の点からも脱ACCESSは進めていかないといけない。

仕様としては
・入力欄を YYYY/MM/DDの4ケタにする
・ACCESSと同じように30年辺りで区切るようにする
のどちらかになるが、どちらがうちのシステムとしてあるべきか検討しないといけない。

JFormattedTextFieldの不具合?と対処

日付の入力や郵便番号の入力制御でJFormattedTextFieldを使っているが、おかしな挙動になる。
例えば日付をYY/MM/DD形式で入力したい場合でJFormattedTextFieldに"##/##/##"とマスクを設定すると

・日付と判定されない数値も入ってしまう
(09/12/32、09/13/01等)

・マスクに一致しない値を入れると前の数値に戻る
"09/11/01"と入力されている状態で、"09/01/  "
と入れフォーカスを外すと"09/11/01"に戻る。
空白にした場合も同様になる。


この状態では入力済みの日付をクリアする。といったケースに対応できないので、以下のような処理を実装し、ラッピングするようにした

■ FocusGain()時
if (jFormattedTextField1.getText().isEmpty() == true) {
    MaskFormatter maskFormatter =
        new MaskFormatter("##/##/##");
    DefaultFormatterFactory formatterFactory =
        new DefaultFormatterFactory(maskFormatter);

    jFormattedTextField1.setFormatterFactory(formatterFactory);

}

■ FocusLost()時
jFormattedTextField1.setFormatterFactory(null);
try {
    MaskFormatter maskFormatter =
        new MaskFormatter("##/##/##");
    maskFormatter.valueToString(jFormattedTextField1.getText());
   
} catch (java.text.ParseException ex) {
    jFormattedTextField1.setText("");
}

FocusGain()時にテキストが空であれば、setFormatterFactory()を行いマスクを有効に、
FocusList()時はFormatterFactoryを無効にして、MaskFormatterのvalueToString()によって書式の整合性をチェックしマッチしなければテキストを空にするという風にした

日付の妥当チェックについてはこの後に対応予定。