2014年8月19日 星期二

Crystal Report-小筆記

純筆記小東西~
外國的東西中文版通常會更難用~都是因為那個奇怪的翻譯Orz...
在google的時後也會造成困難~因為都看不懂他們是在說那個Orz...

###群組,日期
群組就新增群組應該沒什麼問題~但是若是該欄位為日期時要注意...
它group by 的項目default是周...(為什麼是周阿阿阿阿阿阿~超故意)
要記得去改他,一般最常用應該是日,月,年才是~

###打SQL的地方
資料庫專家(這翻譯一看就超不專業的~)--> 命令(右鍵修改)
--> 修改命令視窗

左邊區塊就是打SQL的,照規定打就好沒啥問題~
重點在右邊~ ~若左邊有where條件的話,通常都會有一堆$變數傳入的地方~~
傳入的變數"一定"要在右邊"建立"一個與變數一模一樣的項目~才能真正的傳值進去...

確定後~如果沒啥問題~就會跳出變數資訊輸入值給你填(就算沒報錯,也不一定表示一定對,只是有過語法而已)~記得這個與報表設計右下的"欄位總管"的參數是迷有關係的!!雖然,在資料庫建完右邊參數後,欄位總管會出現看起來一樣的東西,但是用途是不一樣的!!
我猜是把輸入DB的參數再代入一般變數到ap(reprot)裡使用,這邊已經是後段了,與DB的條件內容輸入無關~改"欄位總管"的項目是不會改變DB的查詢條件的!!

###撰寫function(公式)
其實很簡單的~右鍵新增或隨便找個東西編輯修改~
就會跳出"公式工作區-公式編輯器",重點在於中間與右上方default會有"報表欄位"、"函式"、"運算子"。樹狀點開後~可以直接把該項目用滑鼠拖拉到下方的打字編輯區,就會帶出該項的template!

對於拉變數欄位還蠻方便的~不用去記,因為欄位/參數/公式會全在 "報表欄位"裡~
而函式這東西就是讓你看看有沒有什麼可以用的...找不到就是沒有就對了!早點死心Orz...
運算子也還算實用~實用的原因是~它的語法真的太奇怪了阿阿阿~~不知道是那位天才想出來的,很奇怪的function概念~

在我目前的感覺上~嗯一"一a...因為偶又沒看過書,沒上過課,直接當沒說明書的遊戲在打王...就~
以var變數上來說,定義時不要給init值,當有要用到時,沒值他會自己起一個default值(總之要用的時後不會是null啦~)
function裡,其實他理論上像是 string xxxx(), int xxxx()的那種樣子,會要求你一定要給回傳值讓他顯示在頁面上~但是也沒有return的寫法,就是...只要隨便用個變數給個值~或是給它個純字串純數字~他最後就會把最後的那個值顯示在報表上~只能說"天才"Orz...

###數字轉文字時加三位一撇~
ToText( cnt ,'##,###,###,##0', 0);

###判別null...在crystal report內沒有null這種東西,是用預設值在看的~
http://stackoverflow.com/questions/18691542/how-to-check-for-null-condition-on-shared-variable-in-crystal-reports

Number: 0
Currency: $0
String: "" //The empty string
Date: Date(0,0,0) //The null date value
Time: None or null //The isnull() function won't work
Datetime: None or null //The isnull() function won't work

所以以日期舉例來看為~
if  ({命令.MAX_DATE} <> Date(0,0,0)) then
    ToText ({命令.MIN_DATE},'yyyy-MM-dd')
else
    ''

### 日期轉民國年
(其實,後來發現內建的"欄位格式",就可以改成民國年format了,不過要是資料源是字串,還是得自己處理)
if  ({命令.MIN_DATE} <> Date(0,0,0) And {命令.MAX_DATE} <> Date(0,0,0)) then
   ToText(ToNumber(Year ({命令.MIN_DATE}))-1911,'####')+'.'
    +(Mid(ToText ({命令.MIN_DATE},'yyyy.MM.dd'), 6,5))
    +' ~ '
    +ToText(ToNumber(Year ({命令.MAX_DATE}))-1911,'####')+'.'
    +(Mid(ToText ({命令.MAX_DATE},'yyyy.MM.dd'), 6,5))
else
    ''
### 動態where 時間區間,若原值可能有null,用IFNULL,default 起迄可以用Date的最大值或最小值~或是實務上的時間。動態數字,原理一樣(處理<=, >=)
....
and IFNULL(CREATE_DATE,'1800-01-01') >= CASE
      WHEN '{?CREATE_DATE_START}' != '' THEN '{?CREATE_DATE_START}'
      ELSE '1800-01-01' 
END
...

### 動態where string(處理=)
....
and TYPE = CASE
      WHEN '{?TYPE}' != '' THEN '{?TYPE}'
      ELSE TYPE
END
...

### 設計軟體的XLS對齊....
一般如果只是拉固定頁面排版或是純文字的話, 應該是沒什麼好講的...
但是如果是要拉成像XLS那種格子的話....就...

因為crystal report並沒有提供table類型的排版,所以就是用框線(口)加上直線(一|)這種東西組合出來Orz...

表頭基本上就是外面一個大框(口),加上豎線(|)。如果表頭多列的話就再加橫(一)畫出來,做成最上面的區段(表頭或是群組的區段)。

資料的話,就是在細目畫出左下右框線(|_|),上框線要空的,因為表頭或前一列會提供上框線...

相連的區段,可以用區段調整,把區段的空隙消除,就會黏在一起了~

PS: 後來發現如果用大框(口)其實也可以接成xls的樣子,但是有個前提是,大框的左右兩邊必須都是對齊的狀態,在看預覽時,就會發現有對齊的格子跟沒對齊的格子畫法不一樣O_oa...
然後實際上跑的時候,橫線有時會黏在一起,有時不會,真的超級Orz...
接著試出最後一招....在區段,右鍵「排列各行」。接著就會在邊邊出現對齊用的小三角形(然後版通常會亂一下),開始拉小三角形到定點,還有調最底下的那個往上(通常那個就是指大框(口)的底)...接著最後調整區段清掉空白(調整區段後,應該還要可以看到最底下的小三角形...就是要把那個拉比區段高一點點)...然後T__T他終於會把線黏在一起了~不過...是會比較粗啦~但至少不會空在那裡更怪~_~|||....

然後常會碰到很機車的,在那邊打XY,長度寬度怎麼打數字都會故意亂跳,自以為很聰明但是全都不對!...按左右移格的位置還都很奇怪(就是為了那0.01...)
這時候就到工具列"檔案"--> "選項" 裡,貼齊格線的勾拿掉...
http://stackoverflow.com/questions/17529383/crystal-reports-object-size-and-position-not-working
接下來後,就可以用滑鼠拖拉對齊了,但是再怎麼打數字就完全不鳥你(管你打20, 30聞風不動,一切靠200%+滑鼠...)....雖然很難用,但是這個方法至少讓我可以移動傳說中的0.01位置...

### 設計軟體字被裁切
這個可能是pdf版本所延伸出來的問題,然後中文字又喜歡長得特別胖,很容易看軟體美美的,等產出後整個走經=3=...

所以就是一開始的文字高度一定要定高出來多點,如果外框剛剛好,一定會被切到底部...
然後目前Browser看到的樣子,與另存新檔開出來的樣子也會有差別(聽說連螢幕解析度也有影響)...
如果user很龜毛的話(user通常也不懂資訊,能有個能說嘴的通常都龜毛的跟什麼一樣...)
最好還是乖乖的依實用案例量身打造囉~

沒有留言: