Urusaki Ответов: 3

Нужна помощь в импорте данных машины посещаемости для доступа к базе данных


Я новичок в Visual Basic. Я использую visual basic 6 с базой данных Microsoft Access для просмотра и записи данных о посещаемости. Мне удалось подключить машину и просмотреть данные о посещаемости в DataGrid view с помощью Machine sdk. Однако в базе данных есть только одна строка импортированных данных. Нужна помощь. Я приложил код. Также я буду благодарен, если кто-то покажет мне, как его улучшить. Спасибо

Что я уже пробовал:

Private Sub cmdGlogData_Click()
   Dim vTMachineNumber As Long
   Dim vSMachineNumber As Long
   Dim vSEnrollNumber As Long
   Dim vVerifyMode As Long
   Dim vYear As Long
   Dim vMonth As Long
   Dim vDay As Long
   Dim vHour As Long
   Dim vMinute As Long
   Dim vErrorCode As Long
   Dim vRet As Boolean
   Dim i, n As Long
   Dim vMaxLogCnt  As Long    
   Dim vinouttype As Long
   Dim vaction As Long
    
   With RawData
      .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db\dbase.mdb;Persist Security Info=False"
      .RecordSource = "select * from RawData"
      .Refresh         
        
      Do    
         vMaxLogCnt = gMaxLow    
         lblMessage.Caption = "Waiting..."   
         DoEvents       
         gridSLogData.Height = 4800
         gridSLogData.Redraw = False
         gridSLogData.Clear        
         gstrLogItem = Array("", "TMachineNo", "EnrollNo", "EMachineNo", "InOut", "VeriMode", "DateTime")
         With gridSLogData
            .Row = 0
            .ColWidth(0) = 600
            For i = 1 To 6
               .Col = i
               .Text = gstrLogItem(i)
               .ColAlignment(i) = 3
               .ColWidth(i) = 1200
            Next i
            .Col = 6
            .ColWidth(5) = 2000
            .ColWidth(6) = 2000
            .ColWidth(7) = 100
            .ColWidth(8) = 100
            n = .Rows
            If n > 2 Then
               Do
                  If n = 2 Then Exit Do
                  .RemoveItem (n)
                  n = n - 1
               Loop
            End If
            .Redraw = True
         End With   
         MousePointer = vbHourglass
         vRet = frm_DataImp.FP_CLOCK1.EnableDevice(mMachineNumber, False)
         If vRet = False Then
            lblMessage.Caption = gstrNoDevice
            MousePointer = vbDefault
            Exit Sub
         End If    
         vRet = frm_DataImp.FP_CLOCK1.ReadAllGLogData(mMachineNumber)
         If vRet = False Then
            frm_DataImp.FP_CLOCK1.GetLastError vErrorCode
            lblMessage.Caption = ErrorPrint(vErrorCode)
         End If    
         If vRet = True Then
            lblMessage.Caption = "Getting..."
            frm_DataImp.FP_CLOCK1.EnableDevice mMachineNumber, True
            MousePointer = vbHourglass
            DoEvents
            gridSLogData.Redraw = False        
            With gridSLogData
               i = 1
               Do
