- PR -

時刻計算について

投稿者投稿内容
顔爺
ベテラン
会議室デビュー日: 2003/10/03
投稿数: 52
投稿日時: 2004-05-17 16:41
コード:

if (shussha==taisha) {



ここが間違っています。Object 同士の比較は equals を使用します。

# 追記
あれれ?
コード:

if (shussha==taisha) {


は、両方とも nullでないかぎり常に偽だから INSERT 文が呼ばれるはずですねぇ。

間違いは間違いでも関係ない?

[ メッセージ編集済み 編集者: 顔爺 編集日時 2004-05-17 16:44 ]

# さらに追記
コード:

rs = st.executeQuery(sql);
Time shussha = rs.getTime("shussha");


rs.next() が抜けています。

[ メッセージ編集済み 編集者: 顔爺 編集日時 2004-05-17 17:06 ]
すなめり
常連さん
会議室デビュー日: 2003/01/29
投稿数: 37
お住まい・勤務地: 横浜
投稿日時: 2004-05-17 17:02
間違っている個所は顔爺さんが指摘してくださったので、その他について。

何も処理されないということですので、おそらく、どこかで例外が発生していて
catchに飛んでいるのだと思います。
でも、今はcatchでは何も処理していませんよね?
catchでExceptionクラスの内容を表示させれば、ちょっとはデバッグが早く
進むかと思います。

タイムカードの押し忘れ対策として、別ページで修正できるようにするとの
ことですが、そもそもユーザが退勤時刻を記録するつもりなのに出勤時刻の
記録になってしまったりするのは、使う側としてはあまりうれしくないのでは
ないでしょうか。
システムで判別できないならともかく、仕掛け上判別はできる筈ですから、
ちょっと頑張ってみるのもよいのでは、と思います。

それと、これは危険性は低い事象なのですが、複数のページから同じIDで
接続している場合に、データの不整合を起こす危険がありますね。
退勤時刻を記録しようとしてブラウザA(の処理をしているサーバプロセス)が
最大のIDを取得した後で、ブラウザB(の処理をしているサーバプロセス)が先に
UPDATEしてしまい、ブラウザAが新規にデータを挿入する(出勤を記録する)べき
だと判定してしまうとか。
厳密にやるとすれば、トランザクションの管理が必要になってきます。
まあ、社内の出退勤管理システムということですので、同じIDで複数の
人間がアクセスする可能性は低いと考えられますし、気にしなくても
よいかもしれません。
みかん
会議室デビュー日: 2004/05/01
投稿数: 10
投稿日時: 2004-05-17 17:36
返信ありがとうございます。
アドバイスして頂いた通り、

if (shussha.equals(taisha))

と変更し、また以下の部分を追加してみました。

catch (Exception e) {
out.println("データ追加エラー"+e);
try {
// ロールバックします
conn.rollback();
} catch (SQLException ex) {
e.printStackTrace();
}
}

すると、java.sql.SQLException:Column'no' not found
というエラーが出ました。。。。

最新データを取得する部分でどこか間違っているのでしょうか??

select no,name,uid,hiduke,thiduke,shussha,taisha
from kinmu
where no=(select max(no) from kinmu)

という方法で最新のデータを取得しようとも考え、コマンドプロンプト上で打ってみたのですがうまく選択されませんでした。バージョンはmysql-3.23.55です。
未記入
会議室デビュー日: 2003/09/24
投稿数: 18
投稿日時: 2004-05-17 19:50
引用:

みかんさんの書き込み (2004-05-17 17:36) より:

select no,name,uid,hiduke,thiduke,shussha,taisha
from kinmu
where no=(select max(no) from kinmu)

という方法で最新のデータを取得しようとも考え、コマンドプロンプト上で打ってみたのですがうまく選択されませんでした。バージョンはmysql-3.23.55です。



 このselect文が上手くいかないのは、mysql3.23で
副問い合わせ文がサポートされていないのが原因だと思います。
 
 あと、今までの投稿にはかかれてないようですが、
noはautoincrement型になっているんですよね?
みかん
会議室デビュー日: 2004/05/01
投稿数: 10
投稿日時: 2004-05-17 20:18
teaさんのおっしゃる通り、noはautoincrement型です。
それが原因でしょうか??
ご教授の程よろしくお願いしますm(u_u)m
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-05-17 21:19
引用:

みかんさんの書き込み (2004-05-17 17:36) より:
catch (Exception e) {
out.println("データ追加エラー"+e);


これよりも、
e.printStackTrace();
の方がよいでしょう。例外の発生箇所も含めてより詳細な情報が出力されます。

引用:

すると、java.sql.SQLException:Column'no' not found
というエラーが出ました。。。。

最新データを取得する部分でどこか間違っているのでしょうか??


ではなくて、update文では? まず例外の発生箇所を特定するのが先ですが、SQLExceptionが
出る場合は、実行しているSQL文をDB付属ユーティリティなどで実行できるかどうか確認して
みましょう。
未記入
会議室デビュー日: 2003/09/24
投稿数: 18
投稿日時: 2004-05-18 10:03
引用:

みかんさんの書き込み (2004-05-17 20:18) より:
teaさんのおっしゃる通り、noはautoincrement型です。
それが原因でしょうか??
ご教授の程よろしくお願いしますm(u_u)m


 すいません、原因とは直接は関係ないんです。
情報を正確にしてもらった方が解決しやすいと思っただけで(^^;

 ukさんが既に指摘されていますが、何行目でSQLExceptionが起きていて
今の状態になっているのかをはっきりさせる必要があると思います。
対処はそれからのほうが。
みかん
会議室デビュー日: 2004/05/01
投稿数: 10
投稿日時: 2004-05-18 11:02
引用:

ukさんの書き込み (2004-05-17 21:19) より:
引用:

みかんさんの書き込み (2004-05-17 17:36) より:
catch (Exception e) {
out.println("データ追加エラー"+e);


これよりも、
e.printStackTrace();
の方がよいでしょう。例外の発生箇所も含めてより詳細な情報が出力されます。



というアドバイスを頂いたので早速

catch (Exception e) {
e.printStackTrace();
try {
// ロールバックします
conn.rollback();
} catch (SQLException ex) {
e.printStackTrace();
}
}
に書き換えてみました。しかし、何のエラーも表示されなくなってしまいました(;へ:)
変更の仕方がおかしいのでしょうか??調べてみたのですが分かりませんでした。。

また、

sql = "UPDATE kinmu SET "
+ " taisha = '" + request.getParameter("taisha") + "'"
+ " thiduke = '" + hiduke +"'"
+ " WHERE no = " + rs.getInt("no");

の一部に変な箇所があったので
+ " taisha = '" + request.getParameter("taisha") + "',"
と直しました。

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