Sql VBScript-FROM子句中的语法错误

Sql VBScript-FROM子句中的语法错误,sql,vbscript,Sql,Vbscript,所以我想先说我对VBS的经验很少。但无论如何,我正在尝试编写这个脚本,我想从存储多个项目的数据库中计算一个项目的年数(但在某些情况下留空) 我收到的错误是: 错误800A0C3B–From子句中的语法错误。 第26行 字符1 资料来源:DAO.Database 我也不知道该怎么修 Option Explicit 'Line 1 'Declare Variables Dim rs1 Dim rs2 Dim Year '5 Dim YearNo Dim oAccess Dim oShell Dim

所以我想先说我对VBS的经验很少。但无论如何,我正在尝试编写这个脚本,我想从存储多个项目的数据库中计算一个项目的年数(但在某些情况下留空)

我收到的错误是: 错误800A0C3B–From子句中的语法错误。 第26行 字符1 资料来源:DAO.Database 我也不知道该怎么修

Option Explicit 'Line 1
'Declare Variables
Dim rs1
Dim rs2
Dim Year '5
Dim YearNo
Dim oAccess
Dim oShell
Dim dbLocation
Dim currentdb '10
Dim sql
Dim Program_Year
Dim Construction_Year
Dim oFSO
Set oFSO = CreateObject("scripting.fileSystemObject") '15
Set oShell = Wscript.CreateObject("Wscript.Shell")

dbLocation = "[drive]\folder\folder\file.accdb"

Set oAccess = createobject("Access.Application") '20

oAccess.opencurrentdatabase(dbLocation)

'sql = "SELECT * FROM [Expenditures] IN '" & dbLocation & "' "
'25
oAccess.currentdb.execute("SELECT * FROM [Expenditures] IN '" & dbLocation & "'""") '26

Set rs1 = CurrentDb.OpenRecordset(oAccess)

'Move to first record '30
rs1.MoveFirst
'Copy recordset
Set rs2 = rs1.Clone
rs2.Bookmark = rs1.Bookmark
rs2.MoveNext '35

Do While Not rs2.EOF

            rs2.Edit

'1. Check if Construction Year is before Program Year '40
If Me.Construction_Year < Me.Program_Year Then

'a) If year comes before program year, leave yearno blank
 If Me.Year < Me.Program_Year Then
     Me.YearNo = "" '45
 'b) If year is program year or is greater than program year, fill in yearno
 ElseIf Me.Year > Me.Program_Year or Me.Year = Me.Program_Year Then
     If rs1.Year < rs2.Year And Trim(rs1.GWP) = Trim(rs2.GWP) Then
         rs2.YearNo = rs2.Year - rs1.Year + rs1.YearNo
     End If '50
 End If

'2. Check if Program Year is Before Construction Year
ElseIf Me.Program_Year < Me.Construction_Year Then
'55
 'a) If year comes before construction year, leave yearno blank
 If Me.Year < Me.Construction_Year Then
     Me.YearNo =""
 'b) If year is construction year or is greater than construction year, fill in yearno
 ElseIf Me.Year > Me.Construction_Year or Me.Year = Me.Construction_Year Then '60
     If rs1.Year < rs2.Year And Trim(rs1.GWP) = Trim(rs2.GWP) Then
         rs2.YearNo = rs2.Year - rs1.Year + rs1.YearNo
     End If
 End If
'3. Check if Program Year and Construction Year are the same '65
ElseIf Me.ProgramYear = Me.Construction_Year Then
 'a) If year comes before program year, leave yearno blank
 If Me.Year < Me.Program_Year Then
     Me.YearNo = ""
 'b) Otherwise fill in yearno '70
 ElseIf rs1.Year < rs2.Year And Trim(rs1.GWP) = Trim(rs2.GWP) Then
         rs2.YearNo = rs2.Year - rs1.Year + rs1.YearNo
     End If
 End If
'80
'End If

'Update and move to next

            rs2.Update

rs1.MoveNext '85

            rs2.MoveNext

        Loop


        'Close recordsets and set to nothing

rs2.Close '90

        rs1.Close

        Set rs1 = Nothing

        Set rs2 = Nothing

'95
oShell.Popup "Update Complete!",2, "",0

oAccess.quit
Set oAccess = Nothing

