以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  我想想,你们也帮我想想,复杂的数学逻辑题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=81334)

--  作者:意悠心轻
--  发布时间:2016/2/24 23:45:00
--  我想想,你们也帮我想想,复杂的数学逻辑题
     这题在excel官方论坛只有函数论坛的版主帮我,但并不正确,我顺着她的思路更正过来,TABLE文件我整理了格式,未输数据,我现有2015年12月份的excel表,但来到TABLE软件我想改格式,不完全参照原样,当然原表也是我计设的,改成现状减少篇幅、方便打印,但条件识别要求高了。
     先用excel表截图数据说明:

此主题相关图片如下:捕获.png
按此在新窗口浏览图片

    规定4个人打砂,配置一名机动人员,机动人员工资占计件工资23%;6人打砂配置2名机动人员,机动人员工资占计件工资26%。 即如果生产形式为安比例计提,当天总人数大于等于8人,打砂人员分配后应得金额等于计件金额乘74%,2名机动人员按当天各自的工作时间长短分配当天26%的计件总金额,如果当天总人数小于8人,打砂员工分配后应得金额等于计件金额乘77%,2名机动人员按当天各自的工作时间长短分配当天23%的计件总金额。如果生产形式为集体直接分配(不同人组成不同组,生产形式以集体直倿分配1、集体直倿分配2、集体直倿分配3等识别),分配后应得金额等于计件金额除于这个组的人数平分,生产形式为个人,分配后应得金额等于数量乘单价,请教程序应怎么编?
     本做好了一个table文件,刚打开发现损坏,我删了!
     未把直接分配合并在内的excel公式如下: 
=IFERROR(IF($B4="",IF(ROW($B4)>MAX(IF($B$4:$B$1311<>"",ROW($B$4:$B$1311),""))+2,0,IF(ROW(B4)=MAX(IF($B$4:$B$1311<>"",ROW($B$4:$B$1311),0))+2,SUM($H$4:dw)/2,SUM($H$4:dw)-SUMIF($A$4:dw,$A4,H$4)*2)),IF(LEFT(D4,2)="机动",(SUM(应得金额)*IF(人数>=8,0.26,0.23)/SUMPRODUCT((1-ISERR(FIND("机动",$D$4:$D$1311)*FIND(A4,$A$4:$A$1311)))*($S$4:$S$1311)))*S4,G4*IF(机动人数=0,1,IF(人数>=8,0.74,0.77)))),"")
    同按shift+ctrl+回车,这是数组函数。

[此贴子已经被作者于2016/2/25 17:46:57编辑过]

--  作者:大红袍
--  发布时间:2016/2/24 23:54:00
--  
 分别取出各个组的人员,看组的人数是多少,然后得出计件金额。之后的和以前的一样写代码。
--  作者:意悠心轻
--  发布时间:2016/2/25 0:06:00
--  
    条件语句套用复杂多了,还要提成,机动的工资也不是平分,试过有人上半天,下午请假了,剩下那个做足一天,所以也要安工作时间比例分配,我修改补充了题目,这题用编程解应比excel解强,excel表在插入-名称-定位下设了几个公式才能运行上面的公式,非常复杂。
--  作者:意悠心轻
--  发布时间:2016/2/25 0:09:00
--  
    说之容易做之难,真用到运算上,这程序要花些功夫,否则结果会错。
[此贴子已经被作者于2016/2/25 0:10:35编辑过]

--  作者:jspta
--  发布时间:2016/2/25 8:56:00
--  
你主要模式就几种,先按模式分成不同类,吧情况一个一个列进去,写完代码后,再总结归整。
首先,你数据表格要设置对
一个工单表(工单ID)——人员分配表(人员ID)——每个人员做砂表,很容易得到基础数据。后面计算就简单了,套入对应规则即可计算。

工单表定义模式,人员分配表负责记录最后获得金额,做砂表记录实际做工情况。

最后用SQL语句直接组合三个表,即可得出结果。

--  作者:大红袍
--  发布时间:2016/2/25 9:18:00
--  

汗,你参考之前的代码啊,就是判断一下分组的人数而已啊。

 

不会做,不想学的,请上传具体例子


--  作者:jiangyong
--  发布时间:2016/2/25 9:55:00
--  
excel 中写个自定义函数, 没必要用excel函数弄嵌套
--  作者:意悠心轻
--  发布时间:2016/2/25 10:34:00
--  
我上传了刚做的表,但没输入数据,价格表更新又出现前天问你的问题,不能打开错误,不能点获取详细信息,要强行关闭软件。还有上传的table文件还漏了条件,如果备注列显示客户返工,按价目表中该规格对应单价2倍计算,如果备注列显示喷涂返工,按价目表中该规格对应单价3倍计算。

图片点击可在新窗口打开查看此主题相关图片如下:捕获1.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:捕获.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2016/6/26 15:34:20编辑过]

--  作者:大红袍
--  发布时间:2016/2/25 11:05:00
--  

按比例分配的代码

 

Dim dt As DataTable = DataTables("打砂车间工资表")
For Each ary() As String In dt.GetValues("日期|生产形式", "日期 is not null and 生产形式 = \'安比例分配\'")
    Dim drs_ds As List(Of DataRow) = dt.Select("日期=#" & ary(0) & "# and 生产形式=\'" & ary(1) & "\' and (规格 <> \'机动\' or 规格 is null)")
    Dim drs_jd As List(Of DataRow) = dt.Select("日期=#" & ary(0) & "# and 生产形式=\'" & ary(1) & "\' and 规格 = \'机动\'")
    Dim bl As Double = 0
    If drs_ds.count + drs_jd.count < 8 Then
        bl = 0.77
    Else
        bl = 0.74
    End If
    Dim smoney As Double = dt.compute("sum(金额)", "日期=#" & ary(0) & "# and 生产形式=\'" & ary(1) & "\'")
    Dim stime As Double = dt.compute("sum(计件工时)", "日期=#" & ary(0) & "# and 生产形式=\'" & ary(1) & "\' and (规格 <> \'机动\' or 规格 is null)")
    Dim dj As Double = smoney * bl / stime
    For Each dr As DataRow In drs_ds
        dr("分配后金额") = dj * dr("计件工时")
    Next
    stime = dt.compute("sum(计件工时)", "日期=#" & ary(0) & "# and 生产形式=\'" & ary(1) & "\' and 规格 = \'机动\'")
    dj = smoney * (1-bl) / stime
    For Each dr As DataRow In drs_jd
        dr("分配后金额") = dj * dr("计件工时")
    Next
Next


--  作者:大红袍
--  发布时间:2016/2/25 11:08:00
--  

datacolchanged事件

 

Select Case e.DataCol.name
    Case "规格", "备注"
        Dim fdr As DataRow = DataTables("价目表").find("规格 = \'" & e.DataRow("规格") & "\'")
        If fdr IsNot Nothing
            If e.DataRow("备注") Like "*喷涂返工*" Then
                e.DataRow("单价") = fdr("单价") * 3
            ElseIf e.DataRow("备注") Like "*喷涂返工*" Then
                e.DataRow("单价") = fdr("单价") * 2
            Else
                e.DataRow("单价") = fdr("单价")
            End If
        End If
End Select