张兵1989
求知若渴,方取真经!南阳论坛www.nysbbs.com
posts - 38,  comments - 9,  trackbacks - 0

1.一个项目里面可以有多个web.config文件
  但不能在一个目录里面

2.实现页面自动跳转到登录页面,登陆后自动跳转回来
在一个文件目录配置web.config,那么这个目录的所有网页都会自动跳转

<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>

注释:代表某个用户,*代表谁都不能登录,直接用户名,只允许次用户登录

3.配置默认web.config

<authentication mode="Forms"/>

可以实现全局获取用户名
 Response.Write(Page.User.Identity.Name);///获取用户名

posted @ 2011-05-10 18:53 张兵1989 阅读(275) 评论(0) 编辑

配置global.asax群居应用程序类,实现网站的在线统计

void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
Application["count"] = 0;
}

void Application_End(object sender, EventArgs e)
{
//在应用程序关闭时运行的代码

}

void Application_Error(object sender, EventArgs e)
{
//在出现未处理的错误时运行的代码

}

void Session_Start(object sender, EventArgs e)
{
Session.Timeout
= 1;
//在新会话启动时运行的代码
Application["count"] = Convert.ToInt32(Application["count"].ToString())+1;
}

void Session_End(object sender, EventArgs e)
{
Application[
"count"] = Convert.ToInt32(Application["count"].ToString()) - 1;
//在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式
//设置为 StateServer 或 SQLServer,则不会引发该事件。

}

session的重新认识

session跟浏览器相关,与用户无关

posted @ 2011-05-10 18:50 张兵1989 阅读(222) 评论(6) 编辑
一.在一个项目上添加别的项目的窗体,
1.添加三个文件.cs,  .designer.cs,  .resx;
2.修改命名空间保持一致
3.先将窗体排除到项目之外,然后包括到项目里面
二,引用别的项目的窗体
1.先生成
2.然后引用dll文件,引用命名空间
3.再生成,就可以调用窗体
三。远程访问数据库
1.连接服务器设置成IP
2.外围应用配置器
3.远程访问
4.在配置管理器中,网络TCP/IP服务
5.在属性IP地址修改下IP为本地地址
6,。TCP端口设置为1433
posted @ 2011-05-06 20:26 张兵1989 阅读(655) 评论(0) 编辑

Session Variables
接下来我们看一看session变量,这些变量由服务器来处理。第一个响影一从客户端传递到服务器,Sessions就创建了,并且当用户关闭浏览器窗口或者一些异常操作发生,session就会结束。给你一些可以使用session变量来传递数值的方法。在下面你看到为用户创建的Session和 “Name”是关键字,也如知名的Session关键字一样,关键字被赋给TextBox数值。
// Session Created
Session["Name"] = txtName.Text;
Response.Redirect("WebForm5.aspx");
// The code below shows how to get the session value.
// This code must be placed in other page.
if(Session["Name"] != null)
Label3.Text = Session["Name"].ToString();
Application Variables
有时,我们需要存取来自网页任何地方的数值。因为那样,可以使用Application变量。这里有一小段代码,这段代码显示如何做到那些事情。一旦创建Application变量并且为其赋值,在应用程序的任何地方都可以重新得到它的值。
// This sets the value of the Application Variable
Application["Name"] = txtName.Text;
Response.Redirect("WebForm5.aspx");
// This is how we retrieve the value of the Application Variable
if( Application["Name"] != null )
Label3.Text = Application["Name"].ToString();
HttpContext
可以使用HttpContext从网页中重新得到数值。通过使用方法的属性获得那些数值。既然它们易于编写代码和修改,使用属性是一种好方法。在你的第一个网页中,制造一个属性,这个属性可以返回TextBox的值。
public string GetName
{
get { return txtName.Text; }
}
我们使用Server.Transfer来将此控件发送到一个新网页。注意:Server.Transfer仅仅将此控件传递到新的网页并且不重新定位该网页,这意味着你会看到在URL中旧网页的地址。简单地在“Server.Transfer”按钮单击事件,并且增加下列代码。
Server.Transfer("WebForm5.aspx");
现在,让我们定位网页,数值就传递到该网页上,在这种情况下使用的该网页是“webForm5.aspx”。
// You can declare this Globally or in any event you like
WebForm4 w;
// Gets the Page.Context which is Associated with this page
w = (WebForm4)Context.Handler;
// Assign the Label control with the property "GetName" which returns string
Label3.Text = w.GetName;
Special Note
特别注意 与你看到的一样,从一个网页向别一网页传递数值时有不同的方法。每一个方法有它自己的优点也有其缺点。所以,当你传递数值时,选择好你所需要的所以你就会有一种好方法,这种方法对你是最为可行的。
我们总是会遇到这样的情况,需要将数值从一个网页传递到另一个网页。在这篇文章中,向你展示了几种从一个网页向另一个网页传递数值的几种方法。在此例子中,创建的网页由一个文本控件和几个按钮控件组成。在文本框中输入的数据通过被标识在按钮控件中的不同方法从一个网页传递到另一个网页。
Response.Redirect
让我们首先看一看如何使用Response.Redirect方法传递数据。这是它们之中最简单的方法。在文本框中输入一些数据,并且当你输入完成数据后,按下“Respose.Redirect”按钮。我们会得到一个提示,有时我们想在catch程序中传递另一个网页,意味着捕捉到例外程序并且向另一个网页传递。如果你试图这样做,它会给你一个System.Threading例外程序。因为你想遗留下一个线程向另一个网页传递数据,所以这个例外程序就会被抛出。
Response.Redirect("WebForm5.aspx",false);
这个语句告诉编译器定位到“WebForm5.aspx”,这里的“false”意味着在当前网页不能结束你正在做的事情。应该看一看线程发布命令的System.Threading类。在下面,看一看按钮事件的C#代码。“txtName”文本控件的名字,文本框的内的值传递到一个叫做“WebForm5.aspx”的网页。在“?”之后的“Name”符号只是一个临时的响应变量,这个变量保持着文本的数值。
private void Button1_Click(object sender, System.EventArgs e)
{
// Value sent using HttpResponse
Response.Redirect("WebForm5.aspx?Name="+txtName.Text);
}
好的,到这种观点为止,你使用Response发送了数值。刚刚,在此我收集到了这些数值,所以在“WebForm5.aspx”page_Load事件中,写入这些代码。首先,我们检查到输入的值不为null。如果不是这样,我们只是简单地在网页上使用Label控件显示数值。注意:如果你使用Response.Redirect方法来传递这些数值,所有这些数值在浏览器的URL中都是不可见的。你绝不能使用Response.Redirect来传递信用证号码和机密信息。
if (Request.QueryString["Name"]!= null)
Label3.Text = Request.QueryString["Name"];
Cookies
接下来使用Cookies。Cookies在服务器端创建,但是客户端省略。在此 “Cookies” 按钮的click事件中,写入以下代码:
HttpCookie cName = new HttpCookie("Name");
cName.Value = txtName.Text;
Response.Cookies.Add(cName);
Response.Redirect("WebForm5.aspx");
首先,创建一个cookie命名为“cName”。既然一个cookie实例可以拥有许多数值,告诉编译器这个cookie持有“Name”数值。我们将它赋值给TextBox并且最结后将它加入Response流,再使用Response.Redirect方法传递给其它网页。
让我们看一看如何得到被另一个网页传递的cookie数值。
if (Request.Cookies["Name"] != null )
Label3.Text = Request.Cookies["Name"].Value;
如你所看到的,象我们以前做一的一样正是使用同一种方法,刚刚我们在Request.QueryString之内,使用了Request.Cookies。记注一些浏览器不接收cookies。

posted @ 2010-12-17 22:03 张兵1989 阅读(39) 评论(0) 编辑
摘要: 实验环境:笔记本一台(2GB内存,320GB硬盘)Vmware Server 1.0.6版Linux Enterprise 5.1版Oracle 10g for linux(10.2.0.1)前言:最开始的实验环境其实不是这样的,虚拟机用的是vmware workstation,用了一段时间之后发现用vmware workstation版本建不了共享磁盘,也就没法构建ORACLE RAC实验环境,所以把vmware workstation换成了vmware server2.0。装完vmware server2.0之后连启动web界面都成问题,重装仍然如此,无奈之下启用了vmware serv.阅读全文
posted @ 2011-12-18 17:58 张兵1989 阅读(14) 评论(0)  编辑
Brinson模型是投资绩效评估的模型之一,简要说就是讲组合收益与基准收益进行比较,两者之差叫做超额收益,超额收益可以分解为超额资产配置收益与超额个股选择收益和交互收益三种。
Brinson对股票债券的处理方法是不同的,债券主要是受到利率水平的共性影响,主要讲一下股票型基金归因方法,股票型基金中包含部分债券持仓,等同于不在基准中的股票持仓。
简单的Brinson模型
在一个时期内收益可以分为四个部分:资产配置收益,个股选择收益,交互收益和基准组合收益。构建如下四个概念性组合:Q1:基准组合,即基准组合收益rb;Q2:积极资产配置组合;Q3:积极股票选择组合;Q4:实际组合,即实际组合收益rp。
涉及到的组合资产i权重,组合资产i收益,基准资产i权重,基准资产i收益(具体公式省略)。
资产配置收益:AR=Q2-Q1=(Wpi-Wbi)*Rbi累加之和。
个股选择收益:SR=Q3-Q1=Wbi*(Rpi-Rbi)累加之和。
交互收益:IR=Q4-Q2-Q3+Q1=(Wpi-Wbi)*(Rpi-Rbi)累加之和。
总超额收益:TR=Rp-Rb=Q4-Q1=AR+SR+IR。(要求每期组合中资产权重总和为1).
AR'=AR-(Wpi-Wbi)*Rb累计之和。(Wpi-Wbi)*Rb累计之和=0。按照实际来看,这是更能说明绩效归因,强调的是对涨幅超过基准总收益的类别进行超配或者对跌幅超过基准总收益的类别进行低配才是有超额资产配置能力。
简单Brinson模型的复合收益
Brinson模型可以在任意时间段内,比如1天,1个月,进行相应计算后,然后,在将所有时间段内地单期进行汇总计算。
组合的收益率可以跨期进行符合计算,各个分解的归因收益不能简单地进行跨期复合计算。组合收益率为Rp,基准收益率为Rb。
Rp=(1+Rp1)
(1+Rp2
)...
1+Rpt)-1.
Rb=
(1+Rb1)
(1+Rb2)...
(1+Rbt)-1.
单期的超额收益可以表示为Rpt-Rbt,多期的超额收益相应为Rp-Rb。
为什么不能简单的对跨期进行效应和加总,是因为各期收益超额总和并不等于复合收益超额:
Rp-Rb!=(Rp1-Rb1)+
(Rp2-Rb2)+...+
(Rpt-Rbt).

