2011年7月27日 星期三

oracle 紀錄 login session

http://www.runpc.com.tw/content/content.aspx?id=106824

2011年7月25日 星期一

用CSV 分隔字元當格式當EDI交換檔案的注意事項

1. CSV 基本上每種程式語言幾乎都有物件直接支持這種格式的轉換, 或是一般grid 物件都會有這種格式支持, 請盡量使用物件去產生,不要自己組字串, 因為CSV 不是只有單純用逗號分開而已, 還有很多特殊狀況要處理, 例如資料本身有逗號, 雙引號, 等….
2. 換行字元也是CSV 要處理的問題之一, 一定要確認不能在產生的資料中有換行字元
3. 一樣不能處理Binary 字元
4. CSV 也像txt 一般, 需要確認檔案編碼格式 ( UTF-8 or ansi)

用TXT 固定位置的格式當EDI交換檔案的注意事項

1. 中文, 雙字元絕對是這種格式的致命傷, 測試溝通時一定要參入雙字元去測試,因為不同開發平台在計算單字元字串長度和雙字元字串長度實是可能會結果不同的, 一定要注意計算字串長度的計算方式雙方有共識
2. 換行字元處理, 用固定長度格式即表示不支持換行字元, 所有字串都要處理掉換行字元
3. 檔案編碼, 用txt 做資料交換的大部分都是早期開發的規格, 9 成9都是用ansi ,但不是必然的, 這點也是要注意到
4. 不能交換BINARY 格式檔案, 應該也沒人這麼離譜把Binary 字元塞在txt 檔中交換

用XML 當交換格式的時候須注意的

1. 雙方編碼格式要一致, 這行 在xml 中雖然可以省略, 但是如果拿XML來做資料交換時, 這行就不能省略, 不然xml 解析器會用預設語系解析, 遇到有中文或是其他unicode 的時候就會錯誤
2. 特殊字元處理 , 所以字串欄位都需要先通過特殊字元處理

< 小於
<
> 大於 >
&   &
' 單引號 '
" 雙引號 "


3. Xml 中特殊欄位 CDATA , 在這中間的文字是xml 解析器不處理的, 換句話說, 這欄位中的資料不用經過上面說的特殊字元處理, 這適合拿來交換大文字字串用, 因為用browser 開啟資料觀看時, 這部分資料的換行字元會顯示在畫面上, 相對的, 如果是用一般tag 處理的文字字串, 換行字元在browser 上顯示不出來, 但要注意用CDATA 也不是沒風險的, 如果資料內容包含 ]]> 就會錯誤了
4. 不要試圖交換binary 型別的資料, 如果一定要換這種資料, 那收/送雙方約定好用base64 decode/encode 編碼是一種處理方式
5. Xml 組好後要用browser 檢查過 , 看是否能正確顯示, 並用notepad 開啟另存新檔檢查看看編碼是否正確(是UTF-8 or ANSI)
6. 用notepad 另存UTF-8新檔產生的UTF-8 檔案, 和用程式直接產生的前面會多3碼檔案控制碼, “EF BB BF” ,這檔案控制碼在notepad 中看不到, browser 中也看不到, 用ultraEdit 以binary 型式顯示時才會發現, 做EDI 的雙方溝通debug 時一定要注意這件事, 不然有可能會出現大家都找不到錯誤的狀況, 這檔案控制碼不同編碼寫法不一樣,我只舉UTF-8 為例
7. XML 解析器共同的問題就是  大型檔案, 這邊說的大型檔案指 4mb 以上的檔案, 大部分解析器效率隨檔案大小以幾何級數曲線上升, 很多解析器到4mb 已經變很慢了, 有些甚至乾脆不支援4mb 以上的, 這點要注意, 解決方法也很簡單, 自己寫解析器把檔案拆小就可以, 因為這麼大的檔案, 通常是系統組成的, 有固定規律可拆

2011年7月22日 星期五

關於用FTP當EDI通訊工具時的注意事項

1. 交換檔案備份, 不論收或是送, 在檔案交換的時候一定要留一個備份檔, 尤其當FTP主機端是在我們掌控的時候一定要要求產生或接收後把檔案放到\BAK 路徑下, 由於FTP 在大量檔案堆在同一路徑時會造成反應很慢的問題, 所以備份檔案最好能按年月放到特定資料夾下, 這樣在EDI測試的過程或是後續追查問題的時後對雙方而言都有很大的方便性


2. 因為FTP上檔案搬來搬去會看不出來檔案產生的時間, FTP檔名在制定時最好加入時間註記, 例如 OE_OEHKS11070735_20110707153618.xml


3. FTP 檔案傳送過程有可能會和對方接收讀取檔案時間交會的話, 要注意避免讀到不完全檔案的問題, 由於檔案上傳時, 一旦開始上傳,主機端就會產生檔案, 這時剛好主機端開始接收檔案時就會讀取到空檔 .這種問題兩個簡單的解決方案, 一是錯開讀取與上傳的時間, 如果上傳時間為不特定的話, 就要採取另一個方案...產生ack 檔 , 也就是讀取指示檔
例如
OE_OEHKS11070735_20110707153618.txt 45k
OE_OEHKS11070735_20110707153618.ack 0k
這種ack檔放個空檔就可以, 對讀取檔案的程式而言, 看到ack 檔才表示這個檔案已經傳送完成可以讀取

