2017-01-25 11 views
2

Я просмотрел несколько тем, где VBS-файл вызывается через командный файл в планировщике задач, но он не запускается.Получение количества записей из общего .mdb-файла с помощью VBS + Task Scheduler

В моем случае мой VBS-файл запускается в планировщике заданий, но моя логика для захвата количества записей из общей базы данных (.mdb) работает некорректно. В идеале мой VBS-файл проверяет, сколько единиц было сделано в текущий день, и выдает соответствующие единицы DATE, TIME и TOTAL, причем DATE и TIME являются фиксированными значениями, а TOTAL - моим количеством записей.

* Следует отметить, что, хотя мой файл VBS не работает правильно в планировщике заданий, он работает правильно при запуске вручную. Это то, что я не могу оборачивать.

Вот пример того, что мой вывод (.csv) файл должен выглядеть, бег каждые пять минут на планировщик заданий

DATE  TIME TOTAL 
01/13/2017 16:30 165 
01/13/2017 16:35 169 
01/13/2017 16:40 173 
01/13/2017 16:45 176 
01/13/2017 16:50 179 

но прямо сейчас, я получаю только ниже выход.

DATE  TIME TOTAL 
01/13/2017 16:30 recordset is empty 
01/13/2017 16:35 recordset is empty 
01/13/2017 16:40 recordset is empty 
01/13/2017 16:45 recordset is empty 
01/13/2017 16:50 recordset is empty 

Планировщик заданий запускает этот код VBS с 7 AM-10PM каждый день. Если единицы еще не были созданы, тогда TOTAL должен показать, что «набор записей пуст», пока не будет произведено устройство. Проблема в том, что мой код генерировал файлы только «recordset is empty» в течение целого дня.

Вот мой VBS код, разделяется на:

-A копия вставленного кода, который я использовал, чтобы иметь возможность запускать DAO на 64-битной Windows 7
-Установка переменные окружения
-Date логики
-record подсчитывать логики
-output в файл .csv

