B/S模式仓库管理系统,VS2003,SQL2000
(kcbgyp表)
id  物品编号 品名   单价 初始数量 当前数量   入库日期
 1    001   签字笔   5      10      5       2006-1-1
 2    110   油性笔   6      10      6       2006-1-2
 3    001   签字笔   9      10      4       2006-1-3
 4    001   签字笔   10     10      4       2006-1-4
 
以上是在库情况,用户端展现:
 
 物品编号   品名    当前数量   
   001    签字笔      13       
   110    油性笔       6       
即由于同一物品单价会发生变更,因此系统控制用户不能看到单价,只能看到总数,出库的时候按照用户申请的数量以及入库日期进行出库
 
例如:用户A申请物品编号为001的签字笔10支后的在库情况:
id  物品编号 品名   单价 初始数量 当前数量   入库日期
 1    001   签字笔   5      10      0       2006-1-1
 2    110   油性笔   6      10      6       2006-1-2
 3    001   签字笔   9      10      0       2006-1-3
 4    001   签字笔   10     10      3       2006-1-4
 
申请表(SQ_LIST):(单据号取系统时间)
id  单据号      物品编号 单价 申请数量 金额
1   1022190014    001    5     5      25
3   1022190014    001    9     4      36
4   1022190014    001    10    1      10
 
申请表ID与物品在库ID相同,作为唯一标识,第一步提交不更新库存表,只更新申请表
我现在遇到的困难是当填入申请数量提交时,不知道怎么写这条SQL语句把用户申请的东西写入申请表,我感觉一条SQL语句无法实现,有什么办法吗?
 
谢谢!

解决方案 »

  1.   

    string strid="001";
    int int申请数量 = 10;for ( int i = 0; i < 10; i++ )
    {
      //先取日期最小的在库数
      Select top 1 当前数量,品名,单价 from kcbgyp where 物品编号 = '001' AND 当前数量>0 Order by 入库日期  //用取出的在库数跟int申请数量比较。如果在库数大于int申请数量
      if ( 取出的在库数 >= int申请数量 )
      {
         insert into SQ_LIST .....//申请数量=int申请数量
         break;//退出循环
       }
       else
       {
        insert into SQ_LIST .....//申请数量=取出的在库数
        int申请数量 = int申请数量 - 取出的在库数;    }}大概的逻辑。
      

  2.   

    TO:mzy791129(little马) 我需要实现几种物品同时出库,望指教
      

  3.   

    看了一下你的流程:
    首先问一个问题,既然是先进先出,为什么下表的初始数量都是10,当前数量都是小于10呢?
    是不是应该id=1的当前数量为0时才出库id=3的呢?初始数量难道不是表示入库时的数量吗?
    先给解释一下id  物品编号 品名   单价 初始数量 当前数量   入库日期
     1    001   签字笔   5      10      5       2006-1-1
     2    110   油性笔   6      10      6       2006-1-2
     3    001   签字笔   9      10      4       2006-1-3
     4    001   签字笔   10     10      4       2006-1-4
      

  4.   

    流程是这样的吗?
    入库(登陆在库表)-->提交申请-->登陆申请表-->出库(更新在库表)没明白你想问什么,你是想问出库时如何更新在库表吗?
    还是问几种物品同时出库,怎么登陆申请表?
      

  5.   

    作程序,首先要知道,程序能干什么!
     
    id  物品编号 品名   单价 初始数量 当前数量   入库日期
     1    001   签字笔   5      10      5       2006-1-1
     2    110   油性笔   6      10      6       2006-1-2
     3    001   签字笔   9      10      4       2006-1-3
     4    001   签字笔   10     10      4       2006-1-4
    这部分是仓库信息表,但是对于程序,仓库只有当前数量可记录!要取 签字笔 10支 ,对程序来说,就是看仓库中是否有足够的数量,以供取用.id ,品名,入库时间,在仓库这个类中都是只是规则.下面来针对具体的申请,用这些规则判断,(true or false).
    申请表 同样道理
      

  6.   

    我是楼主
    首先解释一下流程
    大家说的没错,是我弄错了
    id  物品编号 品名   单价 初始数量 当前数量   入库日期
     1    001   签字笔   5      10      0       2006-1-1
     2    110   油性笔   6      10      6       2006-1-2
     3    001   签字笔   9      10      4       2006-1-3
     4    001   签字笔   10     10      10       2006-1-4应该是以上这个样子。
    我的问题是:根据入库日期先后出库,如果单价为9的签字笔数量不足时,再用单价为10的签字笔补充数量,并将这两种单价不同的物品ID以及数量写入库中。
    另外用户每次都要申请好几种物品,也存在多行更新的问题
      

  7.   

    而且这个与 B/S C/S没有关系,主要是在业务流程控制层上实现即可
      

  8.   

    private void chuku(string wpbh,int sqsl)
    {
    string djh="BG"+Session["gcdm"]+DateTime.Now.ToString("yyMMddHHmmss");

    for ( int j = 0; j < sqsl; j++ )
    {
    //先取日期最小的在库数
    string str_insert = ""; 
    string str_update = "";
    string sql="Select top 1 id,zksl,pm from kcbgyp where wpbh = '"+wpbh+"' AND zksl>0 Order by rkrq";
    string strconn = System.Configuration.ConfigurationSettings.AppSettings["DSN"];//从Web.config中读取
    SqlConnection conn =new SqlConnection(strconn);
    SqlCommand comm = new SqlCommand(sql,conn);
    conn.Open();
    SqlDataReader dr = comm.ExecuteReader();
    dr.Read();
    int id=dr.GetInt32(0);
    int zksl=dr.GetInt32(1);
    //用取出的在库数跟int申请数量比较。如果在库数大于int申请数量
    if ( zksl >= sqsl )
    {
    str_insert= "insert into SQ_LIST VALUES('"+id+"','"+djh+"','"+wpbh+"','"+sqsl+"','2006-10-28','aa',bgyp',cast('10' as money),'10','test'";//申请数量=int申请数量

    ExecuteSql(str_insert);
    break;//退出循环
       } else
    {
     str_insert= "insert into SQ_LIST VALUES('"+id+"','"+djh+"','"+wpbh+"','"+zksl+"','2006-10-28','aa','bgyp',cast('10' as money),'10','test')";//申请数量=取出的在库数
    str_update="update kcbgyp set zksl='0' where id='"+id+"'";
    sqsl = sqsl - zksl;   }
     ExecuteSql(str_insert);
     ExecuteSql(str_update);
    }}private void btn_OK_Click(object sender, System.EventArgs e)
    {for(int i = 0;i < dg_Cart.Items.Count; i++)
    {
    string str_wpbh=dg_Cart.Items[i].Cells[1].Text;
    TextBox txtSL = (TextBox)dg_Cart.Items[i].FindControl("Txt_Sqsl");
    string str_Tmp = txtSL.Text;
    int sqsl = new int();
    sqsl=int.Parse(str_Tmp); 
    this.chuku(str_wpbh,sqsl);
    }
      

  9.   

    多件更新的时候:ArrayList arr申请 = new ArrayList();
    object[] obj申请= new object[] 
    {
        申请物品ID,
        申请件数
    };
    arr申请.Add(obj申请);for ( int j = 0; j < arr申请.Count; j++ )
    {object[] objKey = ( object[] )arr申请[i];string strID=objKey[0].ToString(); //申请物品ID
    int int申请数量 = objKey[1].ToString() //申请数量for ( int i = 0; i < 申请数量; i++ )
    {
      //先取日期最小的在库数
      Select top 1 当前数量,品名,单价 from kcbgyp where 物品编号 = strID AND 当前数量>0 Order by 单价,入库日期  //根据自己的要求定排序  //用取出的在库数跟int申请数量比较。如果在库数大于int申请数量
      if ( 取出的在库数 >= int申请数量 )
      {
         insert into SQ_LIST .....//申请数量=int申请数量
         break;//退出循环
       }
       else
       {
        insert into SQ_LIST .....//申请数量=取出的在库数
        int申请数量 = int申请数量 - 取出的在库数;    }}}