使用自定义公式计算工资

pshy 2009-03-19 10:19:11
我在做人事软件的时候,考虑到工资计算方法可能会经常变化,想用自定义公式来实现。看了好多贴子都没看到比较好的解决方法,在此请教各位。
例如我有一个员工考勤表(迟到,请假),一个基本工资表(全勤奖),我要用这二个表中的字段进行自定义公式。
全勤奖计算方法为:如果迟到2次或请事假1天及以上者得0%,迟到1次或请事假半天者得50%,无迟到请事假者得100%。
请问这个公式用程序如何定义?该如何验证用户输入的公式是否正确呢?怎么让程序解释该公式并计算得出结果呢?
...全文
954 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengxue61 2011-03-14
  • 打赏
  • 举报
回复
我有个自己用Delphi写的自定义公式,公式项目可以自定义多项,且每个项目可以由不同的项目根据不同的条件生成,如果有兴趣可以联系我,邮箱:fengxue106@163.com
例如定义一个实得底薪,在公式里可写成:if(上班天数>=21,实得底薪,基本底薪*(上班天数/21),基本底薪和上班天数是一个项目。
此自定义公式经测试成功,且目前有支持十几个函数,但可以增加多个函数
booker 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 booker 的回复:]
引用楼主 pshy 的帖子:

我在做人事软件的时候,考虑到工资计算方法可能会经常变化,想用自定义公式来实现。看了好多贴子都没看到比较好的解决方法,在此请教各位。
例如我有一个员工考勤表(迟到,请假),一个基本工资表(全勤奖),我要用这二个表中的字段进行自定义公式。
全勤奖计算方法为:如果迟到2次或请事假1天及以上者得0%,迟到1次或请事假半天者得50%,无迟到请事假者得100%。
请问这个公式用程序如何定义?该如何…
[/Quote]

不是bool,是float,汗颜-___-
caorenlong 2009-03-20
  • 打赏
  • 举报
回复
就用最简单的if else 或 switch case吧!
booker 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 pshy 的帖子:]
我在做人事软件的时候,考虑到工资计算方法可能会经常变化,想用自定义公式来实现。看了好多贴子都没看到比较好的解决方法,在此请教各位。
例如我有一个员工考勤表(迟到,请假),一个基本工资表(全勤奖),我要用这二个表中的字段进行自定义公式。
全勤奖计算方法为:如果迟到2次或请事假1天及以上者得0%,迟到1次或请事假半天者得50%,无迟到请事假者得100%。
请问这个公式用程序如何定义?该如何验证用户输入的公式是否…
[/Quote]

既让你要在公式中加入逻辑判断,可以参照以下形式:

全勤奖 = 基本工资表.基本工资 * IF(考勤表.迟到>=2 || (考勤表.请假.type=="事假" && 考勤表.请假.times==1) , 0 , IF(考勤表.迟到==1 || (考勤表.请假.type=="事假" && 考勤表.请假.times==0.5) , 0.5 , 1))

或者你可以将这部分计算比例的判断定义到函数中(公式虽然灵活,但在人事管理中这种全勤奖给付条件应该是不会改变的吧)
全勤奖 = 基本工资表.基本工资 * getPercent();

bool getPercent()
{
...
return percent;
}

budong0000 2009-03-19
  • 打赏
  • 举报
回复
将公式里需要变动的保存为另一张表,程序从表中取表达式。像动态SQL。。。即LS说的建个公式工厂模式。
wwwojc 2009-03-19
  • 打赏
  • 举报
回复
在数据库建立计算工资需要的基本字段,之后加判断不就行了吗。
lxf2000104 2009-03-19
  • 打赏
  • 举报
回复
个人所得税,表结构公式
1 0 500 5 0
2 501 2000 10 25
3 2001 5000 15 125
4 5001 20000 20 375
5 20001 40000 25 1375
6 40001 60000 30 3375
7 60001 80000 35 6375
8 80001 100000 40 10375
9 100001 NULL 45 15875
lxf2000104 2009-03-19
  • 打赏
  • 举报
