表不是我设计的,可是我对SQL认识太少了,
所以才请求大家能帮助我,
我的请求有过分吗?
如果让我跪下来请求大家,哪怕是帮助一点点,
谢谢你们了

解决方案 »

  1.   

    呵呵,你的问题确实混在一起不好回答,你如果能分成几个问题就好回答些,比如你的单位问题,我在上面已经回答了,你的库存控制问题, forgot2000(忘记2000年) 也指出用触发器和存储过程解决,但很难具体写出触发器的代码,因为你的问题都混在一起,触发器要考虑的方面很多,但你没有说全。
      

  2.   

    CREATE PROC InsertSubDate
     @TotalTableID bigint,            /*总表ID:Char(N)*/
     @GoodsID bigint,                 /*货品ID:Char(N)*/
     @InputNumber Numeric(9,2) = 0,       /*进货数量*/
     @SellNumber Numeric(9,2) = 0,        /*销售数量*/
     @StockNumber Numeric(9,2) = 0,       /*库存数量*/
     @PrevMonthStockNumber Numeric(9,2) = 0,/*上月库存数量:Char(N)*/    
    AS
    BEGIN
    declare @sumpremonth Numeric(9,2),
      @stock       Numeric(9,2),
      @ttid bigin;
    set sumpremonth =0 
    /*求上月库存数量*/
    select @sumpremonth=上月库存数量, @stock= 库存数量
    from 进销存总表
    where right(时间,2) = month(getdate()) /*时间为 '2002-04'形式,你可以更改*/
    AND 货品ID = @GoodsID
    AND 总表ID = @ttid
    set @stock = @stock + @InputNumber - @SellNumber
    IF EXISTS (SELECT * FROM  进销存总表  WHERE 总表ID = @ttid)
    update 进销存总表 set StockNumber = @stock
    where 总表ID = @ttid
    else
    insert into 进销存细表
    valuse
    (
    @TotalTableID,
    @GoodsID,
    @InputNumber,
    @SellNumber,
    @stock,
    @PrevMonthStockNumber,
    rtrim(ltrim(str(year(getdate()))))+'-' +rtrim(ltrim(str(month(getdate())))),
    )


    /*插入数据*/
    insert into 进销存细表
    valuse
    (
    @TotalTableID,
    @GoodsID,
    @InputNumber,
    @SellNumber,
    @stock,
    @PrevMonthStockNumber,
    getdate()
    )


    END;
      

  3.   

    我觉得这样的系统设计的就有问题。整个系统逻辑乱得很。这个程序说起来功能也不复杂,人为地搞得这么复杂。而且我觉得在多用户操作时很可能会产生问题。
    想不明白其中一点:当月没有出入库记录时,总表中没有当月的记录???这样的总表可信?可靠?可用?
    我觉得你应该这样理清一下整个系统逻辑:
    1、录入出入库记录时不要实时地更新总表的记录。象YANG_说的,好不要用库存余额这样的字段。可以通过单据审核或过账过程来完成总表的记录更新问题。因为单据审核(或过账)后是不允许改的。按你上面的方法,单据除非是不允许保存后再更改,否则,改一个单据,所有时间在其后的单据的余额数都要进行更新。而且还要锁定,不允许新的单据保存(因为最后的余额还没确定)。更不能进行删除,删除也会影响大量单据的余额字段更新问题。你这样的方式,需要花太大的代价去维护库存余额的正确性。实在不可取。
    2、断货表的内容是怎么来的?余额为零时就生成记录吗?通过查询总表来得出断货的记录就可以了,何必设一个表?
    3、在实际的系统中,我觉得最好不要使用不规范的计量单位,比如:包(不是小包,是那种大的包装)、瓶、件、车等。因为不能用来确定实际数量,比如一包中可能有10瓶,可能有20瓶,很可能会有调整。我以前公司用过的系统就有过这样的问题,一包由6个单位改成5个单位,使用人理所当然地在基础资料里将6改成5,结果所有报表都不对。既然你在数据库里保存的就是瓶,就让用户录入以瓶为单位的(虽然我觉得若是生产型的企业,以瓶也不严格,因为可能有大瓶,小瓶。我们现在公司用的单位大家猜猜,是用升的,MYGOD,真是晕死了。但我觉得只有用L才是准确的,因为用瓶,根本不能确定诸如实际产量之类的数据,实际产量非要用L才准确。)。不过实际情况中也不能要求太高,但是一定要注意避免这样的问题。所以我觉得你这里肯定也最好就用瓶来做单位,不允许用其他单位。因为可能换算关系会变,但操作员的思路不会变的,他上次一包是4瓶,他会录入1包,现在是1包5瓶,他肯定也是录入1包的。结果当然会乱了。
    4、加上月结的处理,按你的思路,需要存分月的出入库总表,在月结时,当月没有业务发生的数据也要在总表中有记录,而不是等到以后月份有出入库了再去补充。这样才能保证总表中的记录的完整的。试想一下,若不是这样,你按总表出本月余额表是不是会很难?(因为本月无记录的,需要找最近月份的记录查出当时的余额,怎么样SQL语句都会难写些,效率也低很多)。我怕你到时候又要来问该怎么写这样的SQL了。
    5、很奇怪,为什么在细表中看不到单据编号,且时间只精确到日,你怎么确定单据的先后?确定不了先后怎么确定得了每张单据上的库存数?
    6、建议找点写得好的进销存系统的数据库来研究研究。不要被这样糟糕的设计耽误了。
    7、不会数据库、不会SQL不是最要紧的,设计数据库只是个技术活,对业务的理解,系统的分析与设计才是最根本的。
      

  4.   

    我觉得这样的系统设计的就有问题。整个系统逻辑乱得很。这个程序说起来功能也不复杂,人为地搞得这么复杂。而且我觉得在多用户操作时很可能会产生问题。
    想不明白其中一点:当月没有出入库记录时,总表中没有当月的记录???这样的总表可信?可靠?可用?
    我觉得你应该这样理清一下整个系统逻辑:
    1、录入出入库记录时不要实时地更新总表的记录。象YANG_说的,好不要用库存余额这样的字段。可以通过单据审核或过账过程来完成总表的记录更新问题。因为单据审核(或过账)后是不允许改的。按你上面的方法,单据除非是不允许保存后再更改,否则,改一个单据,所有时间在其后的单据的余额数都要进行更新。而且还要锁定,不允许新的单据保存(因为最后的余额还没确定)。更不能进行删除,删除也会影响大量单据的余额字段更新问题。你这样的方式,需要花太大的代价去维护库存余额的正确性。实在不可取。
    2、断货表的内容是怎么来的?余额为零时就生成记录吗?通过查询总表来得出断货的记录就可以了,何必设一个表?
    3、在实际的系统中,我觉得最好不要使用不规范的计量单位,比如:包(不是小包,是那种大的包装)、瓶、件、车等。因为不能用来确定实际数量,比如一包中可能有10瓶,可能有20瓶,很可能会有调整。我以前公司用过的系统就有过这样的问题,一包由6个单位改成5个单位,使用人理所当然地在基础资料里将6改成5,结果所有报表都不对。既然你在数据库里保存的就是瓶,就让用户录入以瓶为单位的(虽然我觉得若是生产型的企业,以瓶也不严格,因为可能有大瓶,小瓶。我们现在公司用的单位大家猜猜,是用升的,MYGOD,真是晕死了。但我觉得只有用L才是准确的,因为用瓶,根本不能确定诸如实际产量之类的数据,实际产量非要用L才准确。)。不过实际情况中也不能要求太高,但是一定要注意避免这样的问题。所以我觉得你这里肯定也最好就用瓶来做单位,不允许用其他单位。因为可能换算关系会变,但操作员的思路不会变的,他上次一包是4瓶,他会录入1包,现在是1包5瓶,他肯定也是录入1包的。结果当然会乱了。
    4、加上月结的处理,按你的思路,需要存分月的出入库总表,在月结时,当月没有业务发生的数据也要在总表中有记录,而不是等到以后月份有出入库了再去补充。这样才能保证总表中的记录的完整的。试想一下,若不是这样,你按总表出本月余额表是不是会很难?(因为本月无记录的,需要找最近月份的记录查出当时的余额,怎么样SQL语句都会难写些,效率也低很多)。我怕你到时候又要来问该怎么写这样的SQL了。
    5、很奇怪,为什么在细表中看不到单据编号,且时间只精确到日,你怎么确定单据的先后?确定不了先后怎么确定得了每张单据上的库存数?
    6、建议找点写得好的进销存系统的数据库来研究研究。不要被这样不规范的设计耽误了。
    7、不会数据库不要紧,设计数据库只是个技术活,对业务的分析与设计才是根本问题。
      

  5.   

    谢谢楼上各位,特别是 icevi(按钮工厂),
    因为数据库不是我设计的,上面这些操作也是我整理出来的和设计人员讨论的结果。
    在进入公司以前只是自学了一些Java和ASP,对SQL只有少许了解,只会写简单语句。
    但是第一个项目给我的感觉实际上就是要求写一堆数据库的语句,对数据库水平要求比对Java的要求高多了。
    我先好好看看大家的意见,再和我们设计人员讨论一下。
      

  6.   

    我还没有和设计人员沟通,
    看了一下大家的意见,
    这个进销存系统是为如制药厂内部人员了解自己的药品在不同医院的销售情况而设计的,是针对医院的进、销、存,
    所以上面的进销存总表和细表还有医院ID这个字段。
    1,
    首先因为审核是需要分级审核的,即经过办事处-->分公司-->总公司三级审核。
    在进销存总表还有1个checked字段标志着审核的状态
    0:未被审核
    1:已被办事处审核
    2:已被分公司审核
    3:已被总公司审核
    -1:审核未通过(无论是哪一级的审核未通过)如果审核未通过,销售人员可以修改数据,如果处于审核中间阶段,销售人员就不能再修改数据。
    此时如果要修改数据(修改进销存的总表,可笑吧),必须提交修改申请并由总公司负责修改。icevi(按钮工厂),你说的“录入出入库记录时不要实时地更新总表的记录。最好不要用库存余额这样的字段。可以通过单据审核或过账过程来完成总表的记录更新问题”
    有点不明白,是指审核的哪个阶段完成总表的记录更新?2,
    断货表的内容---首先有1个页面可以设定提供给某个单位的某种货品多长时间算断货。
    在具体查看哪些货品断货的时候,搜索目前符合断货设定条件的所有货品(在设定时间段内进货量为0),
    然后认为决定哪些货品在哪个单位算作断货,并且把这条记录加进断货表中。一旦再次录入进削存细表数据时录入的入货量不为0,就自动清除断药表的记录4,
    “加上月结的处理,按你的思路,需要存分月的出入库总表,在月结时,当月没有业务发生的数据也要在总表中有记录”
      

  7.   

    跟据你的描述我作了以下几个表看看对你有没有参考价值:
    1.product表
    productID productname
    3.unit(单位表)单位数量填入最大的换数值。如某盒有五瓶,在单位名称处填入
    瓶,数量处填5,并给它分一个组号
    unitid unitnumber unitname unitgroup
    2.inputProduct (进货表)
    inputProductID productid inputNumber(进货数量) unitid Dates
    4.sellProduct(销售表)
    sellProductID productid sellNumber unitid Dates
    总表可能通过视图等方法实现
    细表也一样
    小弟愚见
    大家多提意见
      

  8.   

    我们设计人员强调:
    所有存入数据库中的数据都是换算成最小单位的数量,
    如果要改变换算量,就修改货品单位表TominiUnit的对应关系
    他好象不想改设计
      

  9.   

    顶楼的要求和我做的这个项目有些类似
    我这儿是一个三星级酒店,有很多部门:餐饮,客房,商场,仓库....
    各部门都有仓库物品需要统计管理。设计是这样的,一张“商品名称”表,包括ID,name等,商品的计量单位在这张表里规定好的。有点像你说的“货品单位表”。数据录入有两张表,是相关联的父子表关系,一张“单据父表”(fb),一张“单据子表”(zb),比如说在商场,一个客人来买了五样不同的商品,柜台只可能开一张单据,填上单据号,开票日期,营业员等信息,这些信息是存放在FB里的,ZB里是存的具体哪五样商品,具体单价和数量。FB和ZB是通过“单据号”关联的,在电脑数据录入时,只要键入商品名称的拼音缩写,就可以很方便地从“商品名称”表里调出五件商品。还有一张“库存表”,类似于你的总表。在插入父子表的同时,向库存表刷新,如果A商品,如果库存表有,就在原记录上累计;如果没有,就插新记录,如果库存表出了错,但上月库存还在,所以只要根据本月期初库存和本月父子表的数据,重新对库存表刷一次就正确了。我只是简单说了一下当月的情况,也许有些类似的地方,你参考一下