ASP.NET開發員工業績評測中心
最後更新:2017-02-28
來源:互聯網
上載者:User
asp.net 摘要:本文介紹使用Asp.net開發一個軟體公司內部員工業績評測系統,包括後台所有員工資訊管理,部門資訊管理,所有部門評測細則資訊管理;前台員工每月自我評測和主管對員工的評測.重點介紹資料庫設計,以及重要Web服務端和頁面控制項的使用.筆者相信本文會對讀者的資料庫設計和使用Asp.net開發頁面技術有很好的啟發和協助。
一、 系統體繫結構
Visual Studio .NET 是微軟公司迄今為止推出的最強大的,完整的開發工具,用於產生 Asp Web 應用程式、XML Web services、傳統型應用程式和行動裝置 App程式。Asp.net 是一個已編譯的、基於.NET 的環境.。下面的圖表給我們示範了Visual Studio.Net framework是如何支援ASP.NET應用的。
Visual C#(發音為 C sharp)是一種新的物件導向的程式設計語言,它從 C 和 C++ 演變而來,為開發應用程式提供了一種簡單和型別安全的語言。因此在編程環境及語言的選擇中,我們使用了Asp.net構架來為頁面開發提供支援,Visual C#來進行實際編程。我們的評測系統中採用的是傳統的三層體繫結構,包括資料存放區層(SqlServer2000)、應用邏輯層(.aspx.cs),頁面顯示(.aspx)。
二、 資料庫設計
資料庫”ygpc”(員工評測)中共含有五個表,介紹如下:
1. Employee,存放公司所有員工和主管基本資料。
2. Department,所有部門基本資料.
3. bigRules ,包括評測細則大的分類情況,比如”遵守制度”, “專業技能”,”計劃與管理”,”工作成果”,”工作態度”等.
4. smallRules, 包括每個細則分類對應的具體評測細則,例如細則分類”專業技能”中對應的”熟練使用設計工具(如Rational Rose或Visio等)”,” 熟練使用資料庫或其相關的應用如SQL,OLAP等”,”熟悉公司的技術體系並能熟練地應用於開發當中”。
5. score, 每月評測結果分數,分為員工自測和主管對員工評測,針對每條評測細則存放每個員工每月相應的分數.
各個表主要欄位和表間關係如下圖所示:
表名主要欄位主鍵和外鍵employeeemployID,departID,leaderID,reallName, userName,userPass, emal, telephone…….主鍵: employID
外鍵: departIDdepartmentdepartID,LeaderID,dName,dDescription…主鍵: departIDsmallRulessmallID,bigID,departID simpleDiscription,fullDescription,score,主鍵: smallID
外鍵: bigID, departIDbigRulesbigID,content,totalScore主鍵: bigIDScoretestPersonID, testedPersonID,smallID, score, month 主鍵: 無
外鍵: smallID
在大多數的軟體公司中,部門分為研發,測試,客服等, 僱員分屬若干部門;各個部門既有相同又有不同的評測標準。比如在筆者所在的開發超市軟體的公司中,在遵守制度上各個部門需要相同的評測標準,例如:無遲到早退,有事向公司請假,無無故曠工等;同時各個部門又有不同的評測標準,比如在專業技能上,研發部門的員工需要掌握熟練的.Net開發Windows頁面技術;而客服部門需要掌握熟練的資料庫技術,隨時為各個店鋪尋找商品銷售情況,商品進銷存情況等;在工作成果上,測試部門會有”測試漏測率”評測標準,而研發和客服部門就不需要。因此,在smallRules(評測細則)表中,不僅需要相應的bigRules(細則分類)中的bigID,使得”熟練使用開發兩種以上工具”對應著”專業技能”分類,同時還要儲存該細則所屬的部門ID。
另外,在Score表中,需要按照每月,每個評測人,每個被測人,每個評測細則分別儲存相應的細則上的得分,這樣無論是取自測成績還是主管對自己的評測成績都是十分方便的。其中所有ID,分數, 分值,月份等數值型資料為int型,描述型資訊都為varchar型。
三、 應用邏輯實現
1、應用概述
系統管理員,各個部門主管及員工從同樣的登陸頁面分別進入前後台系統。系統管理員完成後台員工資訊管理,部門資訊管理,各個部門評測標準資訊管理等。前台使用者包括各部門主管和普通員工。部門主管進入評測首頁面後,可以選擇本部門的任一員工,選擇工作當月為其打分;普通員工只能給自己當月評測。員工在主管為自己本月工作情況評測前可多次修改自己以前的評測結果,一旦主管為自己評測過就無法修改了;主管只有在員工評測之後才能為其打分,主管可為員工多次評定。
2、重要伺服器和頁面控制項的使用
我們使用了相當多的基本控制項,比如Button,TextBox,HtmlSelect,DropDownList,隱藏控制項等。由於篇幅有限,現只介紹其中起到關鍵作用的控制項。
(1) HtmlTable控制項
。
該頁面在實現中的邏輯並不複雜,我們以文字敘述如下:遍曆bigRules表中每條評測分類,根據當前細則分類ID從smallRules取出對應的若干條評測細則,同時判斷當前員工當月是否已經有過成績,如果有,則取出,放入”黃色”方框中,便於參考。進入該頁面後,還需要判斷是”誰”在給”誰”評測,如果是主管或者員工的自測,則將評測結果存入資料庫時
testPersonID,testedPersonID都填入同一ID,否則testPersonID存放主管ID,testedPersonID存放被測人ID.
該頁面主要使用了HtmlTable控制項。使用 HtmlTable控制項對 HTML <table> 元素進行編程。在後台頁面IDE設計環境中,該控制項不含任何內容。在從資料庫中取出資料後,我們可以體會到該控制項的強大功能。HtmlTable控制項由一個表Table的 Rows 集合中儲存的行(由 HtmlTableRow 對象表示)組成。每行均由儲存在行的 Cells 集合中的儲存格(由 HtmlTableCell 對象表示)組成。在實際編程中,首先需要填充若干個HtmlTableCell內容,一次加入到HtmlTableRow對象中,再將該HtmlTableRow對象加入到HtmlTable對象中。
(2) DataGrid
DataGrid控制項與HtmlTable控制項不同在於DataGrid控制項是Web伺服器端控制項。以html語言書寫和以伺服器端控制項的實現在思維方式上已經有了很大的不同,對於html語言而言,只是一種標識;而對伺服器端html控制項而言,卻已演變成為一段程式,一個對象。
它不僅可以方便,快捷的完成資料庫中資料的綁定顯示,還可以在設計時產生包含“編輯”、“更新”、“取消”按鈕的列、包含自訂按鈕的列以及模板列。在後台管理頁面中我們使用了該控制項的編輯資料功能,點擊每一小項的Edit按鈕可以更新該項內容。點擊Update 控制項就可完成資料庫內容的更新。
另外,在其他情況下也可使用DataGrid控制項
從該控制項在不同情況下的使用我們體會到該控制項的強大功能。這也正是Asp.net編程構架給使用者提供的切實利益。
四、結束語
筆者在一家開發超市軟體的公司進行畢業設計時為公司開發了這個員工評測中心。儘管由於時間短促,未能做出功能更多,更豐富的頁面,但是也確實體會到了Asp.net的種種優勢。同樣在資料庫的設計和使用上也積累了一定的經驗,希望能對大家有一定的啟迪。相信使用該技術同樣可以為公司做出功能更加全面的辦公自動化產品。
(以下原始碼不排版)
原始碼編譯環境:安裝Visual Studio.Net 7.0,SqlServer2000
原始碼1(前台評測首頁面):
//建立資料庫連接,取出bigRules表資料放入ds中
SqlConnection conn = new SqlConnection(“server=localhost;uid=sa;pwd=;database=ygpc”;
SqlCommand comm. = new SqlCommand(“select * from bigRules”,conn);
SqlDataAdapter da = new SqlDataAdapter(comm);
DataSet ds;
da.Fill(ds,”bigRules”);
int nTotalBig = ds.Tables[“bigRules”].Rows.Count;
int k = Convert.ToInt32(ds.Tables["bigRules"].Rows[0]["bigID"].ToString());
for(int iBig=0;k<=Convert.ToInt32(ds.Tables["bigRules"].Rows[nTotalBig-1]["bigID"].ToString());k=Convert.ToInt32(ds.Tables["bigRules"].Rows[iBig]["ID"].ToString()))
//iBig代表bigRules表中行值,k代表iBig行對應的ID值
{
string commText = "Select * from smallRules where bigID="+k+"order by id";
SqlCommand commSmall = new SqlCommand(commText,conn);
SqlDataAdapter daSmall = new SqlDataAdapter(commSmall);
if(ds1!=null) ds1.Clear();
ds1 = new DataSet();//每次迴圈都需要更新ds1中記錄的細則資料
daSmall.Fill(ds1,"smallRules");
int nTotalRows = ds1.Tables["smallRules"].Rows.Count;
int i=Convert.ToInt32(ds1.Tables["smallRules"].Rows[0]["ID"].ToString());
string str = "select * from score where
_testPersonID="+testID+"and testedPersonID="+testedID+"and month="+curMon+" and smallID="+i;
//判斷當前被測員工當月是否已有過成績,即檢查score表中是否有與testedID, testID,curMon相符
//的記錄,判斷結果為true或false存入hidTested隱藏控制項中,
// 在顯示”黃框”以往成績時起到作用,略
for(int z=0;i<=Convert.ToInt32(ds1.Tables["smallRules"]
_.Rows[nTotalRows-1][“ID”].ToString());
i=Convert.ToInt32(ds1.Tables[“smallRules”].Rows[z][“ID”].ToString()))
//z代表smallRules中的行值,i代表z行的ID值,需要找出i值對應的score表的"成績"值
{
HtmlTableRow tr = new HtmlTableRow();
array.SetValue(indexPageRow++,i);
//array為靜態數組,記錄每個i值在頁面上的對應行,
// 因為各項評測smallRules經過後台不斷的增,刪,改,其ID值與頁面上的行並不對應
for(int j=0;j<ds1.Tables["smallRules"].Columns.Count;j++)
{
HtmlTableCell tc = new HtmlTableCell();
if(j==0)//當前範圍的零行零列
{
if(i == Convert.ToInt32(ds1.Tables["smallRules"].Rows[0]["ID"].ToString()))
{
//最左的細則分類列,注意從bigRules表中取資料
tc.InnerHtml = s.Tables["bigRules"].Rows[iBig][j+1].ToString()+
_ds.Tables["bigRules"].Rows[iBig]["totalScore"].ToString()+"分";
}
tr.Cells.Add(tc);
}
else //不是最左列
{
if(j!=ds1.Tables["smallRules"].Columns.Count-1)//判斷是否最右列
{
tc.InnerHtml = ds1.Tables["smallRules"].Rows[z][j].ToString();
}
else
{
//最右的成績分值列
if(hidTested.Value==”true”)
//最後一個cell列含兩個textbox列,顯示上次評測的成績
{
TextBox box1= new TextBox();
box1.Width = 30;
//找出i值對應的score表中的成績放入ds2
box1.Text = ds2.Tables["score"].Rows[0]["score"].ToString();
box1.ReadOnly = true;
box1.BackColor = System.Drawing.Color.Beige;
tc.Controls.Add(box1);
}
TextBox box = new TextBox();
if(hidTested.Value == "false")
box.Width = 60;
else
box.Width = 30;
box.Attributes["onblur"]="javascript:OnChange("+ds1.Tables[
"smallRules"].Rows[z][j-1].ToString()+",this)";
//javascript控制使用者評測分數在該項分值之內,
//ds1.Tables["smallRules"].Rows[z][j-1].ToString()
//傳給OnChange函數該項評測細則分值
}
tr.Cells.Add(tc);//將HtmlTableCell對象存入HtmlTableRow對象中
}
}
t.Rows.Add(tr);//一行資料完成,加入到HtmlTable的Rows集合中
z++;
}//一個細則分類的所有評測細則完成
iBig++;
}//下一個細則分類,如由”遵守制度”到”專業技能”
其中嵌入的javascript語句的OnChange()函數在html頁面中head部分實現如下:
<script language=”javascript”>
function OnChange(maxValue,obj)
{
//maxValue為該項細則的分值,obj為該項得分,是object型
parseInt(obj.value,10); parseInt(maxValue,10);
if(!isNaN(obj.value)) //判斷是否自然數
if(obj.value>maxValue) //值超過範圍
{
alert('值超過範圍') obj.focus();}
else {}
else //值非法
{
alert('值非法') obj.focus();}
</script>
原始碼2(評測結果頁面,以一個DataGrid為例):
DataTable table1 = ds.Tables.Add("score");//ds,ds1為兩個DataSet型資料集
table1.Columns.Add("smallID",typeof(int));//細則ID列
table1.Columns.Add("realName", typeof(string));//測評人姓名
table1.Columns.Add("score", typeof(int));//該項細則得分
string commText = "select smallID,realName,score from score, employee where score.testPersonID="+testID+"and score.testedPersonID="+testedID+"and score.month="+curMon+"order by score.smallID";
//其中testID,testedID為頁面進入時從前一頁面記錄的測評人ID和被評人ID值
SqlConnection conn = new SqlConnection(“server=localhost;uid=sa;pwd=;database=ygpc”;
Conn.Open();
SqlCommand comm= new SqlCommand(commText,conn);
SqlDataReader reader = com1.ExecuteReader();
int nColCount= table1.Columns.Count;
while(reader.Read())
{
System.Data.DataRow row = table1.NewRow();
for(int i=0;i<nColCount;i++)
{
row[i]=reader[i];
}
table1.Rows.Add(row);
}
DataGrid1.DataSource=ds.Tables["score"].DefaultView;
DataGrid1.DataMember =ds.Tables["employee"].TableName;
DataGrid1.DataBind();
//使用DataSource和DataMember就能在一個DataGrid控制項中顯示來自兩個表的資訊