2008-12-31

QRReport 列印連續報表

因為許多的單據都是用點陣式印表機(Ex EPSON 2080C..),
且紙張都是用連續報表紙中一刀
但因為QRReport對NT的作業系統支援有點問題,無法預設Report的size,
所以既使原先的設定都正常,但列印出來仍會用格式跑掉的情況,

下面列出解決辦法:
1.於OS中的印表機和傳真畫面中點選右鍵
2.點選伺服器內容
3.建立新格式
4.根據報表紙的長寬輸入(一般為24.40cm*27.94cm)
5.格式名稱"連續報表紙"-存檔
6.將點陣式印表機設為預設
7.將印表機內的列印喜好設定裝置設定值紙張格式都設為"連續報表紙"
8.QRReport中的Page Size設定為Default,不可為Custom

2008-12-25

DBGrid中顯示Memo屬性欄位

若資料庫中欄位的資料型態設為Memo、NVarChar(MAX)....類似欄位
當欲撈取資料顯示於DBGrid中時,則該欄位皆顯示為(MEMO)

解決方法:
一、可以藉由SQL的資料型態型態轉換改變該欄位資料型態-cast
cast(column as NVarChar)

二、於Delphi中QueryField的事件作轉換-GetText
procedure TFSTK205.Query_SearchMemoGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
  inherited;
 Text := Sender.AsString;
end;

2008-12-24

查詢MS SQL Server中表格已使用空間

若要查詢Server中表格已使用空間可用下列語法
sp_spaceused TableName
若無輸入 TableName 的話,則會傳回整個資料庫的空間使用狀況

sp_spaceused Prod

2008-12-15

當Lookup Field遇上NULL

當Query 中建立Lookup的欄位,欲參照的欄位為NULL時,
則會跳出 "無法識別的錯誤" 的錯誤訊息,
此時將Query中該Lookup的欄位lookupcache屬性設為True,即可解決!

利用 SQL Convert轉換日期格式

Select CONVERT(varchar(100), GETDATE(), 0)-->05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1)-->05/16/06
Select CONVERT(varchar(100), GETDATE(), 2)-->06.05.16
Select CONVERT(varchar(100), GETDATE(), 3)-->16/05/06
Select CONVERT(varchar(100), GETDATE(), 4)-->16.05.06
Select CONVERT(varchar(100), GETDATE(), 5)-->16-05-06
Select CONVERT(varchar(100), GETDATE(), 6)-->16 05 06
Select CONVERT(varchar(100), GETDATE(), 7)-->05 16, 06
Select CONVERT(varchar(100), GETDATE(), 8)-->10:57:46
Select CONVERT(varchar(100), GETDATE(), 9)-->05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10)-->05-16-06
Select CONVERT(varchar(100), GETDATE(), 11)-->06/05/16
Select CONVERT(varchar(100), GETDATE(), 12)-->060516
Select CONVERT(varchar(100), GETDATE(), 13)-->16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14)-->10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20)-->2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21)-->2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22)-->05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23)-->2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24)-->10:57:47
Select CONVERT(varchar(100), GETDATE(), 25)-->2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100)-->05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101)-->05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102)-->2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103)-->16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104)-->16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105)-->16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106)-->16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107)-->05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108)-->10:57:49
Select CONVERT(varchar(100), GETDATE(), 109)-->05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110)-->05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111)-->2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112)-->20060516
Select CONVERT(varchar(100), GETDATE(), 113)-->16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114)-->10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120)-->2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121)-->2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126)-->2006-05-16T10:57:49.827

case when

有時候會針對不同的欄位資料,對相對應的動作,
可藉由case when來完成
case when Rule then Result (when other Rule then Result) esle Result end

select (case when Substring(ProdNo,1,1)='0' then PA
when Substring(ProdNo,1,1)='1' then VA else PA end )
from Prod

當ProdNo 第一碼為0時抓取PA欄位
當ProdNo 第一碼為1時抓取VA欄位
其餘抓取PA欄位

2008-12-10

於QRReport顯示縱向文字

基本上於QRReport中僅可顯示橫向的文字,
但有時能仍有特殊需求,需要以縱向顯示,
解決辦法如下:

--------------------範例--------------------
拉一個QRLabel,打上 "保存期限 " ,
放在報表規格內的右側中間(不要置放在任何QRBand 之內)
再來動一點手腳,讓它變成直式(因為 QRLabel的 WordWarp 對中文字沒有作用),
所以用 一般橫式字體打好後,在 QRreport畫面以滑鼠右鍵選擇 View As Text
進入 DFM 的文字編輯模式,找到"保存期限" 這個Label
改成 Caption='保'#13'存'#13'期'#13'限'#13':'#13'一'#13'年'
(註:#13就是Enter)

再轉回 View As Form即可。

參考自:Delphi.KTop

2008-12-09

清除MS交易記錄檔

方法一
backup log TableName with NO_LOG
use TableName
dbcc shrinkfile (TableName_log , truncateonly)

方法二
BACKUP LOG 資料庫名稱 WITH TRUNCATE_ONLY
DBCC SHRINKDATABASE (資料庫名稱)

解釋:
TRUNCATE_ONLY 的意思是直接刪除
SHRINKDATABASE 就是把DB使用到的硬碟空間釋放

BACKUP LOG ERPdb WITH TRUNCATE_ONLY
DBCC SHRINKDATABASE (ERPdb)

MS SQL2008已將此BACKUP語法停用!

隨機撈取資料

有時候因為作業的需求,需要隨機從Table中撈取資料,
可使用內建的 NEWID ()函式

select Top 100 *
from STK
where CorpNo='10002'
order by NEWID()

說明:抓取STK中經亂數排序的前100筆資料

2008-12-08

滑鼠滾輪滾動時移動DBGrid 中的資料列

1.建立一個新類別借以開放OnMouseWheel
type
TMyGrid = Class(TDBGrid)
Public
property OnMouseWheel; // 開放事件
End;

2.在Form1新增一個事件程序
procedure MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);

3.事件程序內容如下
procedure TForm1.MouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
If Sender Is TDBGrid Then Begin // 先判斷Sender是否為TDBGrid
If WheelDelta > 0 Then TDBGrid(Sender).Datasource.DataSet.Prior;
If wheelDelta < 0 Then TDBGrid(Sender).DataSource.DataSet.Next;
Handled := True;
End;
end;


4.最後在Form1.OnCreate事件中將上的事件程序掛上
procedure TForm1.FormCreate(Sender: TObject);
begin
// 將DBGrid_Name轉型為TMyGrid才可以指定OnMouseWheel事件
TMyGrid(DBGrid_Name).OnMouseWheel := MouseWheel ;
end;

列出資料欄位內含有中文字

有時候因為特殊的需求,需要將某些特性欄位中含有中文字段的資料列出,
則可在條件是加入 patindex('%[一-龜]%',column) > 0

--------------------範例--------------------
select ProdNo,PnameD
from Prod
where patindex('%[一-龜]%',PnameD) > 0
order by ProdNo

參考自:點部落

2008-12-07

解決MS SQL 定序不同問題

當在查詢兩個不同的Table或DB時,若是兩個表格所設定的定序不同
則無法進行join的動作!

錯誤訊息:Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "Chinese_Taiwan_Stroke_CI_AS" in the UNION operation.

解決方法:在要參照的key後加上相同的定序名稱即可解決

select S.ProdNo,P.PnameD
from STK S,Prod P
where S.ProdNo COLLATE Chinese_PRC_Stroke_CI_AS = P.ProdNo COLLATE Chinese_PRC_Stroke_CI_AS


創建表格時也可一併設定定序,如下:
if (select OBJECT_ID('tempdb..#ExpandRubBOMD')) IS NOT NULL Drop Table #ExpandRubBOMD
CREATE TABLE #ExpandRubBOMD(
[MixRubNo] [varchar](5) collate Chinese_PRC_Stroke_CI_AS NOT NULL,
[ProdNo] [varchar](16) collate Chinese_PRC_Stroke_CI_AS NOT NULL,
[Wgt] [varchar](30) collate Chinese_PRC_Stroke_CI_AS NULL CONSTRAINT [DF_ExpandRubBOMD_Wgt_Dean] DEFAULT ((0)) )

2008-12-06

使用CAST 或 CONVERT 轉換資料型態

使用 CAST:
CAST ( expression AS data_type )

使用 CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

select cast(AAA as int) from ABCD
select convert(int,AAA) from ABCD