這問題一定要注意, 不然就等於一個不定時炸彈, 不知何時就會跑出奇怪的錯誤

2011年7月21日 星期四

程式結合excel 樞紐分析

要利用Excel 樞紐分析及樞紐分析圖的工具來接到數據可以用Excel 外接資料功能, 可以建立一個excel 樞紐分析, 但是資料來源是外部資料, 外部資料可以有機種模式 txt , excel , DB , XML ...等, excel 引用時有許多的選項, 但是我沒試出txt , xml 要如何使用因為不知怎樣的格式可以符合, 而且我希望可以直接利用cxGrid 元件匯出功能,就直接接到excel 報表, 所以採用外部資料是另一個excel 檔案的方式, 將來或許可以測試轉出為資料庫(access)的方式,這也許也是個不錯的選擇

外部資料為excel 具體方式如下, 先建立一個要分析資料用的excel A 當做資料來源, 然後建立另外一個excel B 做樞紐分析圖表, 只不過B 的資料來源是引用A, 再來的部分就比較簡單了, 利用程式把要被分析的資料匯出成A , 然後程式直接呼叫excel B 開啟就可以看到樞紐分析圖表了

沒錯,說起來挺快的, 不過這中間還有幾個問題要處理

首先, 當 B 被開啟時並不會刷新從A讀取的資料, 而是顯示最後一次使用的資料, 所以需要一個刷新資料的方式, 很顯然需要在excel 開啟的同時去執行"重新整理"這個按鈕, 這裡我想到的解決方式是用巨集去執行"重新整理"這個按鈕, 但是巨集如何在開啟時更新呢? 很簡單,只要把巨集命名為Auto_Open, 這個巨集便會在開啟時自動執行.

其次, 解決了excel B 的問題後, 還有A的問題, 由於A的資料室是每次都要重新匯出的, 匯出最快就是把A 砍掉在重新匯出另一個A, 但是由於B裡面引用資料路徑是固定寫在excel B 裡面的, 所以檔A的名稱和路徑是不能隨意變的, 這會導致同一個時間只能有一個A 存在, 也就是不能同時開啟兩個圖表B, 這目前並沒測出好的解決方式, 只能暫時這樣處理

最後,版本和自動巨集EXCEL安全性問題, 由於自動巨集需要安全性確認, 所以第一次執行時會跳出詢問訊息, 這是excel 安全管理, 這也是沒辦法的事

關於這套做法好處是, 用excel 樞紐分析當圖表工具是成本最低的, 不但很多人會製作和使用, 製作的速度也挺快的,基本上幾分鐘就能做出一個分析圖表, 隨著excel 版本不斷更新,樞紐分析圖表工具也越來越人性化, 功能越來越強大, 能夠借這工具力氣來做資料分析而不用自己去開發圖表, 感覺實在太好了

2011年7月11日 星期一

oracle date format

SYSDATE
2 --◎ 可得到目前系統的時間
3
4 ex.
5 select sysdate from dual;
6
7 sysdate
8 ----------
9 20-SEP-07
10
11 常用之日期格式
12
13 日期格式 說明
14 ------------------------------------------------------------------------
15 YYYY/MM/DD -- 年/月/日
16 YYYY -- 年(4位)
17 YYY -- 年(3位)
18 YY -- 年(2位)
19 MM -- 月份
20 DD -- 日期
21 D -- 星期
22 -- 星期日 = 1 星期一 = 2 星期二 = 3
23 -- 星期三 = 4 星期四 = 5 星期五 = 6 星期六 = 7
24
25 DDD -- 一年之第幾天
26 WW -- 一年之第幾週
27 W -- 一月之第幾週
28 YYYY/MM/DD HH24:MI:SS -- 年/月/日 時(24小時制):分:秒
29 YYYY/MM/DD HH:MI:SS -- 年/月/日 時(非24小時制):分:秒
30 J -- Julian day,Bc 4712/01/01 為1
31 RR/MM/DD -- 公元2000問題
32             -- 00-49 = 下世紀;50-99 = 本世紀
33 ex.
34 select to_char(sysdate,'YYYY/MM/DD') FROM DUAL; -- 2007/09/20
35 select to_char(sysdate,'YYYY') FROM DUAL; -- 2007
36 select to_char(sysdate,'YYY') FROM DUAL; -- 007
37 select to_char(sysdate,'YY') FROM DUAL; -- 07
38 select to_char(sysdate,'MM') FROM DUAL; -- 09
39 select to_char(sysdate,'DD') FROM DUAL; -- 20
40 select to_char(sysdate,'D') FROM DUAL; -- 5
41 select to_char(sysdate,'DDD') FROM DUAL; -- 263
42 select to_char(sysdate,'WW') FROM DUAL; -- 38
43 select to_char(sysdate,'W') FROM DUAL; -- 3
44 select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') FROM DUAL; -- 2007/09/20 15:24:13
45 select to_char(sysdate,'YYYY/MM/DD HH:MI:SS') FROM DUAL; -- 2007/09/20 03:25:23
46 select to_char(sysdate,'J') FROM DUAL; -- 2454364
47 select to_char(sysdate,'RR/MM/DD') FROM DUAL; -- 07/09/20