摘要: 花N长时间积累的Jquery插件,希望大家喜欢。大家还有什么新的插件,请留言,我们一并收录。感谢大家的支持。1.accordion类基于jQuery开发,非常简单的水平方向折叠控件。Horizontal accordion: jQuery热点图书:www.hotbook.cnjQuery-Horizontal Accordion具有XBOX360 blade界面风格的水平方向Accordion。jQuery-Horizontal AccordionjQuery plugin: Accordion用于创建 折叠菜单的jQuery插件。jQuery plugin: Accordion热点图书:ww阅读全文
posted @ 2011-10-18 21:11 克隆 阅读(11) 评论(0) 编辑
摘要: DiggStyle<1234567...199200>YahooStyle<1234567...199200>New Yahoo!Style1234567...199200Next >MeneameStyle<1234567...199200>FlickrStyle<1234567...199200>Sabros.usStyle<1234567...199200>Green Style<1234567...199200>Gray Style<1234567...199200>Black Style<阅读全文
posted @ 2011-10-18 21:10 克隆 阅读(11) 评论(0) 编辑
摘要: l Web程序运行时,页面效果概览未加载数据时的效果执行了数据库查询,没有符合条件的结果时的效果执行了数据库查询,返回10条查询结果时的效果(PageSize设置为5,所以进行了分页)点击列标题进行排序DataPager分页控件l 如何实现自定义组合条件的复杂查询?实现步骤如下:1. QueryCondition 类首先定义一个 QueryCondition 类,包含了查询条件的组合,以及排序规则。该class中的各个字段都为可空类型,为空即表示不依据该字段查询,从而不需要将参数设置为0或者-1或者“”以表示同样的目的。其中,PatternQueryKeywordsScope用于定义Keywo阅读全文
posted @ 2011-10-06 20:53 克隆 阅读(29) 评论(0) 编辑

网络打印概述

◆B/S结构导致了Web应用程序中打印的特殊性。
◆程序运行在浏览器中,打印机在本地,而文件却可能在服务器上,导致了打印控制不是很灵活。
◆格式如何控制和定制等,是我们开发中可能会面对的问题。

打印文档的生成

1、客户端脚本方式

一般情况下,主要使用JS可以分析源页面的内容,将欲打印的页面元素提取出来,实现打印。通过分析源文档的内容,可以生成打印目标文档。

优点:客户端独立完成打印目标文档的生成,减轻服务器负荷;

缺点:源文档的分析操作复杂,并且源文档中的打印内容要有约定。

2、服务器端程序方式

利用后台代码从数据库中读取打印源,生成打印目标文档。当的页面生成时,还应适当考虑使用CSS来实现强制分页控制。

优点:可以生成内容非常丰富的打印目标文档,目标文档的内容的可控性强。由于打印内容是从数据库中获取的,所以生成操作相对简单;

缺点:服务器端负载比较大。

页面设置

◆页面设置主要是指设置打印文档的页边距、页眉、页脚、纸张等内容。页面设置将直接影响到打印文档版面的生成效果,所以它和打印文档的生成有着密切的关系。比如:表格的行数、大小、位置、字体的大小等。

现有的技术是利用IE 6.0内置的打印模板方式来控制页面设置,其可以对打印目标文档产生非常大的影响。打印模板可以控制页边距、页眉、页脚、奇偶页等内容,并可以将用户的设置取得,还可以将设置发送到服务器端。打印模板技术可以自定预览窗口和打印格式,最大限度地影响目标文档和打印效果。

IE直接打印

直接调用window.print或者webrower控件的ExecWB方法来打印。

优点:方便快捷,客户端无需任何设置即可。

缺点:打印控制不是很灵活。如果直接调用。

window.print来打印页面,页面上别的元素也会被打印处理,页头页尾的格式也不好控制。

常用方法:大部分情况会把查询的结果绑定到DataGrid上来,然后打印DataGrid。这种情况的打印一般来说格式比较固定简单,确定后基本不会再作更改。所以可以采用IE直接打印。