WScript.Quit
选项显式“第1行
'声明变量
暗rs1
暗rs2
第五年
朦胧的渴望
暗色通道
迪姆奥谢尔酒店
暗数据库定位
小电流dB'10
dimsql
国际货币基金组织国际货币基金组织
第二年
朦胧
Set of so=CreateObject(“scripting.fileSystemObject”)'15
设置oShell=Wscript.CreateObject(“Wscript.Shell”)
dbLocation=“[drive]\folder\folder\file.accdb”
设置oAccess=createobject(“Access.Application”)'20
oAccess.opencurrentdatabase(dbLocation)
'sql=“从'&dbLocation&''中的[Expensions]中选择*”
'25
oAccess.currentdb.execute(“从“&dbLocation&“”“””)中的[Expensions]中选择*26
Set rs1=CurrentDb.OpenRecordset(OAAccess)
“移动到第一个记录”30
rs1.1首先
'复制记录集
设置rs2=rs1.Clone
rs2.Bookmark=rs1.Bookmark
rs2.MoveNext'35
而不是rs2.EOF
rs2.编辑
'1.检查施工年份是否早于计划年份'40
如果Me.Construction\u YearMe.Program\u Year或Me.Year=Me.Program\u Year
如果rs1.YearMe.Construction\u Year或Me.Year=Me.Construction\u Year然后是'60
如果rs1.Year
非常感谢您提供的任何帮助,包括我的代码中的任何明显问题


编辑:忘记添加数据库基于Access。

SQL?看起来像是访问。这是一段非常古老的VBScript代码。可能有助于:

”游标类型枚举值
常量ADOPENFORADONLY=0
常数adOpenKeyset=1
常数adOpenDynamic=2
常数adOpenStatic=3
'LockTypeEnum值
常数adLockReadOnly=1
Const adlock悲观=2
常数adlock=3
常数adlockBatchOptimization=4
'CommandTypeEnum值
Const adCmdUnknown=&H0008
Const adCmdText=&H0001
Const adCmdTable=&H0002
Const adCmdStoredProc=&H0004
Dim连接,rs,项,svcOpsRA(1),数据文件,n,fs
设置fs=CreateObject(“Scripting.FileSystemObject”)
Dim CurrentPath,CurrentFolder
设置CurrentPath=fs.GetFolder(“.”)
CurrentFolder=CurrentPath.path
设置CurrentPath=nothing
Set Connection=CreateObject(“ADODB.Connection”)
Connection.ConnectionTimeout=30
Connection.CommandTimeout=80
datafile=CurrentFolder&“\deploy.mdb”
连接。打开“驱动程序={Microsoft Access驱动程序(*.mdb)};DBQ=“&datafile&”DefaultDir=;UID=;PWD=;”
set rs=CreateObject(“ADODB.RecordSet”)
rs.打开“选择服务,从svcOps状态选择状态”,连接,adOpenForwardOnly,AdLockOptimized
而不是卢比
n=0
对于rs.字段中的每个项目
svcOpsRA(n)=item.value'。。。用值填充数组
n=n+1
下一个
svcOps svcOpsRA(0),svcOpsRA(1)“。。。基本上调用一个子函数并传递2个字段作为参数
下一个
温德
rs.Close
连接,关闭
设置rs=无
设置连接=无
设置fs=nothing
svcOps
子项看起来像:

sub-svcOps(服务、状态)'。。。获取2个参数
' ... 做点什么
端接头
此外,如果计划更新记录集,请使用
adOpenDynamic
而不是
adOpenForwardOnly
;)

以下是有关记录锁和枚举类型的文档:

这是无效的语法。如果要在中使用,则可以是:

"SELECT * FROM [Expenditures] WHERE somefield IN('val1','val2','val3')"
如果这些值是变量,那么仍然需要使用连接插入它们

"SELECT * FROM [Expenditures] WHERE somefield IN('" & val1 & "','" & val_etc & "')"
或者


如果
val1
是一个数字,那么您不需要撇号。

您只需使用适当的锁创建一个连接即可。无需打开access应用程序对象。@porkchop完全正确。但是,对我来说,这属于对OP代码的评论和建议,而不是对他们的问题和错误消息的回答。因此,我更改了'sql=“SELECT*FROM[expensions]WHERE somefield=val1”'WHERE GWP='“+me.GWP+”“'ORDER BY Year”'oAccess.currentdb.execute(“SELECT*FROM[expensations]”)“25”设置rs1=CurrentDb.OpenRecordset(“sql”)以设置rs1=CurrentDb.CreateObject(“ADODB.Recordset”)strQuery=“从支出中选择*”30设置rs1=oConnection.Execute
"SELECT * FROM [Expenditures] WHERE somefield IN('" & val1 & "','" & val_etc & "')"
"SELECT * FROM [Expenditures] WHERE somefield = 'val1'"