2016-04-11 30 views
2

摘要: Crystal報表使用SQL查詢連接到Access數據庫(其中包括)。其中一列包含在使用Jet4 DAO驅動程序連接到Access數據庫時在Crystal中作爲「TEXT [255]」字段公開的表達式,但在使用Microsoft Office 12.0 Access數據庫引擎OLE連接時作爲「備忘錄」 DB提供者。這會導致下游問題。MS Office 12.0 Access數據庫引擎與Jet 4驅動程序相比,OLE DB提供程序驅動程序向文本列分配不同的數據類型

詳細信息: 我有一個Crystal報表,它使用兩個不同的MS Access數據庫中的數據,使用報表中定義的單獨的SQL查詢。然後使用錶鏈接合並結果(錶鏈接類似於表連接,但是跨不同數據庫的表操作,並且由Crystal本身處理,而不是運行服務器端)。

錶鏈路基於(在一側)上在SQL查詢中計算列(「ColumnToLinkOn」),這看起來像這樣(匿名):

SELECT 
Column1 AS Heading1, 
Column2 as Heading2, 
Left(Column2,6) AS ColumnToLinkOn -- Table link based on this column 
FROM NameOfTable 

在列2的數據類型訪問是Short Text(正如Access 2013所稱的 - 以前這被稱爲Text)。

現在有趣的一點:當從Crystal到Access數據庫的連接類型是Jet4(DAO)時,那麼ColumnToLinkOn的數據類型是String [255]。但是,如果連接更改爲使用Microsoft Office 12.0 Access數據庫引擎OLE DB提供程序,則Crystal會將其選爲Memo(我們更改連接類型是因爲我們需要它在32位和64位模式下工作,但沒有64位Jet4驅動程序)。與此問題是錶鏈接不能基於備註字段,以便呈現鏈接無效。

我的問題: 如何更改SQL查詢以將數據類型轉換爲普通文本字段,以便可以在錶鏈接中使用它?根據Access文檔,LEFT function返回Variant (String),我懷疑這會導致問題。源列不是類型的備忘錄,所以它顯然是介紹該問題的左函數。

我試過包裝CStr的結果,像這樣:CStr(Left(Column2,6)) AS ColumnToLinkOn,但這沒有什麼區別。我還發現一個暗示,說這樣做Replace(Left(Column2,6), "", "") AS ColumnToLinkOn會有所幫助,但事實並非如此。不幸的是,Access也不支持CAST(column AS type)語法。

我使用Access 2013和Crystal Reports 2013.

任何幫助將不勝感激!

+1

我沒有CR的經驗。但是如果使用'Nz'或'Left $'會發生什麼?或者與字符串連接:'「」&Left(Column2,6)AS ColumnToLinkOn'? – Gustav

+0

感謝您的問題,古斯塔夫。嘗試'Nz(Left(Column2,6))AS ColumnToLinkOn'或'Left(Nz(Column2),6)AS ColumnToLinkOn'失敗,並且表達式中的'Undefined function'NZ'。接下來會嘗試你的其他建議。 –

+0

不幸的是,'Left $(Column2,6)AS ColumnToLinkOn'沒有什麼區別。 ''「&Left(Column2,6)AS ColumnToLinkOn'也不會作爲備忘錄出現。 –

回答

2

如果這些記錄是不同的,你可以做這樣的:

SELECT DISTINCT 
Column1 AS Heading1, 
Column2 as Heading2, 
Left(Column2,6) AS ColumnToLinkOn -- Table link based on this column 
FROM NameOfTable 

Access無法匹配備註字段要麼,所以它必須截斷備註字段來shorttext找到不同的元素。

另一種方法是使用Crystal子報表,並鏈接到子報表上的公式字段,而不是鏈接到表。

+0

哇,一個可愛的開箱即用的思想!那樣做了。非常感謝! –

相關問題