Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 9555|回復(fù): 15
打印 上一主題 下一主題

[模塊/函數(shù)] 遞歸法:根據(jù)訂單日期,交貨周期,扣除非工作日計(jì)算交貨日期

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2012-6-25 23:53:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 Henry D. Sy 于 2012-6-27 10:19 編輯

這是為網(wǎng)友寫(xiě)的,現(xiàn)在發(fā)上來(lái),給有需要的朋友參考,
不是很成熟,大家探討提意見(jiàn)啊---------謝謝 layaman_999 提出寶貴建議
增加:
春節(jié),端午,中秋,元旦,五一,國(guó)慶
  1. '---------------------------------------------------------------------------------------
  2. ' Procedure : DeliveryDay
  3. ' DateTime  : 2012-6-25 23:25
  4. ' Author    : Henry D. Sy
  5. ' 參數(shù)      : OrderDate 下單日期
  6. '
  7. '           : intPeriod 交貨周期(以天為單位)
  8. '
  9. '根據(jù)下單日期及交貨周期計(jì)算剔除非工作日(周六,日)以及五一,國(guó)慶,元旦之交貨日期
  10. '按理:交貨日期=下單日期+周期+非工作日天數(shù),但加上這段額外的天數(shù)中也許又有周六日
  11. '本例的重點(diǎn)就是利用遞歸函數(shù)來(lái)計(jì)算這非工作日中的非工作日.....
  12. '---------------------------------------------------------------------------------------
  13. '
  14. Public Function DeliveryDay(OrderDate As Date, intPeriod As Integer) As Date

  15.     Dim i As Integer          '循環(huán)變量

  16.     Dim NWD As Integer        '保存非工作日天數(shù)(Non_Work_Days)

  17.     Dim myDate As Date        '生產(chǎn)期間每天的日期,用來(lái)判斷是否為NWD

  18.     Dim gDate As Date         '計(jì)算過(guò)程中的臨時(shí)日期值

  19.     Dim lunarDate As Date     '農(nóng)歷日期

  20.     On Error GoTo DeliveryDay_Error

  21.     For i = 1 To intPeriod    '這里i取值從1開(kāi)始,不考慮0,因?yàn)榻訂萎?dāng)日無(wú)需判斷是否工作日
  22.    
  23.         '考慮周六,日
  24.         myDate = DateAdd("d", i, OrderDate)
  25.         If Weekday(myDate) = 1 Or Weekday(myDate) = 7 Then
  26.             NWD = NWD + 1
  27.         End If

  28.         '下面考慮五一,國(guó)慶,元旦
  29.         If Format(myDate, "mmdd") = "0501" Or _
  30.            Format(myDate, "mmdd") = "0101" Then
  31.             NWD = NWD + 1
  32.         ElseIf Format(myDate, "mmdd") = "1001" Then
  33.             NWD = NWD + 3
  34.         End If

  35.         '考慮春節(jié),端午,中秋
  36.         lunarDate = GetNlDate(myDate)
  37.         Select Case Format(lunarDate, "mmdd")
  38.         Case "0101"
  39.             NWD = NWD + 3
  40.         Case "0505", "0815"
  41.             NWD = NWD + 1
  42.         End Select

  43.     Next
  44.     '判斷及計(jì)算工作日結(jié)束

  45.     gDate = DateAdd("d", intPeriod, OrderDate)  '在不考慮工作日時(shí):交貨日期=下單日期+周期
  46.     '下面開(kāi)始考慮工作日
  47.     If NWD = 0 Then   '沒(méi)有非工作日

  48.         DeliveryDay = gDate           '交貨日期=下單日期+周期

  49.         '有非工作日
  50.     Else
  51.         DeliveryDay = DeliveryDay(gDate, NWD)    '為了計(jì)算加上非工作日天數(shù)后的非工作日,這里函數(shù)引用自己本身(遞歸),繼續(xù)循環(huán)計(jì)算至NWD=0
  52.     End If

  53.     On Error GoTo 0
  54.     Exit Function

  55. DeliveryDay_Error:

  56.     MsgBox "Error " & Err.Number & " (" & Err.Description & ") "
  57. End Function
  58. Function GetNlDate(D As Date) As Date
  59.     Dim MonthAdd(11), NongliData(99)
  60.     Dim curYear, curMonth, curDay
  61.     Dim NongliStr
  62.     Dim i, m, n, k, isEnd, bit, TheDate
  63.     '公歷每月前面的天數(shù)
  64.     MonthAdd(0) = 0
  65.     MonthAdd(1) = 31
  66.     MonthAdd(2) = 59
  67.     MonthAdd(3) = 90
  68.     MonthAdd(4) = 120
  69.     MonthAdd(5) = 151
  70.     MonthAdd(6) = 181
  71.     MonthAdd(7) = 212
  72.     MonthAdd(8) = 243
  73.     MonthAdd(9) = 273
  74.     MonthAdd(10) = 304
  75.     MonthAdd(11) = 334
  76.     '農(nóng)歷數(shù)據(jù)
  77.     NongliData(0) = 2635
  78.     NongliData(1) = 333387
  79.     NongliData(2) = 1701
  80.     NongliData(3) = 1748
  81.     NongliData(4) = 267701
  82.     NongliData(5) = 694
  83.     NongliData(6) = 2391
  84.     NongliData(7) = 133423
  85.     NongliData(8) = 1175
  86.     NongliData(9) = 396438
  87.     NongliData(10) = 3402
  88.     NongliData(11) = 3749
  89.     NongliData(12) = 331177
  90.     NongliData(13) = 1453
  91.     NongliData(14) = 694
  92.     NongliData(15) = 201326
  93.     NongliData(16) = 2350
  94.     NongliData(17) = 465197
  95.     NongliData(18) = 3221
  96.     NongliData(19) = 3402
  97.     NongliData(20) = 400202
  98.     NongliData(21) = 2901
  99.     NongliData(22) = 1386
  100.     NongliData(23) = 267611
  101.     NongliData(24) = 605
  102.     NongliData(25) = 2349
  103.     NongliData(26) = 137515
  104.     NongliData(27) = 2709
  105.     NongliData(28) = 464533
  106.     NongliData(29) = 1738
  107.     NongliData(30) = 2901
  108.     NongliData(31) = 330421
  109.     NongliData(32) = 1242
  110.     NongliData(33) = 2651
  111.     NongliData(34) = 199255
  112.     NongliData(35) = 1323
  113.     NongliData(36) = 529706
  114.     NongliData(37) = 3733
  115.     NongliData(38) = 1706
  116.     NongliData(39) = 398762
  117.     NongliData(40) = 2741
  118.     NongliData(41) = 1206
  119.     NongliData(42) = 267438
  120.     NongliData(43) = 2647
  121.     NongliData(44) = 1318
  122.     NongliData(45) = 204070
  123.     NongliData(46) = 3477
  124.     NongliData(47) = 461653
  125.     NongliData(48) = 1386
  126.     NongliData(49) = 2413
  127.     NongliData(50) = 330077
  128.     NongliData(51) = 1197
  129.     NongliData(52) = 2637
  130.     NongliData(53) = 268877
  131.     NongliData(54) = 3365
  132.     NongliData(55) = 531109
  133.     NongliData(56) = 2900
  134.     NongliData(57) = 2922
  135.     NongliData(58) = 398042
  136.     NongliData(59) = 2395
  137.     NongliData(60) = 1179
  138.     NongliData(61) = 267415
  139.     NongliData(62) = 2635
  140.     NongliData(63) = 661067
  141.     NongliData(64) = 1701
  142.     NongliData(65) = 1748
  143.     NongliData(66) = 398772
  144.     NongliData(67) = 2742
  145.     NongliData(68) = 2391
  146.     NongliData(69) = 330031
  147.     NongliData(70) = 1175
  148.     NongliData(71) = 1611
  149.     NongliData(72) = 200010
  150.     NongliData(73) = 3749
  151.     NongliData(74) = 527717
  152.     NongliData(75) = 1452
  153.     NongliData(76) = 2742
  154.     NongliData(77) = 332397
  155.     NongliData(78) = 2350
  156.     NongliData(79) = 3222
  157.     NongliData(80) = 268949
  158.     NongliData(81) = 3402
  159.     NongliData(82) = 3493
  160.     NongliData(83) = 133973
  161.     NongliData(84) = 1386
  162.     NongliData(85) = 464219
  163.     NongliData(86) = 605
  164.     NongliData(87) = 2349
  165.     NongliData(88) = 334123
  166.     NongliData(89) = 2709
  167.     NongliData(90) = 2890
  168.     NongliData(91) = 267946
  169.     NongliData(92) = 2773
  170.     NongliData(93) = 592565
  171.     NongliData(94) = 1210
  172.     NongliData(95) = 2651
  173.     NongliData(96) = 395863
  174.     NongliData(97) = 1323
  175.     NongliData(98) = 2707
  176.     NongliData(99) = 265877
  177.     '生成當(dāng)前公歷年、月、日   ==>   GongliStr
  178.     curYear = Year(D)
  179.     curMonth = Month(D)
  180.     curDay = Day(D)

  181.     '計(jì)算到初始時(shí)間1921年2月8日的天數(shù):1921-2-8(正月初一)
  182.     TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(curMonth - 1) - 38
  183.     If ((curYear Mod 4) = 0 And curMonth > 2) Then
  184.         TheDate = TheDate + 1
  185.     End If
  186.     '計(jì)算農(nóng)歷天干、地支、月、日
  187.     isEnd = 0
  188.     m = 0
  189.     Do
  190.         If (NongliData(m) < 4095) Then
  191.             k = 11
  192.         Else
  193.             k = 12
  194.         End If
  195.         n = k
  196.         Do
  197.             If (n < 0) Then
  198.                 Exit Do
  199.             End If
  200.             '獲取NongliData(m)的第n個(gè)二進(jìn)制位的值
  201.             bit = NongliData(m)
  202.             For i = 1 To n Step 1
  203.                 bit = Int(bit / 2)
  204.             Next
  205.             bit = bit Mod 2
  206.             If (TheDate <= 29 + bit) Then
  207.                 isEnd = 1
  208.                 Exit Do
  209.             End If
  210.             TheDate = TheDate - 29 - bit
  211.             n = n - 1
  212.         Loop
  213.         If (isEnd = 1) Then
  214.             Exit Do
  215.         End If
  216.         m = m + 1
  217.     Loop
  218.     curYear = 1921 + m
  219.     curMonth = k - n + 1
  220.     curDay = TheDate
  221.     If (k = 12) Then
  222.         If (curMonth = (Int(NongliData(m) / 65536) + 1)) Then
  223.             curMonth = 1 - curMonth
  224.         ElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)) Then
  225.             curMonth = curMonth - 1
  226.         End If
  227.     End If
  228.     '生成農(nóng)歷==>   NongliStr
  229.     GetNlDate = CDate(curYear & "- " & Format(curMonth, "00 ") & "- " & Format(curDay, "00 "))
  230. End Function

