2017-01-16 14 views
0

私は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のレコードのみを更新する方法はありますか?

私が正しくあなたの問題を理解していれば、あなたは外側のループを取り除く必要があります

答えて

1

とActiveRowプロパティを使用(謝罪は、これは混乱をケースだ場合何を明確にするために少し、説明するのは難しい幸せです)

Dim ctrRow = ugContracts.ActiveRow 
if ctrRow IsNot Nothing Then 

    ' Extract the contractid from the ugContracts active row and use it 
    Dim contractID = ctrRow.Cells("ContractID").Value 

    For Each ugr As UltraGridRow In ugModules.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 = contractID 
    cmd.Parameters.Add("@mid", OleDbType.Integer).Value = mID 

    .... 
    .... also the insert part can use the contractID variable 
    .... 

    Next 
End If 

EDIT
あなたのモジュールのグリッドがすべてのモジュールが含まれており、(コードでAllowRowFiltering、FilterConditionsなどが...である)のUltraGridのフィルタ機能を使用する場合、あなたが含まれている行のみを取得することができます〜でこのメソッドを使用して現在のフィルタ(したがってグリッド上に表示されます)

For Each ur As UltraGridRow In ugModules.Rows.GetFilteredInNonGroupByRows() 
    ..... 
Next 
+0

こんにちはスティーブ、私はすでにcontractIDを取得していますが、これは問題ではありません。選択した連絡先(別のモジュールを別の行に)に基づいて、表示する行をフィルタリングするので、問題が発生しているのはモジュールグリッドです。したがって、可能であれば、極端なグリッド内の可視行のみを更新する必要がありますか? – Harambe

+0

モジュールグリッドをどのようにフィルタリングしますか?契約を選択すると、モジュールグリッドはその契約に属するモジュールでのみ満たされていると思います。または、グリッドを塗りつぶすか、すべての既存のモジュールがグリッドのフィルタ機能を使用しますか? – Steve

+0

最初の1つは、グリッドは、その契約のモジュールでいっぱいです – Harambe

関連する問題