⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataform.frm

📁 汽修厂管理软件
💻 FRM
📖 第 1 页 / 共 2 页
字号:
    Case vbDataActionMoveLast
      '什么也不做
    Case vbDataActionAddNew
      '什么也不做
    Case vbDataActionUpdate
       '移到 cmdUpdate_click 事件代码
    Case vbDataActionDelete
      '什么也不做
    Case vbDataActionFind
      '设置 reposition 事件中使用的标志
      mbJustUsedFind = True
    Case vbDataActionBookmark
      '什么也不做"
    Case vbDataActionClose, vbDataActionUnload
      If Save Then
        If MsgBox(MSG6, mnMSGBOX_TYPE) <> vbYes Then
          Save = False
        End If
      End If

  End Select

  Exit Sub

ValErr:
  ShowErrMsg
  Exit Sub
  
End Sub

Private Sub cmdDelete_Click()
  On Error GoTo DELErr

  If MsgBox(MSG7, mnMSGBOX_TYPE) = vbYes Then
    datDataCtl.Recordset.Delete
    mlNumRows = mlNumRows - 1
    datDataCtl.Recordset.MoveNext
    '如果发生 EOF,移开这种情况
    If datDataCtl.Recordset.RecordCount > 0 Then datDataCtl.Recordset.MoveLast
    maFldArr(0).SetFocus
  End If

  Exit Sub

DELErr:
  ShowErrMsg
  Exit Sub

End Sub

Private Sub cmdFind_Click()
  On Error GoTo FindErr

  Dim sBookMark As String
  Dim sFindStr As String

  If datDataCtl.Recordset.Type = dbOpenTable Then
    sFindStr = InputBox(MSG8)
  Else
    sFindStr = InputBox(MSG9)
  End If
  If Len(sFindStr) = 0 Then Exit Sub

  If datDataCtl.Recordset.RecordCount > 0 Then
    sBookMark = datDataCtl.Recordset.Bookmark
  End If

  If datDataCtl.Recordset.Type = dbOpenTable Then
    datDataCtl.Recordset.Seek "=", sFindStr
  Else
    datDataCtl.Recordset.FindFirst sFindStr
  End If

  '如果匹配未找到,返回旧的记录
  If datDataCtl.Recordset.NoMatch And Len(sBookMark) > 0 Then
    datDataCtl.Recordset.Bookmark = sBookMark
  End If

  maFldArr(1).SetFocus
  Exit Sub

FindErr:
  ShowErrMsg
  maFldArr(1).SetFocus
  Exit Sub

End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyF1 And Shift = 0 Then
   ' DisplayTopic 2016122
  End If
End Sub

Private Sub Form_Load()
'  On Error GoTo LoadErr

  cmdCancelAdd.Caption = BUTTON1
  cmdUpdate.Caption = BUTTON2
  cmdDelete.Caption = BUTTON3
  cmdFind.Caption = BUTTON4
  cmdRefresh.Caption = BUTTON5
  cmdClose.Caption = BUTTON6
  cmdAdd.Caption = BUTTON7
 ' lblFieldHeader.Caption = Label1
  'lblFieldValue.Caption = Label2
  
  'mrsFormRecordset 是一个全局模块级变量
  '必须在显示(Show)这个窗体之前设置好
  
  
  With mrsFormRecordset
    If .Type = dbOpenTable Then
      '需要设置索引
       If DBSGRG.TableDefs(.Name).Indexes.Count > 0 Then
        .Index = DBSGRG.TableDefs(.Name).Indexes(0).Name
      End If
    End If
    If .RecordCount > 0 Then
      '移到下一个,然后移到前一个,得到记录数
      .MoveLast
      .MoveFirst
    End If
  End With
  Set datDataCtl.Recordset = mrsFormRecordset
  
  Me.Width = 5868
  loadFields
  Me.Show
  If maFldArr(0).Enabled = False Then
    maFldArr(1).SetFocus
   Else
    maFldArr(0).SetFocus
  End If
  Exit Sub

LoadErr:
  ShowErrMsg
 ' Unload Me
End Sub

