【问题标题】:VBA run time errorVBA 运行时错误
【发布时间】:2016-04-28 17:34:35
【问题描述】:

此代码上的运行时错误显示“Set Myrs=myqry.openrecordsheet() 是错误,有什么想法吗?

我有一个带有此代码的按钮:

选项比较数据库

Private Sub Command5_Click()

GetDataFromDate DateStart.Value, DateEnd.Value

End Sub

然后我有这个:

Option Compare Database


Sub GetDataFromDate(dtStart As Date, dtEnd As Date)

 Dim MyDb As Database, MyQry As QueryDef, MyRS  As Recordset
 Set MyDb = CurrentDb()
 Set MyQry = MyDb.CreateQueryDef("")

 ' Type a connect string using the appropriate values for your
 ' server.
 MyQry.Connect = "ODBC;DSN=PRDDLPA1;UID=purch_edi1;PWD=useedi;DBQ=PRDDLPA1;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;"

 ' Set the SQL query with Date Range passed to the sub as parameters
 MyQry.SQL = "SELECT NDC_CODE, SUM(INVOICE_QTY) AS TOTAL_QTY, SUM(INVOICE_QTY*UNIT_PRICE) AS EXT_DOLLAR_TOTAL, ITEM_NBR, TO_CHAR(EDI_INVOICE_DT, 'YYYYMM') " & _
 "FROM EDI_INVOICE_DETAIL_LINE" & _
 "WHERE AP_VENDOR_NBR IN('   242081') AND NOT((EDI_INVOICE_TYPE = 'C') AND (UNIT_PRICE = 0))" & _
 "AND (EDI_INVOICE_DT BETWEEN #" & dtStart & "# AND #" & dtEnd & "# " & _
 "AND LOCATION_NBR NOT IN('88017',' 88003',' 88010',' 88011',' 88018',' 88012',' 88008',' 88006',' 88001',' 88007',' 88009',' 88004',' 88019')" & _
" GROUP BY NDC_CODE, ITEM_NBR, TO_CHAR(EDI_INVOICE_DT, 'YYYYMM')"

 MyQry.ReturnsRecords = True
 Set MyRS = MyQry.OpenRecordset()

 MyRS.MoveFirst

 If Not MyRS.BOF Then

    While Not MyRS.EOF

        Debug.Print MyRS!TO_CHAR(EDI_INVOICE_DT)
        Debug.Print MyRS!NDC_CODE
        Debug.Print MyRS!TOTAL_QTY
        Debug.Print MyRS!EXT_DOLLAR_TOTAL
        Debug.Print MyRS!ITEM_NBR


        MyRS.MoveNext
    Wend


 End If

 MyQry.Close
 MyRS.Close
 MyDb.Close

End Sub

我该如何解决这个问题,以便我可以通过我的表单使用新的日期范围更新我的传递查询?


[来自评论] 原始查询如下所示:

SELECT NDC_CODE, SUM(INVOICE_QTY) AS TOTAL_QTY, SUM(INVOICE_QTY*UNIT_PRICE) AS EXT_DOLLAR_TOTAL, ITEM_NBR, TO_CHAR(EDI_INVOICE_DT, 'YYYYMM') FROM EDI_INVOICE_DETAIL_LINE WHERE AP_VENDOR_NBR IN(' 242081') AND NOT((EDI_INVOICE_TYPE = 'C') AND (UNIT_PRICE = 0)) AND (EDI_INVOICE_DT BETWEEN TO_DATE('03/01/2016', 'MM/DD/YYYY') AND TO_DATE('03/31/2016', 'MM/DD/YYYY')) AND LOCATION_NBR NOT IN('88017',' 88003',' 88010',' 88011',' 88018',' 88012',' 88008',' 88006',' 88001',' 88007',' 88009',' 88004',' 88019') GROUP BY NDC_CODE, ITEM_NBR, TO_CHAR(EDI_INVOICE_DT, 'YYYYMM')

【问题讨论】:

  • 您收到的错误信息是什么?您是否仔细检查过您的连接字符串是否正确?
  • 运行时错误 '3146' 然后突出显示“SET MyRS=MyQry.OpenRecordSet() //yes 连接字符串是正确的。
  • 拜托,它肯定说的不仅仅是“3146”吗?
  • 哦...哈哈抱歉,是的,它说 ODBC -- 调用失败,这很奇怪,因为当我在数据库中单独运行查询时它可以工作...
  • Access 使用# 字符来分隔日期值。您要连接的数据库不是 Access。那么该数据库使用哪些字符来分隔日期值呢? (可能不是#

标签: vba ms-access


【解决方案1】:

好像您偷偷连接到 Oracle 数据库。那么日期值必须格式化为 yyyy-mm-dd 字符串表达式:

"AND (EDI_INVOICE_DT BETWEEN '" & Format(dtStart, "yyyy-mm-dd") & "' AND '" & Format(dtEnd, "yyyy-mm-dd") & "' " & _

或尝试其他日期格式:

"AND (EDI_INVOICE_DT BETWEEN '" & Format(dtStart, "mm/dd/yyyy") & "' AND '" & Format(dtEnd, "mm/dd/yyyy") & "' " & _

【讨论】:

  • 谢谢,我试过了,但我仍然得到同样的错误。我是 VBA 新手,“Set MyRS = MyQry.OpenRecordset()”是什么意思?
  • 表示使用MyQry打开一个记录集。
  • 所以现在我有错误'找不到方法或数据成员'
  • 尝试使用非常基本的选择查询,例如“SELECT NDC_CODE FROM EDI_INVOICE_DETAIL_LINE”并修改代码直到成功。然后逐步构建此查询,在继续下一步之前更正您可能遇到的错误。
猜你喜欢
  • 2014-08-30
  • 2018-12-23
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多