期待する動作
・締グループ(締日)と請求書発行日を設定すると、請求締めの対象期間の開始日と終了日を取得できる。
・請求書発行日が当月の締日(締グループ)より前の時は前月の対象期間を返す。
・月末の扱いをちゃんとする(2月や小の月における締めグループ:31の扱い)
まず各値を格納するクラスから
Private Class 請求締日の情報
Public 締グループ As Integer
Public 請求書発行日 As Date
Public 期間_開始日 As Date
Public 期間_終了日 As Date
End Class
締グループ:何日締めか?(整数)月末締めは31を設定する
請求書発行日:請求書を発行する日
期間_開始日:請求書の締め期間の開始日
期間_終了日:請求書の締め期間の終了日
です。
次に実際のコードはこんな感じ?
Private Sub 締日設定(ByRef 締日 As 請求締日の情報)
Dim 締グループ As Integer = 締日.締グループ '締日の日付
Dim 請求書発行日 As Date = 締日.請求書発行日
Dim 日付_請求書発行日 As Integer = 請求書発行日.Day
Dim 当月 As DateTime = dtp請求書発行日.Value
Dim 前月 As DateTime = CDate(当月.Year & "/" & 当月.Month & "/1").AddMonths(-1) '前月の1日
Dim 来月 As DateTime = CDate(当月.Year & "/" & 当月.Month & "/1").AddMonths(+1) '来月の1日
Dim 当月末日 As Date = 来月.AddDays(-1) '来月の1日の1日前が当月の末日
'月末日かどうか調べる
If 請求書発行日.Date.Equals(当月末日.Date) Then
'なにもしない
Else
'締日より前の発行日なら前月の請求範囲を設定
If 締グループ - 日付_請求書発行日 > 0 Then
当月 = 当月.AddMonths(-1)
前月 = 前月.AddMonths(-1)
来月 = 来月.AddMonths(-1)
End If
End If
Dim 締期間_終了日 As Date
If Not Date.TryParse(当月.Year & "/" & 当月.Month & "/" & 締グループ, 締期間_終了日) Then
締期間_終了日 = CDate(来月.Year & "/" & 来月.Month & "/1").AddDays(-1)
End If
Dim 締期間_開始日 As Date
If Not Date.TryParse(前月.Year & "/" & 前月.Month & "/" & 締グループ + 1, 締期間_開始日) Then
締期間_開始日 = CDate(CDate(当月.Year & "/" & 当月.Month & "/1"))
End If
締日.期間_開始日 = 締期間_開始日
締日.期間_終了日 = 締期間_終了日
End Sub
使うときには
Dim 締日の情報 As New 請求締日の情報
Dim 締期間_開始日 As Date
Dim 締期間_終了日 As Date
締日の情報.締グループ = 31
締日の情報.請求書発行日 = System.DateTime.Today '今日の場合
Call 締日設定(締日の情報)
'値を取得する
締期間_開始日 = 締日の情報.期間_開始日
締期間_終了日 = 締日の情報.期間_終了日
とりあえずこれで使ってみよう