【实例代码】

注:

①这是客户端通过window.print打印指定内容。这里定义sprnstr和eprnstr来指定内容。执行代码:

<input type="button" name="print" value="预览并打印" onclick="preview()">

②如果直接使用window.print将打印页面上的所有内容,但是我们可以使用:

st<<style> @media Print { .Noprn { DISPLAY: none }}

用来指定不打印的内容。

script language="Javascript">
function preview()
{
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->";
eprnstr="<!--endprint-->";
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17);
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));
window.document.body.innerHTML=prnhtml;
window.print();
}
</script>
<!--省略部分代码-->
<form id="WebForm1" method="post" runat="server">
<center>本部分以上不被打印</center>
<!--startprint-->
<div align="center">
<asp:DataGrid id="dgShow" runat="server">
<!--省略部分代码-->
</asp:DataGrid>
</div>
<!--endprint-->
<center>本部分以下不被打印</center>
<div align="center">
<input type="button" name="print" value="预览并打印" onclick="preview()">
</div>
<style> @media Print { .Noprn { DISPLAY: none }}
</style>
<p class="Noprn">不打印</p>
<table id="datagrid">
<tr>
<td>打印</td>
</tr>
</table>
<input class="Noprn" type="button" onclick="window.print()" value="print">
</form>

#p#

WebBrowser控件技术

◆打印操作的实现

此功能的实现主要是利用WebBrowser控件的函数接口来实现打印、打印预览(默认的)、页面设置(默认的)。

CLASSID=‘CLSID:8856F961-340A-11D0-A96B-00C04FD705A2’>
//打印
WebBrowser1.ExecWB(6,1);
//打印设置
WebBrowser1.ExecWB(8,1);
//打印预览
WebBrowser1.ExecWB(7,1);
//直接打印
WebBrowser1.ExecWB(6,6);

【实例代码】

//自定义类PrintClass
public string DGPrint(DataSet ds)
{
//DGPrint执行的功能:根据DataTable转换成对应的HTML对应的字符串
DataTable myDataTable=new DataTable();
myDataTable=ds.Tables[0];

int myRow=myDataTable.Rows.Count;
int myCol=myDataTable.Columns.Count;

StringBuilder sb=new StringBuilder();

string colHeaders=""+"<object ID=‘WebBrowser1’ WIDTH=0 HEIGHT=0
CLASSID=‘CLSID:8856F961-340A-11D0-A96B-00C04FD705A2’>
//打印
WebBrowser1.ExecWB(6,1);
//打印设置
WebBrowser1.ExecWB(8,1);
//打印预览
WebBrowser1.ExecWB(7,1);
//直接打印
WebBrowser1.ExecWB(6,6);

在把DataGrid转换为对应的HTML代码时,如果存在按钮列就会报错,最好把这一列隐藏,一般只能转换数据列。其次要注意分页问题,一般只能打印当前一页,最好在打印之前除掉分页。导出到Excel,Word中去打印。可以在服务端或者客户端进行。

优点:使用这种方法,可适应性比较强,控制较好。

缺点:在服务端使用的话,要求服务端要安装Word,Excel,在客户端使用的话,要求客户端在IE的安全设置上有一定要求。

【实例代码】

protected void btnMIME_Click(object sender, System.EventArgs e)
{
BindData();

Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "inline;
       filename="+HttpUtility.UrlEncode("下载文件.xls",Encoding.UTF8));        

//如果输出为Word,修改为以下代码
//Response.ContentType = "application/ms-word"
//Response.AddHeader("Content-Disposition", "inline;filename=test.doc")
StringBuilder sb=new StringBuilder();
System.IO.StringWriter sw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);
sb.Append("");
dgShow.RenderControl(hw);
sb.Append("");
Response.Write(sb.ToString());
Response.End();
}

protected void btnCom_Click(object sender, System.EventArgs e)
{
ExportToExcel(BindData(),Server.MapPath("ComExcel.xls"));
}
//从DataSet到出到Excel
#region从DataSet到出到Excel
///导出指定的Excel文件
public void ExportToExcel(DataSet ds,string strExcelFileName)
{
if (ds.Tables.Count==0 || strExcelFileName=="") return;
doExport(ds,strExcelFileName);
}
///执行导出
private void doExport(DataSet ds,string strExcelFileName)
{
excel.Application excel= new excel.Application();
int rowIndex=1;
int colIndex=0;
excel.Application.Workbooks.Add(true);
System.Data.DataTable table=ds.Tables[0] ;
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[1,colIndex]=col.ColumnName;
}

foreach(DataRow row in table.Rows)
{
rowIndex++;
colIndex=0;
foreach(DataColumn col in table.Columns)
{
colIndex++;
excel.Cells[rowIndex,colIndex]=row[col.ColumnName].ToString();
}
}
excel.Visible=false;
excel.ActiveWorkbook.SaveAs(strExcelFileName+".XLS",
       Excel.XlFileFormat.xlExcel9795,null,null,false,false,
       Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null,null);
excel.Quit();
excel=null;
GC.Collect();//垃圾回收
}
#endregion

#p#

利用.Net组件打印

利用.Net组件

◆优点:这种打印方式对于格式变化大,数据量小的应用来说非常合适。

◆缺点:

◆需要客户端安.Net framework组件。
◆Xml的解析上,如果文件较大速度上不是很理想。
◆页面首次加载时会有明显的延时。

使用XSL和XSLT转换Xml

◆XSL:扩展样式表语言,可以通过它来把Xml转换为其他的文本格式。
◆XSL转换包括发现或者选择一个模式匹配,通过使用XPath选择一个结果集,然后对结果集中的每一项,为这些匹配定义结果输出。
◆XSL是一个功能强大的工具,可以把Xml转换成任何你想要的格式。

【参考代码】

XslTransform xslt = new XslTransform();
xslt.Load(Server.MapPath( "StudentsToHTML.xsl") );

XPathDocument XDoc = new XPathDocument(Server.MapPath( "Students.Xml" ));
XmlWriter writer = new XmlTextWriter( server.MapPath("Students.html"),

System.Text.Encoding.UTF8 );
xslt.Transform( XDoc, null, writer );
writer.Close();
Response.Redirect("Students.html");

利用ActiveX控件打印

利用第三方控件

◆自己开发控件。这种方式很多商用软件采用这种方式,写成控件后已经无所谓是在web中使用还是应用程序中使用了。

优点:打印方式非常灵活,基本上程序能做到的web也能做得到。

缺点:客户端需要安装组件,部署不是很方便。

使用水晶报表

◆用户仅需要Web 浏览器就可以查看报表。
◆报表查看器控件可以是应用程序中众多控件之一。
◆与报表轻松交互
◆用户可将报表导出为Microsoft word 和Excel 格式,以及PDF、HTML 和Crystal Reports for visual Studio .Net格式。
◆可以使用报表控件直接打印

【实例代码】

//水晶报表的填充,省略连接代码
myReport ReportDoc = new myReport();
ReportDoc.SetDataSource(ds);
Crv.ReportSource = ReportDoc;

//输出为指定类型文件
CrystalDecisions.Shared.DiskFileDestinationOptions DiskOpts = new
  CrystalDecisions.Shared.DiskFileDestinationOptions();
ReportDoc.ExportOptions.ExportDestinationType =
  CrystalDecisions.Shared.ExportDestinationType.DiskFile;
