- PR -

ROWSTATEの変更

投稿者投稿内容
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-10-17 13:12
Jittaさん、重ね重ねありがとうございます。

少し環境が伝わっていませんでした。

まず、テーブルは3つです。

伝票入力テーブル(データは伝票+行ごと)
伝票入力ログテーブル(データは伝票+行ごと 加えて訂正前と訂正後)
集計テーブル(データは品番ごと)

それと伝票入力ログテーブルは更新日付欄は最新の日付をセットします。
集計テーブルもSUMすればよのかもしれませんが
件数が多い為、集計した形で持っています。

伝票入力ログテーブルは、1日にいろいろ
新規入力があったり、修正があったりします、
それら1日の動きをテーブルにもち
最後に集計テーブルに更新していきます。

ご理解いただけたでしょうか?


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-17 20:58
どういう状態にあるデータが、
どの操作によって(今分かっているのはこれ)、
どういう状態になるのか。
操作の前後、少なくとも後が分からなければ、結果を出すための操作方法を提示できないのですけど...

コード:
伝票入力テーブル
伝票No 行No ... 品種 数量
     1    1 ...    A    1
     1    2 ...    B    4
     1    3 ...    C    2
     2    1 ...    B    2
     2    2 ...    D    1
     3    1 ...    A    2
     3    2 ...    B    1
     3    3 ...    C    5
     3    4 ...    D    4
     4    1 ...    C    3

集計テーブル
品種 ... 数量
   A ...    3
   B ...    7
   C ...   10
   D ...    5

伝票入力ログテーブル
伝票No 行No ... 品種 数量 種別 更新日時
     1    1 ...    A    1    A xxxxxxxx
     1    2 ...    B    4    A xxxxxxxx
     1    3 ...    C    2    A xxxxxxxx
     2    1 ...    B    2    A xxxxxxxx
     2    2 ...    D    1    A xxxxxxxx
     3    1 ...    A    2    A xxxxxxxx
     3    2 ...    B    1    A xxxxxxxx
     3    3 ...    C    5    A xxxxxxxx
     3    4 ...    D    4    A xxxxxxxx
     4    1 ...    C    3    A xxxxxxxx


こんな感じ?

集計テーブルは、
「SELECT 品種, SUM(数量) FROM 伝票入力テーブル GROUP BY 品種」
な感じで作れるんじゃないかなぁ?
(SQL 文忘れてる orz)

伝票入力ログテーブルも、ログテーブルに対しては追加しかしないなら、訂正前を記録する必要はないですよね?
「種別」に、「追加…A」「削除…D」「更新…U」を記録しておけば、例えば「伝票No 1 の 2 行目を、『B を 4個』から『D を 3個』書き換えた」時には、
コード:
伝票No 行No ... 品種 数量 種別 更新日時
     1    2 ...    D    3    U xxxxxxxx


という行を追加します。修正前は、すでに記録されているので、いらないですよね?
操作後は、このようになります。
コード:
伝票入力ログテーブル
伝票No 行No ... 品種 数量 種別 更新日時
     1    1 ...    A    1    A xxxxxxxx
     1    2 ...    B    4    A xxxxxxxx
     1    3 ...    C    2    A xxxxxxxx
     2    1 ...    B    2    A xxxxxxxx
     2    2 ...    D    1    A xxxxxxxx
     3    1 ...    A    2    A xxxxxxxx
     3    2 ...    B    1    A xxxxxxxx
     3    3 ...    C    5    A xxxxxxxx
     3    4 ...    D    4    A xxxxxxxx
     4    1 ...    C    3    A xxxxxxxx
     1    2 ...    D    3    U xxxxxxxx


LANVINさんがおっしゃっているのは、この、最後の行を2行追加したい、ということですよね?その内容は、どのようなもので、追加した結果はどうなりますか?
私がイメージしているのは、次の2行を追加するようなものです。これは、意味がないと思います。
コード:
伝票No 行No ... 品種 数量 種別 更新日時
     1    1 ...    A    1    A xxxxxxxx
     1    2 ...    B    4    A xxxxxxxx (A)
     1    3 ...    C    2    A xxxxxxxx
     2    1 ...    B    2    A xxxxxxxx
     2    2 ...    D    1    A xxxxxxxx
     3    1 ...    A    2    A xxxxxxxx
     3    2 ...    B    1    A xxxxxxxx
     3    3 ...    C    5    A xxxxxxxx
     3    4 ...    D    4    A xxxxxxxx
     4    1 ...    C    3    A xxxxxxxx
----この2行を追加
     1    2 ...    B    4 prev xxxxxxxx  ← (A)と同じでは?
     1    2 ...    D    3    U xxxxxxxx (B)
