置顶随笔
2012年3月30日
1:IT人员需要面对自身部门以下问题
用户申请了资产it部未处理的单还有哪些?
库存里面还有哪些资产?
有多少设备在维修?
有多少设备已经报废了?
哪些资产低于安全库存需要采购?
使用超过10年或者5年的资产统计数据有哪些?
某个员工现在占用了哪些资产?
上一个月总共领用了多少资产,报废了多少,送修了多少,归还了多少?
某个员工从入职到现在,所有资产的历史记录,如何查询?
某个资产如电脑,从登记入库,被哪些人使用过?
何如面对财务的年底盘点?
资产账目是否清晰?
如何实现无纸办公?
......
2:IT人员需要面对其他用户需求:
如何方便用户申请资产?
如何方便用户申请时了解需要资产名称?
如何让用户知道自己申请的资产是否有库存?
如何让用户知道自己申请的资产是否领导审批?
如何让用户知道自己申请的资产,如果库存不足是否已经采购?
IT部如果采购回来,如何让用户第一时间知道,并通知?
用户如何查询之前的审批历史?
用户如何查询当前自己有哪些资产?
用户的IT资产如果损坏,如何发起维修申请?
......
3:IT人员需要面对财务部门问题
如何将用户申请的资产每月统计给财务部?
年底如何与财务盘点IT资产?
如何处理IT资产费用报销?
年底费用报销统计?
......
4:IT人员需要面对上级领导
本年度IT部资产开支统计?
IT部费用统计情况,IT费用主要花费在哪些地方,IT资产购买?维修?软件?
IT资产供应商年采购费用统计如何?
......
新浪爱问下载地址是:
http://ishare.iask.sina.com.cn/f/24238392.html
新版本(2.0)已经在华军软件园有提供下载,下载地址是:
http://www.onlinedown.net/soft/268187.htm
天空软件园的下载地址是:
http://www.skycn.com/soft/69986.html
如发现软件中有问题,请加群219010061讨论。或者在这篇博文上面给我留言。谢谢!
正式版本支持企业级应用,如 web端的普通用户申请及领导审批等无纸办公,采购模块,费用报销模块等企业级应用。如需要正式版并要求定制,可以联系我。
QQ:15984167
Email: farrell.liu@gmail.com
2008年1月25日
其实07年对自己来说还是不平凡的一年。
1:首先是值得庆祝的是完成人生的一件大事:老婆帮我生了个儿子。呵呵。其实应该算老婆的功劳。不过对于我来说,也算是一件大事,毕竟好歹是一个爸爸了。呵呵,幸福感和责任感随着而来。在这里我要感谢我的老婆,老婆你幸苦了。
2:07年是我程序生涯的一次大事情,我从VB6.0转向了.net. 这要感谢公司给我这个机会,因为个人感觉从VB到.net的转变不是程序语言的转变。而是编程的思想的转变,从简单面向对象到完全面向对象,包括ASP.NET,C#的学习。当然,我要学的东西还是很多,面向对象的东西博大精深,比如说设计模式,ASP.NET的原理等等。很多东西都要去专研,只有将自己的水平提高了,还有很多东西我都还不是很懂。
3:07在被卖出的半年中,我比较好的完成了客户的要求,得到了客户和公司对自己的肯定。其实在这半年中,获取最多的还是学会做人和生活中的一些道理。我想这让我以后的工作和生活中将得到帮助。
4:07年里我也报了自考,算是我的自考年吧,呵呵,希望撒下自考的种子在今后的两到三年后能够修成正果。虽然很多朋友都劝我学那种远程教育,因为自考太难考了。其实通过今年报的三门中,我觉得自己还是学到了很多东西,因为自考里的很多东西都是我专业里的基础课程,都是讲一些很原理,很基础的知识,但是通过学习,觉得越是基础的东西对于自己的专业是非常重要的。比如说之前被外派时做的系统里面自己设计的数据结构让系统结构很清晰,代码也很清晰,更易读,而且效率也提高很多。接下来的操作系统和离散数学我相信会让我更加理解和学到更多东西。这让我更加坚定对自考的信心和勇气。
08年其实已经来到,其实在新年的来到时我自己心理油生了很多的理想,觉得自己需要做的东西很多,觉得时间不够。
1:首先是上面提到的自考和ASP原理的学习。因为3年的软件生涯让我明白引用其实很简单,但是只知道简单的应用是不够的。就如同理发师一样,我觉得理发师如果不懂的美学,不懂的如何去审美,不管这个理发师的理发技巧如何厉害,手法如何高明,我觉得他最多对一个发型是铭记在心的。他会将这个发型剪的非常的标准,但是这个理发师不知道怎样的人适合这个发型,可能这个人剪的很好,因为他很适合,但是换个人的话,却有可能不好看。其实是同一个道理,这个理发师不懂的美学,不知道怎么样才算美,虽然他掌握了某种方法的应用,但是他不知道为什么要用这个方法,什么时候改用这个方法。其实这些都是很原理东西。只有懂的原理的东西才可以创造更新的东西,才可以将不同的知识加以应用。
2:我想通过上面的学习,我将可以达到一个更高的层次。其实我的下个目标是做项目Manager,上面说的其实只是达到这个目标的一个必须阶段。当然,我还要开始学会这方面的东西。比如说管理,等等,我想经过在过两年之后,我将开始尝试这种工作了。
3:自考的任务还是很艰巨。在今年,我的目标是过7门。时间还是很紧迫,两年之后我在这加公司也待了4年了,由于外包公司的特殊性,结合自己个人的发展。如果要尝试做项目经理,可能只有另寻他路。所以两年之后,自考文凭必须拿到手。这样找工作也好找一点
4:其实以上两个第二和第三点是非常重要的。但是第一点也是很重要。如果第一点做好的话,在公司的待遇,在社会中的竞争也提高。
好了,暂时写到这里。08 年是让你很期待一年,奥运会,房产等都是很关键的一年。
好好把握自己,把握好每一天。
这几天看到别人用System.Diagnostics.Process的时候想到了一个新方法。下面是我的具体做法:
1: 在打开或者新建excel,word的时候,先将当前进程里的word,excel进程的ID记录下来(这些有可能是属于用户已经打开的word或者excel进程,最后删除的时候这些进程是不能kill 掉的
//在打开excel前,将系统里面已经存在的excel进程进程ID保存起来
List<int> intList = new List<int>();
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
if (p.ProcessName.ToUpper() == "EXCEL")
{
intList.Add(p.Id);
}
}
2: 我们的程序打开或者新建excel的操作,有可能还有其他的操作,我这里只简单的列出了基本操作。
Application app = new Application();
Workbook workbook = app.Workbooks.Open(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Worksheet worksheet = (Worksheet)workbook.Worksheets[1];
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit();
3:关闭就是如何关闭刚才新建的excel进程
//先用系统提供的方法对系统资源释放,这种做法是大家常用的方法
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
//以下是我的新方法,如果还对象还没有释放的话kill 掉新线程
if (app!=null)
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
{
//先判断当前进程是否是excel
if (p.ProcessName.ToUpper() == "EXCEL")
{
//需要判断这个进程是用户打开的还是属于新建的进程,如果用户没有打开过excel,则直接kill掉这个进程
if (intList != null && intList.Count > 0)
{
//用来标志是否是程序新建的
bool bNewID=true;
foreach (int existId in intList)
{
if (existId == p.Id)
{
bNewID = false;
break;
}
}
//如果没有匹配到的话,说明是程序新建的,则删除他
if (bNewID == true)
{
p.Kill();
}
}
//用户都没有打开过excel进程,则直接kill掉他
else
{
p.Kill();
}
}
}
}
看到这里你可能会说为什么不取新建时application的时候他的进程ID,操作完之后通过System.Diagnostics.Process.GetProcessById() 方法获取到这个Process,其实我开始也想通过这个方法来处理。无奈微软没有提供获取新建application的进程ID的方法。
希望以上方法对那些关闭excel进程头痛的朋友有帮助
如果大家觉得有更好的建议或者有新的方法麻烦告诉我,谢谢!以下是我的博客地址:http://farrell.cnblogs.com/
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
namespace SendEmailSpace
{
/// <summary>
/// iniClass 的摘要说明。
/// </summary>
// TODO: 在此处添加构造函数逻辑
public class INIClass
{
public string inipath;
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
/// <summary>
/// 构造方法
/// </summary>
/// <param name="INIPath">文件路径</param>
public INIClass(string INIPath)
{
inipath = INIPath;
}
/// <summary>
/// 写入INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public void IniWriteValue(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, this.inipath);
}
/// <summary>
/// 读出INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
public string IniReadValue(string Section, string Key)
{
StringBuilder temp = new StringBuilder(500);
int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.inipath);
return temp.ToString();
}
/// <summary>
/// 验证文件是否存在
/// </summary>
/// <returns>布尔值</returns>
public bool ExistINIFile()
{
return File.Exists(inipath);
}
}
//
}
2008年1月24日
以下是一些对excel的一些基本操作
1:工程对excel类库的导入,如:c:\program files\Microsoft office\offiece11\excel.exe
2:命名控件的引入: using Microsoft.office.Interop.Excel;
3:如果是对一个已经存在的excel文件进行操作则:
Application app=new Application();
Workbook wbook=app.Workbooks.Open("c:\\temp.xls",Type.Missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing);
Worksheet worksheet=(Worksheet)wbook.Worksheets[1];
4:如果是新建一个excel文件:
Application app=new Application();
Workbook wbook=app.Workbook.Add(Type.missing);
Worksheet worksheet=(Worksheet)wbook.Worksheets[1];
5:设置某个单元格里的内容:
worksheet.Cells[1,2]="列内容"
6读取某个单元格里的内容
string temp=((Range)worksheet.Cells[1,2]).Text;
7设置某个单元格里的格式
Excel.Range rtemp=worksheet.get_Range("A1","A1");
rtemp.Font.Name="宋体";
rtemp.Font.FontStyle="加粗";
rtemp.Font.Size=5;
8 保存新建的内容:
worksheet.SaveAs("c:\\temp.xls",Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing);
2008年1月8日
之前做过几个的多语言程序,包括C/S结构和B/S结构的。总体来说都是差不多,都是将语言信息保存在数据库中,或者保存在XML中.在Form load的时候加载控件的信息.其实感觉都差不多,以下以B/S为例,简单介绍一下保存在XML方法
1:对于每种语言的所有元素全部写在一个XML文件里面。如:English的话,那么所有包含English的语言信息全部写在一个XML里面,并且将每种语言的文件全部放在一个目录下面,这样比较好统一处理。比如说统一找目录等
2:创建一个类,该类的主要负责读取某种语言的xml文件,并且将数据保存在这个类里面,并且根据传入的key来读取信息.
类成员主要包含以下信息:
private Hashtable m_arrInterfaceString; //用来保存语言信息(key,VALUE)。
private const string XmlKey_ConstVariable = "//Const_Variable"; //主要是指名xml文件下语言信息保存在哪个Nodes下
private const string XmlKey_Key = "Key";//语言元素的key
private const string XmlKey_Value = "Value"; //语言元素的key
以下是保存在XML中的例子
<Const_Variable>
<Key>VBT_UserLogin_lbl_password</Key>
<Name>UnKnow</Name>
<Value>密码</Value>
<Describe>UnKnow</Describe>
</Const_Variable>
以下的方法是读取xml
public bool LoadXMLDoc(string i_strXMLDocPath)
{
bool bResult = false;
if(m_arrInterfaceString == null)
{
m_arrInterfaceString = new Hashtable();
}
XmlDocument xdoc = new XmlDocument();
try{
xdoc.Load(i_strXMLDocPath);
}
catch(Exception ex)
{
string a = ex.Message;
}
//解吸
XmlNodeList nodes = xdoc.SelectNodes(XmlKey_ConstVariable);
XmlNode KeyNode = null;
XmlNode ValueNode = null;
string strKey = null;
string strValue = null;
foreach(XmlNode node in nodes)
{
KeyNode = node.SelectSingleNode(XmlKey_Key);
ValueNode = node.SelectSingleNode(XmlKey_Value);
if((KeyNode != null) && (ValueNode != null))
{
strKey = KeyNode.InnerText;
strValue = ValueNode.InnerText;
try
{
m_arrInterfaceString.Add(strKey,strValue);
}
catch
{
//int i = 0;
}
}
else
{
bResult = false;
}
}
return bResult;
}
以下方法是读取值
public string GetString(string i_strKey)
{
string strResult = "";
if(i_strKey != null && m_arrInterfaceString[i_strKey] != null)
{
strResult = (string)m_arrInterfaceString[i_strKey];
}
return strResult;
}
以上的方法是创建某种语言的一个类,如果是包含多种语言的话,需要再创建一个Hashtable,其中key是语言的ID,上面创建的类。
对于在某个页面的page_load里面,根据语言类型到Hashtable 里面获取该类的实例,然后通过该实例的GetString 方法来获取某个控件的名字
2008年1月7日
Cookie的用法有点类似Session,在HttpCookie 类成员中发现有个NameValueCollection类型,而这个类型是ICollection接口。这说明Cookie是支持键值队的,就像Session一样使用。从使用上来说Cookie 和 Session 是类似的。
如:
添加设置
HttpCookie cookie = new HttpCookie("Test");
cookie.Values.Add("Name", "Name1");
cookie.Values.Add("Age", "30");
cookie.Values.Add("Sex", "boy");
cookie.Values.Add("LastName", "Liu");
cookie.Expires = DateTime.Now.AddYears(1);
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
System.Web.Security.FormsAuthentication.SetAuthCookie("Test", false);
读取:
HttpCookie coke = System.Web.HttpContext.Request.Cookies["Test"];
string Name = coke["Name"];
string Age = coke["Age"];
string Sex = coke["Sex"];
Session 的使用也是类似的。
但是在功能上来说是不同的。
Session 是保存在服务器端的。但是Cookie是保存在客户端,具体来说应该是在Documents and Settings 目录下的当前登陆的用户文件目录下。由于是保存在用户端,所以相对与Session来说Cookie不适合保存重要的用户信息。
对于Cookie发现以下特点:
对于使用Cookie的用户来说最好先判断用户的IE是否已经禁用该功能:
如:
If (Request.Browser.Cookies == true )
{
}
用户最后设置期限
Expires(期限):获得或设置cookie的终止日期和
以上是对Cookie的一些理解,但是还有一些小问题还不知道为什么?
1: 对于Cookie信息是如何发送给服务器端的。对于一网页请求,客户端会发送请求地址给服务器端,是通过 post get header还是通过其他的途径呢?
