簡體   English   中英

查詢表達式中數字中的 VBS/SQL 語法錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM