Oracle EBS 提供多種報表的開發(fā)和輸出形式,由于MS Excel在處理數(shù)據(jù)方面的優(yōu)勢明顯,報表輸出用Excel打開是很常見的開發(fā)項。
但是正是由于Excel的“過于智能而不智能”,導(dǎo)致有時輸出字段會被Excel自動處理,導(dǎo)致數(shù)據(jù)錯誤。
例如: 系統(tǒng)內(nèi)部字段,物料編碼/訂單標(biāo)號 等等字段在數(shù)據(jù)庫內(nèi)存儲的格式為 varchar, 在某些業(yè)務(wù)或者需求下,編碼方式為全數(shù)字的形式,如"100230001","100230002",... 這樣的字段在系統(tǒng)中沒問題,報表輸出到Excel也無問題;而有情況可能是,編號為 "000031001", "000031002","000031003",.... 這樣的情況,系統(tǒng)中是存儲了9位數(shù)的字符,而報表輸出到Excel之后,Excel就會認(rèn)為他是一個數(shù)字,而非字符串,從而出現(xiàn)字符串前的"0"被截取,變成 "31001", "31002","31003",.... 這樣的錯誤不易被發(fā)覺,但是是一個很不友好的錯誤。
解決辦法:
1. 并發(fā)程序輸出 html 報表
這種類型的報表輸出的是html標(biāo)簽(或者XML標(biāo)簽),這種報表被截位的修復(fù)方法是在輸出的時候,把這個字段放在 =" " 內(nèi),例如,PLSQL代碼片段為:
fnd_file.put_line(fnd_file.output, '<div>000031001</div>');
變成:
fnd_file.put_line(fnd_file.output, '<div>="000031001"</div>');
或者
fnd_file.put_line(fnd_file.output, '<div>''000031001</div>');
解釋:
前一種方法,在Excel中,= 代表公式,而用雙引號括起來之后就是字符串的意思,就是說設(shè)置當(dāng)前單元格為等于當(dāng)前的值轉(zhuǎn)換為字符串的意思,類似于 oracle的 to_char() ;后一種方法,Excel中,在單元格值最前面加一個單引號表示這個單元格為“壞公式”,就是不自動計算的意思,Excel單元格要顯示公式,也是這種方法。
2. XML Publisher 報表
XML publisher 報表除了用上面的兩種方法以外,還可以設(shè)置XML Publisher屬性來解決這個問題,直接看屬性截圖:
屬性設(shè)置為 “強制LTR” ,強制為數(shù)據(jù)格式,在Excel中就不會轉(zhuǎn)化為數(shù)字了,對應(yīng)的 XML publisher 腳本代碼為:
<fo:bidi-override direction="ltr" unicode-bidi="bidi-override"><?ASSEMBLY?></fo:bidi-override>