EEE:              vRet = frm_DataImp.FP_CLOCK1.GetAllGLogData(mMachineNumber, _
                                                              vTMachineNumber, _
                                                              vSEnrollNumber, _
                                                              vSMachineNumber, _
                                                              vVerifyMode, _
                                                              vYear, _
                                                              vMonth, _
                                                              vDay, _
                                                              vHour, _
                                                              vMinute)
                  If vRet = False Then Exit Do
                  If vRet = True And i <> 1 Then
                     .AddItem (1)
                  End If
                  vinouttype = Int(vVerifyMode / 8)
                  vaction = vVerifyMode Mod 8
                  .Row = i
                  .Col = 0
                  .Text = i
                  .Col = 1
                  .Text = vTMachineNumber
                  .Col = 2
                  .Text = vSEnrollNumber
                  .Col = 3
                  .Text = vSMachineNumber
                  .Col = 4
                  .Text = vinouttype
                  .Col = 5
                  If vSEnrollNumber <> 0 Then
                     If vaction = 0 Then
                        .Text = vaction & "/Normal"
                     ElseIf vaction = 1 Then
                        .Text = vaction & "/f1"
                     ElseIf vaction = 2 Then
                        .Text = vaction & "/f2"
                     ElseIf vaction = 3 Then
                        .Text = vaction & "/f3"
                     ElseIf vaction = 4 Then
                        .Text = vaction & "/f4"
                     ElseIf vaction = 5 Then
                        .Text = vaction & "/in"
                     ElseIf vaction = 6 Then
                        .Text = vaction & "/out"
                     Else
                        .Text = vaction & "/--"
                     End If
                  Else
                     If vaction = 0 Then
                        .Text = vaction & "/Closed"
                     ElseIf vaction = 1 Then
                        .Text = vaction & "/Opened"
                     ElseIf vaction = 2 Then
                        .Text = vaction & "/HandOpen"
                     ElseIf vaction = 3 Then
                        .Text = vaction & "/ProcOpen"
                     ElseIf vaction = 4 Then
                        .Text = vaction & "/ProcClose"
                     ElseIf vaction = 5 Then
                        .Text = vaction & "/IllegalOpen"
                     ElseIf vaction = 6 Then
                        .Text = vaction & "/IlleagalRemove"
                     ElseIf vaction = 7 Then
                        .Text = vaction & "/Alarm"
                     Else
                        .Text = vaction & "/--"
                     End If
                  End If
                  .Col = 6
                  .Text = CStr(vYear) & "/" & Format(vMonth, "0#") & "/" & Format(vDay, "0#") & _
                          " " & Format(vHour, "0#") & ":" & Format(vMinute, "0#")
                  DoEvents
                  i = i + 1
                  If i > vMaxLogCnt Then Exit Do
               Loop
            End With
        
            If i > vMaxLogCnt Then
               gridSLogData.Height = gridSLogData.Height / 2            
            End If
            vMaxLogCnt = vMaxLogCnt * 2
            If i > vMaxLogCnt Then
               gridSLogData.Height = gridSLogData.Height * 2 / 3
            End If
            gridSLogData.Redraw = True       
        
            lblMessage.Caption = "ReadAllGLogData OK"
         End If
    
         'Writing to database
         '
         '
         '
         With .Recordset
            .AddNew
            !TMachineNo = vTMachineNumber
            !EnrollNo = vSEnrollNumber
            !EMachineNo = vSMachineNumber
            !InOut = vinouttype
            If vSEnrollNumber <> 0 Then
               If vaction = 0 Then
                  !VeriMode = vaction & "/Normal"
               ElseIf vaction = 1 Then
                  !VeriMode = vaction & "/f1"
               ElseIf vaction = 2 Then
                  !VeriMode = vaction & "/f2"
               ElseIf vaction = 3 Then
                  !VeriMode = vaction & "/f3"
               ElseIf vaction = 4 Then
                  !VeriMode = vaction & "/f4"
               ElseIf vaction = 5 Then
                  !VeriMode = vaction & "/in"
               ElseIf vaction = 6 Then
                  !VeriMode = vaction & "/out"
               Else
                  !VeriMode = vaction & "/--"
               End If
            Else
               If vaction = 0 Then
                  !VeriMode = vaction & "/Closed"
               ElseIf vaction = 1 Then
                  !VeriMode = vaction & "/Opened"
               ElseIf vaction = 2 Then
                  !VeriMode = vaction & "/HandOpen"
               ElseIf vaction = 3 Then
                  !VeriMode = vaction & "/ProcOpen"
               ElseIf vaction = 4 Then
                  !VeriMode = vaction & "/ProcClose"
               ElseIf vaction = 5 Then
                  !VeriMode = vaction & "/IllegalOpen"
               ElseIf vaction = 6 Then
                  !VeriMode = vaction & "/IlleagalRemove"
               ElseIf vaction = 7 Then
                  !VeriMode = vaction & "/Alarm"
               Else
                  !VeriMode = vaction & "/--"
               End If
            End If
            !DateTime = CStr(vYear) & "/" & Format(vMonth, "0#") & "/" & Format(vDay, "0#") & _
                        " " & Format(vHour, "0#") & ":" & Format(vMinute, "0#")
            .Update
