将 MS Access 表单日期传递到 Oracle SQL
Passing a MS Access Form date into an Oracle SQL
我正在使用 MS Access 通过传递查询从 Oracle 服务器提取一些数据。用户会看到一个表单,他们可以在其中输入一些变量(例如日期范围)。我希望 Oracle SQL 能够从表单中选取两个日期字段。
目前的SQL(无效)如下:
SELECT a.I_LOAN_NUM, a.I_LOAN_SUB_ALLOC, c.N_EXCLV, e.I_GSL_SPNSR, e.N_GSL_SPNSR, b.D_CAL, b.C_LOAN_STAT, g.N_CNTRY
FROM SLD_LOAN_MSTR a
JOIN SLD_LOAN_CDL b on b.I_LOAN_ID = a.I_LOAN_ID
JOIN SLD_EXCLV c on c.I_EXCLV_ID = b.I_EXCLV_ID
JOIN SLD_AC d on d.I_AC_ID = b.I_AC_ID
JOIN SLD_CUST e on e.I_CUST_ID = d.I_CUST_ID
JOIN SLD_DPT_CNTRY f on f.I_DPT_ID = b.I_DPT_ID
JOIN SLD_CNTRY g on g.I_CNTRY_ID = f.I_CNTRY_ID
WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between [Forms]![Cost Allocation Form]![Start_Date] and [Forms]![Cost Allocation Form]![End_Date])
ORDER BY b.D_CAL
如果我用硬编码日期替换表单引用,上面的 SQL 就可以工作,所以我知道 SQL 通常是好的。示例:
WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between '01JAN2019' and '01FEB2019')
SQL 生成的错误消息状态 "ODBC--call failed. [Oracle][ODBC][Ora]ORA-00936: missing expression (#936)"
表单中的两个日期字段都使用短日期格式。
我不确定这是否有任何区别,但表单有多个选项卡。从我从其他示例中看到的情况来看,表单引用不需要考虑选项卡标签。
谢谢
传递查询在服务器上执行。在您的情况下,Oracle 服务器无法识别 [Forms]![Cost Allocation Form]![Start_Date]
和 [Forms]![Cost Allocation Form]![End_Date]
属性。
您可以使用 VBA 动态更新查询的查询定义以包含表单控件值。然后执行查询。
Dim strSQL As String
Dim qdf As QueryDef
strSQL = "SELECT a.I_LOAN_NUM, a.I_LOAN_SUB_ALLOC, c.N_EXCLV, e.I_GSL_SPNSR, e.N_GSL_SPNSR, b.D_CAL, b.C_LOAN_STAT, g.N_CNTRY " & _
"FROM SLD_LOAN_MSTR a " & _
"JOIN SLD_LOAN_CDL b on b.I_LOAN_ID = a.I_LOAN_ID " & _
"JOIN SLD_EXCLV c on c.I_EXCLV_ID = b.I_EXCLV_ID " & _
"JOIN SLD_AC d on d.I_AC_ID = b.I_AC_ID " & _
"JOIN SLD_CUST e on e.I_CUST_ID = d.I_CUST_ID " & _
"JOIN SLD_DPT_CNTRY f on f.I_DPT_ID = b.I_DPT_ID " & _
"JOIN SLD_CNTRY g on g.I_CNTRY_ID = f.I_CNTRY_ID " & _
"WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between '" & _
[Forms]![Cost Allocation Form]![Start_Date] & "' and '" & [Forms]![Cost Allocation Form]![End_Date] & _
"' ORDER BY b.D_CAL"
Set qdf = CurrentDb.QueryDefs("PassThroughQueryName")
qdf.SQL = strSQL
此外,由于您使用日期,我建议您将日期格式化为 ISO 格式 yyyy-mm-dd
在这种情况下格式化控件如
Format([Forms]![Cost Allocation Form]![Start_Date], "yyyy-mm-dd") & "' and '" & Format([Forms]![Cost Allocation Form]![End_Date], "yyyy-mm-dd")
另一种方法是仅使用 VBA ADO 访问 Oracle 服务器并检索数据。您仍然需要按照此处所述构建 SQL 字符串。
我正在使用 MS Access 通过传递查询从 Oracle 服务器提取一些数据。用户会看到一个表单,他们可以在其中输入一些变量(例如日期范围)。我希望 Oracle SQL 能够从表单中选取两个日期字段。
目前的SQL(无效)如下:
SELECT a.I_LOAN_NUM, a.I_LOAN_SUB_ALLOC, c.N_EXCLV, e.I_GSL_SPNSR, e.N_GSL_SPNSR, b.D_CAL, b.C_LOAN_STAT, g.N_CNTRY
FROM SLD_LOAN_MSTR a
JOIN SLD_LOAN_CDL b on b.I_LOAN_ID = a.I_LOAN_ID
JOIN SLD_EXCLV c on c.I_EXCLV_ID = b.I_EXCLV_ID
JOIN SLD_AC d on d.I_AC_ID = b.I_AC_ID
JOIN SLD_CUST e on e.I_CUST_ID = d.I_CUST_ID
JOIN SLD_DPT_CNTRY f on f.I_DPT_ID = b.I_DPT_ID
JOIN SLD_CNTRY g on g.I_CNTRY_ID = f.I_CNTRY_ID
WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between [Forms]![Cost Allocation Form]![Start_Date] and [Forms]![Cost Allocation Form]![End_Date])
ORDER BY b.D_CAL
如果我用硬编码日期替换表单引用,上面的 SQL 就可以工作,所以我知道 SQL 通常是好的。示例:
WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between '01JAN2019' and '01FEB2019')
SQL 生成的错误消息状态 "ODBC--call failed. [Oracle][ODBC][Ora]ORA-00936: missing expression (#936)"
表单中的两个日期字段都使用短日期格式。
我不确定这是否有任何区别,但表单有多个选项卡。从我从其他示例中看到的情况来看,表单引用不需要考虑选项卡标签。
谢谢
传递查询在服务器上执行。在您的情况下,Oracle 服务器无法识别 [Forms]![Cost Allocation Form]![Start_Date]
和 [Forms]![Cost Allocation Form]![End_Date]
属性。
您可以使用 VBA 动态更新查询的查询定义以包含表单控件值。然后执行查询。
Dim strSQL As String
Dim qdf As QueryDef
strSQL = "SELECT a.I_LOAN_NUM, a.I_LOAN_SUB_ALLOC, c.N_EXCLV, e.I_GSL_SPNSR, e.N_GSL_SPNSR, b.D_CAL, b.C_LOAN_STAT, g.N_CNTRY " & _
"FROM SLD_LOAN_MSTR a " & _
"JOIN SLD_LOAN_CDL b on b.I_LOAN_ID = a.I_LOAN_ID " & _
"JOIN SLD_EXCLV c on c.I_EXCLV_ID = b.I_EXCLV_ID " & _
"JOIN SLD_AC d on d.I_AC_ID = b.I_AC_ID " & _
"JOIN SLD_CUST e on e.I_CUST_ID = d.I_CUST_ID " & _
"JOIN SLD_DPT_CNTRY f on f.I_DPT_ID = b.I_DPT_ID " & _
"JOIN SLD_CNTRY g on g.I_CNTRY_ID = f.I_CNTRY_ID " & _
"WHERE (b.C_LOAN_STAT = 'SETTLED' and b.D_CAL between '" & _
[Forms]![Cost Allocation Form]![Start_Date] & "' and '" & [Forms]![Cost Allocation Form]![End_Date] & _
"' ORDER BY b.D_CAL"
Set qdf = CurrentDb.QueryDefs("PassThroughQueryName")
qdf.SQL = strSQL
此外,由于您使用日期,我建议您将日期格式化为 ISO 格式 yyyy-mm-dd
在这种情况下格式化控件如
Format([Forms]![Cost Allocation Form]![Start_Date], "yyyy-mm-dd") & "' and '" & Format([Forms]![Cost Allocation Form]![End_Date], "yyyy-mm-dd")
另一种方法是仅使用 VBA ADO 访问 Oracle 服务器并检索数据。您仍然需要按照此处所述构建 SQL 字符串。