Option Explicit 
    '////////////////////////////////IGNORE - COPY PASTED TO GET DAO.DBENGINE.36 RUNNING////////////////////////// 
    CheckOSx86x64Args() 
    dim JRO, SC, DAO 
    Rem main code begins here 
    Set JRO = CreateObject("JRO.JetEngine") 
    Set SC = CreateObject("ScriptControl") 
    Set DAO = CreateObject("DAO.DBEngine.36") 

    Sub CheckOSx86x64Args() 
     Dim CmdLn, Arg 
     With CreateObject("WScript.Shell") 
      If Replace(LCase(WScript.Path), LCase(.ExpandEnvironmentStrings("%windir%\")), "") = "system32" Then 
       CmdLn = Replace(LCase(WScript.FullName), "system32", "syswow64") 
       If CreateObject("Scripting.FileSystemObject").FileExists(CmdLn) Then 
        CmdLn = CmdLn & " """ & WScript.ScriptFullName & """" 
        For Each Arg In WScript.Arguments 
         CmdLn = CmdLn & " """ & Arg & """" 
        Next 
        .Run CmdLn, 1, True 'added " ,1, True " in hopes of waiting until whatever process is running is done. read into bwaitonreturn 
        WScript.Quit 
        End If 
      End If 
     End With 
    End Sub 
'////////////////////////////////////////////ENVIRONMENT///////////////////////////////////////////////////// 
'//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
'On Error Resume Next 
Const ForWriting = 2 
Const ForAppending = 8 
Dim rst, oJet, oDB 'As DAO.DBEngine, DAO.Database, DAO.Recordset 
Dim fso, GetTheBase 
Dim formatDate, SQLdate, csvCurrentTime 'date format 
Dim counterFSO, activeWbTest, objworkbook, objLogFile 
Dim origLP, destpath 
Dim Total 
Const QRY_NAME = "Results" 'Table to export 

csvCurrentTime = Hour(now) & ":" & Minute (now) 

origLP = "\\192.168.1.240\ProductionSrvr2\SIMULATION\LongPulse.mdb" 
destpath = "\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\SM" 
'///////////////////////////////////////////////DATE///////////////////////////////////////////////////////// 
'//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
'check if date provided as an argument;if provided, use that data, otherwise, determine date 
If WScript.Arguments.Count > 0 Then 
    SQLdate = WScript.Arguments.Item(0) 'Query date, MM/DD/YYYY with 0's 
    formatDate = Replace(SQLdate,"/","")'File extension date 
Else 
    SQLdate = Right("0" & Month(Now()), 2)& "/" & Right("0" & Day(Now()), 2)& "/" & Year(Now()) 'Query date 
    'SQLdate = "01/13/2017" 
    formatDate = Replace(SQLdate,"/","")'File extension date 
End If 
'//////////////////////////////////////////////RECORDCOUNT LOGIC///////////////////////////////////////////// 
'//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
Set fso = CreateObject("Scripting.FileSystemObject") 
GetTheBase = "SM_" & formatDate & ".csv" 'adding csv to the file 

Set oJet = CreateObject("DAO.DBEngine.36") 
Set oDB = oJet.OpenDatabase(origLP) 
'Query database for 'distinct ID' from table 'Results' where the column 'Test_Date' contains the system date 
Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date LIKE '*" & SQLdate & "*' ") 
If rst.EOF = True Then 
    Total = "recordset is empty" 
Else 
    Total = rst.RecordCount 
End If 
oDB.Close 
Set oDB = Nothing 
Set oJet = Nothing 
'//////////////////////////////////////OUTPUT TO .CSV FILE/////////////////////////////////////////////////// 
'//////////////////////////////////////////////////////////////////////////////////////////////////////////// 
'checks if .csv file already exists. If it doesn't, it creates file with headers. If it does, it skips the 'if' statement 
Set counterFSO = CreateObject("Scripting.FileSystemObject") 
If Not counterFSO.FileExists(GetTheBase) Then 
    Set objLogFile = counterFSO.CreateTextFile(GetTheBase, ForWriting) 
    objLogFile.Writeline chr(34) & _ 
    "DATE" & chr(34) & "," & chr(34) & _ 
    "TIME" & chr(34) & "," & chr(34) & _ 
    "TOTAL" & chr(34) & "," 
    Set objLogFile = nothing 'prevents "permission denied" error.set objLogFile to nothing for the next .opentextfile action 
End If 
Set objLogFile = counterFSO.OpenTextFile(GetTheBase, ForAppending) 
objLogFile.Writeline chr(34) & _ 
SQLdate & chr(34) & "," & chr(34) & _ 
csvCurrentTime & chr(34) & "," & chr(34) & _ 
Total & chr(34) & "," 
Set objLogFile = nothing  

Я не уверен, где я неправильно в счетных записях логики. Я начинаю с использования оператора SQL Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date LIKE '*" & SQLdate & "*' "), чтобы выбрать уникальные записи (используя ID в качестве критериев), где Test_Date похож на мой SQLdate (который всегда является представителем текущего дня).

Я думаю, что проблема заключается в этом разделе

If rst.EOF = True Then 
    Total = "recordset is empty" 
Else 
    Total = rst.RecordCount 
End If 

Если единицы не было произведено еще, мой записей должен быть совершенно пуст. Я использую .EOF, чтобы обнаружить это обстоятельство, но на данный момент код думает rst.EOF = True все время вместо того, чтобы записывать фактическое количество записей, когда были произведены единицы. Опять же, когда файл VBS запускается вручную, а не в Task Scheduler, он может получить правильный счетчик записей.

Вот пример базы данных облака (MDB) файл, в котором я запрашиваю идентификатор и Test_Date для записи подсчитывать

Title Comment ID   Test_Date Test_Time Pmax 
AU29 PL1  H160019608 01/13/2017 1:03:16 PM 351.9642 
AU29 PL1  H160019917 01/13/2017 1:03:35 PM 351.9942 
AU29 PL1  H160019940 01/13/2017 1:03:56 PM 356.2267 
AU29 PL1  H160019940 01/13/2017 1:04:17 PM 356.2153 

Пакетный файл просто вызывает мой .vbs файл (UniqueCounter.vbs), используя следующие код:

set SM_DEST="\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\SM" 
set sim_count="\\192.168.1.240\ProductionSrvr2\PROGRESS_LOGS\BIN\UniqueCounter.vbs" 

REM collect simulation data 
pushd %SM_DEST% 
%sim_count% 
popd 

Кто-нибудь знает, как я могу решить проблему? Любая помощь будет принята с благодарностью.

+2

FYI, только потому, что ваш файл MDB находится в сетевой папке в вашей локальной сети, это не «в облаке». Просто удалите этот отрывок из вашего вопроса, это вводит в заблуждение. – Tomalak

+0

Хорошая точка, спасибо за редактирование – Joshua

ответ

1

В то время как мой файл VBS не работает в Task Scheduler, он работает, когда запускается вручную.

Тогда я не вижу, как и почему вы изменили бы код.

Причиной неисправности является учетная запись, назначенная заданием.

Назначьте (создайте) учетную запись пользователя для запланированной задачи, которой вы предоставляете привилегии для доступа к файлу базы данных.

Редактировать:

Ваше предложение where неверно. Он должен гласить:

Set rst = oDB.OpenRecordset("SELECT DISTINCT ID FROM " & QRY_NAME & " WHERE Test_Date = #" & SQLdate & "#' ") 
+1

Извините, я должен перефразировать - Task Scheduler запускает код VBS, но не корректно. Я обнаружил, что мой файл VBS может работать целый день и выводить только «набор записей пуст» вместо фактического количества записей, чего я не хочу. Я полагаю, что у меня есть учетная запись пользователя, назначенная для запланированной задачи, вы знаете, где именно я могу проверить это? Я не настраивал планировщик заданий, я только написал код VBS. Вот несколько [снимков настроек] (http://imgur.com/a/94h69) – Joshua

+0

@ Joshua, почему вы хотите, чтобы он запускался только при входе пользователя в систему, не будет ли он работать независимо от пользователя, который регистрируется быть лучше? – Lankymart

+0

Это может быть ваше предложение where. См. Править. – Gustav