Private Sub Form_Resize()
 ' On Error Resume Next

  'If gbSettingDataCtl Then Exit Sub
  'If mbResizing Then Exit Sub

  Dim nHeight As Integer
  Dim i As Integer
  Dim nTotalWidth As Integer

  mbResizing = True
  If Me.WindowState <> 1 And lblFieldName(0).Visible Then '非最小化的
    '确保窗体在一个范围内排列整齐
    nHeight = Me.Height
    If (nHeight - 1320) Mod mnCTLARRAYHEIGHT <> 0 Then
      Me.Height = ((nHeight - 1280) \ mnCTLARRAYHEIGHT) * mnCTLARRAYHEIGHT + 1280
    End If
    '改变状态栏的大小
    datDataCtl.Top = Me.Height - 650
    '改变状态栏的大小
    vsbScrollBar.Height = Me.Height - 1300
    vsbScrollBar.Left = Me.Width - 360
    If mrsFormRecordset.Fields.Count > 10 Then
      picFields.Width = Me.Width - 260
      nTotalWidth = vsbScrollBar.Left - 20
    Else
      picFields.Width = Me.Width - 20
      nTotalWidth = Me.Width - 50
    End If
   ' picButtons.Width = Me.Width - 20
    '如果可能的话加宽字段
    For i = 0 To mrsFormRecordset.Fields.Count - 1
      lblFieldName(i).Width = 0.3 * nTotalWidth - 100
      maFldArr(i).Left = lblFieldName(i).Width + 200
      If datDataCtl.Recordset.Fields(i).Type > 10 Then
        maFldArr(i).Width = 0.7 * nTotalWidth - 270
         End If
    Next
    'lblFieldValue.Left = maFldArr(0).Left

  End If

  mbResizing = False

End Sub

Private Function GetFieldWidth(rnType As Integer, FieldSize As Integer)
  '决定基于字段类型确定窗体控件的宽度
  Select Case rnType
    Case dbBoolean
      GetFieldWidth = 850
    Case dbByte
      GetFieldWidth = 650
    Case dbInteger
      GetFieldWidth = 900
    Case dbLong
      GetFieldWidth = 1100
    Case dbCurrency
      GetFieldWidth = 1800
    Case dbSingle
      GetFieldWidth = 1800
    Case dbDouble
      GetFieldWidth = 2200
    Case dbDate
      GetFieldWidth = 2000
    Case dbText
      
      GetFieldWidth = 100 * FieldSize
      If GetFieldWidth > 3250 Then GetFieldWidth = 3250
    Case dbMemo
      GetFieldWidth = 3250
    Case Else
      GetFieldWidth = 3250
  End Select

End Function

