今回は236話の続きである。検索するときに購入年,月を必ず指定しなければいけないという仕様を,購入年,月が指定されていたら検索条件に加えるという仕様に変更するのだ。検索画面における年月の指定の仕方は箇条書きにすると以下のようになる。
・年月を指定する
・年を指定する
・年月を指定しない


さて,こうしろうがどう解決したかみていこう。購入日の年,月の初期表示値を0000,00とした。
----------------------------------------------------------

jComboBox1.addItem("0000");
 for (int i=1980;i<=2006;i++){
 jComboBox1.addItem(Integer.toString(i));
}

----------------------------------------------------------
(年のコンボボックスを作成するコードの一部)

コンボボックスに,まず"0000"を追加するようにしたのである。

年を指定した場合は,その年に購入したものが表示される。

年月を指定すると絞り込まれる。コードは次のようなものだ。
----------------------------------------------------------

if(jComboBox1.getSelectedItem() != "0000"){
 buy_date = jComboBox1.getSelectedItem().toString();
}
if(jComboBox2.getSelectedItem() != "00"){
 buy_date += jComboBox2.getSelectedItem().toString();
}


----------------------------------------------------------
(SQL文を作成するメソッドへの引数を作成するコードの一部)

"0000"以外,"00"以外の文字列が選択されていたら,buy_date変数に入れていく。

 意外に感じたのは,月だけを指定しても検索条件になることだ。どうやっているのだろうと,SQL文のWHERE句を組み立てているコードを覗いてみた。
----------------------------------------------------------

switch(buy_date.length()){
 case 2:
  sql += " buy_date LIKE '____-" + buy_date + "-__' ";
  break;
 case 4:
  sql += " buy_date >= '" + buy_date + 
       "0101' AND buy_date < = '" + buy_date + "1201'";
  break;
 case 6:
  sql += " buy_date =" + buy_date + "01";
  break;
 }
}

----------------------------------------------------------
(SQL文を作成するコードの一部)

 buy_date の長さ(buy_date.length())が2だったらLike演算子を使って,前は年,後ろは日にしていたのだ。アンダースコア(_)は文字の桁数を指定できるので,月の前に4桁(年)とハイフン,指定された月,そしてハイフンと2桁の日という書式を指定できる。

 buy_date の長さが4桁のときは,年が指定されているのだから「年+0101」と「年+1201」の範囲を条件にしている。最大値の日が01なのは,登録処理でも年月のみ指定できるようにして日には常に01を代入しているからだ。

 「よく考えたな」とちょっとだけ思った。SQL文の理解が進んでいることをうれしく感じた。でも,どうせなら次のようにして年,月に何も表示させないほうがすっきりしないか。
----------------------------------------------------------

jComboBox1.addItem("");

----------------------------------------------------------

 buy_dateの組み立ても,0000と比較するよりはましになるだろう。
----------------------------------------------------------

if (jComboBox1.getSelectedItem().toString() != ""){
 buy_date = jComboBox1.getSelectedItem().toString();
}

----------------------------------------------------------


 月だけを指定しての検索も,年に0000と表示されていないほうが自然だ。条件にならないものは表面に出てこない方が無用な混乱を招くまい。

   よいプログラム,よいユーザーインターフェイスを作るのは難しいが,もうちょっとだけよいものには手が届くはずだ。「できた」と思ってから,もう少し粘ればいいのだ。

   「あっ,でも,こうしろう。タイプのラジオボタンは初期表示ではどこにもチェックが付いていないのに,リセットボタンを押すとデジカメにチェックが入ってしまうぞ。それから,他にも,えーっと・・・」