2016-11-22 8 views
0

Excelのワークシートから連結されたSQL文を実行して別のワークシートに結果を返します。私がインラインネストされたクエリを実行すると、結果はエラーなしで返されます(性能は3分対数秒よりずっと遅いですが)。以下に示すように共通テーブル式CTEを使用すると、実行時エラー '3704'オブジェクトは閉じられます。私はExcel 2010を使用しており、Oracle 11gデータベースを照会しています。クエリはToadでうまく動作し、Oracleに対してExcelからCTEクエリを実行していることを覚えているようですので、問題ではないと思います。私は、DBに何か変更を加えたり、これをストアドプロシージャとして設定することはできません。どんなass assに対しても事前に感謝します。機密保持のための消毒オブジェクトが閉じているときにvba共通テーブル式cte操作が許可されない

全コード:

Sub RefreshData() 

'Turn off screen updating and alerts 
Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

'User cell selection when running macro 
Dim iRowRef As Integer 
Dim iColRef As Integer 
SheetRef = ActiveSheet.Name 
iRowRef = ActiveCell.Row 
iColRef = ActiveCell.Column 

Worksheets("Dashboard").Cells(2, 2).Value = "Start time: " & Now() 

'Create connection 
Dim cn As Object 
Dim rs As Object 
Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

If strUname = "" Then 
    strUname = InputBox(Prompt:="USERNAME", Title:="Authentication", Default:=(Environ$("Username"))) 
End If 
If strPword = "" Then 
    'strPword = InputBox(Prompt:="PASSWORD", Title:="Authentication", Default:="Password") 
    strPword = modPWMask.InputBoxPW("PASSWORD", "Authentication") 
End If 

***編集:問題は、接続文字列で提供していました。 CTEサポートはプロバイダに依存します。おかげ@TimWilliams

'Connection string 
cn.ConnectionString = "Provider=MSDAORA.1;User ID=" & strUname & ";Password=" & strPword & ";Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = host.com)(PORT = 100))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db_prd)))" 
'Open connection 
cn.Open 

'Query Data Runoff 
strQuery = Worksheets("SQL").Cells(2, 2).Value & UCase(Format(Worksheets("Dashboard").Cells(7, 3).Value, "dd-mmm-yyyy")) & Worksheets("SQL").Cells(2, 3).Value 
'Send query string to clipboard 
Dim DataObj3 As New MSForms.DataObject 
DataObj3.SetText strQuery 
DataObj3.PutInClipboard 

    'Clear old data 
    Worksheets("Data").Cells.EntireColumn.Hidden = False 
    Worksheets("Data").Range("C20:E20").ClearContents 

    'Create recordset from query 
    Set rs = cn.Execute(strQuery) 

は、これは私がエラーを取得していますラインです:

'Paste data from record set 
    Worksheets("Data").Range("C20").CopyFromRecordset rs 

'Timestamp end time 
Worksheets("Dashboard").Cells(3, 2).Value = "Last refreshed: " & Now() 

'Turn on screen updating and alerts 
Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

'Return to starting cell 
Worksheets(SheetRef).Activate 
Cells(iRowRef, iColRef).Select 

End Sub 

そして、これが再び機密保持のために消毒SQLです:プロバイダとの私のための

with cte as 
(
select 
    ENTITY 
    , ENDPOINT 
    , case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end as PCT 
    , SUM(case 
    when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) 
    when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) 
    when RWS = 2 then cast(BAL AS decimal (18,2)) 
    else 0 end) as BAL 
    , ROUND(SUM((case 
    when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) 
    when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) 
    when RWS = 2 then cast(BAL AS decimal (18,2)) 
    else 0 end) 
    * 
    (case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end) 
    /100),2) as ADJ_BAL 
from 
    SCHEMA.VIEW 
    cross join (select 1 as RWS from dual union select 2 as RWS from dual) 
where 
    AS_OF_DATE = '01-NOV-2016' 
group by 
    ENTITY 
    , ENDPOINT 
    , case 
    when RWS = 1 and ENDPOINT in (13,14) then PCT_B 
    when RWS = 2 and ENDPOINT in (13,14) then PCT_A 
    else PCT_A end 
) 

select sum(case 
      when ENTITY = 'ENTITYA' and ENDPOINT <> 33 then ADJ_BAL 
      when ENTITY = 'ENTITYB' then ADJ_BAL 
      when ENTITY = 'ENTITYC' and ENDPOINT <> 33 then ADJ_BAL 
      else 0 
     end) as BAL_CONSOL 
    , sum(case 
      when ENTITY = 'ENTITYA' then ADJ_BAL 
      else 0 
     end) as BAL_ENTITYA 
    , sum(case 
      when ENTITY = 'ENTITYB' then ADJ_BAL 
      else 0 
     end) as BAL_ENTITYB 
from cte 
+1

「cn.open」という行が失敗していて、実際に接続が正常に開かれたかどうかを確認していません。 – xQbert

+0

私はそのチェックを追加することができますが、上記の前に他の2つのクエリを正常に実行するので、そうは思わないでしょう。 ?cn.State 1 – clarencebuttowski

+0

(1) 'cn.State'ではなく' rs.State'をチェックする(2)Connectionのエラーコレクションをチェックするhttps://support.microsoft.com/en-us/kb/167957 –

答えて

1

作品OraOLEDB.Oracleおよび

cn.CursorLocation = adUseClient 

MSDAORA.1プロバイダーでは動作しません

関連する問題