string strFileName = server.MapPath("Output");
switch (ddlFormat.SelectedItem.Text)
{
case "Rich Text (RTF)":
ReportDoc.ExportOptions.ExportFormatType =
                CrystalDecisions.Shared.ExportFormatType.RichText;
DiskOpts.DiskFileName =strFileName + ".rtf";
break;
case "Portable Document (PDF)":
ReportDoc.ExportOptions.ExportFormatType =
                CrystalDecisions.Shared.ExportFormatType.PortableDocFormat;
DiskOpts.DiskFileName = strFileName + ".pdf";
break;
case "MS word (DOC)":
ReportDoc.ExportOptions.ExportFormatType =
                CrystalDecisions.Shared.ExportFormatType.WordForWindows;
DiskOpts.DiskFileName = strFileName + ".doc";
break;
case "MS excel (XLS)":
ReportDoc.ExportOptions.ExportFormatType =
                CrystalDecisions.Shared.ExportFormatType.Excel;//
DiskOpts.DiskFileName = strFileName + ".xls";
break;
default:
break;
}
ReportDoc.ExportOptions.DestinationOptions = DiskOpts;
ReportDoc.Export();

//打印
// 指定打印机名称
string strPrinterName;
strPrinterName = @"Canon Bubble-Jet BJC-210SP";
// 设置打印页边距
PageMargins margins;
margins = ReportDoc.PrintOptions.PageMargins;
margins.bottomMargin = 250;
margins.leftMargin = 350;
margins.rightMargin = 350;
margins.topMargin = 450;
ReportDoc.PrintOptions.ApplyPageMargins(margins);
//应用打印机名称
ReportDoc.PrintOptions.PrinterName = strPrinterName;
// 打印 // 打印报表。将startPageN 和endPageN
// 参数设置为0 表示打印所有页。
ReportDoc.PrintToPrinter(1, false,0,0);
posted @ 2011-08-05 13:20 克隆 阅读(165) 评论(0) 编辑

引言:数据库设计 Step by Step (4)中我们讨论了泛化关系、聚合关系、三元关系等高级实体关系模型构件及其语义。从本次讲座开始我将引领大家开始数据库设计之旅,我们将从需求分析开始,途中将经过概念数据建模、多视图集成、ER模型转化为SQL、范式化等过程,最终得到完整、可用的SQL表。

需求分析在数据库生命周期中至关重要,通常也是涉及人员最多的步骤。数据库设计师在这个阶段必须走访最终用户,与他们进行访谈,从而确定用户想在系统中存储什么数据以及想怎样使用这些数据。我们将需求分析分为两个步骤:1.理解用户需求;2.提取业务规则。这次我们先讨论“理解用户需求”。

image

设计定制化产品——无论是一个数据库、一幅平面广告或一个玩具,都是一个“翻译”的过程。我们需要把浮现在客户脑海中的模糊想法、愿望挖掘出来,并“翻译”成满足他们需求的现实产品。

这个“翻译”过程的第一步就是理解用户的需求。设计最好的订单处理系统对于需要一个电路设计工具的客户来说毫无意义。对客户需求理解的不完全会造成错误或无用的设计与开发,这浪费了你、你的团队还有客户的时间与金钱。(牢记数据库是整个应用开发的根基)

制定一个计划

我们首先制定了一个计划,其中包含挖掘客户需求的一系列步骤。遵循这些步骤能更好地理解客户需求,但在一些项目中我们不需要遵循所有的步骤。举例来说,如果客户是单个人且需求很明确时,我们就不需要进行“搞清谁是谁”与“头脑风暴”了。当客户的数据需要保密时,我们就不能“尝试客户的工作”了。在另一些项目中,调整这些步骤的顺序会更为合适。例如我们可能在去拜访客户和观察他们工作之前先进行“头脑风暴”。

以下按照最普遍的顺序列出了各个步骤。大家根据不同项目的情况可进行灵活调整,目标只有一个就是更好地理解用户需求。

  1. 列出问题清单
  2. 拜访客户
  3. 搞清谁是谁
  4. 挖掘客户大脑
  5. 尝试客户的工作
  6. 学习现有操作
  7. 头脑风暴
  8. 展望未来
  9. 理解客户的质疑
  10. 弄清客户的真正需求
  11. 优先级
  12. 确认你的理解
  13. 撰写需求文档

下面我们将一一解释每一个步骤。

列出问题清单

我们需要思考,向客户问些什么问题可以帮助我们了解项目的目标和范畴(scope)。以下几个方面的问题可以作为起始点。

功能:

以下问题主要涉及系统应完成的功能与目标。

  1. 系统应该做些什么?
  2. 为什么你想建这个系统?
  3. 系统看上去应该是怎样的?
  4. 需要些什么报表?
  5. 用户需要自己定义新报表吗?
  6. 系统的操作者会是谁?

数据需求:

这些问题是为了弄清项目的数据需求。了解需要些什么数据能帮助我们定义数据库表。

  1. 系统界面上需要展现哪些数据?
  2. 这些数据应该由谁来提供?
  3. 这些数据是如何关联的?
  4. 这些工作现在是如何处理的?数据来自哪里?

数据完整性:

这些问题能帮助我们在构建数据库时定义完整性约束。

  1. 哪些数据是必须填写的?(eg: 一条客户记录必须有电话信息吗?)
  2. 数据的有效域是什么?(eg: 电话号码是否有格式规定?地址数据应有多长?)
  3. 系统是否需要根据邮编来检验城市的有效性?
  4. 系统中是否必须在定义了客户之后才能下订单?
  5. 系统要求多高的可用性等级?(系统需要7×24的可用性吗?数据的备份频率要多高?)

安全性:

这些问题能帮助我们了解客户对权限控制与审计方面的需求。

  1. 是否每个用户都需要一个不同的密码?
  2. 是否需要控制不同的用户所能访问的数据?(eg: 销售代表有权限看到客户的信用卡账号,但订单录入专员却不能)
  3. 存储在数据库中的数据是否需要加密?
  4. 谁做了什么操作是否需要记录以便于审计?(eg: 记录销售代表提高客户级别的操作,在需要时可以追溯操作的原因)
  5. 系统中的客户分成几个级别?每个级别的客户有多少?
  6. 是否已有文档记录了用户的工作与权责?

环境:

这些问题能帮助我们了解当前项目将代替其他什么系统或流程,以及项目将与其他哪些系统进行交互。

  1. 当前项目是要代替或升级现有的某系统吗?

    •是否有描述现有系统的文档?

    •现有系统的哪些功能是需要的?哪些是不需要的?

    •现有系统处理些什么数据?这些数据是如何存储的?数据之间是如何关联的?

    •是否有关于现有系统数据的文档?

  2. 当前项目必须与其他哪些系统交互?

    •项目与其他系统之间如何交互?

    •新项目是否需要向现有系统提供数据?如何提供?

    •新项目是否需要接收现有系统的数据?如何接收?

    •是否有关于其他系统的文档?

  3. 客户的整个业务流程是怎样的?(了解在整个业务流程中当前项目的作用)

拜访客户

了解我们要设计和搭建的系统的最好方式是询问客户。拿着我们在上一步中准备的问题清单安排与客户进行会面。这不会像闲聊那么轻松,向客户了解需求是一个冗长且折磨人的过程。

有时我们的穷追猛问会使客户筋疲力竭感到不快。在这些时候我们必须更为耐心,可以分几次多次会议来了解需求,每次针对几个问题或流程。我们的目标是对我们要解决的问题有一个完全且彻底的理解。

即使我们的项目只是去解决整个业务中的一小部分问题,我们也要试图去了解客户的整体业务流程,这可能会给我们带来意想不到的收获。

搞清谁是谁

意识到不同的客户可能对项目有不同的愿景。我们需要分辨出谁是领导,谁是积极支持者,谁是旁观者,谁是唱反调者。

