2015-09-08 3 views
1

Я написал код VBA в Access 2007 для запуска SQL-запроса в Oracle и вставки результатов в таблицу Access с использованием запроса Pass-Through. Я получаю следующую ошибку: «ODBC - звонок не выполнен». Ниже приведен код:Доступ к VBA для импорта таблицы Oracle: ODBC - сбой вызова

If TableExists("" & TblName) = True Then DoCmd.DeleteObject acTable, TblName 

CurrentDb.Execute "CREATE TABLE " & TblName & "(Merch_Nbr Text, Month_End_Date Text, Passer Text, PasserMonth Text, Volume Long, DiscountRevenue Long)" 

'Create a Pass through query to extract MID List from Oracle table 
Dim PassThruQuery As QueryDef 
If QueryExists("Query_oracle") = True Then DoCmd.DeleteObject acQuery, "Query_oracle" 
Set PassThruQuery = CurrentDb.CreateQueryDef("Query_oracle") 

'SQL query to be executed on Oracle database 
sql_stmt = "SELECT M.MERCH_NBR as Merch_Nbr,CM.MONTH_END_DATE as Month_End_Date,PSR.PASSER as Passer,PSR.MONTH as PasserMonth,sum(F.MERCH_BILLED_ASSESSMENTS) as Assessments," 
sql_stmt = sql_stmt & "sum(F.SALES_VOLUME-F.RETURNS_VOLUME) as Volume,sum(F.DISCOUNT_REVENUE) as DiscountRevenue " 
sql_stmt = sql_stmt & "FROM WH_TARGET.RPSI_MONETARY_FACT F,WH_TARGET.RPSI_MERCHANT_DIM M,WH_TARGET.RPSI_CARD_TYPE_CHARGE_TYPE_DIM CT" 
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_PRICING_CATEGORY_DIM PC,WH_TARGET.RPSI_CALENDAR_MONTH_DIM CM,WH_TARGET.RPSI_BACK_END_VENDOR_DIM BEV" 
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_SALES_GROUP_DIM SG_H,WH_TARGET.RPSI_SALES_REP_DIM SR_H,WH_TARGET.RPSI_AGENT_BANK_DIM AB_H" 
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_H,WH_TARGET.RPSI_SALES_GROUP_DIM SG_C,WH_TARGET.RPSI_SALES_REP_DIM SR_C" 
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_AGENT_BANK_DIM AB_C,WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_C,dw_biz.portfolio_mgmt PSR " 
sql_stmt = sql_stmt & "WHERE Month_End_Date >= '01-OCT-2014' AND PSR.MONTH = '01-JAN-2015' " 
sql_stmt = sql_stmt & "AND psr.TYPE = 'MON' AND CT.CARD_TYPE in ('1','2','5') AND PSR.MID = M.MERCH_NBR " 
sql_stmt = sql_stmt & "AND F.MERCHANT_SID_FK = M.MERCHANT_SID_PK AND F.CARD_TYPE_CHARGE_TYPE_SID_FK = CT.CARD_TYPE_CHARGE_TYPE_SID_PK " 
sql_stmt = sql_stmt & "AND F.PRICING_CATEGORY_SID_FK = PC.PRICING_CATEGORY_SID_PK AND F.CALENDAR_MONTH_SID_FK = CM.CALENDAR_MONTH_SID_PK " 
sql_stmt = sql_stmt & "AND F.BACK_END_VENDOR_SID_FK = BEV.BACK_END_VENDOR_SID_PK AND F.SALES_GROUP_SID_FK = SG_H.SALES_GROUP_SID_PK " 
sql_stmt = sql_stmt & "AND F.SALES_REP_SID_FK = SR_H.SALES_REP_SID_PK AND F.AGENT_BANK_SID_FK = AB_H.AGENT_BANK_SID_PK " 
sql_stmt = sql_stmt & "AND F.ASSOCIATION_SID_FK = ASSC_H.ASSOCIATION_SID_PK AND M.SALES_GROUP_SID_FK = SG_C.SALES_GROUP_SID_PK " 
sql_stmt = sql_stmt & "AND M.SALES_REP_SID_FK = SR_C.SALES_REP_SID_PK AND M.AGENT_BANK_SID_FK = AB_C.AGENT_BANK_SID_PK " 
sql_stmt = sql_stmt & "AND M.ASSOCIATION_SID_FK = ASSC_C.ASSOCIATION_SID_PK " 
sql_stmt = sql_stmt & "GROUP BY M.MERCH_NBR,CM.MONTH_END_DATE,PSR.PASSER,PSR.MONTH" 


PassThruQuery.SQL = sql_stmt 

PassThruQuery.Connect = "ODBC;DSN=RDW1;UID=dw_biz;PWD=dw_biz" 
PassThruQuery.ReturnsRecords = True 

'Insert the Query results into Access Table 
CurrentDb.Execute "INSERT INTO " & TblName & "(Merch_Nbr, Month_End_Date, Passer, PasserMonth, Volume, DiscountRevenue) " & _ 
"SELECT Query_oracle.Merch_Nbr, Query_oracle.Month_End_Date, Query_oracle.Passer, Query_oracle.PasserMonth, Query_oracle.Volume, Query_oracle.DiscountRevenue From Query_oracle;" 


Exit Sub 

Я экспортировал этот запрос в текстовый файл и запустил его на Oracle, он работает нормально! Кроме того, я создал временную таблицу в Oracle с вышеупомянутым SQL-запросом и заменил sql_stmt в VBA на «select * from new_oracle_table». Как ни странно, это, похоже, отлично работает. Считаете ли вы, что это связано с длиной SQL-запроса в sql_stmt? Любые идеи о том, как исправить это, будут очень признательны.

-SS

+0

Вы проверили, что строка подключения работает? Попробуйте заменить оператор sql простой инструкцией SELECT, чтобы убедиться, что строка подключения работает нормально. – jhTuppeny

+0

Спасибо за ваш ответ. Строка подключения прекрасна, и простой SQL-запрос также отлично работает. Проблема заключалась в том, что время соединения ODBC заканчивалось. Я разместил ответ ниже. – SSampat

ответ

0

Я был в состоянии решить эту проблему. Просто скопируйте приведенный ниже код в обработчик ошибок, и это даст вам более подробное описание ODBC - Сбой вызова ошибки

'DAO Error Handler 
Dim MyError As Error 
Debug.print Errors.Count 
For Each MyError In DBEngine.Errors 
With MyError 
MsgBox .Number & " " & .Description 
End With 
Next MyError 

Это сказал мне, что мое соединение ODBC было приурочено из-за большого размера SQL-запрос. Чтобы устранить эту ошибку, выполните указанные ниже действия.

http://its.uiowa.edu/support/article/101855