Office中国论坛/Access中国论坛

标题: 【Access小品】哥德巴赫折腾--关于工厂日历的示例 [打印本页]

作者: todaynew    时间: 2010-10-10 20:59
标题: 【Access小品】哥德巴赫折腾--关于工厂日历的示例
本帖最后由 todaynew 于 2010-10-11 17:22 编辑

   版友yanwei82123300连发两贴求问关于工厂日历的问题。大意是工厂的财政年度为每年的10月1日开始到次年的9月30日,从所发的表格和图示来看,每月的结账日大约在月末的某个周五。版友yanwei82123300同志几番解释均不得要领,于是便引起了若干好事者(包括鄙人)进行哥德巴赫猜想。几经分析,在下以为这样的设计相对合理:会计的结账日期一般应在20前后,且低于20日的日数应该相对操过20日的日数要少很多,也就是说最早的结账日不应该低于18日。按照这个思路帮助版友yanwei82123300写了一个函数。为了进一步拓展版友yanwei82123300的思维,又按照倒数第二个周五为月末结账日写了一个函数。其实也不知道是否真的符合该同志的需要。

  由这个问题可以看出,在程序的设计和开发过程中,需要对既有的管理习惯进行一个规范,使之具有规律,并且可以用程序体现出这个规律来。这个问题估计是开发中最难的事情,改变人的习惯很不容易。

[attach]43715[/attach]

[attach]43716[/attach]

又仔细看了一下图示,发现该图的规律应该为每季中月度的周数是按照445分配的(1月和12月除外),按照此规律,编写万年历如下:



[attach]43729[/attach]


[attach]43756[/attach]
作者: ui    时间: 2010-10-10 21:12
老兄总是佳作频出! 收藏了.
作者: chenyingfengsx    时间: 2010-10-10 22:39
佩服啊!
作者: aslxt    时间: 2010-10-10 22:42

我觉得楼主的猜想还是有点距离

作者: li08hua    时间: 2010-10-11 00:09
恭喜todaynew !!!
作者: todaynew    时间: 2010-10-11 06:51
我觉得楼主的猜想还是有点距离
aslxt 发表于 2010-10-10 22:42

有道理,应该是第三个示例:

[attach]43717[/attach]

[attach]43718[/attach]

Function Calendar3(Ddate As Date) As String
'功能:每季度按445周的的工厂日历
Dim Mydate As Date
Dim str As String
Dim i As Long, j As Long, m
Mydate = DateSerial(Ddate - 1, 10, 1)
str = str & 1 & ";" & Mydate & ";"
If Weekday(Mydate, vbMonday) <> 6 Then
    Mydate = DateAdd("d", 21, Mydate)
    For j = 1 To 7
        If Weekday(Mydate, vbMonday) = 5 Then
                Exit For
        End If
        Mydate = DateAdd("d", 1, Mydate)
    Next
Else
    Mydate = DateAdd("d", 20, Mydate)
End If
str = str & Mydate & ";"
m = 0
For i = 1 To 4
    For j = 1 To 3
        m = m + 1
        If m = 12 Then Exit For
        If m <> 1 Then
            str = str & m & ";" & DateAdd("d", 1, Mydate) & ";"
            If j <> 3 Then
                Mydate = DateAdd("d", 28, Mydate)
            Else
                Mydate = DateAdd("d", 35, Mydate)
            End If
            str = str & Mydate & ";"
        End If
    Next
    If m = 12 Then Exit For
Next
str = str & m + 1 & ";" & DateAdd("d", 1, Mydate) & ";" & DateSerial(Ddate, 9, 30)
Calendar3 = str
End Function

作者: ycxchen    时间: 2010-10-11 09:47
还得向TODAYNEW学习写自定义函数!
作者: t小宝    时间: 2010-10-11 13:21
不容易呀,老汉辛苦了!
作者: xuwenning    时间: 2010-10-11 13:35
学习
谢谢分享
作者: yanwei82123300    时间: 2010-10-11 16:21
todaynew ;老师辛苦了!真是大公无私!!
作者: todaynew    时间: 2010-10-11 17:23
todaynew ;老师辛苦了!真是大公无私!!
yanwei82123300 发表于 2010-10-11 16:21

版主都是活雷锋。






欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3