以下列出了一些常见的客户角色:

  1. 项目发起人——一般是管理层的某位领导,他是项目的最高推动者。他会为项目协调资源,解决项目遇到的一些障碍,但他不会参与到项目每天的事务中。
  2. 项目执行负责人——他对于客户的需求和整个业务最为了解。他是了解用户需求阶段最重要的人,他必须有足够的时间来帮助我们定义项目目标以及回答我们的问题。当别人对某业务环节迟疑不决时,我们需要向他请教。
  3. 客户代表——客户代表是回答我们问题的人,他们也可能成为系统的最终用户。他们可能是某一部分业务的专家,我们需要与多个客户代表进行访谈来了解业务全貌。
  4. 利益相关者——这是项目将影响到的人,其中某些人可能同时也是客户代表。这些人可能对项目也有兴趣,但未必对系统都有发言权。我们在进行系统设计时也需要考虑对这些人的影响(特别是附带损害)。
  5. 唱反调者——这是我们需要关注的一些人。如果唱反调者只是让其他人理性或现实地来看待项目,而并不是彻底反对这个项目的话,他将是我们非常好的资源,他将帮助我们说服其他对项目抱有不切实幻想的客户。而如果唱反调者对整个项目抱有抵触时,我们就必须非常小心,有时需要项目执行负责人出面来协调这些人。

挖掘客户大脑

一旦搞清楚谁是谁之后,我们就要与项目执行负责人讨论客户需要什么。客户希望的解决方案是怎样的,需要包含什么数据,怎样呈现,以及不同数据之间如何关联。

与尽可能多的利益相关者进行交流,我们需要考虑每个人的意见,但心中要牢记项目执行负责人最为理解客户的需求并具有最终决定权。

根据项目的规模,这一过程短则几个小时,长则需要几周才能完成。

尝试客户的工作

观察客户每日的工作能帮助我们更好的理解业务。如果我们能做一会儿客户的工作来了解其中包括的内容那就最好了。

即使我们不能实际尝试客户的工作,一般我们还是可以坐在他们身边近距离观察。告诉客户我们将稍稍降低他们的工作效率并问一些愚蠢且恼人的问题,之后我们就可以开问了。在这个过程中要进行记录,学习尽可能多的东西。有些时候外行者的一些看法可能转化为客户怎么也不会想到的好主意。

学习现有操作

在尝试客户的工作之后,我们还可以看一下是否有其他途径能了解现有流程。通常公司有描述客户角色和职责的操作手册或文档。

寻找客户现在使用的数据存储方式,可能是关系型数据库系统或是电子表格或是纸质的单据等等。了解这些数据是怎样使用的,之间是如何关联的。一般物理数据库之间是通过包含冗余信息来相互关联的,如:客户ID。

头脑风暴

此刻我们已经对客户的业务和需求较为了解了。为了确认没有什么遗漏,我们需要安排头脑风暴。召集项目执行负责人和尽可能多的客户代表与利益相关者,向他们描述前期了解到的需求情况,之后让他们畅所欲言谈谈其中有什么问题或还缺什么。

在这个过程中我们不急于答应或排除任何客户的要求,我们先把客户说到的东西记录下来,并确定这些方面我们已经考虑到了。在正式开发前,我们会与项目执行负责人一起根据项目的规模与交付期限确定需求的优先级。

展望未来

在头脑风暴过程中思考一下将来的需求。问问客户他们的业务在将来是否会变化或他们希望系统将来能包含什么功能。

我们可以把他们的一些想法放入当前的项目中,即使不能也可以使我们知道将来可能会有些什么扩展,在设计数据库时我们能预先留有余地。

理解客户的质疑

一些热心且懂些技术的用户会跑来建议我们如何设计系统,应该创建怎样结构的数据表。我们可能觉得这些建议毫无意义甚至可笑。但在忽视这些建议之前我们应谨慎思考用户提出这些建议或质疑的深层原因是什么。客户比我们更了解业务,他们的建议或质疑中可能蕴含着我们还未了解到的业务变化点或某些特殊业务情况。

弄清客户的真正需求

有时客户并不了解自己的真正需求。他们能看到问题的表象,但未必清楚其根源。我们需要帮助客户寻找到问题的根源并针对问题的源头提出解决方案。

