我的问题_2

hotyei 2001-06-11 11:41:00
加精
请问怎样进行记录的横向计算?

比如记录如下:

存货名称 仓库1 仓库2 仓库3 仓库4 总计
大米 10 20 30 40 100

我要求总计是计算字段,而“仓库1、2、3、4”这些字段不是固定的!
因为我可能会添加新的字段如“仓库5”“仓库6”。

应如何实现!又或者用其它的数据库结构来保存?必给分!!!
...全文
110 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotyei 2001-06-14
  • 打赏
  • 举报
回复
谢谢大家!
hotyei 2001-06-13
  • 打赏
  • 举报
回复
谢谢大家!我会认真学习范式的了。
孩皮妞野 2001-06-12
  • 打赏
  • 举报
回复
TR@SOE的意见, 你要好好看一看。

weenyboy 2001-06-12
  • 打赏
  • 举报
回复
很简单的操作,使用动态sql语句

AnsiString S=DataSource->DataSet->Fields[1]->FieldName;
for(int i=2;i<DBGrid1->DataSource->DataSet->FieldCount-1;i++)
{
S+="+";
S+=DBGrid1->DataSource->DataSet->Fields[i]->FieldName;
}
Query1->SQL->Text = "Update theTable Set Total="+S;
Query1->ExecSQL
TR@SOE 2001-06-12
  • 打赏
  • 举报
回复
你对数据库的NORMALIZATION(范式)还没有掌握吧?在一般的讲述数据库基础知识的书中都会讲到,关系数据库中的每个表最少要求达到第三范式。具体的要求我也不是记得很清楚,反正如果针对你上述的情况,你可以这样来修改你的表结构:

货品信息表
货品编号 支数 成分 款号 色号 颜色
0001 2/28 50%Wool 50%W-2/28 1000 雪雪白
0002 3/37 100%Wool ABCDE 5000 墨墨黑

货存货表
库存流水号 货仓号 货品号 数量
1 1 0001 100
2 2 0001 5000
3 1 0002 200
4 2 0002 1500

你可以将货仓号+货品号作为第二个表的主键,以确保对于每个仓库,某个产品的数量只能有一个。或者如果做不到的话,将库存流水号作为主键。无论在何种情况下,第二个表中的货品号都将作为外键和第一个表的主键货品号相关联。

这样不是很好吗?
hotyei 2001-06-12
  • 打赏
  • 举报
回复
但如果我的存货不是大米,而是毛料,因为一种毛料有多个相关的数据,如果按程序猪的做法,会有很多多余的数量,而且几种毛料之间也有一定的关系,如:

存货编码 支数 成份 款号 色号 颜色 缸号 数量............
0001 2/28 50%Wool 50%W-2/28 1000 纯白 3452 100
0001 2/28 50%Wool 50%W-2/28 1000 纯白 3453 100
0001 2/28 50%Wool 50%W-2/28 1000 纯白 3454 100
0001 2/28 50%Wool 50%W-2/28 1000 纯白 3455 100

看,如果有十个仓库的话,有多少多余的数量啊,一间厂一般都会有上万种毛料啊!而且只要缸号不同,其它参数相同,也会是作为同一种毛料的。
ciml 2001-06-11
  • 打赏
  • 举报
回复
表结构很不合理,重新设计表结构!
TR@SOE 2001-06-11
  • 打赏
  • 举报
回复
你这个表的结构是不好的,如果你决定增加或/减少一个仓库,你会发现你陷入了泥潭。

如果一定要那样做,那么可以这样来:
#define TOTAL_STOCKS 4 //一共有4个仓库
const AnsiString StockName[]={"Stock1","Stock2","Stock3","Stock4"}; //存储各仓库在表中的字段名

...
int sum=0;
for(int i=1;i<=TOTAL_STOCKS;i++)
sum+=Table1->FieldByName(StockName[i-1])->AsInteger;

大概是可以完成。修改时,只要修改TOTAL_STOCKS和StockName即可。

推荐的方法中,表结构如下:
Item Stock Qty
大米 仓库1 100
大米 仓库2 1000
.....

这样要求出大米的总库存,可以简单地用SQL来进行:
select item, sum(qty) from table1 where item='大米'


wjzhuang 2001-06-11
  • 打赏
  • 举报
回复
不固定的数据表???
在你的程序中应该有能动态添加修改数据表结构的功能.
所以你可以在这里设置一些变量或者什么的来读取你这个数据表的长度(有几个字段).
然后在需要的地方就可以用得上.
不好意思,我不太明白你要实现什么功能...
wjzhuang 2001-06-11
  • 打赏
  • 举报
回复
帮主的回答中建议你把仓库当成值,而不是字段.这样可以避免修改仓库数目的麻烦.如下
表结构如下:
Item Stock Qty
大米 仓库1 100
大米 仓库2 1000
.....
我个人认为这是更合理的修改方式

数据量大查询速度和你的数据库关系比较大.有超过10000条的纪录就不要使用桌面数据库了(比如:access,),改用比较大型的数据库
另:在查询中使用sql语句更方便,灵活.至少不用自己写代码遍历数据表.
TR@SOE 2001-06-11
  • 打赏
  • 举报
回复
总计字段在你的数据结构中是冗余字段,因为已经有了各个分字段。如果必须要有,可以将它独立出来做一个表格。

用SQL是可以不用循环的。你的问题关键是表的结构不合理。
hotyei 2001-06-11
  • 打赏
  • 举报
回复
大家的方法都是通过循环字段来计算的,但如果记录的数量多时(比如1万条),真怕速度会很慢。

TO:Ciml
你认为怎样设置表的结构呢?总计字段是一定要的了。
gqxs 2001-06-11
  • 打赏
  • 举报
回复
adoquery->Sql->Add("select item from table1");
adoquery->Sql->Open();
while(!adoquery->Eof)
{
sum += adoquery->FieldByName("item")->AsInteger;
adoquery->next;
}

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