правильно ли я понимаю эту визуальную базовую программу? - PullRequest
2 голосов
/ 24 марта 2012

Я никогда раньше не программировал в Visual Basic, и мой начальник только что сказал мне отредактировать эту программу Visual Basic.Эта программа считывает данные из списка файлов и помещает в них данные (некоторые цифры) в базу данных моего босса sql.Он хочет, чтобы я отредактировал эту программу, поэтому, если числа в этих файлах выходят за пределы допустимого, программа игнорирует эти файлы.Я пытаюсь понять, как программа делает это:

Dim totalVolume1 As Integer, totalVolume2 As Integer, nLane1 As Integer, nLane2 As Integer
Dim totalVolSpeed1 As Double, totalVolSpeed2 As Double
Dim totalSpeed1 As Double, totalSpeed2 As Double, totalOccu1 As Double, totalOccu2 As Double
Dim nRunNum As Integer, NumberOfRunPerMinute As Integer, nWaitTime As Long, RetVal As Long
Dim nFileDir As Integer
Dim Sqlcommand1 As String, Sqlcommand2 As String
Dim FileSize() As Long
Dim FTP_DateTime As Date
NumberOfRunPerMinute = 3


'For nRunNum = 1 To NumberOfRunPerMinute
Do While True
    'OutputTxt "Running the " & nRunNum & " time(s) of this minute."

    nFileNum1 = FreeFile
    Open "c:\" & FileSQLRegular For Output As #nFileNum1
    nFileDir = FreeFile
    Open "c:\" & FileSQLDirection & "" For Output As #nFileDir
    OutputTxt "Start to look for files to import."
    cFileList = LookForFiles(cFileBaseFolder, "*.txt")
    OutputTxt "Finished looking for new files."
    Erase FileSize
    ReDim FileSize(LBound(cFileList) To UBound(cFileList))
    OutputTxt "Start to check file lengths."
    For i = 1 To UBound(cFileList)
        FileSize(i) = FileLen(MyDir(cDataFolder) & cFileList(i))
    Next
    OutputTxt "Done checking file lengths."


    For i = 1 To UBound(cFileList)
        Debug.Print i
        nFileNum2 = FreeFile
        OutputTxt "Start to process file '" & cFileList(i) & "'"
        Open cFileBaseFolder & cFileList(i) For Input As #nFileNum2
        FTP_DateTime = FileDateTime(cFileBaseFolder & cFileList(i))
        OutputTxt "DateTime of file '" & cFileList(i) & "' is '" & Format(FTP_DateTime, "yyyy-mm-dd hh:mm:ss") & "'"
        If Not EOF(nFileNum2) Then
            Line Input #nFileNum2, TmpString
            nDetID = Val(Right(TmpString, Len(TmpString) - 4))
            Do While Not EOF(nFileNum2)
                detData = RetrieveData(nFileNum2, nDetID)
                If Not detData.DayID = 0 Then
                    With detData
                        If .ValidattionID = 1 Then
                            OutputTxt "Retrieved 1 record!"

                            totalVolume1 = 0
                            totalVolume2 = 0
                            totalVolSpeed1 = 0
                            totalVolSpeed2 = 0
                            totalOccu1 = 0
                            totalOccu2 = 0
                            nLane1 = 0
                            nLane2 = 0
                            For j = 1 To nDetectorCount(.DetID)
                                TmpDataID = CStrN(.YearID, 4) & CStrN(.DayID, 3) & CStrN(.SecondTimeID, 5) & CStrN(.DetID, 4) & CStrN(j, 2)
                                SqlCommand = _
                                    "@""" & Format(.Date, "yyyy-mm-dd hh:mm:ss") & """,""" & .YearID & """,""" & .DayID & """,""" & .SecondTimeID & _
                                    """,""" & .DetID & """,""" & j & """,""" & .Speed(j) & """,""" & .Volume(j) & _
                                    """,""" & .Occupancy(j) & """,""" & TmpDataID & """,""" & Format(FTP_DateTime, "yyyy-mm-dd hh:mm:ss") & """;"
                                Print #nFileNum1, SqlCommand

                                If .Speed(j) >= 0 And .Speed(j) <= 90 Then
                                    If DetLaneDir(.DetID, j) = 1 Then
                                        totalVolume1 = totalVolume1 + .Volume(j)
                                        totalVolSpeed1 = totalVolSpeed1 + .Volume(j) * 1# * .Speed(j)
                                        totalOccu1 = totalOccu1 + .Occupancy(j)
                                        nLane1 = nLane1 + 1
                                    ElseIf DetLaneDir(.DetID, j) = 2 Then
                                        totalVolume2 = totalVolume2 + .Volume(j)
                                        totalVolSpeed2 = totalVolSpeed2 + .Volume(j) * 1# * .Speed(j)
                                        totalOccu2 = totalOccu2 + .Occupancy(j)
                                        nLane2 = nLane2 + 1
                                    End If
                                End If
                            Next

                            If totalVolume1 = 0 Then
                                totalOccu1 = 0
                                totalSpeed1 = 240
                            Else
                                totalOccu1 = totalOccu1 / nLane1
                                totalSpeed1 = totalVolSpeed1 / totalVolume1
                            End If

                            If totalVolume2 = 0 Then
                                totalOccu2 = 0
                                totalSpeed2 = 240
                            Else
                                totalOccu2 = totalOccu2 / nLane2
                                totalSpeed2 = totalVolSpeed2 / totalVolume2
                            End If

                            TmpDataID1 = CStrN(.YearID, 4) & CStrN(.DayID, 3) & CStrN(.SecondTimeID, 5) & CStrN(.DetID, 4) & CStrN(1, 2)
                            TmpDataID2 = CStrN(.YearID, 4) & CStrN(.DayID, 3) & CStrN(.SecondTimeID, 5) & CStrN(.DetID, 4) & CStrN(2, 2)
                            Sqlcommand1 = "@""" & Format(.Date, "yyyy-mm-dd hh:mm:ss") & """,""" & .YearID & """,""" & .DayID & """,""" & .SecondTimeID & _
                                    """,""" & .DetID & """,""" & 1 & """,""" & totalSpeed1 & """,""" & totalVolume1 & _
                                    """,""" & totalOccu1 & """,""" & TmpDataID1 & """,""d01"";"
                            Sqlcommand2 = "@""" & Format(.Date, "yyyy-mm-dd hh:mm:ss") & """,""" & .YearID & """,""" & .DayID & """,""" & .SecondTimeID & _
                                    """,""" & .DetID & """,""" & 2 & """,""" & totalSpeed2 & """,""" & totalVolume2 & _
                                    """,""" & totalOccu2 & """,""" & TmpDataID2 & """,""d01"";"
                            Print #nFileDir, Sqlcommand1
                            Print #nFileDir, Sqlcommand2
                        Else
                            'MsgBox "Not validated!"
                            Debug.Print "Not validated!"
                        End If
                    End With
                End If
            Loop
        End If
        Close (nFileNum2)
    Next
    Close (nFileNum1)
    Close (nFileDir)
    If FileLen("c:\" & FileSQLRegular & "") > 0 Then
        OutputTxt "Importing data to database real_time_data..."
        cnnMain_New.Execute ("LOAD DATA LOCAL INFILE 'c:\\" & FileSQLRegular & "' INTO TABLE real_time_data FIELDS TERMINATED BY ',' ENCLOSED BY '""' LINES STARTING BY '@' TERMINATED BY ';' (DATE_TIME, YEAR_ID, DAY_ID, SECOND_ID, DET_ID, LANE_ID, SPEED, VOLUME, OCCUPANCY, DATA_ID, PROCESSED_DATE_TIME, DATA_TYPE)")
        OutputTxt "Done importing data to database..."
        OutputTxt "Importing data to database real_time_data_two_day..."
        cnnMain_New.Execute ("LOAD DATA LOCAL INFILE 'c:\\" & FileSQLRegular & "' INTO TABLE real_time_data_two_day FIELDS TERMINATED BY ',' ENCLOSED BY '""' LINES STARTING BY '@' TERMINATED BY ';' (DATE_TIME, YEAR_ID, DAY_ID, SECOND_ID, DET_ID, LANE_ID, SPEED, VOLUME, OCCUPANCY, DATA_ID, PROCESSED_DATE_TIME, DATA_TYPE)")
        OutputTxt "Done importing data to database..."
    Else
        OutputTxt "No file found to process!"
    End If
    If FileLen("c:\" & FileSQLDirection & "") > 0 Then
        OutputTxt "Importing data to database real_time_data_direction..."
        cnnMain_New.Execute ("LOAD DATA LOCAL INFILE 'c:\\" & FileSQLDirection & "' INTO TABLE real_time_data_direction FIELDS TERMINATED BY ',' ENCLOSED BY '""' LINES STARTING BY '@' TERMINATED BY ';' (DATE_TIME, YEAR_ID, DAY_ID, SECOND_ID, DET_ID, Dir_ID, SPEED, VOLUME, OCCUPANCY, DATA_ID)")
        OutputTxt "Done importing data to database..."
        OutputTxt "Importing data to database real_time_data_direction_two_day..."
        cnnMain_New.Execute ("LOAD DATA LOCAL INFILE 'c:\\" & FileSQLDirection & "' INTO TABLE real_time_data_direction_two_day FIELDS TERMINATED BY ',' ENCLOSED BY '""' LINES STARTING BY '@' TERMINATED BY ';' (DATE_TIME, YEAR_ID, DAY_ID, SECOND_ID, DET_ID, Dir_ID, SPEED, VOLUME, OCCUPANCY, DATA_ID)")
        OutputTxt "Done importing data to database..."
    Else
        OutputTxt "No file found for directional data to process!"
    End If
    'cnnMain.Close
    Kill "c:\" & FileSQLRegular & ""
    Kill "c:\" & FileSQLDirection & ""
    MoveFiles cFileList, FileSize

' 
       If nRunNum < NumberOfRunPerMinute Then
'            nWaitTime = CLng((CSng(60) / NumberOfRunPerMinute - 2) * 1000)
'            OutputTxt "Start to wait for " & nWaitTime & " miliseconds."
'            RetVal = MsgWaitObj(nWaitTime)
'            OutputTxt "Finished waiting!"
'        End If
'    'Next
            nWaitTime = 2000
            OutputTxt "Start to wait for " & nWaitTime & " miliseconds."
            RetVal = MsgWaitObj(nWaitTime)
            OutputTxt "Finished waiting!"

Вот что я понимаю до сих пор: в

For i = 1 To UBound(cFileList)

она проходит через все файлы.В

For j = 1 To nDetectorCount(.DetID)

он входит в каждый файл и сохраняет данные в таких переменных, как totalvolume1, totalspeed1 ... В

 If totalVolume1 = 0 Then
 totalOccu1 = 0
 totalSpeed1 = 240

он выполняет некоторый фильтр.Наконец, в

 Sqlcommand1 = "@""" & Format(.Date, "yyyy-mm-dd hh:mm:ss") & """,""" & .YearID & """,""" & .DayID & """,""" & .SecondTimeID & _
                                        """,""" & .DetID & """,""" & 1 & """,""" & totalSpeed1 & """,""" & totalVolume1 & _ 

