C# 数据库 商品入库出入计算库存 数据库winform 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://baike.baidu.com/link?url=AsP6npW_cg1gWOGy_V-E1Xzt-uWN5Ld0V3kooQAmgv8THbqCQ7Ijgg47zLBO0y8Tf1tN62twCWtoFmdhyjWRxq你需要定期实盘,记下期出库存,盘盈/盘亏数,剩下滴则实时计算 按照数据库设计,要有表型号表(基本数据表)出入库表(履历表),内含型号表主键库存表(保存当前库存状态),内含型号表主键在入库的时候,先查询 型号表 是否有要入库的型号,没有的话就插入一条型号记录,同时插入一条库存记录。有的话找出 库存表 对应的型号库存,更改之。在数据库中查询存不存在,采用Select Count(1) From....Where ...或者使用if exists...,效率还是比较高的,楼主说使用List遍历,List里面的入库单的多个型号数据吗?那就这样吧。最好写存储过程。因为型号表和库存表的记录数基本一致(一个型号一条库存),而且型号信息简单(只有一个名称信息)的话,型号表也可以不用。那查询存不存在就得查 库存表 每次入库都新增一条数据。出库修改数据状态。你需要的只是统计上做group by而已。 当然需要先select,然后才决定是update还是insert。如果你能够让SQL Server研发项目组把Update和Insert语句合并成一条新的Upsert语句,那你就“不麻烦”了。否则,你当然需要把这三条语句写在一个事务中。写3条语句就嫌麻烦,你也太懒啦。库存需要大量进行查询,一个程序中有成千上万其它行为需要频繁查询库存数量和库存成本(大多数是要求移动加权平均成本),因此每一次查询都把所有历史明细“统计一遍”这是不显示的。查询库存账时,不做任何计算,直接查询出结果!因此需要实时库存数量和库存成本。 楼主做的是简单的库存管理。在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。 楼主做的是简单的库存管理。在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。这是第一次做仓管系统,完全自己的想法,就没想那么深。软件需求也是经理嫌我平时闲着没事建议做做的, 这样库存就完全没有安全性与稳定性可言拉啊多条就不安全,放到一条记录里就安全?谁告诉你的,该打.你要做的不过是入库的时候直接插入一条记录,出库的时候需要select,,group by,看是否有足够的库存可以出库,避免总量变成负数而允许出库的时候,出库其实也insert一条,设置个标识字段表示一下到底是出库还是入库查询的时候累加一下就完了,sum(入库)-sum(出库)这样还能看清每一笔出入库的量和时间 我使用VS2013写的,在调试的时候是单线程运行,可以正常操作,但是单独运行程序的时候,是多线程运行的,这是会出现一种情况,就是在软件读取或写入一张数据表的过程中,如果另一个表的操作也触发了,那么其就会失效。直接描线的结果就是第二张表修改失败。这个需要如何解决呢?你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand com = new SqlCommand(); com.Connection = conn; List<StockData> sdlist = new List<StockData>(); com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'"; SqlDataReader sdr = com.ExecuteReader(); while (sdr.Read()) { StockData sd = new StockData(); sd.Version = sdr[1].ToString(); sd.Quantity = sdr.GetInt32(3); sdlist.Add(sd); } sdr.Close(); int Quantity = 0; foreach (StockData sid in sdlist) { com.CommandText = "select * from stock where Version='" + sid.Version + "'"; int i = Convert.ToInt32(com.ExecuteScalar()); if (i != 0) { SqlDataReader sdrt = com.ExecuteReader(); Quantity = sdrt.GetInt32(2) + sid.Quantity; sdrt.Close(); com.CommandText = "updata stock set Quantity = @Quantity"; com.Parameters.AddWithValue("@Quantity", Quantity); com.ExecuteNonQuery(); } else { com.CommandText = "insert into stock values(@Version,@Quantity)"; //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据 com.Parameters.Clear(); com.Parameters.AddWithValue("@Version", sid.Version); com.Parameters.AddWithValue("@Quantity", sid.Quantity); } } conn.Close(); 我使用VS2013写的,在调试的时候是单线程运行,可以正常操作,但是单独运行程序的时候,是多线程运行的,这是会出现一种情况,就是在软件读取或写入一张数据表的过程中,如果另一个表的操作也触发了,那么其就会失效。直接描线的结果就是第二张表修改失败。这个需要如何解决呢?你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand com = new SqlCommand(); com.Connection = conn; List<StockData> sdlist = new List<StockData>(); com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'"; SqlDataReader sdr = com.ExecuteReader(); while (sdr.Read()) { StockData sd = new StockData(); sd.Version = sdr[1].ToString(); sd.Quantity = sdr.GetInt32(3); sdlist.Add(sd); } sdr.Close(); int Quantity = 0; foreach (StockData sid in sdlist) { com.CommandText = "select * from stock where Version='" + sid.Version + "'"; int i = Convert.ToInt32(com.ExecuteScalar()); if (i != 0) { SqlDataReader sdrt = com.ExecuteReader(); Quantity = sdrt.GetInt32(2) + sid.Quantity; sdrt.Close(); com.CommandText = "updata stock set Quantity = @Quantity"; com.Parameters.AddWithValue("@Quantity", Quantity); com.ExecuteNonQuery(); } else { com.CommandText = "insert into stock values(@Version,@Quantity)"; //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据 com.Parameters.Clear(); com.Parameters.AddWithValue("@Version", sid.Version); com.Parameters.AddWithValue("@Quantity", sid.Quantity); } } conn.Close();额,第四十行没写 com.ExecuteNonQuery();。应该这么描述:单步调试没错,但是运行DEBUG里的EXE程序的时候会插入失败。 DataSet.update的问题,请高手解答【高分】 请问个设计思路WINFORM的(需要高手支援)。 求商店销售系统 怎么为多个文本框赋值 请教高手:C#中怎样触发Calendar中改变月的事件 对文件夹的监控以及对数据的处理 能否共存 NHibernate配置的问题 请教:为什么我创建Excel应用总是出现“拒绝访问”的错误信息,详细内容件下,谢谢! 一个不错的消息啊,在家来看看 请教:微软.net系列:C#,vc++,J#以及sun公司的Java语言有何区别??? 高手來看下开发图例所示功能软件共需要哪些语言技术 WinForm中的MDI子窗体,如何显示关闭按钮位置?
型号表(基本数据表)
出入库表(履历表),内含型号表主键
库存表(保存当前库存状态),内含型号表主键在入库的时候,先查询 型号表 是否有要入库的型号,没有的话就插入一条型号记录,同时插入一条库存记录。
有的话找出 库存表 对应的型号库存,更改之。
在数据库中查询存不存在,采用Select Count(1) From....Where ...或者使用if exists...,效率还是比较高的,楼主说使用List遍历,List里面的入库单的多个型号数据吗?那就这样吧。最好写存储过程。因为型号表和库存表的记录数基本一致(一个型号一条库存),而且型号信息简单(只有一个名称信息)的话,型号表也可以不用。
那查询存不存在就得查 库存表
出库修改数据状态。你需要的只是统计上做group by而已。
楼主做的是简单的库存管理。
在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。
然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。
楼主做的是简单的库存管理。
在实际中,库存统计要展示的内容多、形式也多,什么图表曲线分类的,所以实际是不查询库存表(Stock)的,建立出入库履历表,记录每次出入库的信息,录入的时候只做插入操作,查询的时候查询出入库履历表。
然后定期盘点,形成盘点表,在数据量大时可直接采用盘点节点。数据量再大还要备份分库。
这是第一次做仓管系统,完全自己的想法,就没想那么深。软件需求也是经理嫌我平时闲着没事建议做做的,
多条就不安全,放到一条记录里就安全?谁告诉你的,该打.
你要做的不过是入库的时候直接插入一条记录,出库的时候需要select,,group by,看是否有足够的库存可以出库,避免总量变成负数
而允许出库的时候,出库其实也insert一条,设置个标识字段表示一下到底是出库还是入库
查询的时候累加一下就完了,sum(入库)-sum(出库)
这样还能看清每一笔出入库的量和时间
你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象
每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand com = new SqlCommand();
com.Connection = conn; List<StockData> sdlist = new List<StockData>(); com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'";
SqlDataReader sdr = com.ExecuteReader();
while (sdr.Read())
{
StockData sd = new StockData();
sd.Version = sdr[1].ToString();
sd.Quantity = sdr.GetInt32(3);
sdlist.Add(sd);
}
sdr.Close(); int Quantity = 0;
foreach (StockData sid in sdlist)
{
com.CommandText = "select * from stock where Version='" + sid.Version + "'";
int i = Convert.ToInt32(com.ExecuteScalar());
if (i != 0)
{
SqlDataReader sdrt = com.ExecuteReader();
Quantity = sdrt.GetInt32(2) + sid.Quantity;
sdrt.Close();
com.CommandText = "updata stock set Quantity = @Quantity";
com.Parameters.AddWithValue("@Quantity", Quantity);
com.ExecuteNonQuery();
}
else
{
com.CommandText = "insert into stock values(@Version,@Quantity)"; //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据
com.Parameters.Clear();
com.Parameters.AddWithValue("@Version", sid.Version);
com.Parameters.AddWithValue("@Quantity", sid.Quantity);
}
}
conn.Close();
你要使用多线程,就要使用多个数据库连接对象,不要用同一个全局对象或静态对象
每太明白啊,就局下面的语句为例子吧,读取STOCKINFO是成功的,可是往SOCK插入的时候就会失败,这是为什么呢?string connStr = @"server=.;database=NETSHARE;uid=sa;pwd=1";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlCommand com = new SqlCommand();
com.Connection = conn; List<StockData> sdlist = new List<StockData>(); com.CommandText = "select * from [stockinfo] where stockid='" + textBox1.Text + "'";
SqlDataReader sdr = com.ExecuteReader();
while (sdr.Read())
{
StockData sd = new StockData();
sd.Version = sdr[1].ToString();
sd.Quantity = sdr.GetInt32(3);
sdlist.Add(sd);
}
sdr.Close(); int Quantity = 0;
foreach (StockData sid in sdlist)
{
com.CommandText = "select * from stock where Version='" + sid.Version + "'";
int i = Convert.ToInt32(com.ExecuteScalar());
if (i != 0)
{
SqlDataReader sdrt = com.ExecuteReader();
Quantity = sdrt.GetInt32(2) + sid.Quantity;
sdrt.Close();
com.CommandText = "updata stock set Quantity = @Quantity";
com.Parameters.AddWithValue("@Quantity", Quantity);
com.ExecuteNonQuery();
}
else
{
com.CommandText = "insert into stock values(@Version,@Quantity)"; //执行到这里时,程序会不报错执行完毕,但是实际上并没有插入任何数据
com.Parameters.Clear();
com.Parameters.AddWithValue("@Version", sid.Version);
com.Parameters.AddWithValue("@Quantity", sid.Quantity);
}
}
conn.Close();
额,第四十行没写 com.ExecuteNonQuery();。
应该这么描述:单步调试没错,但是运行DEBUG里的EXE程序的时候会插入失败。