カーソルを移動させるには・・・?


こよみ  2002-03-07 13:54:45  No: 634  IP: [192.*.*.*]

Tableを使ってデータセット内の前のレコードや次のレコードにカーソルを
移動されたいのですが、うまく動きません。
下記の様に書きましたが、カーソルは移動しませんでした。
Table1.Locate('EDPNO',KeyStr,[ ])
Table1.Prior;
Response.Content:= claim.Content;
              ・
              ・    
何か良い方法がありましたら教えて下さい。  宜しくお願いします。

編集 削除
にしの  2002-03-07 23:00:08  No: 635  IP: [192.*.*.*]

Priorでなく、FindPriorでは動きませんか?
TDataSet.FindPriorのヘルプに、例が出ています。
# 当方、Delphi5

編集 削除
 2002-03-08 09:52:28  No: 636  IP: [192.*.*.*]

にしのさんありがとうございました。  カーソルを移動する事が出来ました。
申し訳ありませんがもう一つ質問したい事があるのですが、ボタンを押して
カーソルを移動して、そのレコードを更新したいと思っているのですが、
それもうまく動きません。下記の様に書きました。
<Table>
KANRINO:= requestUrl.QueryString['KANRINO'];
Table1.FieldByName('KANRINO').AsString:= KANRINO;
if DataBase1.InTransaction then DataBase1.Commit;
dataBase1.StartTransaction;
try
  Table1.Post;
  DataBase1.Commit;
except
  DataBase1.Rollback;
end;
どのレコードにカーソルを移動して更新しても最初のレコードしか更新されない。
<Query>
EDPNO:= requestUrl.QueryString['EDPNO'];
KANRINO:= requestUrl.QueryString['KANRINO'];
Query1.SQL.Add('UPDATE TEST SET kanrino=:KANRINO');
Query1.SQL.Add(' WHERE edpno=:EDPNO');
Query1.Prepare;
Query1.ParamByName('edpno').AsString:= EDPNO;
Query1.ParamByName('kanrino').AsString:= KANRINO;
Query1.ExecSQL;
どのレコードも更新されない。
という結果でした。  何か良い方法がありましたら教えて下さい。
宜しくお願いします。

編集 削除
にしの  2002-03-08 11:26:51  No: 637  IP: [192.*.*.*]

データベースに関しては疎いので、あっているかどうかわかりませんが^^;

TDataSet.FieldByNameのヘルプを見ると、「注意」のところに、
> 指定した項目の値を取得または設定する場合は,FieldByName ではなく,
> データセットのデフォルトプロパティの FieldValues を使用します。
と書いてありますから、<Table>で行っているFieldByNameを、FieldValuesに変更してみてはどうですか?

編集 削除
こよみ  2002-03-08 12:05:12  No: 638  IP: [192.*.*.*]

早速お返事ありがとうがざいます。  私もヘルプを見たりして試行錯誤を
繰り返していますが、未だにうまく動きません。
にしのさんがおっしゃっているFieldValuesも試してみましたが
やはりTableを使って更新をしようとすると、どこにカーソルがあっても
最初のレコードしか更新されません。
また良い方法がありましたら教えて下さい。

編集 削除
にしの  2002-03-08 15:36:41  No: 639  IP: [192.*.*.*]

こんなので更新できました。
StartTransactionあたりのヘルプに例があります。


  Table1.Edit; { ここに来る前に、カレントレコードの位置を変えておく }
  Table1.FieldValues['部署'] := 'BBB'; { 値を変更 }

  with Table1 do
  begin
    Database1.StartTransaction;
    try
      ApplyUpdates; { 更新内容をデータベースに書き込む }
      Database1.Commit; { 成功した場合,変更をコミットする }
    except
      Database1.Rollback; { 失敗した場合,変更を取り消す }
      raise; {CommitUpdates が呼ばれないように例外を生成する }
    end;
    CommitUpdates; { 成功した場合,キャッシュをクリアする }
  end;

編集 削除
にしの  2002-03-08 15:38:16  No: 640  IP: [192.*.*.*]

1つ忘れてました。
Table1の、CachedUpdatesをTrueに変更です。

編集 削除
こよみ  2002-03-08 17:13:54  No: 641  IP: [192.*.*.*]

にしのさん、また返事をくださってありがとうございます。
にしのさんがおっしゃっていた通り、StatrTransactionのヘルプ参考にして
試してみましたがやはり更新はされませんでした。
最初の1件はちゃんと更新されて表示もされるのですが、他のレコードを更新すると
更新も表示もされず、変更したはずの値が最初のレコードに入ってしまいます。
このヘルプを見て思った事なんですが、このヘルプの例の場合、ボタンを
クリックした場合に更新の処理をする・・・という様に解釈できるのですが、
違いますか??  私がやりたいのは'->'ボタンや'<-'ボタンを押した時に
1つ前や1つ後のレコードを表示して、値を変更したいレコードの値を変更して
変更ボタンを押すと変更する・・・というプログラムが作りたいと思っています。
さらにWeb上に表示したいと思っています。  
説明不足ですし、専門用語もあまりしらないので分かりずらいと思いますが
申し訳ありません。  何度も申し訳ありませんが、また良い方法がありましたら
教えて下さい。  宜しくお願いします。

編集 削除
にしの  2002-03-08 22:33:20  No: 642  IP: [192.*.*.*]

'->'ボタンって、Navigatorのレコード移動ボタンですか?
個人的には、この場合は自前で用意した方がよいと思います。

ちょっと読みとれなかったので、'->'が次レコードボタンで、'<-'が前レコードボタンだとします。

「前レコードボタンを押したときに、次へ進んで値を変更する」だと、「現在の値を変更する」のと同じ気がしますが、違いますか?
そうなると、やはり「前レコード」を用意するより、「現在の値を○○に変更して更新」ボタンが妥当かと。

Webに表示することと、データを操作することは別で考えた方がいいです。いっぺんに考えて、いっぺんに組み込もうとすると、1つバグが出ただけでいろいろ見なければならなくなるので。

編集 削除
こよみ  2002-03-11 17:06:46  No: 643  IP: [192.*.*.*]

にしのさん、お返事ありがとうがざいます。  また説明不足だった様で
申し訳ありませんでした。  まだ初心者なので何と説明したらうまく伝わるのか
分からない時があります。  その時はまた聞いて下さい。
'->'ボタンや'-<'ボタンはHTMLで書いています。  透過タグで'->'ボタンが
押されたら今表示しているレコードに対して1つ先のレコードを表示、また
'-<'ボタンが押されたら今表示しているレコードに対して1つ前のレコードを
表示する、という事がしたいと思っています。  それはテーブルを使って
動く様になりましたが、更新は未だに出来ていない状態です。  レコードを
移動させる時に元になる値を、レコードが移動する度にHIDDENで格納しているので
それと何か関係があるのかな・・・と考えているのですが・・・。
また分かりずらい説明になってしまいましたが、また何か良い方法がありましたら
教えて下さい。  宜しくお願いします。

編集 削除
にしの  2002-03-13 12:54:00  No: 644  IP: [192.*.*.*]

Webアプリケーションですか?
動作の基本は同じです。
Actionが呼び出されたときに、データベースを検索・移動・更新させればよいだけです。

Webアプリケーションを走らせる環境に無いので、GUIのボタンでの動作ですが、こんな感じで出来るはずです。
それとも、Webアプリケーションだと動かないのでしょうか。
そうなると環境の問題ですかね。
うちの環境は、
Delphi5 + Oracle8i + ODBC(Oracle ODBC Driver)
です。

begin
  Table1.Locate('氏名コード', 'CC',[ ]); { 検索 }
  Table1.FindPrior; { 検索したレコードの前のレコードへ移動 }

  Table1.Edit; { 編集モード }
  Table1.FieldValues['部署'] := 'BBB'; { 値の変更 }

  with Table1 do
  begin
    Database1.StartTransaction;
    try
      ApplyUpdates; { 更新内容をデータベースに書き込む }
      Database1.Commit; { 成功した場合,変更をコミットする }
    except
      Database1.Rollback; { 失敗した場合,変更を取り消す }
      raise; {CommitUpdates が呼ばれないように例外を生成する }
    end;
    CommitUpdates; { 成功した場合,キャッシュをクリアする }
  end;
end;

編集 削除