有时客户认为数据库或新系统能神奇般的提高销售,减少成本。事实上一个设计精良的数据库能减少输入差错,提高操作效率,提供数据报表,帮助客户管理数据等等。我们在与客户沟通的过程中需要告诉他们新系统能做些什么,不能做些什么,让客户建立起正确的预期。

优先级

经过先前的步骤,我们已列出一张长长的期望功能列表。其中的某些功能可能不切实际或超出了当前项目的范畴。为了使项目规模可控,我们要与客户一起定义功能的优先级。

一般我们可以把功能分为三个等级。第一优先级是在本期开发中必须包含的功能,没有完成这些功能意味着项目的失败。第二优先级是可以放到下一期开发的功能,当第一优先级的功能完成后,我们可以把第二优先级的部分功能提到当期开发。第三优先级是那些相对不重要或超出项目范畴的功能,我们可以忽略这些功能。

有些情况下优先级是可能转化的。当第一优先级的某功能非常难实现时,我们可以与客户进行沟通,确认该功能是否如此重要,是否能移到第二优先级中以避免影响项目进度。当第二优先级中的某些功能很容易实现,我们可以把该功能调整到第一优先级列表中。但做这些调整之前必须与客户沟通,得到客户的认可。

验证你的理解

梳理我们对业务和需求的理解,并一一与客户进行确认。当客户说“但是”、“除了”、“有时”等词时,我们要特别当心,确认客户只是强调了我们已经知道的东西,而没有出现新的情况。在这个阶段客户可能会想到他们之前没有考虑到的例外情况。

例外情况是数据库设计的大害。在需求分析阶段把例外情况挖掘出来,我们才能在数据库设计时有所准备。例如,我们向客户确认退货流程说:“到这里收货员会输入RMA号并点击完成按钮是吗?”客户可能会说:“嗯…这是大多数情况,但有时没有RMA号,收货员会填入None。”这就是一个客户之前没有告诉我们的重要例外情况,我们必须立刻记录下来。再有一个例子,假设客户使用的纸质订单有配送地址与账单地址两个栏目。我们向客户确认时说:“订单需要有一个配送地址和一个账单地址。”客户打断说:“有时我们需要两个配送地址,因为订单不同部分可能要送到不同的地方。”,并找出一张订单,第二个配送地址被标注在订单的边沿处。这是一个重大例外,在纸上可以很容易的进行标注,但在数据库的一个表单元中增加一个地址是不可能的。只有知道这一例外,我们才能用设计的方法解决这一需求。

撰写需求文档

需求文档描述了我们要构建的系统,该文档也被称为需求规格说明。需求文档要讲清楚我们将构建怎样的系统,该系统会完成什么工作,包含哪些功能点,并描述客户如何使用该系统来解决他们的问题。需求文档明确了项目将完成的功能,这也避免了系统交付时出现争执的情况。

需求文档中应定义可交付成果,即里程碑。里程碑是可直观展现并能验证的中间成果。客户通过里程碑能衡量项目的进度。在需求文档中还需定义最终交付成果,这也是确定项目是否完成的标准。

用例图是一种非常好的需求分析工具,可以作为需求文档的一部分。用例图的最主要功能就是用来表达系统的功能性需求或行为。用例图从业务角度上体现谁来使用系统、用户希望系统提供什么样的服务,以及用户需要为系统提供的服务,也便于软件开发人员最终实现这些功能。在官方文档中用例图包含六个元素,分别是:参与者(Actor)、用例(Use Case)、关联关系(Association)、包含关系(Include)、扩展关系(Extend)以及泛化关系(Generalization)。但是有些UML的绘图工具多提供了一种直接关联关系(Directed Association)。

  1. 参与者:是指用户在系统中扮演的角色
  2. 用例:是指外部可见的系统功能,对系统提供的服务进行描述
  3. 关联关系:连接参与者和用例,表示该参与者代表的外部系统实体与该用例描述的系统需求有关
  4. 包含关系:是来自于用例的抽象,即从数个不同的Use Case中,分离出公共的部分,而成为可以复用的用例
  5. 扩展关系:表示某一个用例的对话流程中,可能会根据条件临时插入另外一个用例,而前者称为基础用例后者称为扩展用例
  6. 泛化关系:一个用例可以被特别列举为一个或多个用例,这被称为用例泛化

