Sandcastle生成项目文档手册
作者:admin 日期:2008-09-20
用过NDOC的对生成CHM的项目文档应该不会陌生,可惜那丫居然不再做下去了。还好,MS公司的Sandcastle顶上来了,当然,现在很多高手们也在不断地开发类似NDOC这样的文档生成工具。但用来用去,还是这个比较喜欢,可以自动把其它语言代码也同时生成(类似MSDN)一样。可是网上对这个东东都是一些介绍性的文档,没有说如何使用,这里就把我使用的过程供大家分享,一起学习.
当然,我所说的这工具,是在VS。NET开发环境实现,Java好像也有同样的生成工具的。
Sandcastle生成的输出结果具有以下特点:
类似于MSDN布局的界面。
自动生成索引项、内容项目表、主题块和页面布局,提高一致性和熟悉程度。
自动生成语法宣称部分。
自动生成继承表。
代码彩色化。
提供多种风格和语言选择,终端用户可从中选择自己最喜欢的形式。
输出结果以HTML和CSS形式显示,微软承诺将来提供更多选择。
看到这样好的东西,我估计你也想试一试吧。呵呵。
使用前提:
在你的Solution里面的每个项目里,都会有一个Bin文件夹,同时你必须要让你的项目能生成一个XML文件.(在属性里面设置xml document file),除此之外,在每个方法或函数里面都要写上对应的注释。
如图:
怎么让项目生成一个XML document file
代码中对应的注释:在每个方法前加三个斜杠 /// 会自动出来
做好了以上这两个前提准备,你的Bin文件下就应该有Sandcastle的东东了。
[em11]
[下载]
废话少说,先去当一个Sandcastle再说
还好,MS免费提供了下载:
http://www.microsoft.com/downloads/details.aspx?FamilyId=E82EA71D-DA89-42EE-A715-696E3A4873B2&displaylang=en
如果对这个玩艺儿有意思的话,可以去下载源码研究一下,开源嘛,不研究一下对不起脑子。
下载地址:
https://blogs.msdn.com/sandcastle/
[安装]
安装就不用我劳神吧,搞code不会装那实在是说不过去了吧,孩子。[em13]
安装好后记住安装位置
在安装位置中找到build_Sandcastle.bat这个批处理文件
Sandcastle\Examples\sandcastle\里面
这里提供一个xcopy.exe的系统文件,好像是用来COPY系统中的一些有用的文件的吧(放心,没毒)
点击下载此文件
然后,把你的项目的XML,DLL文件与xcopy.exe build_Sandcastle.bat 放在一起
[使用]
注:我这里采用的是命令行形式,如果要使用GUI方式生成,可以去下载一个
SandcastleGUI.exe (v1.47 - August 2008)
下载地址:http://www.inchl.nl/SandcastleGUI/
打开命令窗口,进入到你的文档所在的文件夹(就是把xml dll xcopy.exe build_Sandcastle.bat 装在一起的那个)
假设我要对IDAL.DLL这个生成文档,刚运行如下命令:
build_Sandcastle vs2005 abc.idal
你就可以在这个文件夹里看到一个CHM文件跟几个相关的文件夹了
如要你觉得上面的操作都比较麻烦,那你可以去下载一个 Sandcastle Help File Builder
你只要根据自己的项目去设定相关属性,同样可以生出chm鸡蛋来,更令人惊喜的是可以生出一个Net的网站!
操作界面跟NDOC类似
生成出来的类似MSDN的文档页面
除了上面这个插件外,Sandcastle 还可以通过 DocProject for Sandcastle 与 VS2005 VS2008集合在一起,以向导方式生出相关的文档来,具体的就不再述说了。大家可以看看下面这几个链接就知道了。
Sandcastle Help File Builder
http://www.codeplex.com/SHFB
DocProject for Sandcastle
http://www.codeplex.com/DocProject
AjaxDoc
http://www.codeplex.com/ajaxdoc
一点小经验,与大家分享,多多支持。[em13]
当然,我所说的这工具,是在VS。NET开发环境实现,Java好像也有同样的生成工具的。
Sandcastle生成的输出结果具有以下特点:
类似于MSDN布局的界面。
自动生成索引项、内容项目表、主题块和页面布局,提高一致性和熟悉程度。
自动生成语法宣称部分。
自动生成继承表。
代码彩色化。
提供多种风格和语言选择,终端用户可从中选择自己最喜欢的形式。
输出结果以HTML和CSS形式显示,微软承诺将来提供更多选择。
看到这样好的东西,我估计你也想试一试吧。呵呵。
使用前提:
在你的Solution里面的每个项目里,都会有一个Bin文件夹,同时你必须要让你的项目能生成一个XML文件.(在属性里面设置xml document file),除此之外,在每个方法或函数里面都要写上对应的注释。
如图:
怎么让项目生成一个XML document file
代码中对应的注释:在每个方法前加三个斜杠 /// 会自动出来
做好了以上这两个前提准备,你的Bin文件下就应该有Sandcastle的东东了。
[em11]
[下载]
废话少说,先去当一个Sandcastle再说
还好,MS免费提供了下载:
http://www.microsoft.com/downloads/details.aspx?FamilyId=E82EA71D-DA89-42EE-A715-696E3A4873B2&displaylang=en
如果对这个玩艺儿有意思的话,可以去下载源码研究一下,开源嘛,不研究一下对不起脑子。
下载地址:
https://blogs.msdn.com/sandcastle/
[安装]
安装就不用我劳神吧,搞code不会装那实在是说不过去了吧,孩子。[em13]
安装好后记住安装位置
在安装位置中找到build_Sandcastle.bat这个批处理文件
Sandcastle\Examples\sandcastle\里面
这里提供一个xcopy.exe的系统文件,好像是用来COPY系统中的一些有用的文件的吧(放心,没毒)
点击下载此文件
然后,把你的项目的XML,DLL文件与xcopy.exe build_Sandcastle.bat 放在一起
[使用]
注:我这里采用的是命令行形式,如果要使用GUI方式生成,可以去下载一个
SandcastleGUI.exe (v1.47 - August 2008)
下载地址:http://www.inchl.nl/SandcastleGUI/
打开命令窗口,进入到你的文档所在的文件夹(就是把xml dll xcopy.exe build_Sandcastle.bat 装在一起的那个)
假设我要对IDAL.DLL这个生成文档,刚运行如下命令:
build_Sandcastle vs2005 abc.idal
你就可以在这个文件夹里看到一个CHM文件跟几个相关的文件夹了
如要你觉得上面的操作都比较麻烦,那你可以去下载一个 Sandcastle Help File Builder
你只要根据自己的项目去设定相关属性,同样可以生出chm鸡蛋来,更令人惊喜的是可以生出一个Net的网站!
操作界面跟NDOC类似
生成出来的类似MSDN的文档页面
除了上面这个插件外,Sandcastle 还可以通过 DocProject for Sandcastle 与 VS2005 VS2008集合在一起,以向导方式生出相关的文档来,具体的就不再述说了。大家可以看看下面这几个链接就知道了。
Sandcastle Help File Builder
http://www.codeplex.com/SHFB
DocProject for Sandcastle
http://www.codeplex.com/DocProject
AjaxDoc
http://www.codeplex.com/ajaxdoc
一点小经验,与大家分享,多多支持。[em13]
Cookies的基本操作
作者:admin 日期:2008-09-10
Cookies的概念就不用哆嗦了,大家都很常用。不过我好像很少用,呵呵。
1.创建Cookies
using System;
// Use this line when you want to save a cookie
Response.Cookies["MyCookieName"].Value = "MyCookieValue";
// How long will cookie exist on client hard disk
Response.Cookies["MyCookieName"].Expires = DateTime.Now.AddDays(1);
// To add multiple key/value pairs in single cookie
Response.Cookies["VisitorData"]["FirstName"] = "Richard";
Response.Cookies["VisitorData"]["LastVisit"] = DateTime.Now.ToString();
2.读取Cookies
string MyCookieValue;
// We need to perform this check first, to avoid null exception
// if cookie not exists
if(Request.Cookies["MyCookieName"] != null)
MyCookieValue = Request.Cookies["MyCookieName"].Value;
3.删除Cookies
// First check if cookie exists
if (Request.Cookies["MyCookieName"] != null)
{
// Set its expiration time somewhere in the past
Response.Cookies["MyCookieName"].Expires = DateTime.Now.AddDays(-1);
4.使用HttpCookie class 这个类
参考MSDN:
http://msdn.microsoft.com/zh-tw/library/system.web.httpcookie(VS.80).aspx
几个常用属性:
属性的使用方法就跟其他类使用一样:
HttpCookie MyGreatCookie = new HttpCookie("MyCookieName");
MyGreatCookie.Value = "Some cookie value";
MyGreatCookie.Expires = DateTime.Now.AddDays(100);
Response.Cookies.Add(MyGreatCookie);
5.Cookies的一些限制
<1> Cookies的存储大小为4096 字节,一般只会用来存储一些数据量较小的信息
<2>每个Cookies的数量在一个网站上不能超过20个,当你超过20个时,老的会删除掉
<3>用户可以在浏览器中设置是否接受或启用Cookies,如果设置了否,Cookies就不能作为存储状态的工具,所以一般都会在使用Cookies之前检测一下浏览器是否启用了Cookies
6.如何确定是否使用了Cookies
End If
[ C# ]
if (Request.Browser.Cookies)
{
// Cookies supported
}
else
{
// Web browser not supports cookies
}
7.使用Cookies的场合
一般对用户比较敏感的数据都不建议使用Cookies来存储,它只是一些普通的文本,但是如果您想使用“记住我的状态”或“直接登录”这样的小功能来增加系统的操作简便性,这时Cookies就可以派上用场了.总的来说:用来保持用户在同一Website同一操作方式时是最好的使用方式
1.创建Cookies
复制内容到剪贴板 程序代码
using System;
// Use this line when you want to save a cookie
Response.Cookies["MyCookieName"].Value = "MyCookieValue";
// How long will cookie exist on client hard disk
Response.Cookies["MyCookieName"].Expires = DateTime.Now.AddDays(1);
// To add multiple key/value pairs in single cookie
Response.Cookies["VisitorData"]["FirstName"] = "Richard";
Response.Cookies["VisitorData"]["LastVisit"] = DateTime.Now.ToString();
2.读取Cookies
复制内容到剪贴板 程序代码
string MyCookieValue;
// We need to perform this check first, to avoid null exception
// if cookie not exists
if(Request.Cookies["MyCookieName"] != null)
MyCookieValue = Request.Cookies["MyCookieName"].Value;
3.删除Cookies
复制内容到剪贴板 程序代码
// First check if cookie exists
if (Request.Cookies["MyCookieName"] != null)
{
// Set its expiration time somewhere in the past
Response.Cookies["MyCookieName"].Expires = DateTime.Now.AddDays(-1);
4.使用HttpCookie class 这个类
参考MSDN:
http://msdn.microsoft.com/zh-tw/library/system.web.httpcookie(VS.80).aspx
几个常用属性:
属性的使用方法就跟其他类使用一样:
复制内容到剪贴板 程序代码
HttpCookie MyGreatCookie = new HttpCookie("MyCookieName");
MyGreatCookie.Value = "Some cookie value";
MyGreatCookie.Expires = DateTime.Now.AddDays(100);
Response.Cookies.Add(MyGreatCookie);
5.Cookies的一些限制
<1> Cookies的存储大小为4096 字节,一般只会用来存储一些数据量较小的信息
<2>每个Cookies的数量在一个网站上不能超过20个,当你超过20个时,老的会删除掉
<3>用户可以在浏览器中设置是否接受或启用Cookies,如果设置了否,Cookies就不能作为存储状态的工具,所以一般都会在使用Cookies之前检测一下浏览器是否启用了Cookies
6.如何确定是否使用了Cookies
复制内容到剪贴板 程序代码
End If
[ C# ]
if (Request.Browser.Cookies)
{
// Cookies supported
}
else
{
// Web browser not supports cookies
}
7.使用Cookies的场合
一般对用户比较敏感的数据都不建议使用Cookies来存储,它只是一些普通的文本,但是如果您想使用“记住我的状态”或“直接登录”这样的小功能来增加系统的操作简便性,这时Cookies就可以派上用场了.总的来说:用来保持用户在同一Website同一操作方式时是最好的使用方式
在业务层实现ASP.NET幻灯片效果
作者:admin 日期:2008-08-29
原本以为很简单的一个小功能,没想到也花了一点时间去磨了几下。遇到问题当然是先www.g.cn一下,然而所找到的结果都是将数据操作写在页面的后台。这样对于整个Solution尤其是分了几层的解决方案来说,要把数据库操作搞到页面上去是不太可取之处的吧。
特别感谢网友 爱在戏院前,提醒可以用json的模式去把前头的字符拼出来,返回个字符串回去就可以了。
注明:针对会多出一个空白框的问题,网友toDown已经给出解决方案. 特此感谢!
在循环之后去掉"|".
retPics = retPics.Remove(retPics.Length-1, 1);
retLinks = retLinks.Remove(retLinks.Length-1, 1);
retTitle= retTitle.Remove(retTitle.Length-1, 1);
欢迎大家指正错误,谢谢!
做幻灯片效果也的确是这样:要么就是用XML做数据源,要么就把从数据库中读取到的参数值传到FlashVar中,实现显示效果。
说明一下:我这里用到的是一个最常用的一种效果
截图:
文件:
一个前台显示的AD.SWF
逻辑层中的代码:
/// <summary>
/// 显示图片新闻列表
/// </summary>
/// <param name="PageSize">每页纪录数</param>
/// <param name="PageIndex"></param>
/// <returns></returns>
public IList<Model.NewsInfo> PicNewsList(int PageSize, int PageIndex)
{
SqlParameter[] parameters =
{
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@strGetFields", SqlDbType.VarChar, 1000),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@doCount", SqlDbType.Bit),
&a...
特别感谢网友 爱在戏院前,提醒可以用json的模式去把前头的字符拼出来,返回个字符串回去就可以了。
注明:针对会多出一个空白框的问题,网友toDown已经给出解决方案. 特此感谢!
在循环之后去掉"|".
复制内容到剪贴板 程序代码
retPics = retPics.Remove(retPics.Length-1, 1);
retLinks = retLinks.Remove(retLinks.Length-1, 1);
retTitle= retTitle.Remove(retTitle.Length-1, 1);
欢迎大家指正错误,谢谢!
做幻灯片效果也的确是这样:要么就是用XML做数据源,要么就把从数据库中读取到的参数值传到FlashVar中,实现显示效果。
说明一下:我这里用到的是一个最常用的一种效果
截图:
文件:
一个前台显示的AD.SWF
Flash动画
逻辑层中的代码:
复制内容到剪贴板 程序代码
/// <summary>
/// 显示图片新闻列表
/// </summary>
/// <param name="PageSize">每页纪录数</param>
/// <param name="PageIndex"></param>
/// <returns></returns>
public IList<Model.NewsInfo> PicNewsList(int PageSize, int PageIndex)
{
SqlParameter[] parameters =
{
new SqlParameter("@tblName", SqlDbType.VarChar, 255),
new SqlParameter("@strGetFields", SqlDbType.VarChar, 1000),
new SqlParameter("@fldName", SqlDbType.VarChar, 255),
new SqlParameter("@PageSize", SqlDbType.Int),
new SqlParameter("@PageIndex", SqlDbType.Int),
new SqlParameter("@doCount", SqlDbType.Bit),
&a...
Web技术电子期刊2008年第7 8期(总第25期)
作者:admin 日期:2008-08-21
对象***已断开连接或不在该服务器上 的解决方案之一
作者:admin 日期:2008-08-16
使用VS2008在发布网站的时候,出现了这样的一个错误,先前一直是OK的。网上找了老半天,几乎没有此问题的解决办法。很是郁闷。只能一个一个地进行编译。单个层Build是OK的,整个Solution的Rebuild也是OK的,一开始使用VS自带的发布网站却报出这个错。
“/1fc3eb5_eab_45c9_84e1_a5fe79064e27/ wehbqewasfd23scf2fumbe7p1a_18.rem”已断开连接或不在该服务器上
用了Web Deployment Project来编译的时候却报项目中某个用户控件在 asp_merge中发生了错误。 我一看这个控件好像是我在多个地方用同一名字命名的,只是在不同文件夹中。会不会是因为这个因素呢. 我把这个用户控件重命名再编译就OK了。呵呵。
这个问题我估计是我在项目中命名了相同名字的用户控件造成的,所以大家不要在同一项目中将用户控件命名相同.
因为出现这个问题在网上的解决方案很少,虽是简单,但发出来与大家分享,希望能给你带来帮助。
“/1fc3eb5_eab_45c9_84e1_a5fe79064e27/ wehbqewasfd23scf2fumbe7p1a_18.rem”已断开连接或不在该服务器上
用了Web Deployment Project来编译的时候却报项目中某个用户控件在 asp_merge中发生了错误。 我一看这个控件好像是我在多个地方用同一名字命名的,只是在不同文件夹中。会不会是因为这个因素呢. 我把这个用户控件重命名再编译就OK了。呵呵。
这个问题我估计是我在项目中命名了相同名字的用户控件造成的,所以大家不要在同一项目中将用户控件命名相同.
因为出现这个问题在网上的解决方案很少,虽是简单,但发出来与大家分享,希望能给你带来帮助。
web.config文件致Ajax控件失效
作者:admin 日期:2008-07-14
发现这个问题一开始真是不知哪里出问题,因为同样的环境下不同的两个项目,一个用得好好的,一个却没反应,后果认真对比了一下web.config,发现问题就在这里了。
不能用Ajax控件的web.config明显少了很多配置
<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings>
<add name="SQLConnString" connectionString="Server=Servera;Integrated Security=True;Database=P23asdad;uid=sa;password=maasdfewads; Max Pool Size = 300; Persist Security Info=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<sessionState mode="StateServer" cookieless="false" timeout="300" stateConnectionString="tcpip=localhost:42424" stateNetworkTimeout="14400"/>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</pages>
<compilation debug="true">
&...
不能用Ajax控件的web.config明显少了很多配置
复制内容到剪贴板 程序代码
<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
\Windows\Microsoft.Net\Framework\v2.x\Config 中
-->
<configuration>
<appSettings/>
<connectionStrings>
<add name="SQLConnString" connectionString="Server=Servera;Integrated Security=True;Database=P23asdad;uid=sa;password=maasdfewads; Max Pool Size = 300; Persist Security Info=True" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<sessionState mode="StateServer" cookieless="false" timeout="300" stateConnectionString="tcpip=localhost:42424" stateNetworkTimeout="14400"/>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<pages>
<controls>
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</pages>
<compilation debug="true">
&...
使用HttpModules 来限制IP地址的访问
作者:admin 日期:2008-07-10
使用HttpModules 来限制IP地址的访问
原文出处:
http://www.codeproject.com/KB/aspnet/http-module-ip-security.aspx
示例代码下载:
点击下载此文件
因为文章看起来比较容易,我就不翻译了。把核心的东西分享出来就行吧
1.先在web.config里面进行设置
<configuration>
<system.web>
<httpModules>
<add name="SecurityHttpModule" type="SecurityHttpModule"/>
</httpModules>
</system.web>
</configuration>
2.使用下面这个方法
/// <summary>
/// HTTP module to restrict access by IP address
/// </summary>
public class SecurityHttpModule : IHttpModule
{
public SecurityHttpModule() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(Application_BeginRequest);
}
private void Application_BeginRequest(object source, EventArgs e)
{
HttpContext context = ((HttpApplication)source).Context;
string ipAddress = context.Request.UserHostAddress;
if (!IsValidIpAddress(ipAddress))
{
context.Response.StatusCode = 403; // (Forbidden)
}
}
private bool IsValidIpAddress(string ipAddress)
{
return (ipAddress == "127.0.0.1");
}
public void Dispose() { /* clean up */ }
}
其它:把IP段做成数据集就可以大批量限制了。换成IP段也可以的吧。呵呵。
原文出处:
http://www.codeproject.com/KB/aspnet/http-module-ip-security.aspx
示例代码下载:
点击下载此文件
因为文章看起来比较容易,我就不翻译了。把核心的东西分享出来就行吧
1.先在web.config里面进行设置
<configuration>
<system.web>
<httpModules>
<add name="SecurityHttpModule" type="SecurityHttpModule"/>
</httpModules>
</system.web>
</configuration>
2.使用下面这个方法
复制内容到剪贴板 程序代码
/// <summary>
/// HTTP module to restrict access by IP address
/// </summary>
public class SecurityHttpModule : IHttpModule
{
public SecurityHttpModule() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(Application_BeginRequest);
}
private void Application_BeginRequest(object source, EventArgs e)
{
HttpContext context = ((HttpApplication)source).Context;
string ipAddress = context.Request.UserHostAddress;
if (!IsValidIpAddress(ipAddress))
{
context.Response.StatusCode = 403; // (Forbidden)
}
}
private bool IsValidIpAddress(string ipAddress)
{
return (ipAddress == "127.0.0.1");
}
public void Dispose() { /* clean up */ }
}
其它:把IP段做成数据集就可以大批量限制了。换成IP段也可以的吧。呵呵。
一个采购价格及成本计算系统项目的总结
作者:admin 日期:2008-07-09
忙乎了三四个月,终于在紧逼的情况下,把“鸭子”们赶上岸了,意想不到的是一个星期地接地疯狂地被折磨,还好几年的项目磨炼让我能承得住气耐得住性子,忍受一些非系统及技术因素所带来的种种抱怨及找碴。当然,不是说所出来的系统一点问题都没,习惯了C/S界面的操作,在面对新B/S系统的使用时,因为原来的习惯不可避免地要做出一些改变,所带来的使用方与技术人员所的冲突,恰恰是最好找碴的地方。可做完这个项目后终于让我领悟到了在企业真正进行一种变革,确实不是如先前所设想的那么容易。在碰到有史以来最难于沟通的项目后,也让我感觉到在项目中不仅仅是做系统这么简单。
因涉及公司商业信息,只能大致需求: 角色甲要对所采购的物料进行定价,所定的价需根据相关物料分类所对应的成本模型进行成本核算。所拟定的价格应该要与通过成本模型计算所得的价格一致,否则就不能通过相关部门的审计,就不能进行大批量的采购。
活动图之一如下:
技术部分:
User Case
基本架构:基本的三层结构
技术难点:
在这个项目中技术上碰到的最大难点应该是成本模型的设计,因为不同的物料实行不同的成本模型计算,又很难确定物料是根据哪个成本来进行核算的.在做时先前咨询过以前共事的同事(感谢两位项目经理及以前同事),一则用XML实现,一则只能写死。这看起来本是一个很简单的工厂模式可以搞掂,可因为使用的部门(对我来说应该是我的客户)种种的“不一定”,“这个不定”,”这个很难说“之类的反馈让我几乎不能下手,以致最后只能用一个很笨的办法,你有多少模型我就写死多少个,这下可就行了吧。嘿嘿。 至于其它部分,主要是一些数据统计部分,还有就是与ERP系统集成及数据交互。这些都很好说,虽则不在同一服务器,但平台都是在SQL及Windows下,加之NET的配置容易设置。就是不难点了。
需求确定:
如果一个项目中的相关人员不积极参与项目的进程,那这个项目是非常非常难以推进的。因为涉及到敏感的价格因素,可以也涉及到相关人员的私人利益,乃至我在获取需求时是如此的困难,使用部门的人员不积极,不配合,总以"工作忙,你们做出来我们能用就行"推脱需求调研的过程,为后来项目开发带来严重的后果留下了隐患-----这也可能是在企业里做项目的一个难点吧。当IT系统使用部门人说很忙的时候,你确实有些时候拿他没办法。 需求的不确定因素,让我在开发过程中走了一个大大的弯路,当然。在这其中我也犯了一个错误,就是不愿参照原来的老系统设计(因为老系统实在难搞懂,先前的开发人员所写的代码一点注释也没有,命名乱七八糟,同时是用Delphi写的),没想到这个原因居然让我成了第一次演示会众矢之的的声讨对象。[em17]
回过头来想想:其实我最初的设计思路其实是没有错的,因为参考众多同等性质的软件及系统,都是差不多的。也许是公司特殊的原因吧。实践证明,在后面与另一部门的IT系统进行数据集成及交互的时候,必须用回我最先设计的思路,很可惜,虽在会上我以一敌十,结果还是败了。
(话外音:这么多人说我错,也是真的是我错了。。。?!!)
开发过程:
根据断断续继收集的需求,在原定于三个月内的项目,在第一个月就设计出来了。尽管我以很多方式让大家参与试用,但领导方不重视,也许是大家之前对此系统有所顾忌的因素吧,居然没有人试用(理由:很忙,没时间),以致于到最后不得不特意发一道公文强制试用。 强制的结果当然是不好的,虽则强制了关键使用人员试用系统,也反映了一些小问题,但解决这些小问题后让我以为大家对这系统整体设计没问题的时候,启用了第一次演示会。结果大大出于我的意外:由原先的一言不发到最后个个人都对着系统一个一个来挑问题。。。,让我十分被动,十分狼狈---第一次在做项目时碰到这样的情况! 没办法,推倒重来。
上线情况
系统被强制在旺季时上线,先前我所建议的新老系统并用不被采纳,结果上线后的一个星期内,我成了超级忙特忙的人,只要稍有不顺,电话就过来了。加之先前确写新老数据导入时又没了解到一些特殊的数据处理办法(双方都以为没问题,结果却出了问题)。后果认真想了一下:难道我现在做的东西就这么垃圾?千疮百孔? 实则不是,很多问题仅仅是因为操作人员的使用不当所引起,不了解系统所引起,甚至应该还有些许对新系统的排斥所带来的怨气吧,毕竞,新系统的上线,让他们在对物料的采购定价方面比以前有很多的要求与限制了。 本着最大的耐性,报一个问题解决一个问题的态度,做到让你心服口服手把手口把口像教小孩子学讲话那样让你无话可说后,坚持了一个星期,第二个星期居然没有什么问题了?!!搞得上星期接电话接到害怕的的我没接到电话误认为电话出了问题,不知是我的"良好的服务态度"问题还是系统确实找不出什么大问题了。唉,真是让我无话可说了.唉。。在我以为项目几近失败的时候,居然又复活成功实施下去了。。。
项目感想:
总结一下这次项目中自己的不足之处:
太自信 太相信别人 沟通出了问题 按以前在软件公司做项目的方式去对待
项目中存在的问题
参与项目中的关键人员对项目态度有问题 需求不确定让项目几近被动地实施进行 不能得到及得反馈信息 沟通出了问题 使用前没有进行使用人员的培训(他们太忙了,他们说)
至于别人到底存不存在问题,就不是我的问题了。呵呵。这个项目是做得有史以来做得相当不爽相当郁闷的一个项目,不过还是感谢他们,让我又经历了一次痛苦的“洗礼”过程,让我对项目开发,对人对事方面有了新的认识。失败是成功她妈嘛!![em13]
因涉及公司商业信息,只能大致需求: 角色甲要对所采购的物料进行定价,所定的价需根据相关物料分类所对应的成本模型进行成本核算。所拟定的价格应该要与通过成本模型计算所得的价格一致,否则就不能通过相关部门的审计,就不能进行大批量的采购。
活动图之一如下:
技术部分:
User Case
基本架构:基本的三层结构
技术难点:
在这个项目中技术上碰到的最大难点应该是成本模型的设计,因为不同的物料实行不同的成本模型计算,又很难确定物料是根据哪个成本来进行核算的.在做时先前咨询过以前共事的同事(感谢两位项目经理及以前同事),一则用XML实现,一则只能写死。这看起来本是一个很简单的工厂模式可以搞掂,可因为使用的部门(对我来说应该是我的客户)种种的“不一定”,“这个不定”,”这个很难说“之类的反馈让我几乎不能下手,以致最后只能用一个很笨的办法,你有多少模型我就写死多少个,这下可就行了吧。嘿嘿。 至于其它部分,主要是一些数据统计部分,还有就是与ERP系统集成及数据交互。这些都很好说,虽则不在同一服务器,但平台都是在SQL及Windows下,加之NET的配置容易设置。就是不难点了。
需求确定:
如果一个项目中的相关人员不积极参与项目的进程,那这个项目是非常非常难以推进的。因为涉及到敏感的价格因素,可以也涉及到相关人员的私人利益,乃至我在获取需求时是如此的困难,使用部门的人员不积极,不配合,总以"工作忙,你们做出来我们能用就行"推脱需求调研的过程,为后来项目开发带来严重的后果留下了隐患-----这也可能是在企业里做项目的一个难点吧。当IT系统使用部门人说很忙的时候,你确实有些时候拿他没办法。 需求的不确定因素,让我在开发过程中走了一个大大的弯路,当然。在这其中我也犯了一个错误,就是不愿参照原来的老系统设计(因为老系统实在难搞懂,先前的开发人员所写的代码一点注释也没有,命名乱七八糟,同时是用Delphi写的),没想到这个原因居然让我成了第一次演示会众矢之的的声讨对象。[em17]
回过头来想想:其实我最初的设计思路其实是没有错的,因为参考众多同等性质的软件及系统,都是差不多的。也许是公司特殊的原因吧。实践证明,在后面与另一部门的IT系统进行数据集成及交互的时候,必须用回我最先设计的思路,很可惜,虽在会上我以一敌十,结果还是败了。
(话外音:这么多人说我错,也是真的是我错了。。。?!!)
开发过程:
根据断断续继收集的需求,在原定于三个月内的项目,在第一个月就设计出来了。尽管我以很多方式让大家参与试用,但领导方不重视,也许是大家之前对此系统有所顾忌的因素吧,居然没有人试用(理由:很忙,没时间),以致于到最后不得不特意发一道公文强制试用。 强制的结果当然是不好的,虽则强制了关键使用人员试用系统,也反映了一些小问题,但解决这些小问题后让我以为大家对这系统整体设计没问题的时候,启用了第一次演示会。结果大大出于我的意外:由原先的一言不发到最后个个人都对着系统一个一个来挑问题。。。,让我十分被动,十分狼狈---第一次在做项目时碰到这样的情况! 没办法,推倒重来。
上线情况
系统被强制在旺季时上线,先前我所建议的新老系统并用不被采纳,结果上线后的一个星期内,我成了超级忙特忙的人,只要稍有不顺,电话就过来了。加之先前确写新老数据导入时又没了解到一些特殊的数据处理办法(双方都以为没问题,结果却出了问题)。后果认真想了一下:难道我现在做的东西就这么垃圾?千疮百孔? 实则不是,很多问题仅仅是因为操作人员的使用不当所引起,不了解系统所引起,甚至应该还有些许对新系统的排斥所带来的怨气吧,毕竞,新系统的上线,让他们在对物料的采购定价方面比以前有很多的要求与限制了。 本着最大的耐性,报一个问题解决一个问题的态度,做到让你心服口服手把手口把口像教小孩子学讲话那样让你无话可说后,坚持了一个星期,第二个星期居然没有什么问题了?!!搞得上星期接电话接到害怕的的我没接到电话误认为电话出了问题,不知是我的"良好的服务态度"问题还是系统确实找不出什么大问题了。唉,真是让我无话可说了.唉。。在我以为项目几近失败的时候,居然又复活成功实施下去了。。。
项目感想:
总结一下这次项目中自己的不足之处:
太自信 太相信别人 沟通出了问题 按以前在软件公司做项目的方式去对待
项目中存在的问题
参与项目中的关键人员对项目态度有问题 需求不确定让项目几近被动地实施进行 不能得到及得反馈信息 沟通出了问题 使用前没有进行使用人员的培训(他们太忙了,他们说)
至于别人到底存不存在问题,就不是我的问题了。呵呵。这个项目是做得有史以来做得相当不爽相当郁闷的一个项目,不过还是感谢他们,让我又经历了一次痛苦的“洗礼”过程,让我对项目开发,对人对事方面有了新的认识。失败是成功她妈嘛!![em13]
花花草草
作者:admin 日期:2008-07-08
读一首诗的杂感
作者:admin 日期:2008-07-08
贫穷说话牙无力,富贵骄人鼻有声。有钱须记无钱时,落难何曾见几人。人来求我三分雨,我求别人六月霜.
《做一个好爸爸中》古乐天所说的这首打油诗确实让我已经很长时间没有写点东西的人,有些感慨。虽则没有传奇人物那种曲折不回终登顶的传世经历,也没有那些财富大亨那发财致富的人生历程。可在这现实的社会中,虽则大家嘴上都标榜大家自由平等,可因财富所筑成的无形的金字塔,不正是我们在人生旅途中孜孜向上的动力?
我本很严肃的问过一个好友一个很世俗的一个问题:人活在这世上的意义是什么? 她给我的回答是:你脑子有病! 人活在这世上,所有的一切无非就是为了一日三餐!
确实如此,我相信每个人小时候都有过自己的理想呀,宏伟目标之类的,甚至现在工作着的我们,也可能每个人都有心里的目标而奋斗。“长大当科学家”,“长大当老师”,“长大当富翁”,“我要成为百万富翁”,“我要成为中国Bill Gates"。表面上,这些人生目标都是让每个人朝着不同的方向发展,让自己能成为一个与众不同的人,或都换一个好听点的说,成为出众的人,但实际上确实,每个人都在追求让自己的一日三餐吃更好,穿得更好。当然,“著名的科学家”,“知名的学者教授”这些戴在每个人头上的荣誉光环,能带给人美好的精神享受吧。拿一个街边乞讨的乞丐与一个家缠万贯的财富大亨本质上相比,确实没有不一样的地方。-------不知是我脑子有问题,还是自己受了什么刺激,有点如梦初醒的感觉。 原来我们一致在奋斗的东西,却是那么的“不值钱”---钱是什么东西,这还又是一个未知数。
贫穷说话牙无力,富贵骄人鼻有声。 没钱的人说话底气不足,没权的人你说话别人当你放屁。有钱的人不把钱当回事,有势的人排除拍马屁的多的是(不可否认,也有一些傲骨依存的某些好汉存在).生活的现实和社会的残酷,决定了大多数像我这样的小角色,只能混混般过着忙忙碌碌却依旧不知浑浊的日子。你不能怪你老爸老妈没钱没势,你只能怪你没生在一个有钱有势老爸老妈的家,就像你出来混的日子不长你说的话别人当你放屁你照样不敢吭气的那样。谈论这社会如何,谈论这世首如何感觉这些都没多大意义。既然上天让你从你妈妈的肚子里出来混,那就好好地混吧,最起码,也得混上个一日三餐吧。
有钱须记无钱时,落难何曾见几人。看看那些房地产奸商就知了,看看那些谋取暴利疯狂炒房炒得老子们买不起房的人的现在的处境就知了。凡事皆有定律。你在某个方面获取到一些东西,必然会在另一个方面失去一些东西。谈钱庸俗,但你确实你离不开他。有钱的日子花天酒地毫无顾忌挥霍无度,落难时毛都没有一根。这种事儿不是仅仅只发生在电视连续剧上,你有钱的时候很多人会主动跟你套套近乎,没钱的时候你刁人家人家都不刁你(套用一句粗话,不好意思),你再去求人办事。。。
人来求我三分雨,我求别人六月霜. 不是所有的人都能达到这境界的。这世道,你认为社会充满爱,世界充满阳光。是的,但温馨的阳光不是能照射到每一个人身上。也不是每一个人的品格都是如此地高尚。。。。
《做一个好爸爸中》古乐天所说的这首打油诗确实让我已经很长时间没有写点东西的人,有些感慨。虽则没有传奇人物那种曲折不回终登顶的传世经历,也没有那些财富大亨那发财致富的人生历程。可在这现实的社会中,虽则大家嘴上都标榜大家自由平等,可因财富所筑成的无形的金字塔,不正是我们在人生旅途中孜孜向上的动力?
我本很严肃的问过一个好友一个很世俗的一个问题:人活在这世上的意义是什么? 她给我的回答是:你脑子有病! 人活在这世上,所有的一切无非就是为了一日三餐!
确实如此,我相信每个人小时候都有过自己的理想呀,宏伟目标之类的,甚至现在工作着的我们,也可能每个人都有心里的目标而奋斗。“长大当科学家”,“长大当老师”,“长大当富翁”,“我要成为百万富翁”,“我要成为中国Bill Gates"。表面上,这些人生目标都是让每个人朝着不同的方向发展,让自己能成为一个与众不同的人,或都换一个好听点的说,成为出众的人,但实际上确实,每个人都在追求让自己的一日三餐吃更好,穿得更好。当然,“著名的科学家”,“知名的学者教授”这些戴在每个人头上的荣誉光环,能带给人美好的精神享受吧。拿一个街边乞讨的乞丐与一个家缠万贯的财富大亨本质上相比,确实没有不一样的地方。-------不知是我脑子有问题,还是自己受了什么刺激,有点如梦初醒的感觉。 原来我们一致在奋斗的东西,却是那么的“不值钱”---钱是什么东西,这还又是一个未知数。
贫穷说话牙无力,富贵骄人鼻有声。 没钱的人说话底气不足,没权的人你说话别人当你放屁。有钱的人不把钱当回事,有势的人排除拍马屁的多的是(不可否认,也有一些傲骨依存的某些好汉存在).生活的现实和社会的残酷,决定了大多数像我这样的小角色,只能混混般过着忙忙碌碌却依旧不知浑浊的日子。你不能怪你老爸老妈没钱没势,你只能怪你没生在一个有钱有势老爸老妈的家,就像你出来混的日子不长你说的话别人当你放屁你照样不敢吭气的那样。谈论这社会如何,谈论这世首如何感觉这些都没多大意义。既然上天让你从你妈妈的肚子里出来混,那就好好地混吧,最起码,也得混上个一日三餐吧。
有钱须记无钱时,落难何曾见几人。看看那些房地产奸商就知了,看看那些谋取暴利疯狂炒房炒得老子们买不起房的人的现在的处境就知了。凡事皆有定律。你在某个方面获取到一些东西,必然会在另一个方面失去一些东西。谈钱庸俗,但你确实你离不开他。有钱的日子花天酒地毫无顾忌挥霍无度,落难时毛都没有一根。这种事儿不是仅仅只发生在电视连续剧上,你有钱的时候很多人会主动跟你套套近乎,没钱的时候你刁人家人家都不刁你(套用一句粗话,不好意思),你再去求人办事。。。
人来求我三分雨,我求别人六月霜. 不是所有的人都能达到这境界的。这世道,你认为社会充满爱,世界充满阳光。是的,但温馨的阳光不是能照射到每一个人身上。也不是每一个人的品格都是如此地高尚。。。。
Web技术电子期刊2008年第4 5期(总第24期)
作者:admin 日期:2008-06-30
一道简单的机试题,考倒多少人?
作者:admin 日期:2008-06-27
一道简单的机试题,考倒多少人? 是我的要求太高还是??很是郁闷。。
发出来给大家讨论一下:
基于基本三层结构开发思想,请解决以下问题:
1.在本地SQL服务器新建数据库(TEST),在库中新建一表 UserInfo(用户信息)
表中包含字段:UserID (主键,自动增长,数字型)UserName (姓名,字符型,不能为空)UserSex (性别,字符型,不能为空) UserDesc (用户描述,字符型,可为空)
请写出针对表UserInfo进行增加,删除,列表,修改的存储过程
2.使用VisualStudio2008以VB.Net或C#新建一个名为InterView解决方案(Solution)
(1)新建一个Ascx文件夹,在里面新建两个用户控件,分别命名为Add.ascx List.acsx
a.在用户控件Add.ascx中设计一个简单的表单提交页面,里面需包含的元素有 文本框 按钮 单选框等控件,
对应所新建的表的字段(用户姓名,用户描述,用户性别)
b.在用户控件List.acx中新增一个Gridview 或 DataGrid repeat DataList等数据控件
(2)将提供的DAL Project添加至InterView的解决方案中,也可以将其中的Sqlhelper.cs直接加入现有Project中作为数据操作.调用方法请认真阅读Sqlhelper.cs中的详细注释
(3)使用所提供的数据层DAL,实现对数据库的增 删 改 操作
要求:
(1) 在数据交互过程,必须使用上述新建的相关存储过程实现对数据库的操作.
(2)在List.ascx列出数据库中的数据,并实现对单条记录的删除。修改操作
(3)Add.acsx 实现增加单条记录操作,判断操作是否成功,成功转入list.aspx,不成功使用弹出对话框或Label控件提示出错
3.将所设计的用户控件分别加入至UserAdd.aspx UserList.aspx中,能正常运行实现上述结果即可
提示:
1.如果对上述要求有问题或不太适应,请根据自己想法实现同样效果即可,不须拘于任何条件下
2.可以使用代码生成器生成上述操作代码.
3.可以上网查询相关信息,操作过程中碰到任何问题均可找相关人员咨询
4.参考基本结构示意图
发出来给大家讨论一下:
基于基本三层结构开发思想,请解决以下问题:
1.在本地SQL服务器新建数据库(TEST),在库中新建一表 UserInfo(用户信息)
表中包含字段:UserID (主键,自动增长,数字型)UserName (姓名,字符型,不能为空)UserSex (性别,字符型,不能为空) UserDesc (用户描述,字符型,可为空)
请写出针对表UserInfo进行增加,删除,列表,修改的存储过程
2.使用VisualStudio2008以VB.Net或C#新建一个名为InterView解决方案(Solution)
(1)新建一个Ascx文件夹,在里面新建两个用户控件,分别命名为Add.ascx List.acsx
a.在用户控件Add.ascx中设计一个简单的表单提交页面,里面需包含的元素有 文本框 按钮 单选框等控件,
对应所新建的表的字段(用户姓名,用户描述,用户性别)
b.在用户控件List.acx中新增一个Gridview 或 DataGrid repeat DataList等数据控件
(2)将提供的DAL Project添加至InterView的解决方案中,也可以将其中的Sqlhelper.cs直接加入现有Project中作为数据操作.调用方法请认真阅读Sqlhelper.cs中的详细注释
(3)使用所提供的数据层DAL,实现对数据库的增 删 改 操作
要求:
(1) 在数据交互过程,必须使用上述新建的相关存储过程实现对数据库的操作.
(2)在List.ascx列出数据库中的数据,并实现对单条记录的删除。修改操作
(3)Add.acsx 实现增加单条记录操作,判断操作是否成功,成功转入list.aspx,不成功使用弹出对话框或Label控件提示出错
3.将所设计的用户控件分别加入至UserAdd.aspx UserList.aspx中,能正常运行实现上述结果即可
提示:
1.如果对上述要求有问题或不太适应,请根据自己想法实现同样效果即可,不须拘于任何条件下
2.可以使用代码生成器生成上述操作代码.
3.可以上网查询相关信息,操作过程中碰到任何问题均可找相关人员咨询
4.参考基本结构示意图
相同记录行如何取最大值
作者:admin 日期:2008-06-25
相同记录行如何取最大值
--测试数据
create table #表A (fid int,fprice dec(5,2),fsuid int,fdate datetime)
insert #表A select 1, 2.1, 2, '2005-09-09'
insert #表A select 1, 2.2, 2, '2005-10-10'
insert #表A select 1, 3.3, 2, '2006-01-01'
insert #表A select 2, 3.3, 1, '2003-09-09'
insert #表A select 2, 5.5, 1, '2005-09-09'
insert #表A select 2, 3.2, 2, '2005-09-09'
insert&...
--测试数据
create table #表A (fid int,fprice dec(5,2),fsuid int,fdate datetime)
insert #表A select 1, 2.1, 2, '2005-09-09'
insert #表A select 1, 2.2, 2, '2005-10-10'
insert #表A select 1, 3.3, 2, '2006-01-01'
insert #表A select 2, 3.3, 1, '2003-09-09'
insert #表A select 2, 5.5, 1, '2005-09-09'
insert #表A select 2, 3.2, 2, '2005-09-09'
insert&...
多条件组合查询+分页
作者:admin 日期:2008-06-04
比较麻烦,把他记录下来。
前台UI:
实现的类代码:
/// <summary>
/// 多条件组合查询
/// </summary>
/// <param name="suppliercode">供应商代码</param>
/// <param name="materialcode">物料代码</param>
/// <param name="beginDate">合同有效日期搜索开始日期</param>
/// <param name="endDate">合同有效日期搜索结束日期</param>
/// <param name="companyType">厂别</param>
/// <param name="formState">状态</param>
/// <param name="POCT">POCT</param>
/// <param name="orderField">排序字段</param>
/// <returns></returns>
public IList<Entity.CAS.PriceFormInfo> MultiSearch(string suppliercode, string materialcode, string beginDate, string endDate, string companyType, string formState, string POCT, string orderField, int pagesize, int pageindex)
{
SqlParameter[] Parms =
{
new SqlParameter("@tblName",SqlDbType.VarChar,255),
new SqlParameter("@strGetFields",SqlDbType.VarChar,1000),
new SqlParameter("@fldName",SqlDbType.VarChar,255),
&...
前台UI:
实现的类代码:
复制内容到剪贴板 程序代码
/// <summary>
/// 多条件组合查询
/// </summary>
/// <param name="suppliercode">供应商代码</param>
/// <param name="materialcode">物料代码</param>
/// <param name="beginDate">合同有效日期搜索开始日期</param>
/// <param name="endDate">合同有效日期搜索结束日期</param>
/// <param name="companyType">厂别</param>
/// <param name="formState">状态</param>
/// <param name="POCT">POCT</param>
/// <param name="orderField">排序字段</param>
/// <returns></returns>
public IList<Entity.CAS.PriceFormInfo> MultiSearch(string suppliercode, string materialcode, string beginDate, string endDate, string companyType, string formState, string POCT, string orderField, int pagesize, int pageindex)
{
SqlParameter[] Parms =
{
new SqlParameter("@tblName",SqlDbType.VarChar,255),
new SqlParameter("@strGetFields",SqlDbType.VarChar,1000),
new SqlParameter("@fldName",SqlDbType.VarChar,255),
&...
一个存储过程实现增删改操作
作者:admin 日期:2008-05-28
-------------------------------------------------------------
--作者:Dezai
--时间:2008-5-28
-------------------------------------------------------------
--存储过程的功能:对表 UBS_CAS_PriceFormBatch 进行添加、更新、删除、获取操作。
-------------------------------------------------------------
--参数说明:
-------------------------------------------------------------
/*
@DataAction 添加更新删除的标志位
@ID ID
@BatchNo ('批次号')
@ItemClassID 分类
@PurchaserUID 分类
@AuditorUID 批准人
@CheckerUID 审核者
@PubDate 拟制时间
@CheckDate 审核时间
@PassDate 批准时间
@State 表单状态
@FormType 表单类型
@SupplierCode 供应商代码
@CompanyType 厂别
@InputModelMaterial 输入成本模型的物料
@Purchaser
@Auditor
@Checker
@RejectReason
*/
Create PROCEDURE UBS_CAS_PriceFormBatchAction
@DataAction int,
@ID int = 0,
@BatchNo varchar(50),
@ItemClassID int,
@PurchaserUID int,
@AuditorUID int,
@CheckerUID int,
@PubDate datetime,
@CheckDate datetime,
@PassDate datetime,
@State int,
@FormType int,
@SupplierCode varchar(50),
@CompanyType int,
@InputModelMaterial varchar(50),
@Purchaser varchar(50),
@Auditor varchar(50),
@Checker varchar(50),
@RejectReason varchar(500)
AS
begin tran
SET NOCOUNT ON
if @DataAction=0
begin
insert into UBS_CAS_PriceFormBatch
(
[BatchNo],
[ItemClassID],
[PurchaserUID],
[AuditorUID],
[CheckerUID],
[PubDate],
[CheckDate],
[PassDate],
&...