все переменные помещаются в две строки, Sqlcommand1 и Sqlcommand2, чтобы их можно было поместить в базу данных sql.

Правильно ли мое понимание этой программы до сих пор?Затем эта программа использует

Print #nFileDir, Sqlcommand1

Print #nFileDir, Sqlcommand2

, чтобы поместить эти две строки в базу данных?

Спасибо за помощь.

это решило бы мою проблему:

  'if data out of range, then they are not written to text file and database
If totalVolume1 < 50 And totalVolume1 > -1 And totalVolume1 < 50 And totalVolume1 > -1 Then
       Print #nFileDir, Sqlcommand1
       Print #nFileDir, Sqlcommand2

 End If

1 Ответ

3 голосов
/ 24 марта 2012

Нет.Операторы Print #nFileDir записывают данные в файл, который выглядит как CSV (значение, разделенное запятыми).(Обратите внимание, что действительно плохой код, даже для старого VB6, написанного желающим программистом.)

Соответствующее утверждение для двух операторов Print, о которых вы спрашиваете, таково:one:

Open "c:\" & FileSQLDirection & "" For Output As #nFileDir

Это создает номер файла (#nFileDir., который объявлен как Integer) для текстового файла (открытого для записи), который используется в остальной части кода длянаписать, используя операторы Print #nFileDir.Полученный текстовый файл затем импортируется в базу данных с помощью операторов cnnNew.Execute, которые ссылаются на FileSQLDirection.(Примечание FileSQLDirection в вызове Open, который я показываю выше.) ПРИМЕЧАНИЕ : упомянутый мною "номер файла" не является дескриптором файла Win32 и не совместим с вызовами Win32 API или другими видами использования.что нужно один.См. Комментарии Боба Римерсма ниже.

Чтобы внести изменения, о которых спрашивает ваш начальник, вам нужно исправить операторы перед этими двумя Print инструкциями, чтобы они выполнялись только в том случае, если данные находятся в пределах границ.ваш босс хочет за данные.Необходимо проверить значения, прежде чем вы перейдете к присвоению текста операторам SqlCommand1 и SQLCommand2 и Print, которые записывают их в текстовый файл, поэтому недопустимые значения никогда не попадут в текстовый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...