復(fù)制代碼

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒(méi)有帳號(hào)?注冊(cè)

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2012-6-26 08:07:25 | 只看該作者
{:soso_e181:}Henry D. Sy 老師謝謝分享您的勞動(dòng)成果。
3#
發(fā)表于 2012-6-26 08:28:42 | 只看該作者
學(xué)習(xí)版主大作!
4#
發(fā)表于 2012-6-26 08:31:19 | 只看該作者
謝謝6D
5#
發(fā)表于 2012-6-26 08:43:58 | 只看該作者
學(xué)習(xí)
收下
6#
發(fā)表于 2012-6-26 08:48:07 | 只看該作者
Function JHRQ(ByVal ddrq As Date, ByVal sczq As Long) As Date

'參數(shù)說(shuō)明:ddrq訂單日期,sczq生產(chǎn)周期
'函數(shù)功能:訂單日期(不計(jì)周日六)+生產(chǎn)周期(不計(jì)周日六),計(jì)算出發(fā)貨日期
'layaman_999
'容易誤解的:
'1.周六\日確定的訂單,順延確定日期為周一(例如周六的訂單,生產(chǎn)周期1天的話,應(yīng)該是下周二交貨)
'2.發(fā)貨日期如遇上周六\日,,發(fā)貨確定日期為周一(例如周五的訂單,生產(chǎn)周期1天的話,應(yīng)該是下周一交貨)