BKT几何归因法:
(1+Rpt)/
(1+Rbt)=(1+At)
(1+St)
(1+It)
单期归因效应的几何方法:
行业配置收益
AE={(Wpi-Wbi)*[(1+Rbi)/(1+Rb)-1]}累加之和
SE={Wbi*(Rpi-Rbi)/(1+Rb)}累加之和
IE=
(1+Rpi)*
(1+Rbi)
/[(1+(Wpi*Rbi)累加之和)*
(1+(Wbi*Rpi)累加之和)
]-1

David在BKT基础上提出了一种算术归因法,计算方法及细节暂不详解。
posted @ 2011-10-18 09:52 张兵1989 阅读(145) 评论(0) 编辑
股票型基金绩效如何评价?

【第一理财网专家解答】:基金绩效评价是国内基金业当前的重要研究课题。合理客观地评价旗下基金的投资绩效,一方面可以为内部投资研究提供事前、事中支持与事后业绩考核;另一方面也可以向客户展现更有说服力的投资业绩,使其对基金管理团队的运作绩效有更深层的认识。

  基金组合,尤其是开放式积极管理型基金组合的持仓通常会处于较为频繁的变动之中,基金经理会根据市场趋势进行主动性投资操作;来自客户的频繁申购、赎回基金也对基金组合产生非常大的冲击,基金经理将不得不根据申购赎回量买卖股票,而且申购赎回资金的流动会直接导致持仓股票权重的变动。因此,对基金管理公司而言,一个实现的、急迫的问题是采用什么样的绩效评估方法反映基金经理的管理能力?

  海外学者对于该问题的研究时间也不长,但迄今为止,已经发展出几种较为实用的多期归因处理方法。目前的几个研究共识是:根据Brinson模型的四个概念性组合,对于基金层面(不对资产进行细分)的多期归因存在精确解;对应类别资产(行业)或者个股层面则不存在精确解。

  很明显,基金层面的多期归因可以采用多种准确计算方法来处理。但是,如果要评价基金经理在细分资产,比如行业和个股上的超额能力就需要用到类别层面的多期归因方法。我们遵循Arnarson等人(2003)的研究,对Davies and Laker(2001)提出的方法进行了拓展,使其可以用于类别资产层面的归因分析。我们提供了一个准确、细分到股票维度,基于交易日的多期Brinson归因分析框架,通过这个框架,可以准确地度量基金组合在任意时间段内的细分资产贡献度、并将超额收益分解到个股层面,从而便于内部绩效评价与投资参考。

  基于上述模型,我们还提供了一个基于现实基金绩效的实证分析,对基金经理的管理能力进行详细分析,以期为国内基金同行和其他买方机构在投资组合绩效评估工作的推进和完善上做出贡献。

  本文的多期Brinson模型解决了基金绩效评估问题的以下重要问题:首先,采用Brinson模型框架解决了对绩效的分解问题,Brinson模型可以将超额收益再分解为超额资产配置收益、超额个股选择收益以及交互收益三个部分;其次,我们采用以交易日为单位的单期计算,可以解决积极型股票组合的持仓变化问题;再次,由于各个分解的归因收益不能简单地进行跨期复合计算,因此,本文的多期技术可以对组合资产中的各细分资产进行多期收益的精确分解;最后,针对实现中的收益计算和资产细分等具体问题提出了解决方法。

posted @ 2011-07-11 13:17 张兵1989 阅读(47) 评论(0) 编辑
1 public static void Main()
2 {
3 DataTable dt = new DataTable();
4 dt.Columns.Add("name");
5 dt.Columns.Add("type");
6 dt.Columns.Add("relt");
7
8 for (int i = 0; i < 4; i++)
9 {
10 DataRow dr = dt.NewRow();
11 dr["name"] = "name" + i;
12 dr["type"] = "type" + i;
13 dr["relt"] = "relt" + i;
14
15 dt.Rows.Add(dr);
16 }
17
18 DisplayTable(dt);
19
20 Console.WriteLine("\r\n =====> 进行行列转换 \r\n");
21
22 DisplayTable(ColumnToRow(dt, 0));
23
24 Console.ReadLine();
25 }
26
27 public static DataTable ColumnToRow(DataTable src_dt, int columnIndex) //columnIndex 用来当作新列名的列
28 {
29 DataTable dt = new DataTable();
30 dt.Columns.Add(src_dt.Columns[columnIndex].ColumnName);
31
32 foreach (DataRow dr in src_dt.Rows)
33 dt.Columns.Add(dr[columnIndex].ToString());
34
35 int n = src_dt.Columns.Count;
36 for (int i = 0; i < n; i++)
37 {
38 if (i == columnIndex) continue; //如果是被当作列名的列,则跳过
39
40 DataRow new_dr = dt.NewRow();
41 string columnName = src_dt.Columns[i].ColumnName;
42 new_dr[0] = columnName;
43
44 foreach (DataRow dr in src_dt.Rows)
45 {
46 string newColumnName = dr[columnIndex].ToString();
47 new_dr[newColumnName] = dr[columnName];
48 }
49
50 dt.Rows.Add(new_dr);
51 }
52
53 return dt;
54 }
posted @ 2011-07-11 13:15 张兵1989 阅读(172) 评论(0) 编辑
1. 避免使用OR操作
在多数情形下,如果SQL语句的WHERE子句中包含了OR,那么SQL可能就不会使用到索引。可以试着用两种方式来代替OR操作,1)用IN 2)用UNION
例如:
SELECT *
FROM TEST A
WHERE A.NO = 9 OR A.NO=23 OR A.NO=21
就算在NO列上建立了索引,上面的SQL也不会使用到索引。可以使用IN的方式改写。
SELECT *
FROM TEST A
WHERE A.NO IN(9,23,21)
这时SQL则可能使用到索引

