Sql VBScript-FROM子句中的语法错误
所以我想先说我对VBS的经验很少。但无论如何,我正在尝试编写这个脚本,我想从存储多个项目的数据库中计算一个项目的年数(但在某些情况下留空) 我收到的错误是: 错误800A0C3B–From子句中的语法错误。 第26行 字符1 资料来源:DAO.Database 我也不知道该怎么修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
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'"