[英]VBS/SQL Syntax error in number in query expression
我遇到了一個我自己無法解決的新錯誤。
我的 hta 文件運行一個使用訪問數據庫的 vbs 文件(基本上與我的其他問題中的場景完全相同)。 無論我從我的數據庫中找到 SELECT 的東西,它都可以正常工作。 代碼中有多個示例。 執行 function fullRefresh 運行所有這些。 但是,一旦我嘗試更新數據集(在 window_onload 中發生一次),我就會收到我用作標題的錯誤。 我不得不提一下,目前還沒有其他情況可以使用當前日期。
德語錯誤:Abfrageausdruck '21.11.202' 中 Zahl 中的 Syntaxfehler
翻譯成英文:查詢表達式“21.11.202”中的數字語法錯誤
錯誤發生在第 81 行,即 dbCall 函數內的 objRecordset.Open dbQuery, objConnection 行。
基本上,我的腳本似乎生成了 202 年的日期,所以我在子 onload 中添加了 footer.innerHTML = Year(tDate),只是為了在我的頁腳中找到數字 2021。 那個怎么樣?
我的vbs:
Dim FSO, localDB, centralDB, cenDataFolder, cenTempFolder, dev, today, iKP, iFreeKP, dtmStartTime, idTimer, dbQuery, tDate, sToday
tDate = Date()
sToday = Day(tDate) & "." & Month(tDate) & "." & Year(tDate)
'iTimer = 5000
Set FSO = CreateObject("Scripting.FileSystemObject")
today = Day(Now) & "." & Month(Now) & "." & Year(Now)
localDB = "C:\_Lokale_Daten_ungesichert\UserDB.accdb"
cenDataFolder = ".\data"
centralDB = cenDataFolder & "\UserDB.accdb"
cenTempFolder = cenDataFolder & "\temp"
sUser = LCase (CreateObject("WScript.Network").UserName)
sComputer = LCase(CreateObject("WScript.Network").ComputerName)
'debug-function
If sUser = "soyar" Then
sUser = "admin"
sComputer = "computer"
End If
function timeout(iTimer)
dtmStartTime = Now
idTimer = window.setTimeout("fullRefresh", iTimer, "VBScript")
End function
function alive()
Dim a, sPath, sFirstname
sPath = cenTempFolder & "\computer\" & sComputer
If FSO.FileExists(sPath) Then
set a = FSO.OpenTextFile(sPath, 2)
Else
set a = FSO.CreateTextFile(sPath, false)
End If
a.WriteLine(sUser)
a.Close()
dbQuery = "SELECT Vorname FROM users WHERE LDAPName = '" & sUser & "'"
vorname.innerHTML = dbCall(dbQuery, 1)
End function
function updateLocalDB()
'löscht die lokale Kopie der Datenbank und zieht eine Kopie der zentralen DB
'die lokale Kopie wird verwendet, um das Pausentool zu füllen.
'Wenn die lokale Instanz zum Master wird siehe updateCentralDB (TBD)
If FSO.FileExists(localDB) Then
FSO.DeleteFile localDB
End If
If FSO.FileExists(centralDB) Then
FSO.CopyFile centralDB, localDB
Else
Dim Msg, Style, Title
Msg = "Kritischer Fehler: Datenbank nicht gefunden! Bitte informiere " & dev 'wird in window_onLoad automatisch mit dem Inhalt des Metatags "Author" aus der Pausentool.hta befüllt
Style = vbOKOnly + vbCritical + vbDefaultButton2
Title = "Datenbank fehlt!"
MsgBox Msg, Style, Title
End If
End function
function tempFiles(sContent)
'Erzeuge temporäre Datei zur Kommunikation mit der Master-Instanz
Dim a, sName, sPath
sName = year(now()) & month(now()) & day(now()) & hour(now()) & minute(now()) & second(now()) & "_" & sComputer
sPath = ".\\temp\\" & sName & ".tmp"
set a = FSO.CreateTextFile(sPath, true)
a.WriteLine(sUser & ":" & sContent)
a.Close()
End function
function dbCall(dbQuery, iAmount)
updateLocalDB()
Dim sConnectionString, objConnection, objRecordset, lTemp
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordset = CreateObject("ADODB.Recordset")
sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & localDB
'do DB-Stuff
objConnection.open sConnectionString
objRecordset.Open dbQuery, objConnection
Select Case iAmount
Case -1
'unbekannte Anzahl, Liste definieren und als ganzes zurückgeben
set lTemp = objRecordset.fields
objRecordset.close
objConnection.close
set dbCall = lTemp
Case 0
'kein Rückgabewert - für Update und Insert-Calls
objRecordset.close
objConnection.close
dbCall = 0
Case 1
'genau ein Rückgabewert - Standardfall
lTemp = objRecordset.fields(0)
objRecordset.close
objConnection.close
dbCall = lTemp
End Select
End function
function getSlotAmount()
Dim temp
'Anzahl der Pausenslots aus der DB auslesen
dbQuery = "SELECT value FROM config WHERE name = 'MiPaCount'"
getSlotAmount = dbCall(dbQuery, 1)
End function
function convertTime(sHour, sMinute, sSecond)
If Len(sHour) = 1 Then
sHour = "0" & sHour
End If
If Len(sMinute) = 1 Then
sMinute = "0" & sMinute
End If
If not sSecond = False and Len(sSecond) = 1 Then
sSecond = "0" & sSecond
End If
sReturnVal = sHour & ":" & sMinute
If not (sSecond = False) Then
sReturnVal = sReturnVal & ":" & sSecond
End If
convertTime = sReturnVal
End function
function getSlotName(iSlot)
'Funktion TBD. Plan für später: Startzeit des jeweiligen Slots aus der DB auslesen, End-Zeit berechnen, zu einem String zusammenbauen
Dim sReturnVal, lTime, iStart, iLen, iEnd, tmp
dbQuery = "SELECT startzeit FROM slots WHERE ID = " & iSlot
iStart = dbCall(dbQuery, 1)
dbQuery = "SELECT value FROM config WHERE name = 'MiPaLen'"
iLen = dbCall(dbQuery, 1)
lTime = Split(iStart, ":")
lTime(0) = CInt(lTime(0))
lTime(1) = CInt(lTime(1)) + CInt(iLen)
If lTime(1) >= 60 Then
lTime(0) = lTime(0) + 1
lTime(1) = lTime(1) - 60
End If
iEnd = convertTime(lTime(0), lTime(1), False)
sReturnVal = iStart & " - " & iEnd
getSlotName = sReturnVal
End function
function getSlotSize(iSlot)
'berechnet aus der Anzahl der Mittagspausen-berechtigten User die Größe des übergebenen Pausenslots
getSlotSize = 10
End function
function getUserInSlot(iSlot)
'gibt zurück, wie viele User im übergebenen Pausenslot eingetragen sind.
getUserInSlot = 0
End function
function clearSlots()
'leert den Hauptbereich des Pausentools
While slots.hasChildNodes()
While slots.lastChild.hasChildNodes()
slots.lastChild.removeChild(slots.lastChild.lastChild)
Wend
slots.removeChild(slots.lastChild)
Wend
End function
function fillSlot(iSlot)
Dim lUsers, oSlot
dbQuery = "SELECT LDAPName, Vorname, Nachname FROM users WHERE active > 0 AND slot = " &iSlot
Set lUsers = dbCall(dbQuery, -1)
Set oSlot = document.GetElementByID("Slot" & iSlot)
For Each field in lUsers
Set NewNode = document.CreateElement("div")
NewNode.setAttribute "ID", field.LDAPName
NewNode.setAttribute "title", field.LDAPName
NewNode.innerHTML = field.Vorname & " " & field.Nachname
oSlot.appendChild(NewNode)
Next
End function
function createSlots()
'befüllt den Hauptbereich des Pausentools mit den Pausenslots
'Erzeuge Slot 0 für Mitarbeiter ohne Mittagspause
Set NewNode = document.CreateElement("div")
NewNode.setAttribute "class", "content NoSlot"
NewNode.setAttribute "ID", "Slot0"
NewNode.innerHTML = "<p>keine Mittagspause</p>"
slots.appendChild(NewNode)
fillSlot(0)
iSlotCount = getSlotAmount()
iWidth = 70 / iSlotCount
iWidth = round(iWidth)
sWidth = "width: " & iWidth & "%;"
iSlot = iSlotCount
'Erzeuge Mittagspausen-Slots 1 bis n mit n gleich der Anzahl der Pausenslots (iSlotCount). Vor jedem Pausenslot wird ein schmaler Slot ohne ID als Spalte zwischen den Slots erzeugt
while iSlot >= 1
Set NewNode = document.CreateElement("div")
NewNode.setAttribute "class", "spalte"
slots.appendChild(NewNode) 'leere Spalte als Abstandshalter
iSlotSize = getSlotSize(iSlot)
iSlotUsers = getUserInSlot(iSlot)
iSlotName = getSlotName(iSlot) 'der Name des Slots ist der Zeitraum, in dem die Mittagspause stattfindet, z.B. 11:30 - 12:00
iSlotName = "Slot <u>" & iSlot & "</u><br>" & iSlotName
Set NewNode = document.CreateElement("div")
NewNode.setAttribute "class", "content slot"
NewNode.setAttribute "ID", "Slot" & iSlot
NewNode.setAttribute "style", sWidth
slots.appendChild(NewNode) 'neuer Pausenslot wird angehängt
Set NewChild = document.CreateElement("span")
NewChild.setAttribute "ID", "UsersIn" & iSlot
NewChild.innerHTML = iSlotUsers & " / " & iSlotSize & "<br>"
NewNode.appendChild(NewChild) 'Belegte und insgesamt verfügbare Plätze im Slot werden in die erste Zeile geschrieben
sButtonText = "diesen Pausenslot wählen (Alt + " & iSlot & ")" 'Mouseover-Text für die Pausenslot-Buttons
Set NewChild = document.CreateElement("button")
NewChild.setAttribute "class", "button"
NewChild.setAttribute "ID", "btn" & iSlot
NewChild.setAttribute "accesskey", iSlot
NewChild.setAttribute "title", sButtonText
NewChild.setAttribute "disabled" 'standardmäßig sind alle Pausenslot-Buttons gesperrt. weiteres siehe Funktion unlockSlots (TODO)
NewChild.setAttribute "onClick", "claimSlot(" & iSlot &")"
NewChild.innerHTML = iSlotName
NewNode.appendChild(NewChild) 'Der Button, den man anklickt um sich in einen Pausenslot einzutragen, wird angehängt.
'Mitarbeiter anhängen, die laut DB in diesem Slot Pause machen.
fillSlot(iSlot)
'die Schleife zählt runter statt hoch, weil die Pausenslots von rechts nach links aufgebaut werden.
iSlot = iSlot - 1
wend
End function
function checkKP()
Dim f, sPath, list, iCount, valColor, fName, fObj, objFSO, objFile
KPBtn.setAttribute "style", "background-color:#5c5656;"
sPath = cenTempFolder & "\kurzpause\"
Set list = CreateObject("ADOR.Recordset")
list.Fields.Append "name", 200, 255
list.Fields.Append "date", 7
list.Open
dbQuery = "SELECT value FROM config WHERE name = 'Kurzpausen'"
iKP = dbCall(dbQuery, 1)
totalKP.innerHTML = iKP
For Each f In fso.GetFolder(sPath).Files
list.AddNew
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile(f.Path)
list("name").Value = objFSO.GetFileName(objFile)
list("date").Value = f.DateCreated
list.Update
Next
list.Sort = "date ASC"
If not list.EOF Then
list.MoveFirst
iCount = 0
Do Until list.EOF
fName = list("name").Value
'set fObj = document.GetElementByID(fName)
If iCount < iKP Then
valColor = "#33FF33"
Else
valColor = "#ffaa00"
End If
If fName = sUser Then
KPBtn.setAttribute "style", "background-color:" & valColor & ";"
End If
'fObj.setAttribute "style", "color:" & valColor
iCount = iCount + 1
list.MoveNext
Loop
End If
list.Close
If iCount >= iKP Then
iCount = iKP
End If
iFreeKP = iKP - iCount
currentKP.innerHTML = iFreeKP
End Function
function getKP()
Dim a, sPath, sFirstname
sPath = cenTempFolder & "\kurzpause\" & sUser
If FSO.FileExists(sPath) Then
FSO.DeleteFile sPath
Else
set a = FSO.CreateTextFile(sPath, false)
a.WriteLine(sComputer)
a.Close()
End If
End function
function getTime(bSeconds)
If bSeconds Then
getTime = convertTime(Hour(Now()), Minute(Now()), Second(Now()))
Else
getTime = convertTime(Hour(Now()), Minute(Now()), False)
End If
End function
function updateTime()
Dim time
time = getTime(True)
Refreshed.innerHTML = time & " Uhr"
End function
function fullRefresh()
window.clearTimeout(idTimer)
updateLocalDB()
clearSlots()
createSlots()
checkKP()
updateTime()
timeout(iTimer)
End Function
'Definition der Funktionen hinter den Menü-Buttons oben links
function refreshBtn()
fullRefresh()
End function
function kurzpauseBtn()
getKP()
fullRefresh()
End function
function adminBtn()
'TODO
End function
If loaded Then
'do stuff
window.resizeTo 1100,620
Sub window_onLoad
alive()
footer.innerHTML = Year(tDate)
dbQuery = "UPDATE users SET active = 1, lastDate = " & sToday & " WHERE LDAPName = '" & sUser & "'"
tmp = dbCall(dbQuery, 0)
Dim author
For Each author In document.getElementsByName("author") 'das einzige Element "author" in der Pausentool.hta ist der Meta-Tag zu beginn
dev = author.content 'der Content des Meta-Tags author wird in die variable dev geschrieben. Diese wird in Fehlermeldungen verwendet
Next 'da die Pausentool.hta nur ein Element namens author enthält läuft die Schleife genau ein Mal.
timeout(iTimer)
End Sub
Else
Dim Msg, Style, Title
Msg = "Dieses Script kann nicht alleine gestartet werden. Bitte nutze stattdessen die Pausentool.hta! Bei Fragen wende dich gerne an den Entwickler."
Style = vbOKOnly + vbCritical + vbDefaultButton2
Title = "falsche Datei"
MsgBox Msg, Style, Title
End If
數據庫表“用戶”(示例):
LDAPName(字符串,唯一鍵) | 名稱(字符串) | 名稱(字符串) | 活動(整數,字節) | 最后日期(日期) | 插槽(整數,字節) |
---|---|---|---|---|---|
行政 | 行政 | 行政 | 0 | 0 | |
用戶1 | 名字1 | 姓氏1 | 0 | 0 | |
用戶2 | 名字2 | 姓氏2 | 0 | 0 |
您需要正確的日期字符串表達式:
sToday = Year(tDate) & "/" & Month(tDate) & "/" & Day(tDate)
' snip
dbQuery = "UPDATE users SET active = 1, lastDate = #" & sToday & "# WHERE LDAPName = '" & sUser & "'"
MsgBox dbQuery
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.