需求:由于表体可能几百条,都弹框取值赋值,工作量大也可能会出错,所有换了种思路

演示如下:

点击【修改单价】按钮,就会解锁【单价】和【备注】两列锁定的字段

效果如图:

然后可以进行修改单价和备注,点击【保存】按钮,重新锁定字段,并自动计算金额字段

 

附源码:

类模块:Industry_PlugIns.cls

 
'定义插件对象接口. 必须具有的声明, 以此来获得事件
Private WithEvents m_BillTransfer   As K3BillTransfer.Bill
Dim F55 As Long, F55Text As String
Dim F56 As Long, F56Text As String
Dim F57 As Long, F57Text As String
 
Public Sub Show(ByVal oBillTransfer As Object)
 
    '接口实现
    '注意: 此方法必须存在, 请勿修改
    Set m_BillTransfer = oBillTransfer
 
End Sub

Private Sub Class_Terminate()
 
    '释放接口对象
    '注意: 此方法必须存在, 请勿修改
    Set m_BillTransfer = Nothing

End Sub

Private Sub m_BillTransfer_BillInitialize()
 
    'TODO: 请在此处添加代码响应事件 BillInitialize
 
 
'*************** 开始设置菜单 ***************
 
    m_BillTransfer.AddUserMenuItem "修改单价", "自定义菜单"
    m_BillTransfer.AddUserMenuItem "保存", "自定义菜单"
 
'*************** 结束设置菜单 ***************
    F55 = GetCtlIndexByFld("FEntrySelfP0132", True)
    F56 = GetCtlIndexByFld("FEntrySelfP0133", True)
    F57 = GetCtlIndexByFld("FQty", True)
  
End Sub

Private Sub m_BillTransfer_BillTerminate()
 
    'TODO: 请在此处添加代码响应事件 BillTerminate
 

End Sub

Private Sub m_BillTransfer_LeveCell(ByVal Col As Long, ByVal Row As Long, ByVal NewCol As Long, ByVal NewRow As Long, Cancel As Boolean)
 
    'TODO: 请在此处添加代码响应事件 LeveCell
    If (NewRow > 0) Then
    currow = NewRow
   End If
End Sub



Private Sub m_BillTransfer_UserMenuClick(ByVal Index As Long, ByVal Caption As String)
    Dim THeadCtl As Variant
    Dim i As Long
    Dim str As String
    Dim state As String
    Dim rs As New ADODB.Recordset
    stateCur = "False"
    'TODO: 请在此处添加代码响应事件 UserMenuClick
   
    Select Case Caption
    Case "修改单价"
     connString = m_BillTransfer.Cnnstring
         THeadCtl = m_BillTransfer.HeadCtl
        For i = 1 To UBound(THeadCtl)
            If (UCase(THeadCtl(i).FieldName) = "FBILLNO") Then
             curBillNo = m_BillTransfer.Head(i).Text
            End If
         Next
            If Len(curBillNo) > 0 Then '判断审核人
            sql = "select FMULTICHECKSTATUS from PORequest  where FBillNo='" + curBillNo + "'"
             rs.Open sql, connString, 0, 1
             state = rs.Fields(0).Value
            End If
      
        If state = 4 Then
      Dim vsEntrys As Object
'      Dim i As Long
      Set vsEntrys = m_BillTransfer.Grid
     For i = 1 To UBound(m_BillTransfer.EntryCtl)
        If UCase(m_BillTransfer.EntryCtl(i).FieldName) = "FENTRYSELFP0132" Then
        
           Exit For
       End If
        
     Next i
     With vsEntrys
        .Col = i
        .Col2 = i
        .Row = -1
        .BlockMode = True
        .Lock = False
        .BlockMode = False
     End With
         For i = 1 To UBound(m_BillTransfer.EntryCtl)
         If UCase(m_BillTransfer.EntryCtl(i).FieldName) = "FENTRYSELFP0133" Then
        
           Exit For
       End If
        
     Next i
     With vsEntrys
        .Col = i
        .Col2 = i
        .Row = -1
        .BlockMode = True
        .Lock = False
        .BlockMode = False
     End With

  Else
    MsgBox "操作失败,必须审核后才能操作!"
  End If
    Case "保存"
    Dim RowCount As Integer
    Set rs = New ADODB.Recordset

         
       RowCount = m_BillTransfer.BillForm.get_MaxEntry

       For i = 1 To RowCount
       F55Text = m_BillTransfer.GetGridText(i, F55)
       F56Text = m_BillTransfer.GetGridText(i, F56)
       F57Text = m_BillTransfer.GetGridText(i, F57)
       sql = "update PORequestentry set FEntrySelfP0133=" + Trim(Val(F56Text)) + ", FEntrySelfP0132='" + F55Text + "',FEntrySelfP0134=" + Trim(Trim(Val(F56Text)) * Trim(Val(F57Text))) + " from PORequestentry t_1 left join PORequest t_2 on t_1.FInterID=t_2.FInterID where FBillNo='" + curBillNo + "' and FEntryID=" + Trim(i)
       rs.Open sql, connString, 0, 1
       
       Next i

     
   Dim vsEntryss As Object
      Dim j As Long
      Set vsEntryss = m_BillTransfer.Grid
   For j = 1 To UBound(m_BillTransfer.EntryCtl)
        If UCase(m_BillTransfer.EntryCtl(j).FieldName) = "FENTRYSELFP0132" Then

           Exit For
       End If

     Next j
     With vsEntryss
        .Col = j
        .Col2 = j
        .Row = -1
        .BlockMode = False
        .Lock = True
        .BlockMode = True
     End With
      For j = 1 To UBound(m_BillTransfer.EntryCtl)
         If UCase(m_BillTransfer.EntryCtl(j).FieldName) = "FENTRYSELFP0133" Then

           Exit For
       End If

     Next j
     With vsEntryss
        .Col = j
        .Col2 = j
        .Row = -1
        .BlockMode = False
        .Lock = True
        .BlockMode = True
     End With
      Set rs = Nothing
    MsgBox "保存成功!"
     m_BillTransfer.BillFunc.refillbill
    End Select
    

End Sub

'**********************************
'返回单据字段顺序(isEntry True是表体)
'**********************************
Public Function GetCtlIndexByFld(ByVal fldName As String, Optional ByVal isEntry As Boolean = False) As Long
Dim ctlIdx As Long
Dim i As Integer
Dim isFind As Boolean
Dim vValue As Variant
fldName = UCase(fldName)
isFind = False
With m_BillTransfer
If isEntry Then
    For i = LBound(.EntryCtl) To UBound(.EntryCtl)
    If UCase(.EntryCtl(i).FieldName) = fldName Then
    ctlIdx = .EntryCtl(i).FCtlOrder
    isFind = True
    Exit For
    End If
    Next i
Else
    For i = LBound(.HeadCtl) To UBound(.HeadCtl)
    If UCase(.HeadCtl(i).FieldName) = fldName Then
    ctlIdx = .HeadCtl(i).FCtlIndex
    isFind = True
    Exit For
    End If
    Next i
End If
End With
If isFind = True Then
GetCtlIndexByFld = ctlIdx
Else
GetCtlIndexByFld = 0
End If
End Function

公共类:Common

  Public currow As Long
  Public curBillNo As String
  Public connString As String
  Public stateCur As String