FFF:   
         End With
      Loop
      gGetState = False
    
      If .Recordset.RecordCount > 1 Then 
         .Recordset.MoveLast
   End With
   MousePointer = vbDefault       
    
   DoEvents
   frm_DataImp.FP_CLOCK1.EnableDevice mMachineNumber, True    
End Sub

3 Ответов

Рейтинг:
2

Wendelius

Я искренне верю, что лучший совет для вас-отказаться от Visual Basic 6. Последняя версия была опубликована в 1998 году, а Microsoft прекратила ее поддержку в 2008 году. Таким образом, нет никакой гарантии, что среда VB6 будет продолжать работать в будущих версиях ОС.

Если вы предпочитаете visual basic, то рассмотрите возможность использования Visual Basic .NET

Подробная информация:
- Visual Basic-Википедия[^]
- Визуальный Основной .Чистая[^]


Graeme_Grant

5 б

Wendelius

Прошло довольно много времени с тех пор, как я в последний раз использовал VB&, но, глядя на код, у вас есть несколько выходов из цикла и из суб. Отладили ли вы выполнение и проверили, что цикл действительно выполняется несколько раз?

Например, если gMaxLow равен 1, то цикл завершается после первого раунда....

Рейтинг:
1

Graeme_Grant

Вам будет трудно получить какую-либо помощь с кодом VB6, так как очень немногие, если таковые имеются, все еще используют его.

Некоторая обратная связь... У вас слишком много кода в cmdGlogData_Click событие. Разбейте его на отдельные куски ответственности. Это очень поможет при чтении вашего кода... Что-то вроде...

Private Sub cmdGlogData_Click()

    InitializeGrid(gridSLogData)

    If InitializeDeviced() Then
        GetDeviceDataAndSave(gridSLogData)
    Else
        lblMessage.Caption = gstrNoDevice
        MousePointer = vbDefault
    End If

end Sub

Private Sub InitializeGrid(gridLog as GridView)
    ' config grid here
End Sub

Private Function InitializeDevice(mMachineNumber as long) as Boolean

    dim success as Boolean

    success = frm_DataImp.FP_CLOCK1.EnableDevice(mMachineNumber, False)

    return success

End Sub

Private Sub GetDeviceDataAndSave(mMachineNumber as long, gridLog as GridView)

    Dim vTMachineNumber As Long
    Dim vSMachineNumber As Long
    Dim vSEnrollNumber As Long
    Dim vVerifyMode As Long
    Dim vYear As Long
    Dim vMonth As Long
    Dim vDay As Long
    Dim vHour As Long
    Dim vMinute As Long

    ' get data entry from device
    If frm_DataImp.FP_CLOCK1.GetAllGLogData(mMachineNumber, _
                                            vTMachineNumber, _
                                            vSEnrollNumber, _
                                            vSMachineNumber, _
                                            vVerifyMode, _
                                            vYear, vMonth, vDay, _
                                            vHour, vMinute) Then
        ' success
        If SaveDataEntry(mMachineNumber, _
                         vTMachineNumber, _
                         vSEnrollNumber, _
                         vSMachineNumber, _
                         vVerifyMode, _
                         vYear, vMonth, vDay, _
                         vHour, vMinute) Then

            LogEntry(gridLog, mMachineNumber, _
                              vTMachineNumber, _
                              vSEnrollNumber, _
                              vSMachineNumber, _
                              vVerifyMode, _
                              vYear, vMonth, vDay, _
                              vHour, vMinute)
        Else
            ' failed to save to database
        End If
    Else
        ' failed to read device code here
    End If

End Sub

