注册 登录
编程论坛 VFP论坛

按日历统计数据

tjdeming 发布于 2023-07-06 20:48, 1094 次点击
各位老师:原表ffff为按日历记录请假情况,num为编号,ny为年月,j1-j31为日历
想得到gg表的结果,即某编号人员从某年月的几号至某年月的几号并统计合计数。
(只统计填写“探”的结果)用vfp6.0
谢谢!!!
附件
只有本站会员才能查看附件,请 登录


能实现吗?

[此贴子已经被作者于2023-7-6 23:15编辑过]

15 回复
#2
schtg2023-07-07 06:14
回复 楼主 tjdeming
使用数组,是方法之一,可能不是最优,仅供参考!
前面好像探讨过请假天数的统计、加班天数的统计,应该属于同一类型的吧。
程序代码:

close all
use ffff
go top
scan
   scatter fields j1,j2,j3,j4,j5,j6,j7,j8,j9,j10,j11,j12,j13,j14,j15,j16,j17,j18,j19,j20,j21,j22,j23,j24,j25,j26,j27,j28,j29,j30,j31 to arr  && 修改此处,可以限定统计日期范围
   nNum = 0
   zjs = alen(arr)
   for i = 1 to zjs
       if [] $ arr(m.i)
          nNum = 1 + nNum
       endif
   endfor
   replace 备注 with alltrim(str(nNum))
endscan
select ffff
browse

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-7-7 06:22编辑过]

#3
tjdeming2023-07-07 06:47
回复 2楼 schtg
谢谢你
我想对“探”统计的结果是Gg表的形式。
#4
吹水佬2023-07-07 11:34
只有本站会员才能查看附件,请 登录

程序代码:

USE ffff
SCAN
    SCATTER TO arr
    ret = ""
    ds = 0
    sd = ASCAN(arr,"探  ")
    ns = sd
    DO WHILE BETWEEN(ns,1,ALEN(arr))
        DO WHILE arr[ns]=="探  "
            ds = ds+1
            ns = ns+1
        ENDDO
        ret = ret + "," + PADL(sd-2,2,"0") + "-" + PADL(ns-3,2,"0")
        sd = ASCAN(arr,"探  ",ns)
        ns = sd
    ENDDO
    ? arr[1],arr[2], SUBSTR(ret,2), ds
ENDSCAN
#5
tjdeming2023-07-07 11:41
回复 4楼 吹水佬
谢谢你!谢谢你!谢谢你!
想达成Gg表有难度,估计要二次数据处理,看来难度是跨月的
#6
sdta2023-07-07 11:42
程序代码:
CLOSE DATABASES
USE gg IN 0
ZAP
SELECT DISTINCT num FROM ffff INTO CURSOR temp
SCAN
    SELECT * FROM ffff WHERE num = temp.num ORDER BY num, ny INTO CURSOR temp1
    lncnt = 0
    SCAN
        FOR ln = 3 TO FCOUNT() - 1
            IF ALLTRIM(EVALUATE(FIELD(ln))) == "探"
                lncnt = lncnt + 1
                IF lncnt = 1
                    lcny = TRANSFORM(ny) + PADL(SUBSTR(FIELD(ln), 2), 2, "0")
                ENDIF
                lcny1 = TRANSFORM(ny) + PADL(SUBSTR(FIELD(ln), 2), 2, "0")
            ENDIF
        ENDFOR
    ENDSCAN
    lcny = CTOD(CHRTRAN("abcd-ef-gh", 'abcdefgh', lcny))
    lcny1 = CTOD(CHRTRAN("abcd-ef-gh", 'abcdefgh', lcny1))
    INSERT INTO gg VALUES (temp.num, lcny, lcny1, lncnt)
ENDSCAN
SELECT gg
BROWSE

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2023-7-7 11:44编辑过]

#7
吹水佬2023-07-07 11:50
以下是引用tjdeming在2023-7-7 11:41:20的发言:

谢谢你!谢谢你!谢谢你!
想达成Gg表有难度,估计要二次数据处理,看来难度是跨月的

4楼的代码已经考虑到同月跨月分段休假,可以再做个分类统计,同一人在不同月的数据求和就是了。
另:这类数据统计,原表数据结构要优化一下应该好统计些。
#8
sdta2023-07-07 11:51
    lcny = CTOD(CHRTRAN("abcd-ef-gh", 'abcdefgh', lcny))
    lcny1 = CTOD(CHRTRAN("abcd-ef-gh", 'abcdefgh', lcny1))
    INSERT INTO gg VALUES (temp.num, lcny, lcny1, lncnt)
改为下面代码看下效果
    lcny = CHRTRAN("abcd,ef,gh", 'abcdefgh', lcny)
    lcny1 = CHRTRAN("abcd,ef,gh", 'abcdefgh', lcny1)
    INSERT INTO gg VALUES (temp.num, DATE(&lcny), DATE(&lcny1), lncnt)
#9
tjdeming2023-07-07 12:00
回复 8楼 sdta
谢谢你!谢谢你!谢谢你!
-气呵成
#10
tjdeming2023-07-07 12:01
感谢二位大佬出手相助,我逐句学习。
#11
tjdeming2023-07-07 12:02
回复 7楼 吹水佬
做哪些改进能否点评一下,谢谢你!
#12
sdta2023-07-07 12:28
最原始考勤表是什么样的,截图看看
#13
tjdeming2023-07-07 20:21
回复 12楼 sdta
原表最后一列有个汇总数,其它一样。遇到了一个情况:有人在2022年4月30日至5月19日间跨月休了假,属于正常。此人2023年6月正常也休了假,这样此人就应有二条记录,现在得到是一条记录st2022/4/30,et2023/6/1 一个hj数.昨天没有考虑这个情况.
#14
tjdeming2023-07-07 20:36
回复 7楼 吹水佬
我在想需改进的地方可能有:增加一个每条记录的合计数,ny年月拆分成n年,y月.  
能把跨月的合在一起吗,谢谢你!  

#15
sdta2023-07-07 22:11
以下是引用tjdeming在2023-7-7 20:21:53的发言:

原表最后一列有个汇总数,其它一样。遇到了一个情况:有人在2022年4月30日至5月19日间跨月休了假,属于正常。此人2023年6月正常也休了假,这样此人就应有二条记录,现在得到是一条记录st2022/4/30,et2023/6/1 一个hj数.昨天没有考虑这个情况.

最合理的处理方法是每个月一条记录,然后累计一条记录
#16
吹水佬2023-07-08 04:13
分月统计就不存在跨月问题了吧,否则就不好定义。
1