对于下面的例子
SELECT *
FROM TEST A
WHERE A.JOINEDYEAR=2007 OR A.CITY='NANJING'
在这种情况下,SQL会采用顺序处理策略,而不管JOINEDYEAE、CITY列上是否有索引。该语句也不用使用IN运算符来代替,但可以用UNION代替
SELECT *
FROM TEST
WHERE JOINEDYEAR=2007
UNION
SELECT *
FORM TEST
WHERE CITY='NANJING'

2. 避免UNION运算符的不必要使用
上面建议使用UNION来代替OR操作,但并不意味UNION总是高效,使用时需要仔细思考
例:计算每场比赛的所赢局数与所输局数之差
SELECT MATCHNO, WON - LOST
FROM MATHES
WHERE WON >= LOST
UNION
SELECT MATCHNO, LOST - WON
FROM MATCHES
WHERE WON < LOST
这条SQL将导致浏览整个MATCHES表两次,通过使用函数可以避免这种情况
SELECT MATCHNO, ABS(WON-LOST)
FROM   MATCHES
这时SQL仅浏览MATCHES表一次,买行执行一次计算。执行计算所导致的额外处理时间可由仅浏览一次表所节约的时间补偿。

3. 避免使用NOT运算符
如果在WHERE从句中包含NOT运算符,那么SQL一般不会使用索引。尽可能的使用比较运算符来代替NOT运算符

4. 隔离条件中的列
如果一个定义了索引的列出现在一个计算或标量函数的列上,则不会用到索引
例:
SELECT *
FROM TEST
WHERE NUMBER + 10 = 3500
在比较运算符=的左侧,有一个包含列名和一个常量的表达式,而在比较运算符=的右侧则是一个常量。在这种情况下不会使用NUMBER列上的索引。可以替换成如下形式
SELECT *
FROM TEST
WHERE NUMBER = 3400
这时比较运算符=左侧的表达式仅包含一个列名。也就是说列被隔离了。

5. 使用BETWEEN运算符
在使用AND运算符查看某个特殊范围的值的WHERE从句的条件,SQL一般不会使用索引,这种情况下可以使用BETWEEN运算符来代替用AND描述的条件。
例:
SELECT *
FROM TEST
WHERE DATE >= '1980-09-12' AND DATE <= '1985-12-12'
这样写可能导致用不到DATE列上建立的索引,建议使用如下形式
SELECT *
FROM DATE BETWEEN   '1980-09-12' AND '1985-12-12'

6. 避免LIKE运算符的特殊形式
如果LIKE运算符以一个百分号或一个下划线开始,则不能使用到索引。但有时必须使用这种方式,并没有其他的行之有效的解决方案。

7. 增加冗余条件
有时通过向WHERE从句增加冗余条件,可以加快SQL的处理速度。
例:
SELECT NO, NAME
FROM TEST1 A, TEST2 B
WHERE A.NO = B.NO AND A.NO = 9001
有时增加一个冗余条件可以SQL提高效率
SELECT NO, NAME
FROM TEST1 A, TEST2 B
WHERE A.NO = B.NO AND A.NO = 9001 AND   B.NO = 9001

8. 尽量避免HAVING从句
SQL中可以在两个地方指定条件,一是在WHERE从句中,一是在HAVING从句中。尽可能的在WHERE从句中指定条件。原因是索引不能用于在HAVING从句中指定的条件。
例:
SELECT *
FROM TEST
GROUP BY NO
HAVING NO>=9001
修改为
SELECT *
FROM TEST
WHERE NO >= 9001
GROUP BY NO

9. 尽可能是SELECT 从句小一些
SELECT 从句表达将被显示的列,要避免显示不必要的列,这会影响性能。如果子查询使用EXISTS运算符链接到主查询,但是,该SELECT语句的最终结果不受指定的表达式的影响,则建议在SELECT从句中由一个常量组成的唯一表达式,例如:
SELECT A.NO, A.NAME
FROM TEST1 A
WHERE EXISTS (
SELECT '1'
FROM TEST2
WHERE A.NO = B.NO
)

10. 尽量避免DISTINCT
DISTINCT在结果中删除重复行的同时也给SQL的处理时间带来了负面影响,所以除非必要,否则尽量不用DISTINCT