eg:用户管理的用例图如下所示,图中人形图标表示参与者,椭圆表示用例(图的出处请参见“总结与参考”)

image

Summary

主要内容回顾

1. 搞清哪个客户扮演哪个角色

2. 从客户的脑海中挖掘信息

3. 寻找关于用户角色、职责、现有流程和现有数据的文档

4. 观察客户的工作,学习他们的业务操作

5. 进行头脑风暴,把收集到的功能需求点按优先级分成第一、第二和第三级

6. 确认对客户需求的理解

7. 撰写需求文档,包含可验证的里程碑和用例

用例图参考

1. 初学UML之-------用例图(http://blog.csdn.net/dl88250/archive/2007/10/16/1826713.aspx

2. UML用例图(http://www.alisdn.com/wordpress/?p=1161

转自:DBFocus

posted @ 2011-06-01 09:30 克隆 阅读(40) 评论(0) 编辑
摘要: 一直在为弹出遮挡层的div烦恼着,今天网上找了下,发现jmpopups很不错,稍微修改下,基本上可以实现需要功能总体HTML代码:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>Untitled</title>&阅读全文
posted @ 2011-04-15 13:50 克隆 阅读(245) 评论(0) 编辑
摘要: 以前用那个SQL语句来生成那个SQLServer库的数据字典,在SQL2000下用的挺好的,最近装上了那个SQL2008来研究,突然发现不能在2008下用了,查了查资料,发现2008下有一些改动贴上来留个记号SQLServer2008/2005 生成数据字典语句Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->SELECT表名=casewhena.colorder=1thend.nameelse''end,表说明=casewhe阅读全文
posted @ 2011-04-14 09:38 克隆 阅读(69) 评论(1) 编辑
摘要: http://www.cftea.com/c/2009/04/GVQCPXGMHTEC3XEM.asp我将在本文里向你介绍 SQLServer2008 的一个新特点:HierarchyID 数据类型。我们会看到这个新的数据类型提供了处理树形结构的一个崭新的方法。它增加了 T-SQL 的功能并提升了性能。本文通过与基于 CTE 的典型方法相比较,深入的介绍了该新的数据类型并给出了一些例子。对于信息系统而言,管理具有层次结构的数据是常见的问题。它是如此的经典以至于我们可以找到很多案例,例如,著名的 Employee 表。其他例子如管理目录树或文件系统的建模。Employee 层次问题比较简单,我们阅读全文
posted @ 2011-04-11 10:32 克隆 阅读(106) 评论(0) 编辑
摘要: 研究了一段时间的OSWorkflow,对其表结构做了一些分析,能帮助深入的学习:以Oracle为例1.========================================================================================create table OS_PROPERTYENTRY --存储propertyset的值(具体字段还不清晰以后补充)(GLOBAL_KEY varchar(255),ITEM_KEY varchar(255),ITEM_TYPE smallint,STRING_VALUE varchar(255),DATE_VAL阅读全文
posted @ 2011-04-05 19:26 克隆 阅读(202) 评论(0) 编辑
摘要: VML是The Vector Markup Language(矢量可标记语言)的缩写。VML用于将图形数据矢量化的标记语言。这是一种基于 XML 语法的语言,由 AutoDesk 、 Macromedia 和 Microsoft 和 HP 公司向 W3C 提出的方案,于1999年9月附带IE5.0发布的。使用VML可以在IE中绘制矢量图形,所以有人认为VML就是在IE中实现了画笔的功能。要使用VML,我们首先要开辟一个命名空间。document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml', &quo阅读全文
posted @ 2011-03-05 19:46 克隆 阅读(77) 评论(0) 编辑