----さらに数量を 5 に変更すると、
     1    2 ...    D    3 prev xxxxxxxx  ← (B)と同じでは?
     1    2 ...    D    5    U xxxxxxxx




なんとなく、結果が分からないものを作ろうとしているんじゃないか、と思うのですが、いかがでしょう?
例えば、仕様書に
「伝票を更新したときに、修正した内容をログに記録する。」
と書かれていると書かれていて、これから
「4 を 3 に変えたから、修正前の 4 と 3 を記録しなければならない」
と思いこんでいる。でも、実際のものがどう動くかは、イメージできていない。
そんな感じがします。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2007-10-18 16:11
私は以下のような処理だと思っていました。
この処理だと集計テーブルの更新で参照すべきデータを最小にできると思います。
また、トラブルが発生した場合、集計テーブルを特定の業務日の状態に戻すことも
容易になります。


2007/10/18の業務開始時の集計テーブルの状態を以下のものとして

コード:

集計テーブル
品種 ... 数量
A ... 100
B ... 100
C ... 100



2007/10/18の業務で以下の伝票を新規入力

コード:

伝票No 行No ... 品種 数量
1 1 ... A 1
1 2 ... B 4
1 3 ... C 2
2 1 ... B 2
2 2 ... C 1




上記処理によって、伝票入力テーブル、伝票入力ログテーブルは以下のように更新される

コード:

伝票入力テーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18 ← 新規
1 2 ... B 4 2007/10/18 ← 新規
1 3 ... C 2 2007/10/18 ← 新規
2 1 ... B 2 2007/10/18 ← 新規
2 2 ... C 1 2007/10/18 ← 新規


伝票入力ログテーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18 ← 新規
1 2 ... B 4 2007/10/18 ← 新規
1 3 ... C 2 2007/10/18 ← 新規
2 1 ... B 2 2007/10/18 ← 新規
2 2 ... C 1 2007/10/18 ← 新規



2007/10/18の業務終了後、伝票入力ログテーブルの更新日付が「2007/10/18」のデータ
を集計し、その結果を集計テーブルに加算することによって、集計テーブルを更新する

コード:

集計テーブル
    処理前 10/18分 処理後
品種 ... 数量  集計値  数量
A ... 100 + 1  = 101
B ... 100 + 6  = 106
C ... 100 + 3  = 103



翌日(2007/10/19)の業務で以下の伝票を修正

コード:

伝票No 行No ... 品種 数量
1 1 ... A 1
1 2 ... B 4 → 5に変更
1 3 ... C 2
2 1 ... B 2
2 2 ... C 1 ← この行を削除



上記処理によって、伝票入力テーブル、伝票入力ログテーブルは以下のように更新される

コード:

伝票入力テーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 5 2007/10/19 ← 更新
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
× 2 2 ... C 1 2007/10/18 ← 削除


伝票入力ログテーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 4 2007/10/18
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
2 2 ... C 1 2007/10/18
1 2 ... B -4 2007/10/19 ← 新規
1 2 ... B 5 2007/10/19 ← 新規
2 2 ... C -1 2007/10/19 ← 新規



2007/10/19の業務終了後、伝票入力ログテーブルの更新日付が「2007/10/19」のデータ
を集計し、その結果を集計テーブルに加算することによって、集計テーブルを更新する

コード:

集計テーブル
    処理前 10/19分 処理後
品種 ... 数量  集計値  数量
A ... 101 + 0  = 101
B ... 106 + 1  = 107
C ... 103 + -1  = 102






[ メッセージ編集済み 編集者: ゆうじゅん 編集日時 2007-10-18 16:18 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-10-18 19:12
ゆうじゅんさん:
なるほど
つうか、LANVINさんから、それを出して欲しかった
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-10-18 19:39
ゆうじゅんさん
そして、Jittaさん

どうもすいません。

まさにゆうじゅんさんの言われる通りです。

伝票テーブルの変更前と後に

AcceptChanges
SetAdded

しDataTableを何とか
追加状態に伝票入力ログテーブルを更新しようと思います。




LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-10-18 22:31
こんばんは。
先程はすごいRESありがとうございました。

書き漏れがありました。

コード:
-------------------------------------------------------------------------------

伝票入力テーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 5 2007/10/19 ← 更新
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
× 2 2 ... C 1 2007/10/18 ← 削除


伝票入力ログテーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 4 2007/10/18
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
2 2 ... C 1 2007/10/18
1 2 ... B -4 2007/10/19 ← 新規
1 2 ... B 5 2007/10/19 ← 新規
2 2 ... C -1 2007/10/19 ← 新規

-------------------------------------------------------------------------------

というRESを頂きました。

伝票入力テーブルのDataTableをCopyして
伝票入力ログテーブル更新用のDataTablを作成しますが
上記の「← 新規」でありますように
伝票入力ログテーブルは必ず新規なのです。
だから伝票入力テーブルのDataTableをCopyしたあと
このスレッドのテーマでありました、必ずAdd状態にしたいので

更新前はDataTableのRowStateは変更無しであるため
SetAdded出来ます。

画面入力内容を伝票入力テーブルのDataTableにセットした後
更新後用の伝票入力ログテーブルにCopyし
またRowStateをAdd状態にしたいのですが

× 2 2 ... C 1 2007/10/18 ← 削除

この分の更新後用の伝票入力テーブルのDataTableは
いらないのです。

そのため伝票入力テーブルをUpdateした後

更新後用の伝票入力ログテーブルにCopyし
またRowStateをAdd状態しましたが、
変でしょうか?


伝票入力テーブルをUpdateする前だと
DELETE状態のためSetAddedでエラーになってしまうからです。

AcceptChanges
SetAdded

なかなか厄介です。






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

LANVINさんの書き込み (2007-10-18 22:31) より:
こんばんは。
先程はすごいRESありがとうございました。

書き漏れがありました。

コード:
-------------------------------------------------------------------------------

伝票入力テーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 5 2007/10/19 ← 更新
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
× 2 2 ... C 1 2007/10/18 ← 削除


伝票入力ログテーブル
伝票No 行No ... 品種 数量 更新日付
1 1 ... A 1 2007/10/18
1 2 ... B 4 2007/10/18
1 3 ... C 2 2007/10/18
2 1 ... B 2 2007/10/18
2 2 ... C 1 2007/10/18
1 2 ... B -4 2007/10/19 ← 新規
1 2 ... B 5 2007/10/19 ← 新規
2 2 ... C -1 2007/10/19 ← 新規

-------------------------------------------------------------------------------

というRESを頂きました。

伝票入力テーブルのDataTableをCopyして
伝票入力ログテーブル更新用のDataTablを作成しますが
上記の「← 新規」でありますように
伝票入力ログテーブルは必ず新規なのです。
@ここまではわかる

だから伝票入力テーブルのDataTableをCopyしたあと
このスレッドのテーマでありました、必ずAdd状態にしたいので
@ここもわかる


更新前はDataTableのRowStateは変更無しであるため
SetAdded出来ます。@文がつながってない


画面入力内容を伝票入力テーブルのDataTableにセットした後
更新後用の伝票入力ログテーブルにCopyし
またRowStateをAdd状態にしたいのですが

× 2 2 ... C 1 2007/10/18 ← 削除

この分の更新後用の伝票入力テーブルのDataTableは
いらないのです。
@更新したんでしょ?


そのため伝票入力テーブルをUpdateした後

更新後用の伝票入力ログテーブルにCopyし
またRowStateをAdd状態しましたが、
変でしょうか?
@意味わかんね

伝票入力テーブルをUpdateする前だと
DELETE状態のためSetAddedでエラーになってしまうからです。

AcceptChanges
SetAdded

なかなか厄介です。









ごめんなさい
途中で送ってしまいました


伝票入力用から、集計用、ログ用のそれぞれへコピーする
じゃなく?


投稿ごとに言葉が変わってませんか?更新後用って、なんですか?

お願いだから、投稿する前に見直して
できれば、他人、可能なら上司に読んでもらってから投稿して...



もひとつ
テーブルまるまるコピーしたらダメですよね?
指摘し忘れてたけど、そういうコードがここにあがってますよね?
変更があった行だけ抜き出してコピーしなければいけないんじゃないですか?

[ メッセージ編集済み 編集者: Jitta 編集日時 2007-10-19 07:27 ]
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2007-10-19 19:44
Jittaさん、長いお付き合いありがとうございます。

1 更新前はDataTableのRowStateは変更無しであるため
  SetAdded出来ます。@文がつながってない
  
  ※DataTableは、画面の入力内容をセットしていないため変更無しの状態です。

2 この分の更新後用の伝票入力テーブルのDataTableは
  いらないのです。
  @更新したんでしょ?

 伝票テーブルは更新します。でも伝票入力ログテーブルは
 更新前のデータだけでよいのです。

伝票の行を削除したからです。
 修正であれば 更新前、更新後の2件更新します。
 
3 更新後用の伝票入力ログテーブルにCopyし
またRowStateをAdd状態しましたが、 変でしょうか?
@意味わかんね

ここの部分のコードを載せます

DataAdapter.Update(Ds, "明細")

そしてこの後
datatable = Ds.Tables("明細").Copy
For Each INVLROW As DataRow In datatable.Rows
INVLROW.AcceptChanges()
INVLROW.SetAdded()
next

といった処理を行っていますが
DataAdapter.Update(Ds, "明細")
と更新した後RowStateをAdd状態するのは変でしょうか?
と聞きたかったのです。

伝わりましたでしょうか?

 


 

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