11. 尽可能使用集合运算符的ALL选项
集合运算符UNION、INTERSECT、EXCEPT的ALL选项的作用是不删除重复行,如果没有指定ALL选择,则必须对所有的行进行排序,以便能够删除重复的行(排序在幕后发生)
例:
SELECT NAME, INITIALS
FROM   PLAYERS
WHERE TOWN = 'STRAT'
UNION ALL
SELECT NAME, INITIALS
WHERE TOWN = 'DOUG'
这里用了关键字ALL,所以SQL将不执行排序来删除可能重复的行。但是思考一下:该结果不会返回重复的行的,因为每个运动员仅可能住在一个城镇。因此,在该例中,如果没有使用ALL关键字,则排序总是被不必要的执行,这会导致性能下降

12. 在可能的情况下,尽量使用外连接而不是UNION运算符
例:对每个运动员,给出其号码、名称、即罚款
SELECT A.PLAYERNO, NAME, AMOUNT
FROM   PLAYERS A, PENALTIES B
WHERE A.PLAYERNO = B.PLAYERNO
UNION
SELECT C.PLAYERNO, NAME, NULL
FROM PLAYERS A
WHERE PLAYERNO NOT IN(
SELECT PLAYERNO
FROM PENALTIES
)
这条SQL写的比较复杂,运行的也会比较慢,例如PLAYERS被访问两次。可以将也句改为如下方式:
SELECT A.PLAYERNO, NAME, AMOUNT
FROM PLAYERS A LEFT OUT JOIN PENALTIES B ON A.PLAYERNO = B.PLAYERNO

13. 避免数据类型转换
数据类型转换会影响SQL的处理速度,如果这种类型转换不是必要的话,应该避免

14. 最后指定最大的表
在表达式链接时,FROM从句内的表的顺序会影响SQL的处理速度,应遵循的规则是:在FROM从句的最后指定最大的表

15. 避免ANY, ALL运算符
许多优化程序在处理带有ALL,ANY运算符是不会使用索引,如果可能,尽量使用聚合函数MIN或MAX来替换
例1:代替ALL
SELECT NO,NAME,BDATE
FROM TEST
WHERE BDATE <= ALL(
SELECT BDATE
FROM TEST
)
用MIN代替为
SELECT NO, NAME, BDATE
FROM TEST
WHERE BDATE = (
SELECT MIN (BDATE)
FROM TEST
)
例2:代替ANY
SELECT NO,NAME,BDATE
FROM TEST
WHERE BDATE > ANY(
SELECT BDATE
FROM TEST
)
用MIN代替为
SELECT NO, NAME, BDATE
FROM TEST
WHERE BDATE > (
SELECT MIN (BDATE)
FROM TEST
)
posted @ 2011-06-17 00:16 张兵1989 阅读(128) 评论(0) 编辑
import pack.b;
import java.sql.*;
//如何使用JDBC_ODBC 桥连接方式
public class c {

/**
*
@param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
//加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//得到连接

Connection con
=DriverManager.getConnection("jdbc:odbc:test","scott","m123");
Statement sm
=con.createStatement();
ResultSet rs
=sm.executeQuery("select * from emp");
System.out.println(
"用户名: "+"职位:"+"上司编号: "+"入职时间: ");
while(rs.next())
{

System.out.println(rs.getString(
2)+" "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5));

}
}
catch(Exception e)
{
e.printStackTrace();
}


}

}

还要添加两个jar

posted @ 2011-06-17 00:15 张兵1989 阅读(33) 评论(0) 编辑
1 import java.sql.*;
2 //用jdbc连接数据库
3 public class zz {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10
11 try
12 {
13 //加载驱动
14 Class.forName("oracle.jdbc.OracleDriver");
15 Connection con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORACLE","scott","m123");
16 Statement sm=con.createStatement();
17 ResultSet rs=sm.executeQuery("select * from emp");
18 System.out.println("用户名: "+"职位:"+"上司编号: "+"入职时间: ");
19 while(rs.next())
20 {
21
22 System.out.println(rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getString(5));
23
24 }
25 rs.close();
26 sm.close();
27 con.close();
28 }
29 catch(Exception e)
30 {
31 e.printStackTrace();
32 }
33
34 }
35
36 }
posted @ 2011-06-17 00:12 张兵1989 阅读(95) 评论(1) 编辑

对商业用户来说,他们后面是成百上千个 供货商,前面是成千上万个消费顾客。怎样利用软件管理错综复杂的供货商和消费顾客,如何做好精细到一个小小调料包的进、销、调、存的商品流通工作,这些都是商业企业需要信息管理系统的理由。软件开发的意义也就在于此。而弄清商业用户如此复杂需求的真面目,正是软件开发成功的关键所在。

经理:“我们要建立一套完整的商业管理软件系统,包括商品的进、销、调、存管理,是总部-门店的连锁经营模式。通过通信手段门店自动订货,供货商自动结算,卖场通过扫条形码实现销 售,管理人员能够随时查询门店商品销售和库存情况。另外,我们也得为政府部门提供关于商品营运的报告。”

分析员:“我已经明白这个项目的大体结构框架,这非常重要,但在制定计划之前,我们必须收集一些需求。”

经理觉得奇怪:“我不是刚告诉你我的需求了吗?”

分析员:“实际上,您只说明了整个项目的概念和目标。这些高层次的业务需求不足以提供开发的内容和时间。我需要与实际将要使用系统的业务人员进行讨论,然 后才能真正明白达到业务目标所需功能和用户要求,了解清楚后,才可以发现哪些是现有组件即可实现的,哪些是需要开发的,这样可节省很多时间。”

经理:“业务人员都在招商。他们非常忙,没有时间与你们详细讨论各种细节。你能不能说明一下你们现有的系统?”

分析员尽量解释从用户处收集需求的合理性:“如果我们只是凭空猜想用户的要求,结果不会令人满意。我们只是软件开发人员,而不是采购专家、营运专家或是财 务专家,我们并不真正明白您这个企业内部运营需要做些什么。我曾经尝试过,未真正明白这些问题就开始编码,结果没有人对产品满意。”

经理坚持道:“行了,行了,我们没有那么多的时间。让我来告诉您我们的需求。实际上我也很忙。请马上开始开发,并随时将你们的进展情况告诉我。”

风险躲在需求的迷雾之后

以上我们看到的是某客户项目经理与系统开发小组的分析人员讨论业务需求。在项目开发中,所有的项目风险承担者都对需求分析阶段备感兴趣。这里所指的风险承 担者包括客户方面的项目负责人和用户,开发方面的需求分析人员和项目管理者。这部分工作做得到位,能开发出很优秀的软件产品,同时也会令客户满意。若处理 不好,则会导致误解、挫折、障碍以及潜在的质量和业务价值上的威胁。因此可见——需求分析奠定了软件工程和项目管理的基础。

拨开需求分析的迷雾

像这样的对话经常出现在软件开发的过程中。客户项目经理的需求对分析人员来讲,像“雾里看花”般模糊并令开发者感到困惑。那么,我们就拨开雾影,分析一下 需求的具体内容:

·业务需求——反映了组织机 构或客户对系统、产品高层次的目标要求,通常在项目定义与范围文档中予以说明。

·用户需求——描述了用户使 用产品必须要完成的任务,这在使用实例或方案脚本中予以说明。

·功能需求——定义了开发人 员必须实现的软件功能,使用户利用系统能够完成他们的任务,从而满足了业务需求。

·非功能性的需求——描述了 系统展现给用户的行为和执行的操作等,它包括产品必须遵从的标准、规范和约束,操作接口的具体细节和构造上的限制。

·需求分析报告——报告所说 明的功能需求充分描述了软件系统所应具有的外部行为。“需求分析报告”在开发、测试、质量保证、项目管理以及相关项目功能中起着重要作用。

前面提到的客户项目经理通常阐明产品的高层次概念和主要业务内容,为后继工作建立了一个指导性的框架。其它任何说明都应遵循“业务需求”的规定,然而“业 务需求”并不能为开发人员提供开发所需的许多细节说明。

下一层次需求——用户需 求,必须从使用产品的用户处收集。因此,这些用户构成了另一种软件客户,他们清楚要使用该产品完成什么任务和一些非功能性的特性需求。例如:程序的易用 性、健壮性和可靠性,而这些特性将会使用户很好地接受具有该特点的软件产品。

经理层有时试图代替实际用户说话,但通常他们无法准确说明“用户需求”。用户需求来自产品的真正使用者,必须让实际用户参与到收集需求的过程中。如果不这 样做,产品很可能会因缺乏足够的信息而遗留不少隐患。

在实际需求分析过程中,以上两种客户可能都觉得没有时间与需求分析人员讨论,有时客户还希望分析人员无须讨论和编写需求说明就能说出用户的需求。除非遇到 的需求极为简单;否则不能这样做。如果您的组织希望软件成功,那么必须要花上数天时间来消除需求中模糊不清的地方和一些使开发者感到困惑的方面。

优秀的软件产品建立在优秀的需求基础之上,而优秀的需求源于客户与开发人员之间有效的交流和合作。只有双方参与者都明白自己需要什么、成功的合作需要什么 时,才能建立起一种良好的合作关系。

由于项目的压力与日俱增,所有项目风险承担者有着一个共同目标,那就是大家都想开发出一个既能实现商业价值又能满足用户要求,还能使开发者感到满足的优秀 软件产品。

客户的需求观

客户与开发人员交流需要好的方法。下面建议20条法则,客户和开发人员可以通过评审以下内容并达成共识。如果遇到分歧,将通过协商达成对各自义务的相互理 解,以便减少以后的磨擦(如一方要求而另一方不愿意或不能够满足要求)。

1、 分析人员要使用符合客户语言习惯的表达

需求讨论集中于业务需求和任务,因此要使用术语。客户应将有关术语(例如:采价、印花商品等采购术语)教给分析人员,而客户不一定要懂得计算机行业的术 语。

2、分析人员要了解客户的业务及目标

只有分析人员更好地了解客户的业务,才能使产品更好地满足需要。这将有助于开发人员设计出真正满足客户需要并达到期望的优秀软件。为帮助开发和分析人员, 客户可以考虑邀请他们观察自己的工作流程。如果是切换新系统,那么开发和分析人员应使用一下目前的旧系统,有利于他们明白目前系统是怎样工作的,其流程情 况以及可供改进之处。`

3、 分析人员必须编写 软件需求报告

分析人员应将从客户那里获得的所有信息进行整理,以区分业务需求及规范、功能需求、质量目标、解决方法和其它信息。通过这些分析,客户就能得到一份“需求 分析报告”,此份报告使开发人员和客户之间针对要开发的产品内容达成协议。报告应以一种客户认为易于翻阅和理解的方式组织编写。客户要评审此报告,以确保 报告内容准确完整地表达其需求。一份高质量的“需求分析报告”有助于开发人员开发出真正需要的产品。

4、 要求得到需求工作结果的解释说明

分析人员可能采用了多种图表作为文字性“需求分析报告”的补充说明,因为工作图表能很清晰地描述出系统行为的某些方面,所以报告中各种图表有着极高的价 值;虽然它们不太难于理解,但是客户可能对此并不熟悉,因此客户可以要求分析人员解释说明每个图表的作用、符号的意义和需求开发工作的结果,以及怎样检查 图表有无错误及不一致等。

5、 开发人员要尊重客户 的意见

如果用户与开发人员之间不能相互理解,那关于需求的讨论将会有障碍。共同合作能使大家“兼听则明”。参与需求开发过程的客户有权要求开发人员尊重他们并珍 惜他们为项目成功所付出的时间,同样,客户也应对开发人员为项目成功这一共同目标所做出的努力表示尊重。

6、 开发人员要对需求及产品实施提出建议和解决方案

通常客户所说的“需求”已经是一种实际可行的实施方案,分析人员应尽力从这些解决方法中了解真正的业务需求,同时还应找出已有系统与当前业务不符之处,以 确保产品不会无效或低效;在彻底弄清业务领域内的事情后,分析人员就能提出相当好的改进方法,有经验且有创造力的分析人员还能提出增加一些用户没有发现的 很有价值的系统特性。

7、 描述产品使用特性

客户可以要求分析人员在实现功能需求的同时还注意软件的易用性,因为这些易用特性或质量属性能使客户更准确、高效地完成任务。例如:客户有时要求产品要 “接口友好”或“健壮”或“高效率”,但对于开发人员来讲,太主观了并无实用价值。正确的做法是,分析人员通过询问和调查了解客户所要的“友好、健壮、高 效所包含的具体特性,具体分析哪些特性对哪些特性有负面影响,在性能代价和所提出解决方案的预期利益之间做出权衡,以确保做出合理的取舍。

8、 允许重用已有的软件组件

需求通常有一定灵活性,分析人员可能发现已有的某个软件组件与客户描述的需求很相符,在这种情况下,分析人员应提供一些修改需求的选择以便开发人员能够降 低新系统的开发成本和节省时间,而不必严格按原有的需求说明开发。所以说,如果想在产品中使用一些已有的商业常用组件,而它们并不完全适合您所需的特性, 这时一定程度上的需求灵活性就显得极为重要了。

9、 要求对变更的代价提供真实可靠的评估

有时,人们面临更好、也更昂贵的方案时,会做出不同的选择。而这时,对需求变更的影响进行评估从而对业务决策提供帮助,是十分必要的。所以,客户有权利要 求开发人员通过分析给出一个真实可信的评估,包括影响、成本和得失等。开发人员不能由于不想实施变更而随意夸大评估成本。

10、 获得满足客户功能和质量要求的系统

每个人都希望项目成功,但这不仅要求客户要清晰地告知开发人员关于系统“做什么”所需的所有信息,而且还要求开发人员能通过交流了解清楚取舍与限制,一定 要明确说明您的假设和潜在的期望,否则,开发人员开发出的产品很可能无法让您满意。

11、 给分析人员讲解您的业务

分析人员要依靠客户讲解业务概念及术语,但客户不能指望分析人员会成为该领域的专家,而只能让他们明白您的问题和目标;不要期望分析人员能把握客户业务的 细微潜在之处,他们可能不知道那些对于客户来说理所当然的“常识”。

12、 抽出时间清楚地说明并完善需求

客户很忙,但无论如何客户有必要抽出时间参与“头脑高峰会议”的讨论,接受采访或其它获取需求的活动。有些分析人员可能先明白了您的观点,而过后发现还需 要您的讲解,这时请耐心对待一些需求和需求的精化工作过程中的反复,因为它是人们交流中很自然的现象,何况这对软件产品的成功极为重要。

13、 准确而详细地说明需求

编写一份清晰、准确的需求文档是很困难的。由于处理细节问题不但烦人而且耗时,因此很容易留下模糊不清的需求。但是在开发过程中,必须解决这种模糊性和不 准确性,而客户恰恰是为解决这些问题作出决定的最佳人选,否则,就只好靠开发人员去正确猜测了。

在需求分析中暂时加上“待定”标志是个方法。用该标志可指明哪些是需要进一步讨论、分析或增加信息的地方,有时也可能因为某个特殊需求难以解决或没有人愿 意处理它而标注上“待定”。客户要尽量将每项需求的内容都阐述清楚,以便分析人员能准确地将它们写进“软件需求报告”中去。如果客户一时不能准确表达,通 常就要求用原型技术,通过原型开发,客户可以同开发人员一起反复修改,不断完善需求定义。

14、 及时作出决定

分析人员会要求客户作出一些选择和决定,这些决定包括来自多个用户提出的处理方法或在质量特性冲突和信息准确度中选择折衷方案等。有权作出决定的客户必须 积极地对待这一切,尽快做处理,做决定,因为开发人员通常只有等客户做出决定才能行动,而这种等待会延误项目的进展。

15、 尊重开发人员的需求可行性及成本评估

所有的软件功能都有其成本。客户所希望的某些产品特性可能在技术上行不通,或者实现它要付出极高的代价,而某些需求试图达到在操作环境中不可能达到的性 能,或试图得到一些根本得不到的资料。开发人员会对此作出负面的评价,客户应该尊重他们的意见。

16、 划分需求的优先级

绝大多数项目没有足够的时间或资源实现功能性的每个细节。决定哪些特性是必要的,哪些是重要的,是需求开发的主要部分,这只能由客户负责设定需求优先级, 因为开发者不可能按照客户的观点决定需求优先级;开发人员将为您确定优先级提供有关每个需求的花费和风险的信息。

在时间和资源限制下,关于所需特性能否完成或完成多少应尊重开发人员的意见。尽管没有人愿意看到自己所希望的需求在项目中未被实现,但毕竟是要面对现实, 业务决策有时不得不依据优先级来缩小项目范围或延长工期,或增加资源,或在质量上寻找折衷。

17、 评审需求文档和原 型

客户评审需求文档,是给分析人员带来反馈信息的一个机会。如果客户认为编写的“需求分析报告”不够准确,就有必要尽早告知分析人员并为改进提供建议。

更好的办法是先为产品开发一个原型。这样客户就能提供更有价值的反馈信息给开发人员,使他们更好地理解您的需求;原型并非是一个实际应用产品,但开发人员 能将其转化、扩充成功能齐全的系统。

18、 需求变更要立即联系

不断的需求变更,会给在预定计划内完成的质量产品带来严重的不利影响。变更是不可避免的,但在开发周期中,变更越在晚期出现,其影响越大;变更不仅会导致 代价极高的返工,而且工期将被延误,特别是在大体结构已完成后又需要增加新特性时。所以,一旦客户发现需要变更需求时,请立即通知分析人员。

19、 遵照开发小组处理需求变更的过程

为将变更带来的负面影响减少到最低限度,所有参与者必须遵照项目变更控制过程。这要求不放弃所有提出的变更,对每项要求的变更进行分析、综合考虑,最后做 出合适的决策,以确定应将哪些变更引入项目中。

20、 尊重开发人员采用的需求分析过程

软件开发中最具挑战性的莫过于收集需求并确定其正确性,分析人员采用的方法有其合理性。也许客户认为收集需求的过程不太划算,但请相信花在需求开发上的时 间是非常有价值的;如果您理解并支持分析人员为收集、编写需求文档和确保其质量所采用的技术,那么整个过程将会更为顺利。

“需求确认”意味着什么

在“需求分析报告”上签字确认,通常被认为是客户同意需求分析的标志行为,然而实际操作中,客户往往把“签字”看作是毫无意义的事情。“他们要我在需求文 档的最后一行下面签名,于是我就签了,否则这些开发人员不开始编码。”

这种态度将带来麻烦,譬如客户想更改需求或对产品不满时就会说:“不错,我是在需求分析报告上签了字,但我并没有时间去读完所有的内容,我是相信你们的, 是你们非让我签字的。”

同样问题也会发生在仅把“签字确认”看作是完成任务的分析人员身上,一旦有需求变更出现,他便指着“需求分析报告”说:“您已经在需求上签字了,所以这些 就是我们所开发的,如果您想要别的什么,您应早些告诉我们。”

这两种态度都是不对的。因为不可能在项目的早期就了解所有的需求,而且毫无疑问地需求将会出现变更,在“需求分析报告”上签字确认是终止需求分析过程的正 确方法,所以我们必须明白签字意味着什么。

对“需求分析报告”的签名 是建立在一个需求协议的基线上,因此我们对签名应该这样理解:“我同意这份需求文档表述了我们对项目软件需求的了解,进一步的变更可在此基线上通过项目定 义的变更过程来进行。我知道变更可能会使我们重新协商成本、资源和项目阶段任务等事宜。”对需求分析达成一定的共识会使双方易于忍受将来的摩擦,这些摩擦 来源于项目的改进和需求的误差或市场和业务的新要求等。

需求确认将迷雾拨散,显现需求的真面目,给初步的需求开发工作画上了双方都明确的句号,并有助于形成一个持续良好的客户与开发人员的关系,为项目的成功奠 定了坚实的基础。

posted @ 2011-06-17 00:11 张兵1989 阅读(25) 评论(0) 编辑

posted @ 2011-06-17 00:09 张兵1989 阅读(51) 评论(0) 编辑

C语言程序

  //利用循环输出前40项

  #include <stdio.h>

  int main()

  {

  long fib[41] = {0,1};

  int i;

  for(i=2;i<41;i++)fib[i] = fib[i-1]+fib[i-2];

  for(i=1;i<41;i++)printf("F%d==%d\n",i,fib[i]);

  getch();

  return 0;

  }

  //利用递归实现指定项输出

  第n项和。(1<n<25)

  #include<stdio.h>

  void main()

  {

  long int f1,f2;

  int n,i,c;

  scanf("%d",&n);

  f1=1;f2=1;

  for(i=1;i<=n;i++)

  {

  c=i+1;

  printf("%dItem=%ld %dItem=%ld ",i,f1,c,f2);

  if(i%2==0)printf("\n");

  f1=f1+f2;

  f2=f2+f1;

  }

  }

posted @ 2011-06-17 00:04 张兵1989 阅读(8) 评论(0) 编辑
仅列出标题  下一页