- PR -

セレクトボックスにおいて

投稿者投稿内容
sarusaru
会議室デビュー日: 2004/03/19
投稿数: 14
投稿日時: 2004-03-19 15:38
はじめまして。現在、Strutsを使用してWeb画面を作成しています。
セレクトボックスにおいて、年・月・日(例 2004年03年18日)をそれぞれ選択してそのデータを、DB上にDate型である日付のフィールドとマッチングさせてマッチしたデータを抜き出したいのですが、どのようにソースを書けばよいでしょうか?
また、セレクトボックスでズラーッと年や月を表示したいのですがどのようにすればよいでしょうか?<html:option>2004</html:option>ってな具合には書きたくないのでよろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-03-19 16:08
最近この手の質問が多すぎるので一言いわせてもらいます。

>どのようにソースと書けばよいでしょうか?
結局WEBアプリをこの掲示板で作って欲しいのでしょうか?
仕事の丸投げですかね。

質問の内容からすると、
SQLがわからないのしょうか?
Strutsがわからないのでしょうか?
JDBCを使ってDB操作するのがわからないのでしょうか?
セレクトボックスの値を送信先で取得する方法がわからないのでしょうか?

RDBは何を使っているのでしょうか?
Strutsのバージョンは?APサーバーは?OSは?....

と、あなたの質問に対して何を答えていいのやらわかりません。

SQLやJavaやStruts以前にプログラムすら知らないのであれば、
基本的なプログラムの作り方から勉強してください。
このような掲示板での質問の仕方がわからないのなら、
質問の仕方も勉強したほうがよいかと思います。
sarusaru
会議室デビュー日: 2004/03/19
投稿数: 14
投稿日時: 2004-03-19 17:57
書き方が悪くて申し訳ありませんでした。
Struts3.2.3でAPはネスケでOSはXPでpostgresqlをを使用しております。
DB上の日付と、選択された日付のマッチングさせるSQL文の書き方を教えていただきたいのですが。
よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-03-19 18:12
to_date関数があります。
これは文字列を日付型に変換してくれます。

SQLで、
where AnyDate = to_date('20040319', 'YYYYMMDD');
と書けばその日付で絞り込まれたデータが返されます。
リクエストで取得した年月日を編集して '20040319'の部分に当てはめればいいのでは。

ちなみに、3.2.3といってるのはTomcatでは?
ネスケはAPサーバではなくブラウザです。
TomcatがAPサーバになります。

SQLの質問をするなら、RDB名だけではなくバージョンも記入したほうがいいですよ。
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-03-19 18:36
引用:

SQLで、
where AnyDate = to_date('20040319', 'YYYYMMDD');
と書けばその日付で絞り込まれたデータが返されます。
リクエストで取得した年月日を編集して '20040319'の部分に当てはめればいいのでは。



ユーザー入力を結合して SQL を作成するのはよろしくないと思います。
# ユーザー入力文字列のエスケープ処理が必要なため

SQL 側には

where AnyDate = ?

と書き、

java.sql.PreparedStatement#setDate(int,java.sql.Date) を使って
? にユーザー文字列を java.sql.Date に変換したものを埋め込むべきです。

永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-03-19 19:12
引用:

java.sql.PreparedStatement#setDate(int,java.sql.Date) を使って
? にユーザー文字列を java.sql.Date に変換したものを埋め込むべきです。



蛇足ですが、ユーザー入力をDateに変換する場合は、一度Calendarクラスを通すのがオススメです。#setLenientで厳密な解釈を行うかどうか選択可能です。

http://gimlay.org/~javafaq/S100.html#S100-03

そこから#getTime().getTime()した結果からjava.sql.Dateオブジェクトを作成してStatementにBindでしょうか……。というか、私はそうやってるんですが、この部分って、もうちょっとスマートにならないでしょうか?>諸氏
#いちいち手変換するのは間抜けっぽいので、PreparedStatementのWrapperクラスで拡張インターフェースを作って、Calendarやjava.util.Dateを受けられるようにするくらいの工夫は思い付くのですが……なんか、間抜けな勘違いをしているような予感が……
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-03-19 20:52
>>顔爺さん
本来ならPreparedStatementを使うのがベストですが、
質問者の理解度も踏まえて、あえてエスケープとかしないで書きました。

ちなみに私の場合はPreparedStatementはあまり使いません。
バイナリを格納するときくらいですが、そういうケースは稀ですし。
SQL生成・実行前にバリデーションを必ず行うようにしています。

別にStrutsというわけではありませんが、
バリデーションメソッドを宣言した業務ロジック抽象クラスを継承して、
バリデーションと業務ロジックを別々に記述し
必ずバリデーションが行われる(実装によるが)ように設計しています。
そうすれば、
・業務ロジックは正しい値のみを意識すればよい
・テストが楽になりやすい
というような感じになって、プロジェクト後半が楽になります。

・・・以上余談でした。

#今ヘルプでやってるプロジェクトのソースは酷すぎ・・・(SQL関係)
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-03-21 07:37
引用:

永井和彦さんの書き込み (2004-03-19 19:12) より:
#いちいち手変換するのは間抜けっぽいので、PreparedStatementのWrapperクラスで拡張インターフェースを作って、Calendarやjava.util.Dateを受けられるようにするくらいの工夫は思い付くのですが……なんか、間抜けな勘違いをしているような予感が……




私は、変換用の static メソッドを持ったユーティリティクラス(Math と
同じようなもの)を作りましたが、これが妥当がどうかは自信がありません。


以下、余談。
実は PreparedStatement のバインド用メソッド(setXXX)の第一引数が ? の
インデックスなのは嫌いなのです。
理由は、可読性が低く、SQL 文の変更があったときに対応しづらいからです。

永井様が「Wrapper クラスを作る」とおっしゃってるのを読んでいるときに、
PreparedStatement のバインド位置を文字列で指定できる Wrapper (下記)
があるといいなと思いつきました。

<擬似コード>
// ? の直後にバインド用名称を入れる。
String query = "SELECT * FROM xxx WHERE ID=?ID AND PASSWORD=?PASS";

PreparedStatement wStmt = new PreparedStatementWrapper(stmt,query);
wStmt.setString("ID",id);
wStmt.setString("PASS",pass);
</擬似コード>

自作しても難しいものではありませんが、ありがちな考えなので誰かがすでに
作ってそうです。

どなたかこういうものを作った方おられましたらご意見をお聞かせください。

スキルアップ/キャリアアップ(JOB@IT)