Dim i As Long
Dim j As Long
Dim K As Integer

j = 0

For i = 1 To sczq
K = Weekday(ddrq + j)
Select Case K
   Case 1 '星期日
    j = j + 1
   Case 7 '星期六
    j = j + 2
End Select
  j = j + 1
Next i

JHRQ = ddrq + j

K = Weekday(JHRQ)
Select Case K
   Case 1 '星期日
    JHRQ = JHRQ + 1
   Case 7 '星期六
    JHRQ = JHRQ + 2
End Select

End Function
'這個(gè)是我寫(xiě)的一個(gè),不知是否可行?
7#
發(fā)表于 2012-6-26 09:03:06 | 只看該作者
謝謝分享!
8#
 樓主| 發(fā)表于 2012-6-26 17:14:41 | 只看該作者
  1. '---------------------------------------------------------------------------------------
  2. ' Procedure : DeliveryDay
  3. ' DateTime  : 2012-6-25 23:25
  4. ' Author    : Henry D. Sy
  5. ' 參數(shù)      : OrderDate 下單日期
  6. '
  7. '           : intPeriod 交貨周期(以天為單位)
  8. '
  9. '根據(jù)下單日期及交貨周期計(jì)算剔除非工作日(周六,日)以及五一,國(guó)慶,元旦之交貨日期
  10. '按理:交貨日期=下單日期+周期+非工作日天數(shù),但加上這段額外的天數(shù)中也許又有周六日
  11. '本例的重點(diǎn)就是利用遞歸函數(shù)來(lái)計(jì)算這非工作日中的非工作日.....
  12. '---------------------------------------------------------------------------------------
  13. '
  14. Public Function DeliveryDay(OrderDate As Date, intPeriod As Integer) As Date

  15.     Dim i As Integer          '循環(huán)變量

  16.     Dim NWD As Integer        '保存非工作日天數(shù)(Non_Work_Days)

  17.     Dim myDate As Date        '生產(chǎn)期間每天的日期,用來(lái)判斷是否為NWD

  18.     Dim gDate As Date         '計(jì)算過(guò)程中的臨時(shí)日期值

  19.     On Error GoTo DeliveryDay_Error

  20.     For i = 1 To intPeriod    '這里i取值從1開(kāi)始,不考慮0,因?yàn)榻訂萎?dāng)日無(wú)需判斷是否工作日

  21.         myDate = DateAdd("d", i, OrderDate)
  22.         If Weekday(myDate) = 1 Or Weekday(myDate) = 7 Then
  23.             NWD = NWD + 1
  24.         End If
  25.         '下面考慮五一,國(guó)慶,元旦
  26.         If Right(Format(myDate, "yyyymmdd"), 4) = "0501" Or _
  27.            Right(Format(myDate, "yyyymmdd"), 4) = "0101" Then
  28.             NWD = NWD + 1
  29.         ElseIf Right(Format(myDate, "yyyymmdd"), 4) = "1001" Then
  30.             NWD = NWD + 3
  31.         End If
  32.     Next
  33.     '判斷及計(jì)算工作日結(jié)束

  34.     gDate = DateAdd("d", intPeriod, OrderDate)  '在不考慮工作日時(shí):交貨日期=下單日期+周期
  35.     '下面開(kāi)始考慮工作日
  36.     If NWD = 0 Then   '沒(méi)有非工作日

  37.         DeliveryDay = gDate           '交貨日期=下單日期+周期

  38.         '有非工作日
  39.     Else
  40.         DeliveryDay = DeliveryDay(gDate, NWD)    '為了計(jì)算加上非工作日天數(shù)后的非工作日,這里函數(shù)引用自己本身(遞歸),繼續(xù)循環(huán)計(jì)算至NWD=0
  41.     End If

  42.     On Error GoTo 0
  43.     Exit Function

  44. DeliveryDay_Error:

  45.     MsgBox "Error " & Err.Number & " (" & Err.Description & ") "
  46. End Function
復(fù)制代碼
現(xiàn)在增加考慮五一,元旦,國(guó)慶
請(qǐng)兄弟們一起來(lái)增加春節(jié),端午,中秋
9#
 樓主| 發(fā)表于 2012-6-27 10:20:14 | 只看該作者
增加
農(nóng)歷節(jié)日

點(diǎn)擊這里給我發(fā)消息

10#
發(fā)表于 2012-6-27 12:43:19 | 只看該作者
謝謝6D分享!
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-16 18:19 , Processed in 0.117505 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表