Private Sub loadFields()
   Dim recTmp As Recordset
   Dim nFldType As Integer
   Dim nFieldSize As Integer
   Dim i As Integer

  ' On Error GoTo LoadFieldsErr

   Set mrsFormRecordset = datDataCtl.Recordset
   Set recTmp = mrsFormRecordset

   '加载记录集窗体上的控件
   mnNumFields = recTmp.Fields.Count
   ReDim maFldArr(mnNumFields) As Object
   lblFieldName(0).Visible = True
   nFldType = recTmp.Fields(0).Type
   
   nFieldSize = recTmp.Fields(0).Size
   If nFldType = dbBoolean Then
     Set maFldArr(0) = chkFieldData(0)
   ElseIf nFldType = dbLongBinary Then
     If datDataCtl.Tag = "OLE" Then
     
     Else
       Set maFldArr(0) = picFieldData(0)
     End If
   Else
      
     Set maFldArr(0) = txtFieldData(0)
     
   End If
    maFldArr(0).Visible = True
   maFldArr(0).Top = 0
   maFldArr(0).Width = GetFieldWidth(nFldType, nFieldSize)
  If recTmp.Fields(0).Name = "ID" Or recTmp.Fields(0).Name = "Id" Then
    maFldArr(0).Enabled = False
  End If
   If nFldType = dbText Then maFldArr(0).MaxLength = recTmp.Fields(0).Size

   maFldArr(0).TabIndex = 0
   On Error Resume Next
   For i = 1 To recTmp.Fields.Count - 1
     picFields.Height = picFields.Height + mnCTLARRAYHEIGHT
     Load lblFieldName(i)
     lblFieldName(i).Top = lblFieldName(i - 1).Top + mnCTLARRAYHEIGHT
     lblFieldName(i).Visible = True
     nFldType = recTmp.Fields(i).Type
      nFieldSize = recTmp.Fields(i).Size

     If nFldType = dbBoolean Then
       Load chkFieldData(i)
       Set maFldArr(i) = chkFieldData(i)
     ElseIf nFldType = dbLongBinary Then
       If datDataCtl.Tag = "OLE" Then
         Else
         Load picFieldData(i)
         Set maFldArr(i) = picFieldData(i)
       End If
     Else
       Select Case recTmp.Fields(i).Name
       Case "工组"
          Load CombFieldData(i)
          Set maFldArr(i) = CombFieldData(i)
          maFldArr(i).AddItem "美容班"
          maFldArr(i).AddItem "机修班"
          maFldArr(i).AddItem "电路板"
          maFldArr(i).AddItem "砂钣班"
          maFldArr(i).AddItem "管理"
       Case "资质"
          Load CombFieldData(i)
          Set maFldArr(i) = CombFieldData(i)
          maFldArr(i).AddItem "技师"
          maFldArr(i).AddItem "中工"
          maFldArr(i).AddItem "小工"
          maFldArr(i).AddItem "管理人员"
       Case "班组"
       
          Load CombFieldData(i)
          Set maFldArr(i) = CombFieldData(i)
          maFldArr(i).AddItem "美容班"
          maFldArr(i).AddItem "机修班"
          maFldArr(i).AddItem "电路板"
          maFldArr(i).AddItem "砂板班"
          maFldArr(i).AddItem "管理"
       
       Case Else
          Load txtFieldData(i)
          Set maFldArr(i) = txtFieldData(i)
       End Select
    End If
     maFldArr(i).Top = maFldArr(i - 1).Top + mnCTLARRAYHEIGHT
     maFldArr(i).Visible = True
     maFldArr(i).Enabled = True
     If GetFieldWidth(nFldType, nFieldSize) > 1000 Then
      maFldArr(i).Width = GetFieldWidth(nFldType, nFieldSize)
     Else
      maFldArr(i).Width = 1000
     End If
     maFldArr(i).TabIndex = i
     If nFldType = dbText Then maFldArr(i).MaxLength = recTmp.Fields(i).Size
   Next

   On Error GoTo LoadFieldsErr

   '重新调整主窗口
   picFields.Top = picButtons.Top + picButtons.Height
   mnFieldTop = picFields.Top
   vsbScrollBar.Value = mnFieldTop
   If i <= 10 Then
     Height = i * mnCTLARRAYHEIGHT + 1500
     vsbScrollBar.Visible = False
   Else
     Height = 4500
     Width = Width + 260
     vsbScrollBar.Visible = True
     vsbScrollBar.Min = mnFieldTop
     vsbScrollBar.Max = mnFieldTop - (i * mnCTLARRAYHEIGHT) + 3000
   End If

   '显示字段名称
   For i = 0 To recTmp.Fields.Count - 1
     lblFieldName(i).Caption = recTmp.Fields(i).Name & ":"
   
   Next
   
   '绑定控件
   On Error Resume Next   '尽管表是空的也要绑定
   For i = 0 To recTmp.Fields.Count - 1
     maFldArr(i).DataField = recTmp.Fields(i).Name
   Next

   Exit Sub

LoadFieldsErr:
   ShowErrMsg
   Exit Sub

End Sub

Private Sub cmdRefresh_Click()
  On Error GoTo RefErr

  If mbIsParameterized Then
    MsgBox MSG13, vbInformation
    Exit Sub
  End If
  
  datDataCtl.Refresh
  Exit Sub
  If cmdCancelAdd.Visible = True Then
    cmdCancelAdd.Visible = False
    cmdAdd.Visible = True
  End If
RefErr:
  ShowErrMsg
End Sub

