- - PR -
ROWSTATEの変更
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-10-13 06:34
おお!2.0で追加されてる... | ||||||||||||
|
投稿日時: 2007-10-15 10:22
ご返答ありがとうございます。
jittaさんより、更新前が必要ですか? ですが、例えば数量を3から5に修正入力した場合 更新前に掛ける-1、更新後の5はそのままで集計テーブルに更新する為なのです。 集計テーブル 数量 100とあった場合 100 -3 で更新 100+5 で更新 結果、数量は102とするのです。 ところでSetAddedも試してみました。 行状態はDeleteもModifiedもAddedにしたいのです。 どうも もModifiedやDeleteの状態の行をSetAddedにすると エラーになるのですが・・ | ||||||||||||
|
投稿日時: 2007-10-15 11:27
RESありがとうございます。
検証不足でした。 DataTable = Ds.Tables("元").Copy For Each ROW As DataRow In DataTable.Rows ROW.AcceptChanges() ROW.SetAdded() Next とROW.AcceptChangesを更新直前に行うか 元テーブルを更新後(DataAdapter.Update(Ds, "元")に DataTable = Ds.Tables("元").Copy For Each ROW As DataRow In DataTable.Rows ROW.SetAdded() Next とした場合RowStateがUnchangedになりROW.SetAddedができました。 更新前にROW.AcceptChangesした方がよいでしょうか? | ||||||||||||
|
投稿日時: 2007-10-15 11:31
プログラム以外からテーブルaを更新した場合でもテーブルbを更新したほうが
メンテナンス性が上がると思いますので、トリガで作成したほうが良いのでは ないでしょうか? (例えば、インポートやSQLPlusなど値を変更) また、テーブルaを更新するプログラムが追加になった場合に工数を減らす ことができます。 トリガはこんな感じになると思います。
[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2007-10-16 15:56 ] | ||||||||||||
|
投稿日時: 2007-10-15 17:35
ゆうじゅんさん、ありがとうございます。
そのような方法があると、大変参考になりました。 ただどうしてもDataAdapterで実行したい為 DataTable を2つ用意し 1 更新前セット DataTable = Ds.Tables("元").Copy For Each ROW As DataRow In DataTable.Rows ROW.SetAdded() Next 2 入力内容セット 3 入力後セット DataTable2 = Ds.Tables("元").Copy For Each ROW As DataRow In DataTable2.Rows ROW.AcceptChanges() ROW.SetAdded() Next というようにしようと思います。 | ||||||||||||
|
投稿日時: 2007-10-16 06:27
この、最初の投稿からは、「あるテーブルの内容を、別のテーブルにコピーする」としか読み取れませんでした。次の、10/12 16:09 に、
と出てきます。ここで私は、「テーブルのコピーで、なんで INSERT, UPDATE, DELETE が関係するの?」と、軽くパニック状態になりました。 その後の 10/12 18:02 で、「テーブルaも更新しその更新前と更新後の内容もbに追加したいのです。」と出てくるので、ここから「テーブルaに対して行った更新内容をログとしてどこかに保存したいのかもしれない」と思い、10/13 00:12 に、「JSOK対応?」と書きました。J-SOX の間違いですが。 そうは思ったのですが、10/15 10:22 で、また訳がわからなくなります。
なぜ? 数量を 3 から 5 に修正する。これはわかります。しかし、その後の「数量 100」の"100"は、どこから出てきたのでしょう? また、この修正内容を見ると、 テーブルaに「100」で入っている内容は、97 に「3」を足してできあがった数字である。ここで、「3」を「5」に修正した。なので、数量はその差分である「2」だけ変化する。 と理解しました。 例えば、 「数量」は、毎日始業開始時点での在庫量であるとする。ここで、前日の在庫量との差分を取ることで、当日の入庫量がわかる。しかし、オペレータ入力は入庫量であるが、データベース上は在庫量しか持っていない。このため、当日の入庫量を「3」から「5」に修正した場合、いったん前日の在庫量「97」に戻した後、当日の在庫量を「102」としなければならない。 のような感じ。 これではテーブルbが出てくる余地はないと思います。 または、テーブルbに対して INSERT である必要があるのでしょうか? また、「集計テーブルに更新する」とありますが、「集計」なら、更新してはいけないのではないでしょうか。現在設定されている値を集計するだけで、用が足りると思うのです。 ここに来て、テーブルaとテーブルbの関係が、まったくわからなくなりました。 さらに、10/15 11:27、17:35 のコードですが、これではテーブルの内容を、まるまるコピーしています。変更があった行、なかった行、全部が同じように追加されてしまいます。 このようなテーブルのデュプリケートに、いったい何の意味があるのか。理解しかねます。 まじめに、あなたが何を尋ねたいのか、わかりません。 何を尋ねたいのか理解できないので、答えることができません。 現在どういう状態なのか。どのような操作を行うのか。その結果、どのような状態にしたいのか。最低限、この3つが読み取れるようにして下さい。 私は、あなたが、あなたの時間を浪費していると思います。 投稿する前に、あなたのことをまったく知らない人に、書いてあることが理解できるか、考えてみてはいかがでしょうか。 その一つの方法として、チームメイトなど、あなたの周りの人に、書いた文を見せることを提案します。 この提案は、「文章の推敲」であるため、あなたのチームメイトが質問に答えられるかどうかは関係ありません。あなたの文意を理解できるかどうか、それだけです。 回答者のことなど、考えなくてかまいません。 LANVINさんご自身が時間を無駄に使わないために、提案を受け入れて下さるように願います。 | ||||||||||||
|
投稿日時: 2007-10-16 10:26
おはようございます。
大変言葉足らずの質問にて ご迷惑をかけ、申し訳ありません。 説明を付け加えたいと思います。 集計テーブルというものがあり 品番A 数量 100とあった場合(前日末現在で) 1日の伝票入力で 1回目 品番A 3枚売上 2回目 品番A 5枚に変更 3回目 品番A 4枚に変更 と処理した場合 データの発生は(今回コピーしようとしているテーブル) 1回目は 品番A 数量+3 2回目は 変更前をマイナス1し 品番A 数量-3と+5 3回目も変更前はマイナス1し 品番A 数量-5と+4 と発生させ、 業務終了後、まとめて集計テーブル今回コピーして作成しようとした ログファイルみたいなテーブルより更新して 結果、元々100に 1回目分+3, 2回目分-3+5 ,3回目分-5+4し 104となるようにするのです。 なぜ丸ごとコピーするのかというのは 伝票入力用テーブルと、ログファイルみたいなテーブルのレイアウトが 全く同じ為です。 下手な説明ですいません。 | ||||||||||||
|
投稿日時: 2007-10-16 22:15
まず、私は、迷惑とは思っていません。
私が迷惑と感じるなら、単に見なければ済む話ですから。 下手な説明も、謝る必要はありません。読み手は、わからなければスルーするだけです。 それなのにいちいち突っかかるお節介な人に、謝る必要はありません。
私なら、「集計テーブル」という実体は作りません。ビューにするでしょう。そうすると、「元々100に 1回目分+3, 2回目分-3+5 ,3回目分-5+4し 104となるようにする」のような操作が不要になります。 その辺は、今更でしょうから置いておいて。 書かれている内容からは、集計テーブルには「最終的に、今いくら?」だけが入っている、ということでしょうか。 これに対して、ログテーブルの方に、操作ごとの集計を記録していく、ということでしょうか。 そうだとすると、「伝票入力用テーブルと、ログファイルみたいなテーブルのレイアウトが全く同じ為です。」は、納得できませんね。 なぜなら、同じレイアウトなら、操作の記録にならないからです。 少なくとも、ログテーブルの方には、操作を行った日時が入っていないと、何がどうなったのかさっぱりわからないでしょう。 ご存じだと思いますが、データベースでは、追加した順番に取り出せる保証はありません。 また、誰が、何を行ったのかが記録されていなければ、「どうしてこうなっているんだ!」となったときに、誰が、どういう目的で操作したのかわからず、ログとしての意味がありません。 ともかく、実装したいことはわかりましたが、それによって状況がどのように変化するのかわかりません。こんな感じ?
しかし、10/15 11:27、17:35 のコードだと、集計ログテーブルが次のようになると思うのです。
本当にこんなことをする必要があるのでしょうか? そもそも、3や5や4という数値は、どこにあるのですか? 集計なのですから、「集計元」の表があるはずです。 Excel であれば、Sum などの関数で合計行を表示しますが、「集計テーブル」と言っているものは、そのような関数で表現可能なものではないですか? すなわち、3が5や4に変わったという記録が取られていれば、集計結果の変化を記録する必要はないと思います。 何月何日何時何分の時点でどのような値だったという記録があれば、その値を集計することで、計算で求めることができるからです。 少なくとも、修正のために元に戻した値は必要ないでしょう。 それは変化の途中なのですから。 |