磕磕绊绊的重构过程,也该有个美好的结尾,这里就和大家分享一下我的成果。这篇博客主要讲解我对于周结账的认识。 记得第一次的机房收费系统周结,添加了两个时间控件,根据用户选择的时间区间进行周结,单这点就失去了周结的意义。
这次,本来也是相同的思路去做周结,感谢大神指点,用了一种新的思路去做周结。
新方法:将输入的日期通过函数WeekDay转化成数字,再通过函数AddDay去找出这周的周一和周日,并显示成日期形式。
代码实现:
- <span style="font-family:KaiTi_GB2312;font-size:18px;">
- Dim a As Date
- a = "2014-08-19"</span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;">
- Dim b As String
- b = Weekday(a) - 1</span>
- <span style="font-family:KaiTi_GB2312;font-size:18px;">
- Dim c As String
- c = a.AddDays(-b + 1)</span>
Dim d As String
d = a.AddDays(7 - b)</span>
MsgBox(b) ‘显示信息
MsgBox(c)
MsgBox(d)</span>
接下来看看周结的实现
1.周结账思路:
通过仅一个时间控件,根据选中的日期判断所选日期所处的那一周,计算出周一和周日。通过循环计算将一周的记录汇总成一条记录,显示出来。
步骤:<1>将输入的日期转化成数字。
<2>通过日期转化后的数字,将这周的周一和周日转化成(数字)。
<3>通过循环计算一周内的日结记录。
问题:但是这里就会遇到有可能这一天中有收入和支出的活动,但只是没有进行日结账,这样的情况我们该怎么去解决呢?
2.解决思路:
在周结时,系统首先会根据你所选择的日期去判断出这一周的日期。然后从星期一开始遍历查找日结信息,如果有一天没有日结记录,就去执行日结,再去进行周结账。这样就保证了每天都有日结账。
代码:
D层:
Imports System.Data.SqlClient
Imports System.Configuration
Public Class CheckWeekDAL
''' <summary>
''' 周结汇总金额
''' </summary>
''' <param name="startdate"></param>
''' <param name="enddate"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function SuminfoDAL(ByVal startdate As String, ByVal enddate As String) As List(Of Entity.AccountEntity)
Dim helper As New SqlHelper
Dim dt As New DataTable
Dim sql As String = "select sum(RechargeCash),sum(CancelCash),sum(ConsumeCash),sum(AllCash) from T_AccountInfo where CheckDate=@startdate between @enddate"
Dim params As SqlParameter() = {New SqlParameter("@CheckDate", startdate),
New SqlParameter("@CheckDate", enddate)}
Dim infolist As List(Of Entity.AccountEntity)
infolist = Entity.EntityHelper.convertToList(Of Entity.AccountEntity)(dt)
Return infolist
End Function
End Class
U层:
Imports System
Imports Microsoft.Reporting.WinForms
Public Class frmCheckWeek
Private Sub frmCheckWeek_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dtpNow.Value = Now
Call CheckWeek()
End Sub
Private Sub CheckWeek()
Dim now As Date
Dim i As Integer
Dim beginDate As String
Dim begin As Date
Dim endDate As String
now = CDate(Format(dtpNow.Value, "yyyy-MM-dd"))
i = Weekday(now) - 1
beginDate = Format(now.AddDays(-i + 1), "yyyy-MM-dd")
begin = CDate(beginDate)
endDate = Format(now.AddDays(7 - i), "yyyy-MM-dd")
Dim checkdayFacade As New Facade.CheckDayFacade
For j = 0 To 6 ‘根据日期计算周结汇总
checkdayFacade.SuminfoFacade(CStr(Format(begin.AddDays(j), "yyyy-MM-dd")))
Next
Me.T_AccountInfoTableAdapter.Fill(Me.WeekDataSet.T_AccountInfo, beginDate, endDate)
Me.ReportViewer1.RefreshReport()
End Sub
'当时间选择改变时,就调用过程CheckWeek去更新报表
Private Sub dtpNow_ValueChanged(sender As Object, e As EventArgs) Handles dtpNow.ValueChanged
Call CheckWeek()
End Sub
End Class
在这里就给大家展示一下主要的D层汇总数据和U层的代码,其实在这里界面上看似用了一个时间控件就搞定了,在D层以及报表的数据集配置中,还是传递了两个参数(计算出来的周一和周日的日期)。
周结,每个人有每个人的思路和实现,希望大家多提意见,相互交流。