私は2 UltraGrids
のプロジェクトにフォームを持っています。 1つは契約情報を表示し、もう1つはモジュール情報を表示します。条件が真であるUltraGridからの更新
契約グリッドでは、たとえばそれぞれ固有の契約IDを持つ3行があります。行をクリックすると、その契約のもとで割り当てられたモジュールがモジュールグリッドに読み込まれます。
私がする必要があるのは、データベースのcontactIDが選択した契約の行のIDと一致するモジュールを更新することです。
私がこれまで持っているコードは、
For Each ugr As UltraGridRow In ugModules.Rows
For Each ur As UltraGridRow In ugContracts.Rows
mID = ugr.Cells("ModuleID").Text
mName = ugr.Cells("ModuleName").Text
numUsers = ugr.Cells("NumberUsers").Text
sql = "UPDATE dbo.tblModules SET ModuleName = ?, NumberUsers = ? WHERE ContractID = ? AND ModuleID = ?"
cmd = New OleDbCommand(sql, con)
cmd.Parameters.Add("@mname", OleDbType.VarChar).Value = mName
cmd.Parameters.Add("@numusers", OleDbType.VarChar).Value = numUsers
cmd.Parameters.Add("@conID", OleDbType.Integer).Value = ur.Cells("ContractID").Value
cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID
If cmd.ExecuteNonQuery() = 0 Then
sql = "INSERT INTO dbo.tblModules(ModuleID, ModuleName, NumberUsers, ContractID) VALUES(?, ?, ?, ?)"
cmd = New OleDbCommand(sql, con)
cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID
cmd.Parameters.Add("@mname", OleDbType.VarChar).Value = mName
cmd.Parameters.Add("@numusers", OleDbType.VarChar).Value = numUsers
cmd.Parameters.Add("@conID", OleDbType.Integer).Value = ur.Cells("ContractID").Value
cmd.ExecuteNonQuery()
End If
Next
Next
このコードの問題である、IDフィールドに衝突を引き起こしている現在の顧客に関連するすべての契約から、すべてのモジュールを更新しようとしていることです。
このコードを変更して、連絡先テーブルに表示されているすべての契約IDではなく、編集中のcontractIDのレコードのみを更新する方法はありますか?
私が正しくあなたの問題を理解していれば、あなたは外側のループを取り除く必要があります
こんにちはスティーブ、私はすでにcontractIDを取得していますが、これは問題ではありません。選択した連絡先(別のモジュールを別の行に)に基づいて、表示する行をフィルタリングするので、問題が発生しているのはモジュールグリッドです。したがって、可能であれば、極端なグリッド内の可視行のみを更新する必要がありますか? – Harambe
モジュールグリッドをどのようにフィルタリングしますか?契約を選択すると、モジュールグリッドはその契約に属するモジュールでのみ満たされていると思います。または、グリッドを塗りつぶすか、すべての既存のモジュールがグリッドのフィルタ機能を使用しますか? – Steve
最初の1つは、グリッドは、その契約のモジュールでいっぱいです – Harambe