2008年12月26日 星期五

在SQL中使用自訂函數-->十進位轉二進位(12.26)

SQL中要將10進位轉2進位,到底應該怎麼轉呢?
原先想說,
select Convert(binary(10),20),這樣試試
結果,出來的卻是
0x00000000000000000014
天丫,居然變成16進位了,這不是我想要的耶~~
我是希望,打了20,可以幫我轉成「10100」。這樣才對!

在網路上找了挺久,sql似乎沒有這樣的函數,
既然沒有default的,那就自己來寫一個吧!
在c#中,寫function,很簡單,而在sql自訂函數呢?嘻~一樣很簡單
  1. 可程式性」中,有個「函數」,將分支打開後,裡面有sql預設的所有函數,若在找函數用時,可以來參考看看喲!(我也是這次才注意到),直接在「函數」上按右鍵選「新增」,另有一層,是選擇傳回值的資料,看是傳回單值,還是傳回資料表的,這次是要傳回一個轉換後的字串,所以選擇「純量值函數」。
  2. 在新增畫面中,感覺跟「預存程序」差不多嘛~姑且,我將要填入值的地方,分成幾個部份。「說明」「自訂函數名稱」「定義自訂函數參數」「定義回傳資料型態」「宣告回傳值變數」「運算區」「回傳指令」
  3. 確定執行無誤後,接著就是呼叫啦~~~執行: select dbo.ToBinary(20,5)。結果:10100

以下是自訂函數的程式:
-- =============================================
-- Author: 宗
-- Create date: 20081226
-- Description: 將數值資料轉換成二進位字串
-- =============================================

ALTER FUNCTION [dbo].[ToBinary]
(
-- Add the parameters for the function here
@Number int ,--傳入要轉換的數值資料
@Max int --可接受的最大字元數
)
RETURNS nvarchar(31) --共可接受31位數(因為int只到2的31次方)
AS
BEGIN

-- Declare the return variable here
DECLARE @binery nvarchar(31)
set @binery=''
-- Add the T-SQL statements to compute the return value here

--若數值超過所設定的次方數的或是超過函數自訂的31次方,則回傳空字串
if (@Max>31)
begin
return @binery
end

if @Number>power(2,@Max)
begin
return @binery
end
--檢查若都無誤,則進行轉換

declare @min int
set @min =0 --起始值
--進行轉換
while @min<@max+1
  begin
   if @Number=0
    break
   set @binery = Convert(nvarchar(10),@Number % 2)+ @binery;
   set @Number = @Number / 2;
   set @min=@min+1
   end
    -- Return the result of the function
  RETURN @binery
  END  

2008年12月2日 星期二

RadioButton 不准動(12.2)

想要讓CheckBox不能讓使用者點選的話,有很多種方式。
例如:設 Enabled=False,或是來個 disabled,但是呢,這都影響到其外觀,
也就是說,當設了以上的屬性時,他的外觀就會變成是灰色的了。
當然,這樣有好處,也有壞處。這邊就介紹一個可以不影響外觀的小技巧。

<asp:CheckBox ID="CheckBox1" runat="server" onclick="return false;" />

如此一來,怎麼點,他就是不能勾選或取消喲!!

然而,既然 CheckBox 可以用的話,那 RadioButton 應該也可以用吧~~
那就來套套看吧~~
呃~~~結果,動是不能動了,可是,當我是RadioButton群組時,
當點了非預設的選項時,原本預設的選項便會被清空。看來這個小技巧不適合它了。
那就只好寫個小 Function 來協助一下吧!

物件
<asp:RadioButtonList ID="RadioButtonList1" runat="server"  onclick="readonlyRadio(this.id,2)"  >
        <asp:ListItem Value="a">Aasp:ListItem>
        <asp:ListItem Value="b" Selected="true">Basp:ListItem>
        <asp:ListItem Value="c">Casp:ListItem>
asp:RadioButtonList>

JavaScript 函式

function readonlyRadio(name,defaultCheckedIndex) 
{  
    document.getElementsByName(name)[defaultCheckedIndex].checked = true;   
    
}   
看了後,應該是看得懂吧?將預設的選項帶給它,之後,再讓它還原預設的選項就行了!!
對了,有一點要提示的是,有沒有注意到,
這邊使用的是「document.getElementsByName」,而不是「Id」?
原因是,ServerControl RadioButtonList編譯出來的是很多個「input」「type="radio" 」的HTML元件,
其中,將這些input全部以「name」屬性包起來。就跟設Group一樣囉~
所以,當我們在抓時,就該用 getElementsByName 抓呀