2012-03-23 68 views
2

我從來沒有編程過視覺基礎,我的老闆剛剛告訴我編輯這個視覺基礎程序。這個程序讀取從文件列表中讀取並將數據(有些數字)放到我的老闆sql數據庫中。他希望我編輯這個程序,所以如果這些文件中的數字超出範圍,程序將忽略這些文件。我想了解該計劃如何做這個:是我對這個visual basic程序的理解是否正確?

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 
+0

我想你會通過發佈你迄今爲止所做的更多的幫助。這是Visual Studio中的Visual Basic還是嵌入式Access或Excel中的VBA?你運行這個程序了嗎?如果Visual Basic,是否編譯? – octopusgrabbus 2012-03-23 22:58:19

+0

是Visual Basic程序,它有1個.vbp和2個.bas文件,所以我必須使用Microsoft Visual Basic 6打開它。只要我按下運行,它就會停止。 – help 2012-03-23 23:07:00

回答

3

號的Print #nFileDir語句寫入數據到這似乎是爲.csv(逗號分隔值)文件。 (請注意,這是真的代碼,即使是由想成爲的程序員寫的舊VB6)

爲你問關於這兩個Print報表相關的語句是這一個:

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

這將創建一個文件編號(#nFileDir。聲明爲Integer)到一個文本文件(可寫入),在代碼的其餘部分使用Print #nFileDir語句寫入。然後使用引用FileSQLDirectioncnnNew.Execute語句將生成的文本文件導入數據庫。 (注意FileSQLDirectionOpen調用我上面顯示。)注意:我提到的「文件號」不是Win32文件句柄,並與Win32 API調用或其他需要的用途不兼容。請參閱下面的Bob Riemersma的評論。

要做出你的老闆所要求的改變,你需要在這兩個Print聲明之前修復聲明,以便只有當數據在你的老闆想要的數據範圍內時才執行。在將文本分配到文本文件SqlCommand1SQLCommand2Print之前,您需要檢查這些值,然後將它們寫出到文本文件中,以使無效值永遠不會到達文本文件。

+0

謝謝你回答我的問題。如果totalVolume1 <50並且totalVolume1> -1並且totalVolume1 <50並且totalVolume1> -1然後 打印#nFileDir,Sqlcommand1 如果數據超出範圍,打印#nFileDir,Sqlcommand2 End If – help 2012-03-24 02:04:01

+0

不,由於'totalVolume1'被分配到哪裏(因爲還有其他工作需要避免,所以還需要避免,如果我是閱讀代碼)。恐怕這不是你可以通過代碼修復的東西,你可以在這裏發表評論。 :)不幸的是(對於你 - 我認爲這對我來說是件好事),我不是一個VB6程序員,所以我不能告訴你確切的修復方法。 SO並不是真正爲此設計的 - 無論如何 - 這不是「請爲我做我的工作」網站。關於我所能做的就是指引你朝着正確的方向前進。正如我之前所說,這是非常糟糕的代碼。 – 2012-03-24 02:15:12

+0

我的邏輯是例如我有10個文件,每個文件都包含一個totalvolume的整數。首先,對於i = 1 To UBound(cFileList)將遍歷每個文件。接下來,對於j = 1到nDetectorCount(.DetID)將進入該文件並採取totalvolume整數並放入我的totalvolume變量。接下來我把這個變量放到sqlcommand字符串中。接下來,我檢查totalvolume是否在範圍內,如果是,我將sqlcommand字符串放入#nFileDir。最後,#nFileDir引用的文件將被導入到數據庫中。所以如果一個文件的數據超出範圍,它不會被放入#nFileDir和數據庫 – help 2012-03-24 02:30:24