販売管理システムで使用する関数、請求日や支払日、端数処理など

販売管理システム For Accessではmod関数というモジュールに色々な計算式をまとめてあります。
これらの関数はクエリーや、モジュールで呼び出すことが出来ます。
継ぎ足ししてきたので、古い書き方もありますが、ご容赦ください。

日付関連関数 Accessモジュール

月末の計算

Public Function LastOfMon(pDate As Variant) As Variant
'   引数の日付が属する月度の最後の日付を返す'
    Dim DayWork As Date
    If IsNull(pDate) Then
        LastOfMon = Null
        Exit Function
    End If
        
    DayWork = DateSerial(Year(pDate), Month(pDate), 1)
    LastOfMon = DateAdd("m", 1, DayWork) - 1
End Function
解説: まず、pDate の日付の1日をDayWork に格納
続いてDayWork に1ヶ月足して翌月の1日を出し、そこからー1日すると月末となります

請求日の計算

Public Function Seikyubi(DenDay, Sime) As Date
    If IsNull(Sime) Then Sime = 0
    
    If Sime = 31 Then
        Seikyubi = LastOfMon(DenDay)
    ElseIf Sime = 0 Then
        Seikyubi = DenDay
    ElseIf Sime > 31 Then
        Seikyubi = DenDay
    Else
        Seikyubi = DateValue(Format$(DateAdd("m", 1, DenDay) - Sime, "yyyy/mm/") & Sime)
    End If
End Function
解説: パラメータのDenDayは伝票日付、Simeは得意先の締め日
締め日が月末であれば当月末日をセット、0や31日(末日)以外は当日をセット
20日や15日などのそれ以外の日は、
  1. 伝票日付に1ヶ月を足す
  2. そこから締め日の日数を引く< br /> これで、当月の締め日前なのか翌月分なのかが決定
  3. 上記年月に締め日を足して日付とする

締め日が複数の場合の請求日

生鮮品を扱っている場合、締め日が2つ(15日、末日)や3つ(10日、20日、末日)
といった複雑な場合もあります。
当社のお客様、花の仲卸様でのカスタマイズ、関数ではありません。
Private Sub SetSeikyubi()
    Dim WorkSime As Integer, Wday As Integer, Wtuki As Integer
    WorkSime = Day(Me![伝票日付])
    
    If Me![締め日1] = 0 Then
        Wday = Day(Me![伝票日付])
        Wtuki = 0
    End If
    
    If WorkSime <= Me![締め日1] Then
        If Me![締め日1] = 31 Then
            Wday = Day(LastOfMon(Me![伝票日付]))
        Else
            Wday = Me![締め日1]
        End If
        Wtuki = 0
    ElseIf WorkSime <= Me![締め日2] Then
        If Me![締め日2] = 31 Then
            Wday = Day(LastOfMon(Me![伝票日付]))
        Else
            Wday = Me![締め日2]
        End If
        Wtuki = 0
    ElseIf WorkSime <= Me![締め日3] Then
        If Me![締め日3] = 31 Then
            Wday = Day(LastOfMon(Me![伝票日付]))
        Else
            Wday = Me![締め日3]
        End If
        Wtuki = 0
    
    ElseIf Me![締め日2] = 0 Then    '締め日が1つの場合
        Wday = Me![締め日1]
        Wtuki = 1
    
    ElseIf Me![締め日3] = 0 Then    '締め日が1つの場合
        Wday = Me![締め日1]
        Wtuki = 1
    
    End If
   
    Me![請求日] = DateValue(Format$(DateAdd("m", Wtuki, Me![伝票日付]), "yyyy/mm/") & Wday)
    
End Sub

週締め(毎週金曜とか)

Private Sub Syujime()
'週締めの処理
    Dim NouhinYoubi As Integer, Wday As Integer
    
    NouhinYoubi = Weekday(Me![伝票日付])
    
    If Me![曜日] < NouhinYoubi Then   ' 翌週の締め
        Wday = Me![曜日] + (7 - NouhinYoubi)
        Me![請求日] = DateAdd("d", Wday, Me![伝票日付])
    
    ElseIf Me![曜日] = NouhinYoubi Then    '当日締め
        Me![請求日] = Me![伝票日付]
    
    Else
        Wday = Me![曜日] - NouhinYoubi
        Me![請求日] = DateAdd("d", Wday, Me![伝票日付])
    End If
End Sub
下記は、システム日付から先月の1日と先月末を計算しています
帳票印刷画面での、初期値に利用してます。
Public Function Zengetu1() As Date
'システム日付の1ヶ月前の1日を返す
    Dim DayWork As Date
    
    DayWork = DateAdd("m", -1, Date)
    Zengetu1 = DateSerial(Year(DayWork), Month(DayWork), 1)

End Function

Public Function Zengetu31() As Date
'システム日付の1ヶ月前の末日を返す
    Dim DayWork As Date
    
    DayWork = DateSerial(Year(Date), Month(Date), 1)
    Zengetu31 = DateAdd("d", -1, DayWork)

End Function

0 件のコメント :

コメントを投稿