2011-12-25

SQL資料列(分組)流水編號

若要將抓取的資料自動編上流水編號,
可以利用ROW_NUMBER 函式,達到需求!

ROW_NUMBER() OVER (partition by field order by field)
--流水編
select SN=ROW_NUMBER() OVER(order by DTNo),GPNa,DTNo,DTNa
from NOM
where GPNo ='BDT'
----------
1    外胎不良原因    01    含唇
2    外胎不良原因    02    軟唇
3    外胎不良原因    03    胎唇裂痕

--分組流水編
select SN=ROW_NUMBER() OVER(partition by GPNa order by DTNo),GPNa,DTNo,DTNa
from NOM
where GPNo in ('BDT','BID')
----------
1    外胎不良原因    01    含唇
2    外胎不良原因    02    軟唇
3    外胎不良原因    03    胎唇裂痕
1    內胎不良原因    01    嘴邊漏風
2    內胎不良原因    02    嘴邊薄料
3    內胎不良原因    03    嘴邊裂痕
參考自:MSDN-ROW_NUMBER

2011-12-20

SQL自動補0

某些欄位依照資料流水編號紀錄,
如果預設的資料型態為數值型態,
則以1、2、3的形式紀錄,
若希望以001、002、003的方式表達,

可利用REPLICATE函數指定重複字串次數的功能達到需求,
REPLICATE(欲重複字串,欲重複次數)
--若為數字型態欄位需先轉為字串型態
select REPLICATE('0',(3-LEN(欄位)))+欄位
from TableName

select REPLICATE('0',(4-LEN(CONVERT(varchar(3),1))))+
        CONVERT(varchar(3),1)
-------------------------------------------------
001

select REPLICATE('0', (4-LEN(CONVERT(Varchar(4),ROW_NUMBER()
          OVER(Order by M.ProdNo)))))+
          CONVERT(Varchar(4),ROW_NUMBER() OVER(Order by M.ProdNo)),M.ProdNo
from MATCost_tmp M
-------------------------------------------------
0001    R11010002
0002    R11010003
0003    R11020001
參考自:MSDN-REPLICATE The Will Will Web

2011-12-07

QuickReport 群組頁次

在Delphi彙整資料以QuickReport輸出時,
針對頁次與總頁數可以很簡單的列印上去,
在使用GroupBand時若要依據群組顯示頁次,如
1/1
------
1/2
2/2
------
可使用下面的方式來達到需求!
//**宣告全域變數
private
    xPage : Integer;
    xIONo : String;
    xRecIONo : String;

//**在PageHeader的BeforePrint寫入計算規則
procedure TQR.PageHeaderBandBeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
var xPos,xLen : Integer;
      xStr : String;
begin
  //**Query_Item 為QR的DataSet
  if xIONo <> Query_Item.fieldbyname('IONo').AsString then
  begin
    //**"單號-總頁數" 兩群組記錄間以","分開
    if xIONo <> '' then
      xRecIONo := xRecIONo+','+xIONo+'-'+IntToStr(xPage);

    xPage := 0;//**頁次歸0
    xIONo := Query_Item.fieldbyname('IONo').AsString;
  end;

  INC(xPage);//**累加頁次
  QRL_SubPage.Caption := IntToStr(xPage);//**群組頁次

  if AnsiContainsStr(xRecIONo,xIONo) then//**產生preview前不需判斷
  begin
    //**"單號-總頁數"
    xStr := xRecIONo;
    xPos := Pos(xIONo,xStr);
    xLen := Length(xStr);

    //**拆單號-群祖頁數
    xStr := Copy(xStr,xPos+1,xLen-xPos);
    xPos := Pos(',',xStr);
    xStr := Copy(xStr,0,xPos-1);

    //**拆頁數
    xPos := Pos('-',xStr);
    xLen := Length(xStr);
    xStr := Copy(xStr,xPos+1,xLen);

    QRL_GroupPage.Caption := xStr;//**群組頁數
  end;
end;

//**在DataSet的EndOfRecordset寫入資料行結尾處理
procedure TQR.Query_ItemEndOfRecordset(DataSet: TCustomADODataSet;
  var MoreData: WordBool; var EventStatus: TEventStatus);
begin
  //**
  //**"單號-總頁數" 兩群組記錄間以","分開
  if xIONo <> '' then
    xRecIONo := xRecIONo+','+xIONo+'-'+IntToStr(xPage);

  xPage := 0;//**頁次歸0
  xIONo := '';
end;

2011-12-03

Delphi 7 在 Win7 無法使用 help

因Win7預設無法開啟.hlp的檔案,
故在Delphi中要開啟help檔案查詢資料會出現錯誤的行況,
只要安裝官方WinHlp32.exe的更新檔即可!
適用於 Windows 7 的 Windows 說明程式 (WinHlp32.exe)

2011-10-25

控制 Hint 顯示時間

在Delphi中若想要讓原件的Hint顯示久一點的話,
可以透過參數設定修改!

