- PR -

.netを利用して、親レベルの部門と子レベル(グループ)のデータを一緒に更新させる方法

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/05/29
投稿数: 1
投稿日時: 2006-05-29 18:52
初心者です。
 分かる方教えてください。

「最下階層反映」というチェックボックスにチェックを入れたら、事業部コー
ドに選択された値が事業部(親レベル)の場合はその下の部、グループ(子レ
ベル)まで同じものに更新するというものです。

サイトマスターー事業部コード、住所や電話番号のデータが入っている
 部門マスターー事業部コード、事業部FLAG、部門名称、親レベルのデータが
入っている)
 
「部門コード」が入力されたとき、表示ボタンを押すとデータが「サイトマス
タ」からSQL文で取得し、表示されるのだが、

そのSQL文はこのように書きました
 Dim parameters As ParameterCollection
 Dim oraReader As OracleDataReader

parameters = New ParameterCollection
parameters.Add("jigyo_cdv", OracleDbType.Varchar2, 6, Me.wincrlBumon.txtCode.Text, ParameterDirection.Input)
oraReader = m_FormData.getSite(parameters)

strSQL = "SELECT SITE_NOV, " & vbCrLf
strSQL &= " YUBIN_NOV, " & vbCrLf
strSQL &= " JYUSYO1_NMV, " & vbCrLf
strSQL &= " JYUSYO2_NMV, " & vbCrLf
strSQL &= " EJYUSYO1_NMV, " & vbCrLf
strSQL &= " EJYUSYO2_NMV, " & vbCrLf
strSQL &= " TEL_NOV, " & vbCrLf
strSQL &= " FAX_NOV " & vbCrLf
strSQL &= "FROM M_SITE " & vbCrLf
strSQL &= "WHERE JIGYO_CDV= :jigyo_cdv "
Return Me.ExecuteQuery(strSQL, parameter)

それから表示されたデータの更新と削除を行う。


 更新はまず、子レベルのデータを変数に入れて、まず削除してから、親レベ
ルのデータをinsertしたいが、具体的にどうすればよいかよく分からない。
更新の文はこのようにしたが、
strSQL = "INSERT INTO M_SITE (JIGYO_CDV ,SITE_NOV, YUBIN_NOV, JYUSYO1
_NMV, JYUSYO2_NMV, " & vbCrLf
strSQL &= "EJYUSYO1_NMV,EJYUSYO2_NMV,TEL_NOV,
      FAX_NOV,KOSIN_YMD) " & vbCrLf
strSQL &= "VALUES( :jigyo_cdv , :site_nov,
   :yubin_nov, :jyusyo1_nmv, :jyusyo2_nmv," & vbCrLf
strSQL &=":ejyusyo2_nmv, :ejyusyo1_nmv, :tel_nov,
:fax_nov,SYSDATE)" & vbCrLf

それから、何が必要か、どのようにコーディングするかはよくわからないが、
子レベルに反映する際、以下の文のようになるのですか?それともほかになん
か使うんですか?

strSQL &= "where Level" & strLevel & "=:JIGYO_CDV"
教えてください。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-05-30 22:38
 たぶん、わかるんだけど、書いてあることがわからない。こういう理解で良いのかなぁ?
引用:

 同一テーブル内でリンクしているテーブルを更新します。
このとき、「最下階層反映」というチェック ボックスをチェックすると、表示してある階層から始めて、最下層まですべての階層のデータを更新します。
 データベースは Oracle(バージョン)を使用しており、VB.NET との接続には ODP.NET(?)を使用しています。
 関係するテーブルの構成は、次の通りです。

サイトマスタ(M_SITE)
 事業部コード(JIGYO_CDV)
 住所
 電話番号
 ...

部門マスタ
 事業部コード
 事業部フラグ
 部門名称
 親レベルのデータ

 部門コードを入力し、「表示」ボタンをクリックすると、サイトマスタからデータを取得し、画面に表示します。このときのコードは、次のように書きました。このようにして表示したデータの、削除と更新を行いたいのです。
(略)

 更新するためには、次の手順で実行するのがよいと考えました。
1.子階層のデータを、VB.NET 側の変数に入れる
2.1のデータを、データベースから削除する
3.親階層のデータを、データベースに挿入する

 具体的な SQL 文として、次のように書きました。
(略)

これ以外に、何が必要か、どの様にコーディングするのかわかりません。

 また、子階層に反映する際、次の句を追加することになると思いますが、それで正しいでしょうか?
strSQL &= "where level" & strLevel & "=:JIGYO_CDV"

教えてください。



 追加で知りたいこと。

1.使用しているデータベースと、そのマイナーまで含めたバージョン番号
 OracleDataReader 使っているから Oracle なんだろうけど、一応。

2.どの様にして、階層データを作っているのか
 おそらく、部門マスタの「親レベルのデータ」がどこかにリンクしているんだろうけれど、それがどこか。

3.変更するものは何か
 使用者は何を変更し、それをどの様に変更したいのか。または、「最下階層反映」にチェックしたとき、使用者が変更した何を、子階層に伝搬したいのか。
 変更対象は、どのテーブルの、どのカラムか。


今わかる範囲での回答。
1:
 部門マスタの「親レベルのデータ」が、部門マスタの「事業部コード」を外部キーにしていると仮定します。
削除については、外部キーを宣言するときに、delete cascade を宣言します。
そうすれば、親を削除するだけで子を全部消してくれます。

 Oracle で階層問い合わせをするには、、、やっぱり忘れた。START WITH 句は階層問い合わせで何を最上位層とするかの指定だなぁ。CONNECTED BY は、なんだっけ?SQL リファレンスに、「階層問い合わせ」のようなトピックがあるので確認してください。

更新は、副問い合わせで、最上位から階層問い合わせにより、所属するこの事業部コードだけを検索すればいいでしょう。
その事業部コードに含まれる事業部コードを持ったレコードだけ、更新するように、UPDATE 文を組み立てます。


2:
 DataTable 内の変更を、VB.NET のコードでガリガリ書けば、データベースに対する更新も削除も、DataAdapter.Update メソッドで1行のみを対象に行えます。

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-05-30 22:39 ]

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-05-30 22:42 ]
1

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