2011年2月21日 星期一

[.NET]CrystalReport中動態載入外部圖片(Code39為例)


Code39 產出的BarCode 一般都為Bitmap的物件
CrystalReport 中產生動態圖片我紀錄我實做過的兩種方法

第一種方式:使用圖片位置的來源路徑
這種方式只要指定你的URL路徑就可以了,Code39 程式碼會Retrun Jpeg的格式。
這個Jpeg直接在Code39 程式產生Bitmap後,在馬上轉成Jpeg
直接回傳,這樣就可以直接顯示圖片。

   Sample Code :
   Bitmap oBmp;
   oBmp = GetCode39(Request.QueryString["id3"]);
   oBmp.Save(Response.OutputStream, ImageFormat.Jpeg);




第二種方式:使用DataSet動態Loading

將Bitmap轉成Byte變數塞入DataSet中,利用CrystalReport 加入此變數。
其中比較要注意的有:
1. CR中的變數要為BLOB變數,DataSet 變數設定為Base64Binary or Byte
2. objDTbe.Columns.Add(strColumnName[i],System.Type.GetType("System.Byte[]"));
3.CR中圖片可以設定成「自動調整大小」比較好看一點(以BarCode為例的話)

Sample Code :
 //組成要傳給CR的DataSet
   DataSet objDs = new DataSet();
   DataTable objDTbe=new DataTable("ENTprintTable");
   string[] strColumnName={"BILL_ID","SEND_DEP","SEND_EMP","REC_DEP","REC_EMP","REC_ZIP","REC_BASE","GOOD_MEMO","MEMO","IMG","CREATE_DATE"};
   for(int i=0;i<strColumnName.Length;i++)
   {
    if (i == 9)
     objDTbe.Columns.Add(strColumnName[i],System.Type.GetType("System.Byte[]"));
    else
     objDTbe.Columns.Add(strColumnName[i]);
   }

   //Produce Bar Code's Byte Type
   Code39Hander BarCode = new Code39Hander();
   Bitmap oBmp =  BarCode.GetCode39("A0000000001");
   MemoryStream MyMS = new MemoryStream();
   oBmp.Save(MyMS, System.Drawing.Imaging.ImageFormat.Jpeg);
  
 //新增資料
   DataRow objDRow=objDTbe.NewRow();
   objDRow[0] = "A1000000001";
   objDRow[1] = "總部-人力資源TEAM";
   objDRow[2] = "1011-吳小劫";
   objDRow[3] = "南港營業所";
   objDRow[4] = "3712-怡靜";
   objDRow[5] = "11011";
   objDRow[6] = "五堵BASE";
   objDRow[7] = "營業所薪資條";
   objDRow[8] = "收到後請回饋SD";
   objDRow[9] = MyMS.ToArray();
   objDRow[10] = DateTime.Now.ToString("yyyy/MM/dd");
   objDTbe.Rows.Add(objDRow);
   MyMS.Close();




2011年2月17日 星期四

[.NET]如何實做CrystalReport於Web網頁

方便給第一次設計CR於網頁中的人參考使用。

CR版本:CR XI

1. 開啟.Net 2003 建立XST (DATASET)
提供給CR 作為資料來源使用。裡面元素就是到時候要放到報表中的參數。










2. 開啟.Net 2003  建立 RPT
點選專案右鍵,加入新項目,選擇CrystalReport。
(建立完成後,可使用CR XI軟體來編輯會比較輕鬆)
建立新報表時可透過精靈協助建立,Step By Step 依序往下建立,
如果需要群組的需求時,記得選擇群組加入。
[標準報表精靈]-->[目前的連結]-->[選擇1.新建立的DataSet]-->[選擇要加入的欄位資料]-->
[選擇群組欄位]-->[完成]


*加入Crystal Report rpt










*資料來源設定


















3. 撰寫顯示報表程式碼

 先在aspx中拉一個CrystalReportViewer1元件,作為報表顯示的元件。接下來程式碼範例如下:

   //組成要傳給CR的DataSet
   DataSet objDs = new DataSet();
   DataTable objDTbe=new DataTable("ENTprintTable");
   string[] strColumnName={"BILL_ID","SEND_DEP","SEND_EMPID","SEND_EMPNAME","REC_DEP","REC_EMPID","REC_EMPNAME","REC_ZIP","REC_BASE","GOOD_MEMO","MEMO","CREATE_DATE"};
   for(int i=0;i<strColumnName.Length;i++)
    objDTbe.Columns.Add(strColumnName[i]);


   //新增資料
   DataRow objDRow=objDTbe.NewRow();
   objDRow[0] = "A1000000001";
   objDRow[1] = "總部-人力資源TEAM";
   objDRow[2] = "1011-吳小劫";
   objDRow[3] = "";
   objDRow[4] = "營業所";
   objDRow[5] = "3712-怡靜";
   objDRow[6] = "";
   objDRow[7] = "11011";
   objDRow[8] = "彰化BASE";
   objDRow[9] = "營業所薪資條";
   objDRow[10] = "收到後請回饋SD";
   objDRow[11] = DateTime.Now.ToString("yyyy/MM/dd");

   //新資料加入DataTable
   objDTbe.Rows.Add(objDRow);
   objDs.Tables.Clear();
   objDs.Tables.Add(objDTbe);
 
   try
   {
    objRpt1.SetDataSource(objDs);   //將DataSet 指定給CR來源端
    //Session["reportDocument"] = objRpt1;
    objRpt1.Refresh();
    CrystalReportViewer1.ReportSource = objRpt1;  //CR報表顯示元件
   }
   catch(Exception ex)
   {
    objDs.Dispose();
    throw ex;
   }
   objDs.Dispose();


4. 記得DataTable名稱要與1.所設計的DataSet要一樣。
5. DataTable欄位名稱也要一樣。
6. 有設計群組的話,Sample畫面如下:

2011年2月9日 星期三

[SQL]查詢及去除換行符號

SQL 2000 在資料表新增資料時若用Copy-Paste會產生資料有換行或Enter符號的風險。
這讓折騰了我ㄧ陣子,或許客戶反應查不到某筆資料,
但進入資料庫查看確有此筆資料,
但有匯出資料功能匯出,一看:都是斷行符號,
難怪客戶查不到資料。


欣賞一下Copy-Paste吧!滿有創意的。



SQL 查詢 換行符號
where id like '%'+char(10)+'%'

CHAR 可用於將控制字符插入字符串中。下表顯示了一些常用的控制字符。
控制鍵 值
Tab: CHAR(9)
換行: CHAR(10)
ENTER: CHAR(13)

Ex:
SELECT * FROM TABLE_NAME
WHERE 1=1 AND COLUMN_NAME LIKE '%'+CHAR(13)+'%'

update base_mapping set basename = replace(basename,Char(10),'')
update base_mapping set basename = replace(basename,Char(13),'')