Application.HintHidePause := 5000;//**顯示時間 單位為毫秒,即5秒

其他參數
Application.HintPause//**延遲時間
Application.HintColor//**顏色

以上可在Form Create時設定即可!

2011-10-21

Win7下使用Delphi7

當在Win7下面安裝完Delphi執行時會出現檔案無法異動的錯誤訊息,
這是因為資料夾檔案權限問題,修改下述目錄權限即可!

1.修改 C:\Program Files\Borland\Delphi7\Bin 目錄權限,安全性中新增users有modify權限
2.修改 C:\Program Files\Borland\Delphi7\Projects 目錄權限,安全性中新增users有modify權限

2011-08-11

Delphi利用ADOQuery直接讀取Excel內容

在ADOQuery的ConnectionString設定
Provider=Microsoft.Jet.OLEDB.4.0;Data Source='檔案路徑';
Extended Properties=Excel 8.0;Persist Security Info=False';

SQL輸入 select * from [Sheet1$]
<分頁名稱一定要用[]包起來>

ADOQuery Open後Excel的第一欄會變成FieldName,
下面的開始才是明細資料

使用完畢記得將ADOQuery Free掉,避免Excel檔案被鎖定無法正常開啟

2011-07-13

Firefox 設定暫存檔放至RamDisk

將瀏覽的暫存檔放至RamDisk中,可加快瀏覽的速度

about:config
browser.cache.disk.parent_directory-->X:\
重新開啟Firefox即可

註:x:\為RamDisk的位置

2011-07-12

firefox 4、firefox 5 使用 MacType 破字

因firefox 4、firefox 5版本內建開啟GPU功能,
雖然可以加快圖形的運算降低CP使用率,
但是如果有使用MacType美化字形,
會發現有破字的情況發生,
在config內修改下述參數即可正常顯示!

about:config
gfx.direct2d.disabled-->True
gfx.font_rendering.directwrite.enabled-->False
mozilla.widget.render-mode-->0

設定完畢重新開啟Firefox即可!

2011-05-20

Win7 關閉休眠功能

使用系統管理員身分開啟命令提示字元

關閉休眠 powercfg -h off
啟動休眠 powercfg -h on

Win7 啟用Administrator帳號

使用系統管理員身分開啟命令提示字元
啟用Administrator帳號 net user administrator /active:yes

設定密碼 net user administrator password
停用帳戶 net user administrator /active:no

Delphi 求商數、餘數

求商數 10 DIV 3 = 3
求餘數 10 MOD 3 = 1

2011-05-19

update 使用 case when

更新資料時若需經過case when給對應的值,
下列範例可達到要求。
update HBSpecM set PURWgt=(case when PUR.QtyCH is NULL then 0 else PUR.QtyCH end)
from HBSpecM HBM left join
	(select D.BookNum,HBM.ProdNo,QtyCH=SUM(QtyCH)
	from PUR510D D left join HBMatAnti HBM on D.CorpNo=HBM.CorpNo and D.ProdNo=HBM.AntiProdNo
	where D.CorpNo='20001'
	group by D.BookNum,HBM.ProdNo) PUR on HBM.BookNum=PUR.BookNum and HBM.ProdNo=PUR.ProdNo
where HBM.CorpNo='20001'

update 使用 left join

更新資料時若參照的資料需外部合併,
下列範例可達到要求。
update HBSpecM set PURWgt=PUR.QtyCH
from HBSpecM HBM left join
    (select D.BookNum,HBM.ProdNo,QtyCH=SUM(QtyCH)
        from PUR510D D left join HBMatAnti HBM on D.CorpNo=HBM.CorpNo and D.ProdNo=HBM.AntiProdNo
        where D.CorpNo='20001'
        group by D.BookNum,HBM.ProdNo) PUR on HBM.BookNum=PUR.BookNum and HBM.ProdNo=PUR.ProdNo
where HBM.CorpNo='20001' 

2011-01-26

MS AD-超過這個網域允許建立的電腦帳戶數目

AD預設可管理的電腦數為10台,
當欲管理電腦數目超過時,可利用下數方式修改。
1.執行 輸入Adsiedit.msc叫出ADSI編輯器
2.點選 執行--連線到 確定
3.展開樹系會看到DC=XXX,DC=XXX
4.按右鍵內容
5.尋找ms-DS-MachineAccountQuota
6.將數值從10修改為需要管理的台數

參考自:Mircosoft技術支援

2011-01-19

T-SQL-master..spt_values應用

在系統中查詢 master..spt_values 這個表並僅顯示number欄位,
會回傳 0~2047的流水編號,當需要產生一些流水編的數值時,
可利用此回傳特性,應用到我們需要的特定資料格式。
select number
from master..spt_values
where type='p'

number
-----------
0
1
2
...

(2048 個資料列受到影響)
--產生期別
select '2011'+REPLICATE(0,2-LEN(cast(number as varchar(2))))+cast(number as varchar(2))
from master..spt_values
where type='p'
and number between 1 and 12

-------
201101
201102
201103
201104
201105
201106
201107
201108
201109
201110
201111
201112

(12 個資料列受到影響)
--產生日期區間-1
select convert(varchar(10),dateadd(dd,number+1,'2011-01-01'),120)
from master..spt_values
where type='p' and number < datediff(dd,'2011-01-01','2011-01-10')-1

----------
2011-01-02
2011-01-03
2011-01-04
2011-01-05
2011-01-06
2011-01-07
2011-01-08
2011-01-09

(8 個資料列受到影響)
--產生日期區間-2
select convert(varchar(10),dateadd(dd,number+1,'2010-12-31'),120)
from master..spt_values
where type='p' and number < 31

----------
2011-01-01
2011-01-02
2011-01-03
2011-01-04
2011-01-05
2011-01-06
2011-01-07
2011-01-08
2011-01-09
2011-01-10
2011-01-11
2011-01-12
2011-01-13
2011-01-14
2011-01-15
2011-01-16
2011-01-17
2011-01-18
2011-01-19
2011-01-20
2011-01-21
2011-01-22
2011-01-23
2011-01-24
2011-01-25
2011-01-26
2011-01-27
2011-01-28
2011-01-29
2011-01-30
2011-01-31

(31 個資料列受到影響)
參考自:巧用master..spt_values表輸出數字或者時間常量表CSDN

2011-01-18

T-SQL-多表格條件更新

一般我們使用的是用一個表格的條件進行更新,
當需要參照到其他的表格條件,進行資料更新時,
可用下列兩種方式進行更新。
--方法一
update STKCHD
set STKCHD.isLock='1'
from STKCHM
where STKCHM.STKNo=STKCHD.STKNo
and STKCHM.CorpNo=STKCHM.CorpNo
and STKCHM.CorpNo='20001'

--方法二
update STKCHD
set STKCHD.isLock='1'
from STKCHM INNER JOIN STKCHD on STKCHM.STKNo=STKCHD.STKNo and STKCHM.CorpNo=STKCHM.CorpNo
where STKCHM.CorpNo='20001'

2011-01-17

MS SQL-字串函數-REPLICATE

某些欄位依照資料流水編號紀錄,如果預設的資料型態為數值型態,
則以1、2、3的形式紀錄,若希望以001、002、003的方式表達,
可以利用MS SQL Server內的字串函數-REPLICATE將字串以指定字元填滿,
REPLICATE(欲填滿字元,長度)
--應用如下:
--希望流水號以0填滿,並以三位表示

select REPLICATE(0,3-LEN('1'))+'1'
--------------
001

(1 個資料列受到影響)
select REPLICATE(0,3-LEN('10'))+'10'
--------------
010

(1 個資料列受到影響)
參考自:MSDN-REPLICAT

MS SQL-字串函數-STUFF

MS SQL中內建了一STUFF函數,
可於字串指定位置插入指定字串,
STUFF(原字串,起始位置,刪除長度,插入字串)
select STUFF('abc',2,0,'123')
------
a123bc

(1 個資料列受到影響)
select STUFF('abc',2,1,'123')
------
a123c

(1 個資料列受到影響)
select STUFF('abc',2,2,'123')
------
a123

(1 個資料列受到影響)
參考自:MSDN-STUFF

2011-01-07

SQL Server 資料表空間耗用查詢

sql server使用久了,裡面的資料量越來越多,
所耗掉的硬碟空間也日益膨脹,
有些自行做記錄表,可以考慮將某區間的記錄移出或刪除,
sql server有提供單個資料表使用空間查詢-sp_spaceused
如果要將資料庫內的資料表做空間使用排序,可是用下列方式
if (select OBJECT_ID('tempdb..#DB_Spece')) IS NOT NULL Drop Table #DB_Spece
Create table #DB_Spece 
 (Name varchar(200),
  Rows int,
  Reserved varchar(200),
  Data varchar(200),
  Index_size varchar(200),
  Unused varchar(200))
exec sp_MSforeachtable "insert into #DB_Spece exec sp_spaceused '?'"

--預設以KB顯示,下列以計算為MB
select name,rows,
  reserved=(convert(integer,replace(Reserved,' KB',''))/1024),
  data=(convert(integer,replace(Data,' KB',''))/1024),
  index_size=(convert(integer,replace(Index_size,' KB',''))/1024),
  unused=(convert(integer,replace(Unused,' KB',''))/1024)
from #DB_Spece 
order by CAST(replace(Data,' KB','') as Integer) desc

2011-01-06

InputBox 缺字

在Delphi中使用inputbox時,
若欲顯示的字串為中文時,會發生掉字的問題,
這是因為inputbox上預設的字型為英文字,
遇到中文字會有長度判斷上面錯誤的問題,
有兩種方式解決這樣的問題,

一、利用Delphi內建變數DefFontData.Name修改預設字型
DefFontData.Name := 'MingLiU';//**細明體

二、在字串後方加上兩個空白字元