- PR -

SQL updateの質問

1
投稿者投稿内容
SS
会議室デビュー日: 2005/05/30
投稿数: 4
投稿日時: 2005-05-30 21:16
今、施設予約のプログラムのDAOを作っていて、SQLのupdateで悩んでいます。
Updateの条件が、施設IDとユーザーID,時間です。予約を行った人だけが更新可能です。

public void getRecords() throws SQLException {

String sql = "SELECT * FROM FACILITY_RESERVATION_TABLE ORDER BY FACILITY_RESERVATION DESC";
ResultSet rs = stmt.executeQuery(sql);

public TreeMap getRecords(FacilityVO3 record, Vector facility)throws SQLException {

String date = record.getDate();
pstmt = conn.prepareStatement("SELECT * FROM FACILITY_INFO_TABLE WHERE DATE= ? AND ID = ?");

TreeMap tmap = new TreeMap();
for (int i = 0; i < facility.size(); i++) {
FacilityBean facilityBean = (FacilityBean) facility.get(i);
pstmt.setString(1, date);
pstmt.setString(2, facilityBean.getId());

ResultSet rs = pstmt.executeQuery();

while (rs.next()) {
for (int j = 9; j < 21; j++) {
String key = facilityBean.getId() + "_" + String.valueOf(j);
String _hour = rs.getString("r" + j);
if (_hour == null || _hour.equals("")) {
tmap.put(key, null);
} else {
tmap.put(key, _hour);
}
}
}

rs.close();
}

pstmt.close();
return tmap;

}


public int insertFacility(TreeMap record) throws SQLException {


*ここにどのようにUpdateのコードをいれるか、どなたか教えてください!!!

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-05-31 09:58
引用:

SSさんの書き込み (2005-05-30 21:16) より:
今、施設予約のプログラムのDAOを作っていて、SQLのupdateで悩んでいます。
Updateの条件が、施設IDとユーザーID,時間です。予約を行った人だけが更新可能です。


と書いてあって、Javaのソースがかかれていますが、
テーブル構造や、どんなUpdateを発行したいのか
Update文自体が分からないのか、やってみたけどエラーになるのか…

updateの何で悩んでいるのかを明記していただけますか?


SQLとは関係ないですが…
引用:


public int insertFacility(TreeMap record) throws SQLException {


*ここにどのようにUpdateのコードをいれるか、どなたか教えてください!!!





Updateのコードとかかれていて、メソッド名にinsertがつくんですか?
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-05-31 13:40
最初に、この部分はコピーミスだと思われますので、削除してください。
コード:
public void getRecords() throws SQLException {

String sql = "SELECT * FROM FACILITY_RESERVATION_TABLE ORDER BY FACILITY_RESERVATION DESC";
ResultSet rs = stmt.executeQuery(sql);



引用:

Updateの条件が、施設IDとユーザーID,時間です。



SQL 文に求める機能仕様として意味不明です。
施設ID、ユーザID、時間が条件を満たした時ということはわかりますが、どのテーブルのどのカラムを何で update したいのか明確にしましょう。

引用:

予約を行った人だけが更新可能です。



「予約を行った人」というのはどのように表現されるデータですか?
それともあるセッション中でユーザが予約機能を実行した場合に限り、更新機能も実行できるという意味ですか?
このあたりを明確にしてください。

(後者だったら、トランザクション管理をきちんとした上で、予約機能を実行した時にフラグを立てれば良い気もしますが)
SS
会議室デビュー日: 2005/05/30
投稿数: 4
投稿日時: 2005-05-31 22:30
返答してくださって、ありがとうございます。
昨日投稿した情報だけでは、不十分でした すみません。
まずテーブルの構成は、施設ID,施設予約日,各時間帯の情報が1レコードになっています。予約をする場合、1.レコードが無い場合2.既にレコードが存在する場合の2とうりです。
a. 予約情報の取得:日付情報を指定して、キー: "施設ID" + "_" + "時間"  値 : 予約状況(社員ID or null or ""等)
b. 予約情報の更新(こちらの処理で悩んでいます。)情報の更新に必要なデータが、日時、施設ID、予約ID。画面では複数施設の複数時間帯を選択可能です。

テーブルは、下記のようにつくりました。また、時間も別クラスでつくってあります。
■施設情報テーブル(FACILITY_INFO_TABLE)
--------------------------------------------------------------------
フィールド名 データ型 概要
--------------------------------------------------------------------
ld INT 施設ID
Name VARCHAR(30) 施設名

■施設予約者テーブル(FACILITY_USER_TABLE)
--------------------------------------------------------------------
UserID INT(10) 社員ID
User VARCHAR(30) 社員名

■施設予約テーブル(FACILITY_RESERVATION_TABLE)
--------------------------------------------------------------------
ld INT 施設ID
Date DATE 施設予約日
r09 VARCHAR(10) 09:00〜10:00の予約者ID
r10 VARCHAR(10) 10:00〜11:00の予約者ID
r11 VARCHAR(10) 11:00〜12:00の予約者ID
r12 VARCHAR(10) 12:00〜13:00の予約者ID
r13 VARCHAR(10) 13:00〜14:00の予約者ID
r14 VARCHAR(10) 14:00〜15:00の予約者ID
r15 VARCHAR(10) 15:00〜16:00の予約者ID
r16 VARCHAR(10) 16:00〜17:00の予約者ID
r17 VARCHAR(10) 17:00〜18:00の予約者ID
r18 VARCHAR(10) 18:00〜19:00の予約者ID
r19 VARCHAR(10) 19:00〜20:00の予約者ID
r20 VARCHAR(10) 20:00〜21:00の予約者ID
r21 VARCHAR(10) 21:00〜22:00の予約者ID

まだ、Javaの勉強を始めて4月半で、知識もあいまいなので、時間がかかっています。よろしくお願いします。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-05-31 23:33
コード:

String sql = "update FACILITY_RESERVATION_TABLE " +
       "set r" + 時間 + "='" + 予約者ID + "' "+
       "where ld = '" + 施設ID +"' " +
       "and Date = '" + 予約日 +"'";

みたいな処理がやりたいんですよね?
予約日のレコードが無ければinsertして。
がんばってください
# 以下追記
PrepareStatementを使うなら
コード:
String sql = "update FACILITY_RESERVATION_TABLE " +

       "set r09=?,r10=?,r11=?,r12=?,r13=?,r14=?,r15=?,r16=?,r17=?,r18=? "+
       "r19=?,r20=?,r21=? where ld = ? and Date = ?";

ですかね。

[ メッセージ編集済み 編集者: taro 編集日時 2005-06-01 03:07 ]
SS
会議室デビュー日: 2005/05/30
投稿数: 4
投稿日時: 2005-06-01 10:03
taroさんありがとうございます。
1件の更新はそうなり、画面で複数のデータが1回のリクエストでくるようにしたいのですが、それをDAOとビジネスロジクをどのように分ければいいか教えていだだけませんか??
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-06-01 10:57
もう少し他人に読んでもらうということを意識して、整理して書きましょうよ。

引用:

a. 予約情報の取得:日付情報を指定して、キー: "施設ID" + "_" + "時間"  値 : 予約状況(社員ID or null or ""等)



a. 予約情報の取得: 施設ID、日付情報、予約時間を検索キーとして施設予約テーブルを検索する。
値として予約状況が得られる。
予約状況は以下のキーと値のペアを管理する TreeMap オブジェクトとして返される。
キー: 施設ID + "_" + 時間
値: 予約されていれば予約した社員ID、されていなければ null

あと、本来独立した情報であるはずの施設IDと時間を結合した文字列として返すのは、もし受け取った側で再び解析するならばですが、プログラムの処理効率を悪くするため推奨しません。
せめて
コード:
public class FacilityReservationResult {
  private int facilityID;
  private int hour;
  private String userID;
}


くらいのクラスを作り、そのオブジェクトの集合を返すようにしましょう。
(蛇足ですが、最初の投稿の _hour 変数って、時間ではなくて予約者IDを保持するものですね。誤解を招くのでやめましょう。)

で、ここまで来てようやく本題ですが、再び、最初の投稿の
引用:

予約を行った人だけが更新可能です。


の「予約を行った人」と更新を行おうとしている人の関係を整理してください。

一般的には、現セッション中で保持されているであろう操作者IDと予約者IDを比較して、完全に一致しなければ更新不可とするとは予想できます。
これが SS さんが書かれた意図と一致するとは限りませんので、今一度、ご自身の手と頭で要件を整理してください。

ここまで相当「鞭」を駆使したので、ここらで「飴」をば
コード:
update FACILITY_RESERVATION_TABLE set r09=? where ld=? and Date=? and r09=?


以下同様。

以前の予約者と同じ人物が予約を取り消したい場合は、
コード:
update FACILITY_RESERVATION_TABLE set r09="" where ld="体育館ID" and Date="20050610" and r09="社員01"


のようになるのでしょうか。

個人的には施設予約テーブルのスキーマ自体に違和感を覚えます。
自分で作るとしたら
facilityID integer 施設ID
reservedDate date 予約日付
hourZone integer 時間帯
だけにして、
列制約: 9 <= hourZone <= 21
表制約: facilityID, reservedDate, hourZone の組が一意
あたりにするかな〜。
(でも組み始めてやっぱり違っていたら変える

連続性のある予約時間帯をわざわざ別カラムにするというのが、その後のテーブル操作性をまったく考えていない設計に見えます。
1

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