【机房重构】周结账单

    磕磕绊绊的重构过程,也该有个美好的结尾,这里就和大家分享一下我的成果。这篇博客主要讲解我对于周结账的认识。 记得第一次的机房收费系统周结,添加了两个时间控件,根据用户选择的时间区间进行周结,单这点就失去了周结的意义。

    这次,本来也是相同的思路去做周结,感谢大神指点,用了一种新的思路去做周结。

    新方法:将输入的日期通过函数WeekDay转化成数字,再通过函数AddDay去找出这周的周一和周日,并显示成日期形式。

    代码实现:

[vb]  view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">     
  2.         Dim a As Date  
  3.         a = "2014-08-19"</span>  
[vb]  view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">      
  2.         Dim b As String  
  3.         b = Weekday(a) - 1</span>  
[vb]  view plain copy
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">       
  2.         Dim c As String
  3.         c = a.AddDays(-b + 1)</span>

        Dim d As String  
        d = a.AddDays(7 - b)</span>   
        MsgBox(b) ‘显示信息  
        MsgBox(c)  
        MsgBox(d)</span> 

【机房重构】周结账单_第1张图片       【机房重构】周结账单_第2张图片         【机房重构】周结账单_第3张图片

 接下来看看周结的实现

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层以及报表的数据集配置中,还是传递了两个参数(计算出来的周一和周日的日期)。

   周结,每个人有每个人的思路和实现,希望大家多提意见,相互交流。

   

你可能感兴趣的:(【机房重构】周结账单)