标题:计算汇总
只看楼主
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
以下是引用tjdeming在2016-3-11 12:00:00的发言:

补允说明
表中 L1列 手工输入的有:DM为05、06、07、A01——A18、71、72、73、74、75
  自动计算并输入L1列 的有:DM为01=05+06+07
                           DM为00=A01+A02+A03+A04
                           DM为22=71+72+73+74+75
                           DM为72=A05+A06+A07+A08
……
最后审核关系:L1列  DM为01=DM为00=DM为22 并提示错误

这是一张人数表

程序很难从你XM字段中取出公式来,何况还要审核结果呢
如果你一定要这样做,你最起码要再有1个字段,用来存放公式的。比如字段,GS,里面存的是每行的计算公式,如第11行,按职业类型分 =71+72+73+74+75
所以,一开始,我就说,你这样设计表,有严重的缺陷
你这个表,只能手工计算,不利于电脑公式计算,就算能,也要有像吹斑竹这样功力深厚的人才能做到

[此贴子已经被作者于2016-3-11 13:43编辑过]

2016-03-11 13:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用tjdeming在2016-3-11 12:00:00的发言:

补允说明
表中 L1列 手工输入的有:DM为05、06、07、A01——A18、71、72、73、74、75
  自动计算并输入L1列 的有:DM为01=05+06+07
                           DM为00=A01+A02+A03+A04
                           DM为22=71+72+73+74+75
                           DM为72=A05+A06+A07+A08
……
最后审核关系:L1列  DM为01=DM为00=DM为22 并提示错误

  这是一张人数表

将计算表达式用一个字段来存放,这样比较清晰好处理。
程序代码:
XH  XM                      DM  JS         L1
--  ----------------------  --  ---------  ---
 1  一、从业人员                01=00=22  

 2  (一)从业人员期末人数  01  05+06+07
......
2016-03-11 14:22
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:0 
以下是引用mywisdom88在2016-3-11 13:41:23的发言:

 
程序很难从你XM字段中取出公式来,何况还要审核结果呢
如果你一定要这样做,你最起码要再有1个字段,用来存放公式的。比如字段,GS,里面存的是每行的计算公式,如第11行,按职业类型分 =71+72+73+74+75  
所以,一开始,我就说,你这样设计表,有严重的缺陷
你这个表,只能手工计算,不利于电脑公式计算,就算能,也要有像吹斑竹这样功力深厚的人才能做到
没错
2016-03-11 15:43
tjdeming
Rank: 2
等 级:论坛游民
帖 子:351
专家分:49
注 册:2013-3-4
得分:0 
设计思路是这样的:分项有数据了,点击计算命令后 汇总行的数据自动生成。并审核逻辑关系。
2016-03-11 15:47
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:10 
1. 应该增加一个公式字段 gs c(30),将 xm 字段中的公式移至 gs,如:[01]=[05]+[06]+[07]
2. 公式一定要合法,用真实数据去替换行代码后,应返回一个逻辑值,为真,则验证通过,为假,则不通过。
   因此,06≤01 应改为 [06]<=[01],01=00=22 应改为 [01]=[00] AND [01]=[22]
4. 检测代码如下:

CLOSE TABLES ALL
LOCAL cStr,nRec,cCode,cValue,lErr
USE rsb
SCAN FOR !EMPTY(gs)
    cStr = ALLTRIM(gs)
    nRec = RECNO()
    SCAN FOR !EMPTY(dm) AND dm # '---'
        m.cCode = '['+ALLTRIM(dm)+']'
        m.cValue = TRANSFORM(L1)
        cStr = STRTRAN(cStr,m.cCode,m.cValue)
    ENDSCAN
    GO nRec
    DO CASE
    CASE TYPE(cStr) # 'L'
        MESSAGEBOX('公式('+ALLTRIM(gs)+')有错误!('+cStr+')')
        lErr = .t.
        RETURN
    CASE !EVALUATE(cStr)
        MESSAGEBOX('公式('+ALLTRIM(gs)+')未通过验证!('+cStr+')')
        lErr = .t.
        RETURN
    ENDCASE
ENDSCAN
IF !lErr
    MESSAGEBOX('验证全面通过!')
ENDIF

泉城飞狐
2016-03-11 16:05
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
通过编程是可以解决这个问题

坚守VFP最后的阵地
2016-03-11 16:15
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
此类程序,关键是看你的思路。我的基本思路是:用真实值替换公式中的行号,然后判断整个表达式的值是否为真,为真则通过,反之则不通过。若表达式的值不是逻辑型,则公式有误。上述代码都是围绕这个思路展开的。

泉城飞狐
2016-03-11 16:17
tjdeming
Rank: 2
等 级:论坛游民
帖 子:351
专家分:49
注 册:2013-3-4
得分:0 
XM中的公式是用来提示说明行与行之间的数据关系的,实际情况应做到  L1字段,第三行:填入50人,第四行40人,第五行30人,则第二行生成120
第一步计算,第二步审核 来确保数据正确性。

[此贴子已经被作者于2016-3-11 16:35编辑过]

2016-03-11 16:26
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
上点原始数据来,便于测试

坚守VFP最后的阵地
2016-03-11 16:36
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
纸上谈兵是没用的

坚守VFP最后的阵地
2016-03-11 16:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-462368-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.554640 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved