- PR -

ROWSTATEの変更

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-13 06:34
引用:

うがやさんの書き込み (2007-10-13 04:03) より:
DataRowにはSetAddedっていうメソッドがありますよ。
私も一度はまったことがあります。


おお!2.0で追加されてる...
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-10-15 10:22
ご返答ありがとうございます。

jittaさんより、更新前が必要ですか?
ですが、例えば数量を3から5に修正入力した場合
更新前に掛ける-1、更新後の5はそのままで集計テーブルに更新する為なのです。

集計テーブル 数量 100とあった場合
100 -3 で更新
100+5 で更新
結果、数量は102とするのです。

ところでSetAddedも試してみました。

行状態はDeleteもModifiedもAddedにしたいのです。

どうも もModifiedやDeleteの状態の行をSetAddedにすると
エラーになるのですが・・
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 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した方がよいでしょうか?
 
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2007-10-15 11:31
プログラム以外からテーブルaを更新した場合でもテーブルbを更新したほうが
メンテナンス性が上がると思いますので、トリガで作成したほうが良いのでは
ないでしょうか?

(例えば、インポートやSQLPlusなど値を変更)

また、テーブルaを更新するプログラムが追加になった場合に工数を減らす
ことができます。

トリガはこんな感じになると思います。

コード:

CREATE TRIGGER トリガ名
AFTER INSERT OR UPDATE OR DELETE
ON テーブルa
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT テーブルb(
項目1, 項目2, 数量)
VALUES(:NEW.項目1, :NEW.項目2, :NEW.数量) ;
ELSIF UPDATING THEN
INSERT テーブルb(
項目1, 項目2, 数量)
VALUES(:oLD.項目1, :oLD.項目2, (-1)*:oLD.数量) ;
INSERT テーブルb(
項目1, 項目2, 数量)
VALUES(:NEW.項目1, :NEW.項目2, :NEW.数量) ;
ELSIF DELETING THEN
INSERT テーブルb(
項目1, 項目2, 数量)
VALUES(:oLD.項目1, :oLD.項目2, (-1)*:oLD.数量) ;
END IF ;
END



[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2007-10-16 15:56 ]
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 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

というようにしようと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-16 06:27
引用:

LANVINさんの書き込み (2007-10-12 14:27) より:
DataTable+DataAdapterでの更新で
DataTableをコピーして別のテーブルに更新しようとしていますが
必ずINSERTにしたい為、ROWSTATEを全てADDの状態にしたいのですが
可能でしょうか?(ReadOnlyと出てきます)


この、最初の投稿からは、「あるテーブルの内容を、別のテーブルにコピーする」としか読み取れませんでした。次の、10/12 16:09 に、
引用:

1 Insert,Update,Deleteコマンド全て INSERT INTOにする


と出てきます。ここで私は、「テーブルのコピーで、なんで INSERT, UPDATE, DELETE が関係するの?」と、軽くパニック状態になりました。

 その後の 10/12 18:02 で、「テーブルaも更新しその更新前と更新後の内容もbに追加したいのです。」と出てくるので、ここから「テーブルaに対して行った更新内容をログとしてどこかに保存したいのかもしれない」と思い、10/13 00:12 に、「JSOK対応?」と書きました。J-SOX の間違いですが。

 そうは思ったのですが、10/15 10:22 で、また訳がわからなくなります。
引用:

例えば数量を3から5に修正入力した場合
更新前に掛ける-1、更新後の5はそのままで集計テーブルに更新する為なのです。

集計テーブル 数量 100とあった場合
100 -3 で更新
100+5 で更新
結果、数量は102とするのです。


なぜ?
 数量を 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さんご自身が時間を無駄に使わないために、提案を受け入れて下さるように願います。
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 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となるようにするのです。

なぜ丸ごとコピーするのかというのは
伝票入力用テーブルと、ログファイルみたいなテーブルのレイアウトが
全く同じ為です。

下手な説明ですいません。





Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-16 22:15
 まず、私は、迷惑とは思っていません。
私が迷惑と感じるなら、単に見なければ済む話ですから。
 下手な説明も、謝る必要はありません。読み手は、わからなければスルーするだけです。
それなのにいちいち突っかかるお節介な人に、謝る必要はありません。

引用:

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となるようにするのです。


 私なら、「集計テーブル」という実体は作りません。ビューにするでしょう。そうすると、「元々100に 1回目分+3, 2回目分-3+5 ,3回目分-5+4し 104となるようにする」のような操作が不要になります。
その辺は、今更でしょうから置いておいて。

 書かれている内容からは、集計テーブルには「最終的に、今いくら?」だけが入っている、ということでしょうか。
これに対して、ログテーブルの方に、操作ごとの集計を記録していく、ということでしょうか。

 そうだとすると、「伝票入力用テーブルと、ログファイルみたいなテーブルのレイアウトが全く同じ為です。」は、納得できませんね。
なぜなら、同じレイアウトなら、操作の記録にならないからです。
少なくとも、ログテーブルの方には、操作を行った日時が入っていないと、何がどうなったのかさっぱりわからないでしょう。
ご存じだと思いますが、データベースでは、追加した順番に取り出せる保証はありません。
また、誰が、何を行ったのかが記録されていなければ、「どうしてこうなっているんだ!」となったときに、誰が、どういう目的で操作したのかわからず、ログとしての意味がありません。

 ともかく、実装したいことはわかりましたが、それによって状況がどのように変化するのかわかりません。こんな感じ?
コード:
集計テーブル
品番コード
     合計
A    100        「3枚売り上げ」単純に3を足す
A    103        「5枚に変更」103 から 3 を引いて、5 を足す
A    105        「4枚に変更」105 から 5 を引いて、4 を足す
A    104        ←今ここ
↑1つのレコードしかない


集計ログテーブル
A    100
A    103        「3枚売り上げ」
A    105        「5枚に変更」
A    104        「4枚に変更」
↑4つのレコードがある


しかし、10/15 11:27、17:35 のコードだと、集計ログテーブルが次のようになると思うのです。
コード:
A    100
A    103        「3枚売り上げ」
A    100         3を5に訂正するため、3を引いたもの
A    105        「5枚に変更」
A    100         5を4に訂正するため、5を引いたもの
A    104        「4枚に変更」
↑6つのレコードがある


本当にこんなことをする必要があるのでしょうか?

 そもそも、3や5や4という数値は、どこにあるのですか?
集計なのですから、「集計元」の表があるはずです。
Excel であれば、Sum などの関数で合計行を表示しますが、「集計テーブル」と言っているものは、そのような関数で表現可能なものではないですか?
すなわち、3が5や4に変わったという記録が取られていれば、集計結果の変化を記録する必要はないと思います。
何月何日何時何分の時点でどのような値だったという記録があれば、その値を集計することで、計算で求めることができるからです。
少なくとも、修正のために元に戻した値は必要ないでしょう。
それは変化の途中なのですから。

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