| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2339 人关注过本帖
标题:统计迟到早退
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
差不多是这个样子了吧:
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-08-04 15:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
CLEAR ALL
SET DATE ANSI
SET CENTURY ON
SET SAFETY OFF
Main()
CLEAR ALL
RETURN 

PROCEDURE Main()
    LOCAL loForm
    loForm = CREATEOBJECT("_Form")
    WITH loForm
        .Caption = "考勤日报"
        .WindowState = 2
        .Show
    ENDWITH
    READ EVENTS
ENDPROC 

*------------------------
* 规范化时间字段
*------------------------
FUNCTION GetCTime(tcTimeString)
    RETURN IIF(LEN(tcTimeString) < 8, "0", "") + tcTimeString
ENDFUNC 

FUNCTION Have_OutTime
    LOCAL lnIndex
   
    FOR lnIndex = 1 TO FCOUNT("考勤日报表")
        IF "刷卡记录" $ FIELD(lnIndex, "考勤日报表")
            IF GetCTime(ALLTRIM(EVALUATE("考勤日报表." + FIELD(lnIndex, "考勤日报表"))) ) > "18:00:00"
                RETURN .T.
            ENDIF
        ENDIF
    NEXT
   
    RETURN .F.
   
ENDFUNC 

*------------------------
* 求取加班时间
*------------------------
FUNCTION Get_OutTime
    LOCAL lnIndex, lnPos, lcString, lcStart, lcEnd
   
    lnPos = 0
    FOR lnIndex = 1 TO FCOUNT("考勤日报表")
        IF "刷卡记录" $ FIELD(lnIndex, "考勤日报表")
            IF GetCTime(ALLTRIM(EVALUATE("考勤日报表." + FIELD(lnIndex, "考勤日报表"))) ) > "18:00:00"
                lnPos = lnIndex
                EXIT
            ENDIF
        ENDIF
    NEXT
   
    lcString = ""
    IF (lnPos > 0) .AND. (MOD(INT(VAL(RIGHT(FIELD(lnPos, "考勤日报表"), 1))), 2) == 0)
        lcStart = GetCTime(ALLTRIM(EVALUATE("考勤日报表." + FIELD(lnPos - 1, "考勤日报表"))))
        IF lcStart < "18:00:00"
            lcStart = "18:00:00"
        ENDIF
        lcEnd = GetCTime(ALLTRIM(EVALUATE("考勤日报表." + FIELD(lnPos, "考勤日报表"))))
        lcString = Calc_Time(lcStart, lcEnd)
    ENDIF
   
    RETURN lcString

ENDFUNC 

*------------------------
* 求时间差,以小时为单位返回结果
*------------------------
FUNCTION Calc_Time(tcStart, tcEnd)
    LOCAL lnStart, lnEnd
   
    lnStart = INT(VAL(LEFT(tcStart, 2))) * 3600 + INT(VAL(SUBSTR(tcStart, 4, 2))) * 60 + INT(VAL(RIGHT(tcStart, 2)))
    lnEnd = INT(VAL(LEFT(tcEnd, 2))) * 3600 + INT(VAL(SUBSTR(tcEnd, 4, 2))) * 60 + INT(VAL(RIGHT(tcEnd, 2)))
   
    RETURN TRANSFORM(ROUND((lnEnd - lnStart) / 3600, 2)) + "小时"
   
ENDFUNC 

DEFINE CLASS _Form AS Form 

    ADD OBJECT Label1   AS Label WITH Caption = "日期:", Height = 25, Width = 60, FontBold = .T., Alignment = 1
    ADD OBJECT Text1    AS TextBox WITH Value = DATE(), Height = 25, Width = 100
    ADD OBJECT Command1 AS CommandButton WITH Caption = "确认", Height = 25, Width = 40
    ADD OBJECT Grid1    AS Grid WITH HighlightStyle = 2

    PROCEDURE Load
        USE 考勤日报表 NOUPDATE IN 0
        INDEX ON STR(工号, 5) + DTOC(日期) TO 考勤日报表
        GOTO TOP
    ENDPROC
   
    PROCEDURE Unload
        USE IN 考勤日报表
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
    PROCEDURE Arrange
        WITH This.Label1
            .Top = 5
            .Left = 5
        ENDWITH
        WITH This.Text1
            .Top = This.Label1.Top
            .Left = This.Label1.Left + This.Label1.Width
        ENDWITH
        WITH Top = This.Text1.Top
            .Left = This.Text1.Left + This.Text1.Width + 2
        ENDWITH
        WITH This.Grid1
            .Top = This.Label1.Top + This.Label1.Height + 5
            .Left = 5
            .Height = This.Height - .Top - 5
            .Width = This.Width - .Left - 5
        ENDWITH
    ENDPROC
   
    PROCEDURE Activate
        WITH This
            .Arrange
            .Grid1.SetFocus
        ENDWITH
    ENDPROC
   
    PROCEDURE Resize
        This.Arrange
    ENDPROC
   
    PROCEDURE Command1.Click
        WITH This.Parent.Grid1
            .Init
            .SetFocus
        ENDWITH
    ENDPROC
   
    PROCEDURE Grid1.Init
       
        SELECT 考勤日报表
        SET FILTER TO (考勤日报表.日期 == This.Parent.Text1.Value) .AND. Have_OutTime()
        GOTO TOP
       
        WITH This
            .ColumnCount = FCOUNT("考勤日报表") + 1
            WITH .Columns(.ColumnCount)
                .Header1.Caption = "加班时间"
                .ControlSource = "Get_OutTime()"
                .Alignment = 1
            ENDWITH
            .SetAll("FontBold", .T., "Header")
            .SetAll("Alignment", 2, "Header")
        ENDWITH
       
    ENDPROC
   
ENDDEFINE

授人以渔,不授人以鱼。
2013-08-04 15:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这个考勤机的记录,对缺打情况没有监控,会造成太多无效数据,要么完善打卡制度。其实现在数据表的这个设计,给运算也制造了一点麻烦。
用我现在这个方法,迟到和早退也是可以统计出来的。

[ 本帖最后由 TonyDeng 于 2013-8-4 21:53 编辑 ]

授人以渔,不授人以鱼。
2013-08-04 21:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
楼主失踪啦?

授人以渔,不授人以鱼。
2013-08-06 12:17
Kerberos
Rank: 5Rank: 5
来 自:江苏扬州
等 级:职业侠客
帖 子:227
专家分:355
注 册:2012-9-11
收藏
得分:0 
以下是引用TonyDeng在2013-8-6 12:17:55的发言:

楼主失踪啦?
我来了斑竹,我要的就是这个,爱死你了,么么!

想学好VFP,想做VFP高手,想帮助更多的人解决VFP问题!
2013-08-06 17:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你看懂了没有,会改吗?

授人以渔,不授人以鱼。
2013-08-09 12:48
快速回复:统计迟到早退
数据加载中...
 
   



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

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