2012年7月29日 星期日

vs2010 crystal report,和rdl(c)的差異?

之前一直習慣使用微軟的Reporting Service來製作報表(.rdl)
然後再將rdl改命名為rdlc就可以在visual studio使用報表.

所以不懂VS開發程式的同事就可以在BIDS中先做好rdl報表並測試其執行後的報表格式及資料後,再把rdl更改副檔名為rdlc後再給負責開發網站的同事進行coding.
這樣的分工我覺得挺方便的.一來可借助熟DB的同事做好報表,二來也可加快程式員專注在寫code上.

不知crystal report 和reporting service 有何設計上的差異呢?

接下來,我就先建一個小小的下crystal report來測試一下二者差異性吧.

以下就將reporting service 簡稱RS,crystal report 簡稱CR


設計版面:
二者該有的表頭表尾明細群組都有,但CR的layout是free form的任意位置方式,RS的layout則是像Excel方式的表格方.前者的好處應是可以自由擺放報表欄位,後則則是設計方式就如同在操作Excel一樣方便.
個人比較喜歡RS的方式,因為不用一直在那邊對textbox進行上下左右的對齊動作.不過遇到那種複雜版面的報表會比較辛苦.但如果要顯示Grid那種加線條的表格,RS應該是"一塊小蛋糕"吧!










屬性使用:
 CR13.X版報表預覽時,工具列的擺法就和10.X版不一樣. 多了一個主報表的頁籤,舊版似乎是採工具列上的下拉選單.另外GroupTree也預設出現, 因不是很了解這個功能,所以我想把他隱藏起來, Crystal Report Viewer的屬性很令我不直覺,光找一個屬性我就測半天.

RS新舊版的工具列基本上都只有在那一行工具列上變化,屬性使用也很直覺.
下列是個人覺得應設的CR Viewer屬性.
  <CR:CrystalReportViewer ID="crv" AutoDataBind="true" runat="server" PrintMode="ActiveX"
            HasCrystalLogo="false" HasToggleGroupTreeButton="false" ToolPanelView ="None" grouEnableDatabaseLogonPrompt="False"/>

報表來源:
二者報表都是先指定報表名稱,再指定DataSource. 果然是同源產品.

報表呈現:
報表預覽後,CR一直有個地方困擾我, 就是字體看來有點不對齊的感覺,
明明我都設了相同的字體,大小,欄位的高度,也向上對齊 (align tops)
但預覽後的效果,我總是覺在CR中的textbox與資料庫欄位讀出來的textbox對不齊.
像種類:犬, 犬字似乎和種類:沒有平頭對齊??



最後,有一點我也不太理解的是,升級後的有些報表,在執行階段時,一直在
crv.ReportDocument.Load(reportPath)時出現 報表檔案名稱是空的錯誤訊息?雖然檔名及檔案都是正確的.
最後在這篇討論文章找到原因
只要將 ReportDocument.Load(reportPath)改成CrystalReportSource.report.file=reportPath 就OK了

報表工具應該都大同小異,熟悉就好. 不同需求各有擅長. 只要符合需求的都好啦.


vs2010 crystal report,初使用


現在接了一個用vs2005開發的既存在專案,報表的部份需要使用到crystal report.
因為想改用vs2010來開發,而且以前從未使用者這個水晶報表,所以做了以下的測試

首先是環境的建置:
因為vs2010未內建crystal report,所以要先到sap 網站去下載 最後版本,
點選SAP Crystal Reports, version for Visual Studio 2010 - Standard 下載(2012/07/29下載的版本是CRforVS_13_0_4.exe)

如要個別下載及查看release not可到 Crystal Reports for Visual Studio 2010 Updates & Runtime Downloads

安裝完畢後,打開VS2010把原先VS2005專案開啟, 過程中會詢問是否要以較版本crystal reprot進行昇級


選擇轉換方案及備份位置,按下確定
接著詢問是否升級到.net framework  4.0, 這時要按Yes, 因為要昇級為targetFramework=4.0



試著build website,發現有些參考上的錯誤
在任一個已存在的aspx網頁上,由toolbox中將Crystal Report Viewr拖進來後再刪除, web.config就會自動加入相關的assembly定義了 .如下
 <assemblies>
        <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.Controllers, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.DataDefModel, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
      </assemblies>

如果不想每個頁面註冊crystal report viewer,且統一tagname,則也可在web.config加入以下
 <pages>
      <controls>
        <add tagPrefix="CR" assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"  namespace="CrystalDecisions.Web" />       
      </controls>
    </pages>

到此,試著把原先的vs2005 + crystal report 10.*的原網站就順利昇級起來了.


2012年7月24日 星期二

Win7 64 bit Informix ODBC測試


在windows 7 64bit 安裝informix ODBC(我是安裝IBM Informix Client-SDK3.50.xC7版 32bit及64bit),幾個重點

1.配合主機DB版本若為32bit,則仍需在win7 64bit環境下安裝 32bit informix connect ,最新版本可到此網址下載

2.若想利用sql server 2008 R2 建立linked db, 因為R2是64 bit,所以win7也必需要安裝64bit informix connect .

3.自已測試了一下, 想要使用 sql server 2008 R2的Import Data 匯入資料, 這時,他又只認32 bit ODBC的設定???

4.再測試了一下, 使用sql server 2008 R2 SSIS 連結ODBC, 也是只認32 bit ODBC的設定??

5.在SSIS data flow中, 建立informix 轉換到sql server 的處理, 結果仍是一樣的超級無敵難用. 透過ADO NET Source轉換時,仍強迫你要做 unicode and non-unicode的轉換.


為什麼不能依照informix 資料庫欄位的定義來做轉換呢??
為什麼不能和sql 2000 DTS 的用法一樣呢??還我原來的odbc provider啊,我不要ADO NET Source...
為什麼我要浪費時間做型別轉換呢??
為什麼經過了2005,2008,2008R2這個鳥問題仍然存在呢??


6.安裝完ODBC後,更改Enviornment 頁籤下的isolation level 為1-Read Uncommitted後, 測試連結,出現
Test connection was NOT successful.[Informix][Informix ODBC Driver][Informix]Transaction not available.
記得先檢查informix db的log mode是否為buffer log.否則無法設定isolation mode



2012年7月17日 星期二

linq dbml IsComposable 屬性

專案是使用linq to sql建立dmbl .

某天由資料庫主機更新某幾個Stored Procedure的dmbl定義後,
某一隻程式在儲存時會呼叫到更新後的Stored Procedure. 結果一直出現下列的錯誤

找不到資料行 "dbo" 或者使用者自訂函數或彙總 "dbo.zspXXXXX",或是名稱模糊不清。

但檢查了資料庫的SP定義和dbml中的定義完全是一樣的啊,怎麼會找不到咧??

於是打開dbml檔的XXXXX.designer.cs 查看, 發現呼叫的SP和其他SP比較後,多了一個屬性的定義 IsComposable="true"如下:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.zspXXXX" , IsComposable="true")]
        public int zspXXXX([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> orgn, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> ym , [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> isAuto)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), orgn, ym, isAuto);
            return ((int)(result.ReturnValue));
        }


根據MSDN上的定義,

IsComposable 屬性 是取得或設定方法是對應至函式,還是對應至預存程序。如果是函式,則為 true,如果是預存程序,則為 false。 


看來預設是false. 


將這個屬性移除後, 重新compile, 呼叫SP就正常了.

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...