今天早上急忙赶来,把周六周日调试好的代码更新到我自己的机器上。我想总算是轻松了,周6周日没白下功夫。But...自动生成代码好像和实际工作结合有一点不方便的地方,所以重新整理思路,重新编写代码。
        简单说一下自动生成,(我实际工作中是让呈批件的代号实现自动生成)过程是这样的:
        1.数据库中肯定有两张表,一张主表,记录所有信息,比如是个报表之类的,那么会记录登记的人员及部门。第二张就是更新的读写表,记录号码,把号码写入主表后,自动 +1。当然过程是通过存储过程实现的。
         存储过程代码:(LastYear=DataTime.Now.Year; Dep=部门)
CREATE PROCEDURE AM_GetNum
@LastYear int,
@Dep varchar(50)

AS
if exists(select Num from AM_Num where LastYear=@LastYear and Dep=@Dep)
begin
update AM_Num set Num=Num+1 where  LastYear=@LastYear and Dep=@Dep
end
else
begin
insert into AM_Num(Num,LastYear,Dep) values(1,@LastYear,@Dep)
end
select Num from AM_Num where LastYear=@LastYear and Dep=@Dep
GO
        2.页面中定义一个Label,显示这个自动生成的号码。我们的思路是这样,写的人不会看到这个号码,因为我们并不知道这个人是否会保存或者提交这个表,所以避免无谓的失误,我们定义只有这个人保存或者更改才给予他这个号码,所以保存或者提交后。会在主页面生成,主页面就会显示这个自动生成的号码。
        3.页面后台代码:
private int SetNum()
    {
        if (Label1.Text.Trim().Length > 1 && Label1.Text.Contains("-"))
            return 0;
        if (lockFlag) return -1;
        lockFlag = true;
        Label1.Text = DateTime.Now.Year.ToString() + "-" + TextBox1.Text + "-" + GetFileNum();   //TextBox1.Text 是数据库中主表中的部门,我已经在后台把它取出来,并且显示了。
        lockFlag = false;
        return 0;
    }
    private string GetFileNum()
    {
        int Num;
        SqlConnection con = new SqlConnection(CONN);
        SqlCommand cmd = new SqlCommand("AM_GetNum", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@LastYear", SqlDbType.Int));
        cmd.Parameters["@LastYear"].Value = DateTime.Now.Year;
        cmd.Parameters.Add(new SqlParameter("@Dep", SqlDbType.VarChar));
        cmd.Parameters["@Dep"].Value = TextBox1.Text;
        con.Open();
        Num = (int)cmd.ExecuteScalar();
        con.Close();
        return Num.ToString("0###");
    }
        在提交的时候(代码片段):
        if (IsValid == true)     //验证控件是否都通过验证
        {
         
            if (SetNum() < 0)
            {
                Response.Write("<script>alert('系统忙...,请稍后提交!');</script>");
                return;
            }
        }
        这几段代码很重要,因为我们可能会有同时提交一个表的时候,也就是说会有一个人,客户端提示:系统忙...,请稍后提交!这样就可以按照次序来排序了。
        4.问题来了:我已经生成好了,而且测试数据库写入也没问题。现在的要求是部门不能自动生成,因为可能会别的人填写不是自己本部门的呈批件。OK好解决,但是一定要写代码前构思好,我一开始想的是用Dropdownlist,直接把所有部门都给你写进去,马上我就觉得这样不好,因为部门太多,要几十个部门,还是让申请人手写的好。那OK,现在就是要数据验证的过程,第一:不能为空,第二:该部门存在。(我们这里部门都是大写英文字母简写),规范一点,把TextBox里面写的小写字母转换成大写字母,在TextChange中用.ToUpper就OK了,然后查找数据库中是否有这个部门。(这里最好把搜索数据库的存储过程写好,然后直接调用存储过程就好了)。
        5.查看数据库中是否有这个部门代码是:
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        string DepName = args.Value;
        SqlConnection con = new SqlConnection(CONN);
        SqlCommand cmd = new SqlCommand("select Count(*) from mrDepartment where DepName = '" + TextBox1.Text + "'", con);
        con.Open();
        int count = Convert.ToInt32(cmd.ExecuteScalar());
        con.Close();
        if (count > 0)
        {
            args.IsValid = true;
        }
        else
        {
            args.IsValid = false;
        }
       
    }
这个代码很简单,我是怕有别的人看我说半天不明白。。。。呵呵。
调试没问题,打完收工!!!!!
 
总结:
        我觉得这个问题关键就是对数据库的理解,我数据库比较小白,所以只有用一个表更新另一表的办法,我想应该会有更好的办法,希望大家指教。:)
        然后就是每一个控件一定要考虑周全,因为这个页面呢还有很多控件,只给有权限的人,简单说,“新建”和“审批”都是这一个页面,只是新建会页面所有控件清空,审批就调出数据库。所以验证和权限的把握一定要考虑详细,如果出了问题就不仅仅是调程序了,就需要调思路了。希望大家指点,如果大家有更好的建议和意见可以提出来,大家一起研究。