Private Sub SetRecNum()
'  On Error GoTo SRErr
  
  Dim sCurrStat As String
  Dim lCurrRec As Long
  Dim bNoInd As Integer
  
  '得到当前记录数
  mlNumRows = datDataCtl.Recordset.RecordCount
  
  If datDataCtl.EditMode <> dbEditAdd Then
    If datDataCtl.Recordset.BOF Then
      sCurrStat = "(BOF)/" & mlNumRows
    ElseIf datDataCtl.Recordset.EOF Then
      sCurrStat = "(EOF)/" & mlNumRows
    Else
      '检查是否没有索引的表正在使用
      If datDataCtl.Recordset.Type = dbOpenTable Then
        If datDataCtl.Database(datDataCtl.RecordSource).Indexes.Count = 0 Then
          bNoInd = True
        End If
      End If
      '如果表没有索引或记录集是仅向前类型的,
      'PercentPosition 就不能使用
      If bNoInd Then
        sCurrStat = mlNumRows & MSG10
      ElseIf (datDataCtl.Options And dbForwardOnly) = dbForwardOnly Then
        sCurrStat = mlNumRows & MSG11
      Else
        lCurrRec = (mlNumRows * (datDataCtl.Recordset.PercentPosition * 0.01)) + 1
        sCurrStat = lCurrRec & "/" & mlNumRows
      End If
    End If
    If datDataCtl.Recordset.Updatable = False Then
      sCurrStat = sCurrStat & MSG12
      cmdAdd.Enabled = False
      cmdCancelAdd.Enabled = False
      cmdUpdate.Enabled = False
      cmdDelete.Enabled = False
    Else
      cmdAdd.Enabled = True
      cmdCancelAdd.Enabled = True
      cmdUpdate.Enabled = True
      cmdDelete.Enabled = True
    End If
    datDataCtl.Caption = sCurrStat
  End If

  '如果需要的话重新设置按钮
  If datDataCtl.EditMode <> dbEditAdd Then
    cmdCancelAdd.Visible = False
    cmdAdd.Visible = True
  End If

  Exit Sub
SRErr:
  If Err <> 3021 Then
    ShowErrMsg
  End If
  Exit Sub

End Sub

Private Sub cmdUpdate_Click()
  On Error GoTo UpdErr

  Dim bAddFlag As Integer

  Dim nDelay As Long
  Dim nRetryCnt As Integer

  bAddFlag = datDataCtl.EditMode
  
  If datDataCtl.EditMode = dbEditAdd Then
    If MsgBox(MSG4, mnMSGBOX_TYPE) = vbYes Then
      Screen.MousePointer = vbHourglass
RetryUpd1:
      datDataCtl.UpdateRecord
      mlNumRows = mlNumRows + 1
    End If
  Else
    If MsgBox(MSG5, mnMSGBOX_TYPE) = vbYes Then
      Screen.MousePointer = vbHourglass
RetryUpd2:
      datDataCtl.UpdateRecord
    End If
  End If

  If bAddFlag = dbEditAdd Then
    mrsFormRecordset.MoveLast
  End If
  If cmdCancelAdd.Visible = True Then
    cmdCancelAdd.Visible = False
    cmdAdd.Visible = True
  End If
  
  DBEngine.Idle dbFreeLocks
  Screen.MousePointer = vbDefault
  
  Exit Sub

UpdErr:
 ' If Err = 3260 And nRetryCnt < gnMURetryCnt Then
  '  nRetryCnt = nRetryCnt + 1
   ' datDataCtl.Recordset.Bookmark = datDataCtl.Recordset.Bookmark   '取消更新
   ' DBEngine.Idle dbFreeLocks
   ' nDelay = Timer
    '等待 gnMUDelay 秒
   ' While Timer - nDelay < gnMUDelay
      '什么也不做
   ' Wend
   ' If datDataCtl.EditMode = dbEditAdd Then
    '  Resume RetryUpd1
    'Else
     ' Resume RetryUpd2
    'End If
  'Else
   ' Screen.MousePointer = vbDefault
   ' ShowErrMsg
    'Exit Sub
  'End If

End Sub

Private Sub ShowErrMsg()
  MsgBox "Error:" & Err & " " & Error
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -