困扰两天,一直没有好的办法?求救!!!!!!!!!!!!!!!

ycg_893 2007-08-30 12:20:16
做了一个工资管理系统,字段之间的计算以及在表格中的显示问题?

需求如下:
建一个表A里面,预留100个字段,20个文本型(txt1,txt2....txt20),其他为数值型(Num1,Num2......Num80),用于装载用户的工资表.

表B是项目表(根据用户添加的工资项目以及工资的运算),在添加时,系统判断用户选择是文本型还是数值型以及添加顺序,系统自动获取表A的字段名.用户可以自定义公式.

项目表例:
显示顺序 字段名 项目名称 方式 公式
1 txt1 姓名 输入 无
2 txt2 部门 输入 无
3 Num1 基本工资 输入 无
4 Num2 工龄工资 输入 无
5 Num3 迟到早退 输入 无
6 Num4 工资合计 计算 Round(Isnull(Num1,0)+Isnull(Num2,0)-Isnull(Num3,0),2)
7 Num5 应交税金 计算 所得税公式
8 Num6 实发工资 计算 Round(Isnull(Num4,0)-Isnull(Num5,0),2)


输入项,表示手工输入
计算项:表示由系统的SQL计算(由于所税公式较长,所以没写出)

怎样让它们能在表格(未存入数据库之前)计算呢?
如:用DataGridView来显示.
姓名 部门 基本工资 工龄工资 迟到早退 工资合计 应交税金 实发工资
张三 车间 1600 410 10 2000 20 1980

求一个思路.怎样让输入基本工资\工龄工资等输入项(数值型)时,计算项(工资合计等),能按照公式计算出来.
注:顺序是由用户自定的,而公式我是将它转为SQL来验证,并且插入数据库时是根据公式进行的(更新入库没有什么问题),求的是怎样在表格中能动态地计算?

即: 表格动态地计算?
...全文
379 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycg_893 2007-09-04
  • 打赏
  • 举报
回复
谢谢大家
chuxue1342 2007-09-03
  • 打赏
  • 举报
回复
纯计算.怎么不在sql计算出来!!
amandag 2007-09-03
  • 打赏
  • 举报
回复
用DataGridView,是Winform吧,楼上怎么还有用AJAX的?
csharp_start 2007-09-03
  • 打赏
  • 举报
回复
你可以使用SQL语法的公式,通过在SQL执行来验证他们是否合法,在定义后,使用在DATAGRIDVIEW中的时候,就象我以前所说可能不能直接用什么方法来计算得到(不连接数据库),不过,可以通过替换操作符号的方法,把他们替换为DATATABLE.COMPUTE可以识别的字符串.
ycg_893 2007-09-03
  • 打赏
  • 举报
回复
自己再顶
ycg_893 2007-09-03
  • 打赏
  • 举报
回复
SQL2000
极地_雪狼 2007-09-03
  • 打赏
  • 举报
回复
什么数据库,可以考虑采用用户字定义函数。
ycg_893 2007-09-03
  • 打赏
  • 举报
回复
哎呀!看来没什么好的办法了
ycg_893 2007-09-03
  • 打赏
  • 举报
回复
不错!是Winform,怎样能让DataGridView计算SQL能识别的SQL函数呢?

用SQL计算以后再返回,倒是简单,我也想过,不过网络版对于这种来说是非常慢呀,虽然最终的保存结果是用SQL的语句来完成(也就是,不是界面上的计算的结值直接保存入数据库),但我想让用户能够像Excel这种方式一样,让用户能够及时看到他输入的结果以及各项的汇总情况.

如 创信工资管理系统 就能这样计算出来(而且还支持IF,CASE 等函数),而它并不是调用Excel组件
ycg_893 2007-09-02
  • 打赏
  • 举报
回复
自己再顶
ycg_893 2007-09-01
  • 打赏
  • 举报
回复
谢谢各位的参与!有没有什么更好的办法了呢?各位高手们,帮帮忙呀!
csharp_start 2007-09-01
  • 打赏
  • 举报
回复
哎呀,我说的也不全对了,DATATABLE.COMPUTE方法不能识别全部的SQL语法,所以看来你需要把他们先转化成它可以识别的公式了,否则我想只有连接数据库,返回值来得到了.
个人看法,仅供参考!
Tony8002003 2007-08-31
  • 打赏
  • 举报
回复
先定义几个变量:private double countCell1, countCell2,.....
在ItemDataBound里写
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
CalcTotal(e.Item.Cells[1].Text);
CalcTotal1(e.Item.Cells[2].Text);
}
else if (e.Item.ItemType == ListItemType.Footer)
{
e.Item.Cells[0].Text = "总计";
e.Item.Cells[1].Text = countCell1.ToString();
e.Item.Cells[2].Text = countCell2.ToString();
}



#region 求总
private void CalcTotal(string countCell)
{
try
{
countCell1 += Convert.ToDouble(countCell);
}
catch
{
//捕获错误
}
}

private void CalcTotal1(string countCell)
{
try
{
countCell2 += Convert.ToDouble(countCell);
}
catch
{
//捕获错误
}
}
大概就是这个意思吧?
ycg_893 2007-08-31
  • 打赏
  • 举报
回复
不错!就是楼上的这种意思
usxue 2007-08-30
  • 打赏
  • 举报
回复
先将输入的几个数据出入数据库中,然后再将对应的计算公式转换成sql语句进行,再插入到表中。
csharp_start 2007-08-30
  • 打赏
  • 举报
回复
如果没有理解错误的话,楼主是想在DATAGRIDVIEW中显示这样的结果:
姓名 部门 基本工资 工龄工资 迟到早退 工资合计 应交税金 实发工资
---------------------------------------------------------------
然后依次上面的字段输入:

张三 车间 1600 410 10
---------------------------------------------------------------
然后再根据输入内容来计算其他字段 (工资合计 应交税金 实发工资)
如果是这样的话,可以在CELLVALIDING事件中处理,具体的做法是用前面输入的值,替换掉公式中的变量,然后使用datatable.compute方法来得到结果,至于这个DATATABLE,没什么特别意义,只是用来计算,你可以把它写在一个类的虚函数中返回.当然,如果替换后可以连接到数据库也可以通过SQL执行后返回,但这样解决没有必要.
ycg_893 2007-08-30
  • 打赏
  • 举报
回复
有没有什么更好的办法呀!很急呀!
ycg_893 2007-08-30
  • 打赏
  • 举报
回复
是WinForm程序.
ycg_893 2007-08-30
  • 打赏
  • 举报
回复
谢谢大家的帮助!

kellynt()看问题只看表面,有些浮燥,请看清楚问题?

第一,不是简单地知道E=A+B+C的问题,如果用数据库SQL更新时,是可以按这种公式计算,当基本数据(如姓名,性别等)读出来以后,这时就与数据库脱离了,总不能让用输一个数据时,让数据库运行一下,并返回结果.
第二.这种公式是SQL支持函数(如,取整\最大值\平均工资\最小值,还有Case等),并不是在某一事件中简单地让A列加B列的和.而这些项目(和显示顺序)以及公式是由用户定义的,系统并不在事前知道,只能按规律及逻辑实现.
第三.如果说是不动态计算话,那就好做一些,即将不需要计算的数据更新入库,而需要计算便按这个SQL语句更新.

望大家帮助为感!
ezhuyin 2007-08-30
  • 打赏
  • 举报
回复
如果要插入数据库之前,先让用户看到结果,两个办法

1、还不错的办法:直接前台JS计算后输出;
2、有点耗资源的办法:将数据送到后台一个存储过程计算后输入结果

结论:前台JS不需要占用服务器资源,无视带宽,推荐使用。
加载更多回复(4)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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