使用JavaScpript計算日期(幾年後、幾月後、幾天後)
在使用JS時,主是要使用setYear()、setMonth()、setDate()
由上圖可知,JavaScript的潤年規則還是有的~~
在抓取年份時,請採用getFullYear()。不要太直覺性的使用getYear(),
alert('進入列印');if (typeof RSClientPrint.Print == "undefined"){alert("Unable to load client print control.");return;}//邊界RSClientPrint.MarginLeft = 0;RSClientPrint.MarginTop = 0;RSClientPrint.MarginRight = 0;RSClientPrint.MarginBottom = 0;//繁體中文RSClientPrint.Culture = 2052;RSClientPrint.UICulture = 2052;//預設為A4//如果 PageWidth 大於 PageHeight,列印方向就會設定為 [橫向]。 否則,就會設定為 [縱向]。RSClientPrint.PageHeight = 297;RSClientPrint.PageWidth = 210;RSClientPrint.Authenticate = true;RSClientPrint.Print('http://localhost/ReportServer', '/TestPage', 'TestPage')


--將查詢結果存入暫存資料表create table #temp(mid nvarchar(10),memberchname nvarchar(10),uid nvarchar(32),unitname varchar(100))
insert into #temp EXEC spMemberList @uid
--只挑出8及5的值
select #temp.* ,B02POPESN,B02ADKIND from #temp
inner join p2kdb.dbo.CPABT02M on mid=B02IDNO
where (B02POPESN='8' or B02ADKIND='5')
drop table #temp
-- =============================================
-- 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 //以下是一個四則運算的簡單範例
delegate int arithmetic(int num1, int num2); //定義委派類型
protected void Page_Load(object sender, EventArgs e)
{
//先宣告委派
arithmetic ari=null;
//設定算術原則
string fun="/";
switch (fun)
{
//依照fun所給的算術原則,將該算術原則的方法,指派給「ari」
case "+":
ari = new arithmetic(this.add);
break;
case "-":
ari = new arithmetic(subtract);
break;
case "*":
ari = new arithmetic(multiply);
break;
case "/":
ari = new arithmetic(divide);//實作委派
break;
//(這些方法,必須也要跟定義委派類型的是相同的喲。
就是說,也必須有回傳int,及有兩個數值參數。)
}
int ccc = ari(6, 3);//這時候,只要統一用「ari」就可以呼叫對應的方法了。
}
private int add(int a,int b)
{
//加
return a + b;
}
private int subtract(int a, int b)
{
//減
return a - b;
}
private int multiply(int a, int b)
{
//乘
return a * b;
}
private int divide(int a, int b)
{
//除
return a / b;
}
if (e.Row.RowType == DataControlRowType.Header)
{
TableCellCollection oldCell = e.Row.Cells;
oldCell.Clear();//將原有的表頭格式移除
//產生多重表列的第一列
GridViewRow headRow = new GridViewRow(0,0, DataControlRowType.Header, DataControlRowState.Insert);
//第一欄
TableCell head2Cell = new TableCell();
head2Cell.Text = "單位";
head2Cell.BackColor = row1color();//自訂的方法用以統一取得色彩
head2Cell.HorizontalAlign = HorizontalAlign.Center;
head2Cell.RowSpan = 2;//所跨的欄數
headRow.Cells.Add(head2Cell);//新增自製的儲存格
//第二欄
head2Cell = new TableCell();
head2Cell.Text = "群組";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 8;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格
//第三欄
head2Cell = new TableCell();
head2Cell.Text = "聯絡人";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 3;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格
//第四欄
head2Cell = new TableCell();
head2Cell.Text = "行事曆";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 3;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格
//將自製的資料列新增上去
GridView1.Controls[0].Controls.Add(headRow);
//產生多重表列的第二列
headRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);
#region 群組裡的欄位
//用法都與第一列相同
head2Cell = new TableCell();
head2Cell.Text = "使用量";
head2Cell.BackColor = row2color();//自訂的方法用以統一取得色彩
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "成員數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "員工數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "通訊錄量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "檔案總數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "總檔案量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "檔案下載次數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "下載磁碟總量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
#endregion
#region 聯絡人裡的欄位
head2Cell = new TableCell();
head2Cell.Text = "使用人數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "聯絡人數量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "同步次數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
#endregion
#region 行事曆裡的欄位
head2Cell = new TableCell();
head2Cell.Text = "使用人數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "events_personal";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
head2Cell = new TableCell();
head2Cell.Text = "events_group";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);
#endregion
GridView1.Controls[0].Controls.Add(headRow);
using System; string drawString = ""; |
程式碼 Default2.aspx.cs
using System; |
在google上,的確有著非常多相關於介面(Interface)的討論、說明。不曉得是不是本人智商過低,亦或是人家講的不清楚? 我是都有看沒有懂。不過,看大家在都可以在各論壇討論得沸沸騰騰,所以,猜想答案應該是前者吧(本人智商過低)。但是,畢竟用一種說法,並不代表可以說懂每一個人嘛,不然,哪來的「因材施教」呢?也幸好,本人並非「朽木不可雕也」,看了一堆人的說法,總算是有點心得。其實,透過字面上,我們也可以看得出來「介面(Interface)」是什麼東西。就是某個東西,要操控、使用另一個東西時,中間的橋梁,就像我們在使用電腦時,會有一個介面(window畫面),來指引你使用,我們在看電視轉台時,會有個搖控器或是選台的按鈕讓你來轉台。這邊主要的觀念是想說,「介面(Interface)」主要就是構成二者互動的橋梁。有了這個概念後,我們把概念帶到程式這邊來:介面(Interface)就是「程式碼」與「類別(Class)」之間的橋梁。當然,我們在寫程式時,也不見得會採取介面(Interface)的方法,我們會直接「程式碼--->類別」,並不會「程式碼--->介面--->類別」的流程。只是說,若使用介面(Interface)的話,它們的關係,是這樣子的。
interface IHardDisk
{
void setDefault(); //設定硬碟容量的起始值
bool compareHD(int HD); //比較看哪個容量大
int HD_gigabyte{ set;get;} //設定/取得硬碟容量public void errtest();
}小提醒:
- 一般習慣,在命名介面(Interface)時,都以「I」為開頭表示Interface。
- 在定義介面(Interface)時,裡面的方法,屬性都只「定義」而已,並未真正的實作內容。
- 由於,此為測試,所以真正在應用時,請適時地加上「Public」修飾詞。ex: Public interface IHardDisk {...}。
- 上面紅色字體,表示為錯誤的使用方法:不用加上「Public」修飾詞.
看完了如何定義一個介面(Interface)後,我們接著看範例。
範例說明(實作):
- 定義介面(IHardDisk)
- 利用類別(HardDisk)實作介面
- 程式中,一改以往呼叫類別的方法,改以呼叫介面
- 使用該介面的各屬性、方法
小提醒:
- 在實作介面時,該介面所定義的方法、屬性,在類別那,都要一一實作
- 在實作介面時,每個「方法」都請加上修飾詞「Public」
- 程式宣告時「IHardDisk ComputerHD=new HardDisk() ; 」,後面是 new 一個類別。
程式碼:---------------------------------------------interface IHardDisk
{
void setDefault(); //設定硬碟容量的起始值
bool compareHD(int HD); //比較看哪個容量大
int HD_gigabyte{ set;get;} //設定/取得硬碟容量
}class HardDisk : IHardDisk //實作IHardDisk的介面
{
//將介面的各個方法、屬性實作出來int hd_gigabyte;//宣告一個變數來存取硬碟容量的值
public void setDefault()//實作「設定起始值」的方法
{
hd_gigabyte = 520;}
public bool compareHD(int HD)//實作「比較大小」的方法
{
if (HD > hd_gigabyte){return true;}
else{return false;}
}
public int HD_gigabyte //實作「取得/設定容量」的屬性
{
get { return hd_gigabyte; }
set {hd_gigabyte=value;}}
}
protected void Page_Load(object sender, EventArgs e)
{
IHardDisk ComputerHD=new HardDisk() ; //宣告
ComputerHD.setDefault(); //設定硬碟容量的預設值Response.Write(ComputerHD.HD_gigabyte); //取得硬碟容量Response.Write(ComputerHD.compareHD(567)); //比較大小
}--------------------------------------------
看了以上的範例,會有個想法:這種作法,比我直接呼叫類別的方法還要繁瑣我直接將方法寫在類別裡,再呼叫類別使用就好啦!(「程式碼--->類別」)何必要這麼麻煩,還透過介面,多了一道手續(「程式碼--->介面--->類別」)沒錯,藉由以上的範例,的確看不出用介面(Interface)的好處。然而,使用介面的好處在於「泛用」。所謂的「泛用」或許可以解釋成「廣泛地使用」,也就是說,我們只要使用介面,就可以使用不同的類別(前提為,該類別必須實作該介面)範例說明:(實作)
相同地我們定義一個介面(Interface) 另外,我們產生兩個類別一個適用於小型硬碟(miniHardDisk),另一個適用於大型硬碟(bigHardDisk) 兩者也都實作了IHardDisk的介面 再來,我們又新增了一個類別,這個類別裡,定義的方法為回傳一個介面的型態(將來都實作產生這個類別) 在程式碼中,可看到,我們在Computer的類別裡,我們目前是使用「小型硬碟」 在Page_Load中,我們輸出了介面,及二類別的資料程式重點:
程式中,我們目前是使用「小型硬碟」,若突然要改成「大型硬碟」時,我們只需更動,Computer的類別即可,程式碼,完全不用更動 將類別中的「miniHardDisk cc = new miniHardDisk();」,改成「bigHardDisk cc = new bigHardDisk ();」程式碼:======================================interface IHardDisk
{
void setDefault();//設定硬碟容量的起始值
bool compareHD(int HD);//比較看哪個容量大
int HD_gigabyte { set;get;}//設定/取得硬碟容量
}class miniHardDisk : IHardDisk //實作IHardDisk的介面
{
//將介面的各個方法、屬性實作出來int hd_gigabyte=0;//宣告一個變數來存取硬碟容量的值
public void setDefault()
{
hd_gigabyte = 40;}
public bool compareHD(int HD)
{
if (HD > hd_gigabyte){return true;}
else{return false;}
}
public int HD_gigabyte
{
get { return hd_gigabyte; }
set {hd_gigabyte=value;}
}
}
class bigHardDisk : IHardDisk //實作IHardDisk的介面
{
//將介面的各個方法、屬性實作出來int hd_gigabyte=0;//宣告一個變數來存取硬碟容量的值
public void setDefault()
{
hd_gigabyte = 1024;}
public bool compareHD(int HD)
{
if (HD > hd_gigabyte) { return true; }
else { return false; }
}
public int HD_gigabyte
{
get { return hd_gigabyte; }
set { hd_gigabyte = value; }}
}class Computer
{
public IHardDisk Disk()
{
miniHardDisk cc = new miniHardDisk();
cc.setDefault();
return cc;
}
}
protected void Page_Load(object sender, EventArgs e)
{IHardDisk Iabc = new Computer().Disk();
Response.Write("使用介面取得的值:");
Response.Write(Iabc.HD_gigabyte);
Response.Write("<br><br>");
Response.Write("使用bigHardDisk類別取得的值:");
bigHardDisk bHD = new bigHardDisk();
bHD.setDefault();
Response.Write(bHD.HD_gigabyte);
Response.Write("<br><br>");
Response.Write("使用miniHardDisk類別取得的值:");
miniHardDisk mHD = new miniHardDisk();
mHD.setDefault();
Response.Write(mHD.HD_gigabyte);
}======================================議題:這時,也會有個疑問:既然這樣的話,我還是一樣可以使用類別呀,反正也是一定要創造兩個類別,那我在Page_Load時,再改呀類別的寫法-->Response.Write("使用bigHardDisk類別取得的值:");
miniHardDisk mHD = new miniHardDisk ();
mHD .setDefault();
Response.Write(mHD .HD_gigabyte);
Response.Write("<br><br>");那當我要由小型硬碟改成大型時,就把miniHardDisk mHD = new miniHardDisk ();
改成bigHardDisk bHD = new bigHardDisk();也行呀。------------>很好,說得沒錯,不過,首先,會先遇到個問題「命名」,已由 mHD --> bHD ,勢必程式碼裡面的名稱都要修改再者,假設,不修改名稱,我就硬用 mHD 用到底,反正都可以用嘛。是啊,可以用,可是,又面臨到另個問題,目前程式是只有一頁而已,那假設,我們已經使用原先物件的寫法,寫了10頁,甚至於好幾十頁,請問,你要一支一支改嗎?那如果我們使用「介面」的方法,就只要修改我們類別庫裡的該Computer類別即可。