Private Function SaveDataEntry(vTMachineNumber As Long, vSMachineNumber As Long _
                               vSEnrollNumber As Long, vVerifyMode As Long, _
                               vYear As Long, vMonth As Long, vDay As Long, _
                               vHour As Long, vMinute As Long) as Boolean

    dim success as Boolean

    ' Write to DB here and set success to true or false

    return success

End Function

Примечание: это всего лишь макет того, как вы могли бы структурировать код...

Теперь вы можете видеть каждую часть процесса и отслеживать каждую запись в базу данных, поскольку она инкапсулирована в свою собственную функцию. Отладка вашего кода теперь стала намного проще...


Urusaki

Огромное спасибо. Это большое подспорье. Есть ли отзывы о том, как записать несколько или все строки в базу данных?

Graeme_Grant

Я не делал VB6 около 15 лет, так что я больше не знаком с ним. VB.NET или C# - это совсем другая история.

Однако при работе с базами данных массовые операции обычно заключаются в транзакции Begin/Commit/RollBack.

Urusaki

Что ж, все в порядке. Кстати, что такое синтаксис на VB.Сеть для этой цели?

Graeme_Grant

VB.Net? Это немного больше.

Wendelius

Хороший совет, 5.

Рейтинг:
1

Dave Kreskowiak

Я бы посоветовал вам прекратить использовать VB6. Он учит вас плохим привычкам, от которых вам придется отказаться позже.

Вы можете получить бесплатную версию Visual Studio здесь[^], который будет включать в себя VB.NET, C#, C/C++, что угодно, и позволяют вам писать практически любые типы приложений, которые вы хотите.

Просто глядя на код, который вы опубликовали, вы уже многое должны разучиться. Я бы посоветовал выбрать книгу по VB.NET и работать через это вместо этого.


Urusaki

Что ж, я буду иметь это в виду и перейду на VB.Продажи в ближайшее время. И все же, как получить все строки данных? Пожалуйста, пролейте немного света на этот вопрос.

Dave Kreskowiak

Я не могу тебе сказать. Проблема в том, что там, где вы идете и получаете запись с помощью SDK, вы получаете одну строку, которая, как я предполагаю, помещается в переменные, которые вы предоставляете вызову:

GetAllGLogData(mMachineNumber, _
                                                 vTMachineNumber, _
                                                 vSEnrollNumber, _
                                                 vSMachineNumber, _
                                                 vVerifyMode, _
                                                 vYear, _
                                                 vMonth, _
                                                 vDay, _
                                                 vHour, _
                                                 vMinute)

Я предполагаю, что он возвращает логическое значение, чтобы сообщить вам, что recrod был успешно извлечен.

Кстати, вам не нужно проверять False в одном операторе If, а затем проверять True в другом операторе If. Если значение равно True, оператор If выполнит код в блоке Then. Если значение равно False, оператор If выполнит код в блоке Else:
    If expression Then
        ... code if true ...
    Else
        ... code if false ...
    End If


Проблема заключается в SDK. Как вы скажете ему перейти к следующей записи в данных? - Мы не знаем. Мы ничего не знаем о SDK, который вы используете. Такая поддержка должна исходить от поставщика SDK, а не от какой-то третьей стороны, которая никогда о нем не слышала.

Urusaki

На самом деле sdk отлично работает с DataGridView (gridSLogData). Все сохраненные данные отображаются на gridSLogData. Я думаю, что есть что-то, чего я не знаю, отсутствует в коде импорта базы данных, поэтому идет только одна строка.

Dave Kreskowiak

Я не знаю, потому что понятия не имею, как SDK возвращает данные. Все переменные, которые вы передаете в метод GetAllGLogData, могут содержать только одно значение, и вы вызываете этот метод только один раз, насколько я могу судить, поэтому вы получаете только одну запись из SDK.

Опять же, как вы скажете SDK перейти к следующей записи? Я не знаю, потому что никогда не использовал этот SDK и никогда не планирую его использовать.

Что говорит об этом документация по SDK?

Urusaki

Дейв, у Датагрида есть все данные. Код для gridslogdata выше сделал это. Я просто хочу, чтобы эти данные хранились в базе данных.

Graeme_Grant

5 б