- PR -

オラクルのレコードカウントの制御

投稿者投稿内容
カズ
会議室デビュー日: 2008/04/30
投稿数: 17
投稿日時: 2008-06-30 22:57
プログラム初心者です。
オラクル(11g)で、10個のPCで10人が、あるテーブルのデータを更新していく、システムを作成(VB2005)しています。

画面は2パターンです。
・データ一覧表示画面
・上記からデータを選択し、編集する用の画面

例として下記のようなデータがあります。

テーブルC 日付順 番号はユニーク

日付_番号_ステータス__レコードカウント(Rc)
1/3____1_____Q________0
1/5____2_____R________1
1/6____5_____G________2 (Rc=2)
1/7____7_____P________3 (Rc=3)
1/20__ 9_____R________4
2/1___10_____U________5


動作の流れ

1.まず、この全データをSQLで読込みます。
SELECT * FROM テーブルC ORDER BY 日付 ASC
これが一覧表示画面(VB2005のグリッドビュー等)に表示されます。

2.A氏が例えば1/6のレコードを編集したいとします。
そこで、1/6(日付)の列をマウスで選択。このとき列番号(レコードカウント)は2になります。
編集画面フォームに、同じSQL(SELECT * FROM テーブルC ORDER BY 日付 ASC)
と、列番号(レコードカウント)2を、引渡しします。

3.編集画面で、引き渡されたSQLを実行し、そのデータを全てDatatblに格納します。
そのデータの3つめ(レコードカウント2)を参照します。
datatabl.Rows(2).Item("ステータス")
データは参照後、ある条件によりステータスが変わります。
ステータスが、"Z"になった場合、そのレコードは、テーブルAに移動されます。

4.編集後は、他のテーブルに移動する場合でも、テーブルCがそのまま更新される場合でも、
自動的に次の列のレコードに移行し編集を行う。
今回は例として、1/6のレコードのステータスが"Z"になって
A氏は次に1/7(Rc3)のデータを編集作業に入ります。

5. 4.を実行するため、また同じSQLを実行。
SQL実行後、レコードカウントを次に移行すればいいのですが(Rc=2に1を加え、Rc=3とする)、
Rc=3を見ても、1/20のデータが抽出されて しまいます。 (1/6のレコードが移動してなくなってしまった場合)


また、他の例として、上記と同様に、A氏が1/6のデータを編集中に、他の人が1/3,1/5のデータを編集移動
してしまった場合、レコードカウントがぐちゃぐちゃになってしまいます。

こうした多くの人がデータを編集、更新・移動する場合のテーブルを、日付順に作業させていく場合は、どのような制御
(またはオラクルの機能)をすれば、可能なのかご指導頂ければ助かります。


[ メッセージ編集済み 編集者: カズ 編集日時 2008-07-01 01:09 ]
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-07-01 00:10
数回読んでみましたが、私には仕様が伝わりませんでした。

例えば、

引用:

カズさんの書き込み (2008-06-30 22:57) より:
この場合、更新されたら、レコードカウントを次に移行すればいいのですが(Rc2+1で Rc3)、
1/6のデータを編集後、他のテーブルに移動された場合、Rc3を見ても(SQL再読込後)、1/20のデータが抽出されて
しまいます。



と書いてあっても、「抽出されてしまいます。」だけでは伝わりません。
作ってみたSQLを(多少ぼかしてでも)書いてみると良いと思います。
きちんと仕様を整理して、わかりやすく説明されてはいかがでしょうか。

日付とレコードカウントの関係も伝わらなかったのですが、
テーブルを移動すること、レコードカウントで連鎖している(?)ことから、
「UNION」や「階層問い合わせ」辺りじゃないかな?な予感はします。
カズ
会議室デビュー日: 2008/04/30
投稿数: 17
投稿日時: 2008-07-01 01:10
あしゅさんありがとうございます。助かります。

書き直してみましたが如何でしょうか。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-07-01 09:27
このテーブルには主キーはないのでしょうか?
カズ
会議室デビュー日: 2008/04/30
投稿数: 17
投稿日時: 2008-07-01 09:33
引用:

七味唐辛子さんの書き込み (2008-07-01 09:27) より:
このテーブルには主キーはないのでしょうか?



すいません、主キーは番号です。よろしくお願いします。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-07-01 10:23
なにをしたいのかよくわかりませんが、レコードカウントの役割はなんですか
一意識別するのであれば、番号を引き渡して更新処理をするのが普通では
やりたことはレコードカウントを連番にしたいということなのでしょうか?
カズ
会議室デビュー日: 2008/04/30
投稿数: 17
投稿日時: 2008-07-01 11:03
なかなかうまく説明できなくてすみません・・・。

文のSQLのところで、SQLを実行した内容をdatatblに格納します。
レコードカウントは、下記のRcの場所で使用しています。
work = datatabl.Rows(Rc).Item("ステータス")

レコードカウントを連番にしたいというイメージですが、ようは、
日付順にレコードを更新していきたいのです。

問題なのは、日付を最初に指定できてしまうので、最初に1/6(日付)のデータを指定して更新した場合、その次に1/6以降で最近い日付を更新したいのです。そのとき、他の人が1/3,1/5を更新→レコード移動されてしまう可能性もあります。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-07-01 13:05
そうであれば レコードカウント方式をやめた方がよいのでは
更新したあと再度とりなおせば済む話では

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