2008-10-30 171 views
4

我試圖從ACD呼叫數據系統,Nortel Contact Center 6.0確切地獲取數據,如果您使用特定系統,我試圖捕獲的是每天通話數據。然而,當我使用此代碼VBA SQL查詢表錯誤

(SCW是一種常見的字串,等於eCallByCallStat和 SDATE是

dDate = Format(Month(deffDate) & "/" & iStartDay & "/" & Year(deffDate), "mm/dd/yyyy")

sDate = Format(dDate, "yyyymmdd")

sSql = "" 
     sConn = "ODBC;DSN=Aus1S002;UID=somevaliduser;PWD=avalidpassword;SRVR=Thecorrectserver;DB=blue" 
     sSql = "SELECT " & sCW & sDate & ".Timestamp, " 
     sSql = sSql & sCW & sDate & ".CallEvent, " 
     sSql = sSql & sCW & sDate & ".CallEventName, " 
     sSql = sSql & sCW & sDate & ".CallID, " 
     sSql = sSql & sCW & sDate & ".TelsetLoginID, " 
     sSql = sSql & sCW & sDate & ".AssociatedData, " 
     sSql = sSql & sCW & sDate & ".Destination, " 
     sSql = sSql & sCW & sDate & ".EventData, " 
     sSql = sSql & sCW & sDate & ".Source, " 
     sSql = sSql & sCW & sDate & ".Time " & vbCrLf 
     sSql = sSql & "FROM blue.dbo.eCallByCallStat" & sDate & " " & sCW & sDate & vbCrLf 
     sSql = sSql & " ORDER BY " & sCW & sDate & ".Timestamp" 


     Set oQT = ActiveSheet.QueryTables.Add(Connection:=sConn, Destination:=Range("A1"), Sql:=sSql) 

     oQT.Refresh BackgroundQuery:=False 

     Do While oQT.Refreshing = True 
     Loop" 

當我運行此我得到一個奇怪的錯誤消息在oQT.Refresh BackgroundQuery:= False

奇怪的是它的工作了一個月左右,然後就死了


@ loopo 我實際上增加了""到連接字符串,實際上擁有用戶名和密碼硬編碼到不帶引號的查詢,我從那以後刪除它們清晰度我收到的發佈


的錯誤是

運行時錯誤「-2147417848(80010108)」 : 法 '刷新 「對象的」 _​​QueryTable' 失敗


感謝您的輸入凱文。數據庫永遠不會處於沒有人訪問它的狀態,它是一個24 x 7的呼叫處理系統,並且始終連接到客戶端。至少這是我的理解。如果我通過Excel手動執行此操作,我從來不會遇到任何錯誤,或者僅在通過宏執行此操作時遇到任何問題,這會導致我認爲這是我的代碼導致問題。

我按照製造商的建議通過ODBC連接到數據庫,但我不知道他們是否設想過這種事情。

我會看看我是否可以利用這個.NET項目,看看是否有幫助。

+0

什麼是錯誤信息? – Taptronic 2008-10-30 17:01:09

+0

同上,你得到的錯誤號碼和消息是什麼? – 2008-10-30 17:09:18

回答

1

好像與查詢本身就是一個錯誤...

如果你能逐步執行代碼,並張貼sSql的內容,它可能會幫助解決......

當你通過它去,請確保引號正確轉義。

1

看起來你的連接字符串裏有雙引號。 這可能由網站是由於一些解析

你或許應該在設置sConn使用「兩雙」引號,因爲:

sConn = "ODBC;DSN=Aus1S002;UID=""somevaliduser"";PWD=""avalidpassword"";SRVR=""Thecorrectserver"";DB=blue" 
0

我開始通過刪除sSQL的內容與sSql=""

之後,因爲查詢是在for循環中運行的,所以我在下一行中構建查詢,每一行都建立在前一行上,我是這樣做的,所以下一個編輯和理解會更容易的傢伙。

通過sSQL運行後看起來像這樣

sSQL=SELECT eCallByCallStat20081001.Timestamp, eCallByCallStat20081001.CallEvent, 
eCallByCallStat20081001.CallEventName, eCallByCallStat20081001.CallID, 
eCallByCallStat20081001.TelsetLoginID, eCallByCallStat20081001.AssociatedData, 
eCallByCallStat20081001.Destination, eCallByCallStat20081001.EventData, 
eCallByCallStat20081001.Source, eCallByCallStat20081001.Time FROM 
blue.dbo.eCallByCallStat20081001 eCallByCallStat20081001 ORDER BY 
eCallByCallStat20081001.Timestamp 
+0

表存在,所有這些列存在等,是嗎?你能發佈確切的錯誤信息嗎?謝謝。 – 2008-10-30 17:04:33

1

什麼是你得到實際的錯誤信息?

在FROM子句中,您是否試圖從2個不同的表中選擇,並在不同的名稱空間中使用相同的名稱? (在這種情況下,我認爲他們應該用逗號而不是空格分開)

或者應該有另一個'。'而不是在FROM子句中的空格?或者它是一個別名?

您是否需要爲每個字段指定表格?爲什麼不只是做:

SELECT Timestamp, CallEvent, ... ,Time 
     FROM blue.dbo.eCallByCallStat" & sDate & " ORDER BY Timestamp 
1

首先,如果你連接到非通用數據庫(SQL Server,Oracle等),嘗試使用一個數據庫連接是特定於它

其次,既然你說這個錯誤來了又去,你能否測試當沒有其他人訪問系統時它是否仍然發生? 也許是某些行的問題被鎖定,而你的查詢試圖讀取他們...

三,或者切換到不同的報告方法或找到一個不同的方式來獲得數據。 Excel中這種類型的調用是有限制的。雖然,當然,它確實允許您連接到數據庫並獲取數據,但如果您正在處理大量數據,複雜查詢或挑剔的數據庫連接,則可能會發現它不足。