回复
岗位对应的可能是角色等等咯
lxf2000104 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pshy 的回复:]
谢谢各位兄弟!
我就是想把逻辑判断也加入到公式定义里面,因为蛮多工资项目要用到判断的。如个人所得税,病假的工资等。我就是想用公式来处理,如果计个税的起征点变化,病假的计薪基数变动等只要改公式就可以。
要是不加逻辑判断就会简单了。
11楼的兄弟,我不是要在程序里写死:(
各位还有什么好的方法请多多指教,谢谢!!!
[/Quote]

对的,用数据库表存储起来。而且还要跟岗位挂钩,有岗位工资啊。
dell0923 2009-03-19
  • 打赏
  • 举报
回复
我觉得是楼主的设计有问题,如果我是用户,我只想输入迟到次数和请假天数,以及对应的奖金百分比就可以了.我们再来设计一个Config的表,里面有三个字段:LateTime,LeaveDay,Percent.系统管理员登录到画面时,设定这些值之后,考勤系统记录下每个员工的出勤记录.在统计画面,程序根据Config表里的字段以及员工的考勤记录和基本工资表(全勤奖)计算出实得奖金,显示给用户就可以了.
lchh0917 2009-03-19
  • 打赏
  • 举报
回复
创建一个工资工厂模型
genius_tong 2009-03-19
  • 打赏
  • 举报
回复
这个,我觉得还是具体情况具体分析的好~~~
wanabe 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pshy 的回复:]
谢谢各位兄弟!
我就是想把逻辑判断也加入到公式定义里面,因为蛮多工资项目要用到判断的。如个人所得税,病假的工资等。我就是想用公式来处理,如果计个税的起征点变化,病假的计薪基数变动等只要改公式就可以。
要是不加逻辑判断就会简单了。
11楼的兄弟,我不是要在程序里写死:(
各位还有什么好的方法请多多指教,谢谢!!!
[/Quote]
不加逻辑判断你咋实现
写个存储过程可能还方便点
pshy 2009-03-19
  • 打赏
  • 举报
回复
谢谢各位兄弟!
我就是想把逻辑判断也加入到公式定义里面,因为蛮多工资项目要用到判断的。如个人所得税,病假的工资等。我就是想用公式来处理,如果计个税的起征点变化,病假的计薪基数变动等只要改公式就可以。
要是不加逻辑判断就会简单了。
11楼的兄弟,我不是要在程序里写死:(
各位还有什么好的方法请多多指教,谢谢!!!
happychou 2009-03-19
  • 打赏
  • 举报
回复
int P_LateTime;//
int p_SickLeaveHalf;//
int p_SickLeaveDay;//

private int mp_SickLeave(int Half,int Day)
{
int n=Half+2*Day;
return n;
}
private int Salary(int LateTime,int SickLeaveHalf,int SickLeaveDay)
{
int percent=0;
int m= mp_SickLeave(SickLeaveHalf,SickLeaveDay);
if((LateTime>=2)||(m>=1) )
{
percent=0;
}
if((LateTime=1)||(m=1) )
{
percent=50;
}
if((LateTime=0)&&(m=0) )
{
percent=100;
}

return percent;
}


lxf2000104 2009-03-19
  • 打赏
  • 举报
回复
比如说表c-公式表:
条件 比例
迟到=0 and 事假=0 1
迟到>2 or 事假>1 0
迟到>1 or 事假>=0.5 0.5
用表a中的数据替换解析这些条件
wuyi8808 2009-03-19
  • 打赏
  • 举报
回复
解析用户输入的字符串。
lxf2000104 2009-03-19
  • 打赏
  • 举报
回复

你这个公式表比较复杂。
表a,迟到次数和请假次数,表b,全勤奖,表c-公式表:条件,比例。
然后用表a中的数据去匹配表c的条件获得员工的全勤奖比例*全勤奖

如果是多部分工资,就用工资公式表的字段代替了。公式表的中每一列代表工资项目中的一项。
booker 2009-03-19
  • 打赏
  • 举报
回复
比如说“全勤奖计算方法为:如果迟到2次或请事假1天及以上者得0%,迟到1次或请事假半天者得50%,无迟到请事假者得100%。 ”,迟到1次还是病假1天,这个最好不要用你的公式来区分,你只要对全勤将是0%还是50%还是100%三种状态进行处理,让逻辑简单化
booker 2009-03-19
  • 打赏
  • 举报
回复
根据两个表的字段来设置公式,然后通过解析公式来生成select语句机型计算。不过只能是简单逻辑。如果要在公式中加上判断的话逻辑就会复杂一些了,关键看你这个公式面向什么人,如果对编程不是很熟悉的人,即使你写出来比较复杂的语法分析器,他们也不见得会用。所以逻辑尽量简单,能分解成几部来处理的就不要统一在一步完成。
加载更多回复(10)
目录: 1.返回 Column 英文字 2.查询某一值第num次出现的值 3.返回当个人工资薪金所得为2000元(起征点为850元)时的应纳个人所得税税额 4.从形如"123545ABCDE"的字符串中取出数字 5.从形如"ABCD12455EDF"的字符串中取出数字 6.按SplitType取得RangeName串值中的起始位置 7.将金额数字转成中文大写 8.计算某种税金 9.人民币大、小写转换 10.查汉字区位码 11.把公元年转为农历 12.返回指定列数的列标 13.用指定字符替换某字符 14.从右边开始查找指定字符在字符串中的位置 15.从右边开始查找指定字符在字符串中的位置 16.计算工龄 17.计算日期差,除去星期六、星期日 18.将英文字反转的自定函数 19.计算个人所得税 20.一个能计算是否有重复单元的函数 21.数字金额转中文大写 22.将数字转成英文 23.人民币大小写转换 24.获取区域颜色值 25.获取活动工作表名 26.获取最后一行行数 27.判断是否连接在线 28.币种转换 29.检验工作表是否有可打印内容 30.查找一字符串(withinstr)在另一字符串中(findstr1)中某一次(startnum)出现时的位置,返回零表示没找到。 31.增加文件路径最后的“\”符号 32.计算所得税 33.从工作表第一行的标题文字以数字形式返回所在列号 34.在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和 35.返回 Column 英文字 36.查找指定列名的列数 37.文字格式的时间(分:秒)转化为数字格式(秒) 38.将"hh:mm:ss"格式的时分秒数转换成秒数 39.金额中文大写转数字 40.把角度转为度秒分、弧度等显示 41.身份证号码侦测 42.显示公式 43.方便财务人员理帐查找 44.数值转换为字符地址 45.字符地址转换为数值 46.等待时间(以秒计算) 47.得到字符串实际的长度(以单字节记) 48.18位身份证最后一位有效性验证 49.计算符合maturity condition的拆解金额 50.对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,相当于多个vlookup函数相加,对于查找不到的元素在批注中添加,以提醒用户。 51.根据个人所得税(工资)反算工资数 52.判断表是否存在 53.角度转弧 54.比较相同的字符串 55.对选定的数组进行排序 56.取得指定月份天数 57.排序工作表活页薄 58.统计数组中非重复数据个数 59.摘取子字符串 60.计算20000余个汉字的笔画 61.删除当前工作表中的全部超连接 62.取得相近数据 63.提取定串中汉字 64.搜索重复数据(选定范围) 65.字符型转数字型 66.小写人民币转大写人民币 67.取得指定月份人星期天个数 68.侦测档案是否包含宏 69.获取循环参照单元格 70.创建桌面快捷方式 71.自动建立多级目录 72.统计经筛选后符合条件的记录条数 73.复制单元格列高与栏宽 74.取消隐藏工作表(包括vba Project工程保护的) 75.删除单元格自定义名称 76.从文件路径中取得文件名 77.取得一个文件的扩展名 78.取得一个文件的路径 79.十进制转二进制 80.检查一个数组是否为空 81.字母栏名转数字栏名 82.数字栏名转文字栏名 83.判断一件活页夹中是否还有子目录 84.判断一个文件是否在使用中 85.列出档案详细摘要信息 86.获取菜单ID编号及名称列表 87.状态列动态显示文字 88.取得一个文件的路径2 89.取得一个文件的路径3 90.取得Activecell的栏名 91.取得单元格中指定字符前的字符 92.前单元格指定字符前的字符颜色改成红色 93.根据数字返回对应的字母列号 94.取工作表名字 95.取消所有隐藏的宏表 96.导出VBA Project代码 97.导入VBA Project代码 98.取得汉字拼音的第一个字母 99.获取两栏中相同的数据 100.选取当前工作表中公式出错的单元格﹐关返回出错个数 101.将工作表中最后一列作为页脚打印在每一面页尾 102.获取vbproject引用项目 103.移除Excel工作表中的外部数据连接 104.将选择定单元格作成镜像图片 105.反选择单元格中的数 106.在Excel中加入一个量度尺(以厘米为单位) 107.在Excel中加入一个量度尺(以寸为单位) 108.取得一个短文件名的长文件名 109.取得临时文件名 110.等用Shell调用的程序执行完成后再执行其它程序 111.将Mouse显示成动画 112.限制Mouse移动范围 113.取得当前激活窗品句柄及标题 114.取得屏幕分辨率 115.自动建立多级目录 116.将文件长度置零 117.读取WIN9X / Me共享文件夹密码 118.取得预设的打印机及设置预设的打印机 119.获得当前操作系统的打印机个数及检测打印是否存在 120.枚举打印机名称清单 121.读取网络服务器当前时间 122.下载文件到指定目录 123.自动映射网络驱动器 124.自动断开网络驱动器 125.连接选定单元格中的内容 126.获取一个单元格中有指定字体颜色部份数据 127.对指定文件加XLS加密 128.选择指定范围内使用了填充颜色的单元格 129.在特定的区域内查找文本,返回值是包含查找文本的单元格 130.返回特定区域中最大值的地址 131.删除表格中使用范围内的所有空白单元格 132.返回数组中有多少个指定的字符串 133.返回当前工作表中引用了指定的单元的地址 134.获取Excel中字型列表 135.获取一个字符串中有多少个数字字符 136.在Excel中对多列进行填充 137.对选定的范围进行数据填充(忽略单元格格式) 138.VBA Project加密及解密 139.列出收藏夹中的网址 140.计算两个日期之间相隔的年份,比如年龄,工龄等.可计算从1000年01月01日起的日期 141.从字符串提取纯数字 142.将一个数组按升序排列 143.将一个数组按降序排列 144.删除空白列 145.判断工作表是否为空白 146.将数据按类分到不同工作薄 147.单元格内数据排序 148.对多栏排序 149.返回计算公式的值 [,值的计算公式] 150.把第一列=某个值对应的第二列的内容连在一起,并用、隔开 151.取得系统使用模式 152.计算机注销/关机/重启 153.更改计算机名称 154.从n位开始取出字符串中的汉字、英文字母、数字 155.在指定列中寻找含有指定字符串的单元格,并将符合条件的单元格标为红色,并将对应的下一列单元格赋值为1 156.清除字符串中的空格 157.查找合并单元格位置 158.阴阳历转换和阴阳历生日 159.利用数组和Substitute来替换某字符 160.一键创建斜线表头 161.自动获取指定月的工作日
这是一款适用于中小企业的工资管理软件,具有以下特点: 一、完全免费,让你没有购买、注册之类的烦恼; 二、提供了三十多项实用功能,可以与收费的商业软件相媲美; 二、用你最熟悉的EXCEL编写,所见即所得,直接使用,无需学习; 三、完全开放源代码,你可以看到所有代码,并可以跟踪代码的执行,让你消除对宏病毒的担心; 四、数据与代码在一个文档中,不使用额外的数据库,不需要安装,即拷即用,真正做到绿色版; 五、持续更新(因为有相关单位在使用),并提供数据升级功能,让你可以放心地过渡到最新版本。 六、适用于包括Excel2007在内的各个版本的excel。 特色功能: 一、隐藏无发生额的数据列(行),冻结标题行; 二、提供导出银行代发工资的数据,可自定义银行代发工资的数据格式,方便所有银行代发工资; 三、提供按部门打印工资表,工资条、个人工资单,并可以按部门生成汇总表,提供带汇总的综合查询, 方便查询和打印。 四、允许一次删除多名职工,省却逐个删除的烦恼。 五、提供导出单个或全部工作表的功能,方便数据分发和保存。 六、可以灵活地自定义个税计算公式,个税计算更加方便实用,允许设置住房公积金扣除上限、 调整个税扣除基数。 七、提供按月统一计算个税功能,并提供计算详尽的个税计算过程核对表, 一月多次发放工资再无个税扣除烦恼。 八、新增强大的数据导入功能,既可以导入职工姓名、帐号等基础数据,也可以导入代扣水电费等具体数据, 非常方便实用。

110,535

社区成员

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

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

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