递归火山软件开发平台

标题: 请教大佬,进销存的库存是怎么做的? [打印本页]

作者: liuyong886    时间: 2024-1-18 12:55
标题: 请教大佬,进销存的库存是怎么做的?
求一个思路,没有经验,给自己写了一个小的进销存,用了三个表,一个入库表,一个出库表,一个库存表,操作的时候就是入库或者出库的时候修改库存表,但是老是有一些莫名其妙的问题,比如修改入库或出库的时候,库存数量对不上了,但是又不是每次都会出错,只是很少的时候会出错,没有错误提示,查不出来问题,所以放弃这种方法了。
现在用另一种方法,建两个表,一个入库表,一个出库表,显示库存就用入库数减出库数,暂时没问题,但是但心今后数据多了以后,cha询整个入库或出库会用时比较久。



我知道有个期初数期未数的叫法,但是不知道怎么用到程序里。

请教你们一般是怎么处理这个问题的?

谢谢!





作者: kingsoft    时间: 2024-1-18 21:59
cha询的时候就要重新计算一次!

作者: glbosom    时间: 2024-1-18 23:04
修改数据时记得用事务
作者: 老道    时间: 2024-1-19 08:13
cha询的时候 加上SUM 直接计算。不用读出每条记录循环计算
作者: 阿杰    时间: 2024-1-19 09:00
库存表不用创建,建个商品表就行
用SQL语句,以商品表进行计算库存,库存=进货数量-销售数量
这是个思路
有问题可以加个weixin共同探讨(weixin:109032917) QQ:109032918
作者: chenfeng0614    时间: 2024-1-19 10:55
用视图,具体用法百度搜索。
作者: wangvoldp    时间: 2024-1-19 12:19

1.用事务, 在事务中同时操作 出库表 和 库存表, 失败就回滚, 事务会锁表
2.直接用sql的加减, 不要自己取出来加减再更新
作者: liuyong886    时间: 2024-1-19 12:56
glbosom 发表于 2024-1-18 23:04
修改数据时记得用事务

<火山程序 类型 = "通常" 版本 = 1 />
库存数 = 文本到小数 (表格1.取文本数据 (i, 8)) - 文本到小数 (表格1.取文本数据 (i, 4))

SQL = "update 产品信息表 set 库存 ='" + 到文本 (库存数) + "' where 条码 = " + 条码

如果 (全局操作类.成员_Sqlite数据库.执行SQL语句 (SQL, ) != SQLite执行结果.成功)
{
    信息框 ("修改库存数失败! ")
    回滚事务 ()
}


有库存表的时候也是有用事务的,比如说一份送货单有10个产品,修改送货单的时候有时候没问题,但是有时候9个修改成功了,1个没有修改成功。
作者: liuyong886    时间: 2024-1-19 13:01
阿杰 发表于 2024-1-19 09:00
库存表不用创建,建个商品表就行
用SQL语句,以商品表进行计算库存,库存=进货数量-销售数量
这是个思路

成员_Sqlite记录集2 = 全局操作类.成员_Sqlite数据库.取记录集 ("select (select sum(a.数量箱)from 入库明细表 a where a.条码='" + 成员_Sqlite记录集.读文本数据 (0) + "')-(select sum(b.数量箱)from 送货单表 b where b.条码='" + 成员_Sqlite记录集.读文本数据 (0) + "') as 库存数", )


我现在就是这样做的,这样暂时没有问题,但是,如果时间久了或者数据多了怎么办?如果几年后呢,显示库存的时候也要把几年前的一起统计了。

我知道有个期末的说法,但是不知道怎么用。
作者: liuyong886    时间: 2024-1-19 13:03
chenfeng0614 发表于 2024-1-19 10:55
用视图,具体用法百度搜索。

嗯嗯。谢谢。
作者: liuyong886    时间: 2024-1-19 13:04
kingsoft 发表于 2024-1-18 21:59
cha询的时候就要重新计算一次!

我样的话时间久了,数据量大了,速度就会慢了吧。
作者: liuyong886    时间: 2024-1-19 13:06
wangvoldp 发表于 2024-1-19 12:19
1.用事务, 在事务中同时操作 出库表 和 库存表, 失败就回滚, 事务会锁表
2.直接用sql的加减, 不要自己 ...

一开始是有用到事务,一份表10条记录,有可能有一条没有修改成功,但是也没有提示。

作者: wangvoldp    时间: 2024-1-19 13:09
liuyong886 发表于 2024-1-19 12:56
库存数 = 文本到小数 (表格1.取文本数据 (i, 8)) - 文本到小数 (表格1.取文本数据 (i, 4))

SQL = "upda ...

你理解错事务了, 事务相当于锁, 事务开始时其他线程或进程无法操作这个表, 直到事务解除占用,
你上面代码中存在 库存 = 库存数, 你应该这样 库存 = 库存 - 1, 因为单条sql语句被执行时,也相当于事务再运行
如果用事务步骤如下
事务开始
  库存数 = 取出库存数
  库存数 = 库存数 - 1
  更新库存数 = 库存数
事务提交

上面这些语句都需要再事务中运行, 如果你在事务外面取出了库存数, 表是解锁状态,此时其他用户也操作了库存数, 那你刚取出的库存数还是老的,你再写入不就对不上了,
事务相当于锁, 进入事务后他会锁住, 其他用户再来操作都得排队等待, 直到我的事务完成了,你们再来操作
作者: 4899    时间: 2024-1-19 15:48
用事务,生效入库单/出库单的时候,对应修改库存表,修改成功 入库单/出库单 标记已生效,修改库存失败,事务回滚,提示错误,同时 入库单/出库单 不标记已生效。
作者: liuyong886    时间: 2024-1-19 16:16
wangvoldp 发表于 2024-1-19 13:09
你理解错事务了, 事务相当于锁, 事务开始时其他线程或进程无法操作这个表, 直到事务解除占用,
你上面代码 ...

<火山程序 类型 = "通常" 版本 = 1 />

开始事务 ()
计次循环 (表格1.行数 - 1)
{
   
    变量 库存数 <类型 = 小数>
   
    i = 取循环索引 () + 1
   
    库存数 = 文本到小数 (表格1.取文本数据 (i, 8)) - 文本到小数 (表格1.取文本数据 (i, 4))
   
    SQL = "update 产品信息表 set 库存 ='" + 到文本 (库存数) + "' where 条码 = " + 条码
    如果 (全局操作类.成员_Sqlite数据库.执行SQL语句 (SQL, ) != SQLite执行结果.成功)
    {
        信息框 ("修改库存数失败! ")
        回滚事务 ()

    }






    SQL = "insert into 送货单表 (日期,单号,条码,产品名称,数量箱,客户名称,库存数) values ('" + 日期 + "','" + 单号 + "','" + 条码 + "','" + 产品名称 + "','" + 数量箱 + "','" + 客户名称 + "','" + 到文本 (库存数) + "')"
    如果 (全局操作类.成员_Sqlite数据库.执行SQL语句 (SQL, ) != SQLite执行结果.成功)
    {
        信息框 ("保存失败! ", 信息框按钮.错误图标)
        回滚事务 ()


    }

}
信息框 ("保存成功!", 信息框按钮.信息图标)

保存事务 ()


//我上面只截取了一小段,这个完整一点,应该是没有用错的吧。
我出现的那个错误呢,概率比较低,不是每次都会出错,有时候一个月也不会错,所以不好找问题。

谢谢回复。

作者: liuyong886    时间: 2024-1-19 16:20
4899 发表于 2024-1-19 15:48
用事务,生效入库单/出库单的时候,对应修改库存表,修改成功 入库单/出库单 标记已生效,修改库存失败,事 ...

嗯,我开始就是这样做,下面放了一段代码。
我找不出原因,算了不找了,用另外的方法,不用库存表保存库存了,用入库减出库计算库存。

我就想知道别人一般是怎么做的,如果时间长了,数据量肯定会很大,不知道到时候会不会计算很慢。
作者: 冠杰五金    时间: 2024-1-20 01:47
有没有想过用一张表?可能会更好实现哦~~~~~




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4