2012-03-23 2 views
2

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

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 Basic Visual Studio или VBA, как во встроенном доступе или Excel? Вы запустили эту программу? Если Visual Basic, он скомпилировал? – octopusgrabbus

+0

- это программа Visual Basic, у нее есть 1 .vbp и 2 .bas-файлы, поэтому я должен использовать Microsoft Visual Basic 6, чтобы открыть ее. Как только я нажимаю клавишу, он останавливается. – help

ответ

3

No. В Print #nFileDir заявления пишут данные из того, что, как представляется, .csv (значения, разделенные запятыми) файл. (Обратите внимание, что это на самом деле плохой код, даже для старых VB6 написан Wanna-быть программистом.)

Соответствующий оператор для двух Print заявления вы спрашиваете о это один:

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

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

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

+0

спасибо, что ответили на мой вопрос. это исправить мою проблему: «если данные вне диапазона, то они не записаны в текстовый файл и базу данных Если totalVolume1 <50 И totalVolume1> -1 И totalVolume1 <50 И totalVolume1> 0 Затем Печать #nFileDir, Sqlcommand1 Печать #nFileDir, Sqlcommand2 Конец Если – help

+0

Нет, это займет намного больше, потому что там, где назначается 'totalVolume1' (и потому, что после этого есть другая работа, которую также следует избегать, если я считывая код справа). Боюсь, что вы не можете исправить код, который вы можете вставить здесь. :) К сожалению (для вас - я считаю это хорошо для меня), я не программист VB6, поэтому я не могу сказать вам точное исправление. В любом случае, SO не предназначен для этого, так или иначе - это не сайт «пожалуйста, сделайте мою работу для меня». Все, что я могу сделать, это указать вам в правильном направлении. Как я уже говорил, это действительно плохой код. –

+0

Моя логика, например, у меня есть десять файлов, и каждый файл содержит целое число для totalvolume. Во-первых, для i = 1 To UBound (cFileList) будет проходить через каждый файл. Далее, для j = 1 Чтобы nDetectorCount (.DetID) войдет в файл и возьмет целое число integer и поместит его в мою переменную totalvolume. Затем я помещаю эту переменную в строку sqlcommand. Затем я проверяю, находится ли totalvolume в пределах диапазона или нет, если это так, я помещаю строку sqlcommand в #nFileDir. Наконец, ссылка на файл #nFileDir будет импортирована в базу данных. Поэтому, если данные файла находятся вне пределов досягаемости, его не будут помещать в #nFileDir и базу данных – help

Смежные вопросы