Передача даты MS Access Form в Oracle SQL - PullRequest
0 голосов
/ 07 февраля 2019

Я использую 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 - сбой вызова. [Oracle] [ODBC] [Ora] ORA-00936: отсутствует выражение (# 936)»

Оба поля даты в форме используют формат краткой даты.

Я не уверен, имеет ли это какое-либо значение, но форма имеет несколько вкладок.Из того, что я видел в других примерах, ссылка на форму не должна учитывать метки вкладок.

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

Сквозные запросы выполняются на сервере.В вашем случае сервер 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, как упомянуто здесь.

...