磕磕绊绊的重构过程,也该有个美好的结尾,这里就和大家分享一下我的成果。这篇博客主要讲解我对于周结账的认识。 记得第一次的机房收费系统周结,添加了两个时间控件,根据用户选择的时间区间进行周结,单这点就失去了周结的意义。
这次,本来也是相同的思路去做周结,感谢大神指点,用了一种新的思路去做周结。
新方法:将输入的日期通过函数WeekDay转化成数字,再通过函数AddDay去找出这周的周一和周日,并显示成日期形式。
代码实现:
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层以及报表的数据集配置中,还是传递了两个参数(计算出来的周一和周日的日期)。
周结,每个人有每个人的思路和实现,希望大家多提意见,相互交流。