1. 程式人生 > >VB.net版機房收費系統——結賬功能實現(程式碼部分)

VB.net版機房收費系統——結賬功能實現(程式碼部分)

  實現結賬功能的時候,被選項卡控制元件整的有點鬱悶,瞬間腦袋就凌亂了,聽上去自己好像很可笑的樣子……於是,便去爬巨人的肩膀了~

  看了歡哥的部落格,發現她的結賬部落格是按照“索引”思想寫的,在結賬實體中添加了新的屬性過程(我新增的叫CheckDetail)結賬表中並沒有這個欄位,是為了實現顯示所有結賬需要的資訊(售卡、充值、退卡、彙總)而新增的。


  U層程式碼如下,其中部分註釋是功能實現中的一些錯,我就順便把相應的錯誤資訊和解決辦法寫成了註釋~

<span style="font-family:KaiTi_GB2312;font-size:18px;">Public Class frmCheck
    Private Sub frmCheck_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim UserInfo As New Entity.eUserLogin
        '反向思維,查詢操作員和管理員
        UserInfo.UserLevel = "一般使用者"
        Dim UserFac As New Facade.CheckFacade
        Dim mylist As List(Of Entity.eUserLogin)
        mylist = UserFac.ShowUserInfo(UserInfo)
        Dim i As Integer
        '顯示所有的操作員和管理員
        For i = 0 To mylist.Count - 1
            cmbCheckUserID.Items.Add(Val(Trim((mylist(i).UserID))))
        Next
    End Sub
    Private Sub cmbCheckUserID_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbCheckUserID.SelectedIndexChanged
        DgvCancelCard.Rows.Clear()
        DgvRecharge.Rows.Clear()
        DgvSellCard.Rows.Clear()
        '選擇使用者名稱後,顯示使用者真實姓名
        Dim eUser As New Entity.eUserLogin
        eUser.UserID = Trim(cmbCheckUserID.Text)
        Dim UserNameFac As New Facade.CheckFacade
        Dim mylist As List(Of Entity.eUserLogin)
        Dim i As Integer
        mylist = UserNameFac.ShowUserName(eUser)
        txtCheckUserName.Text = Trim(mylist(i).UserName)

        '顯示結賬前的不同資訊
        Dim CheckInfo As New Entity.eCheck
        Dim CheckFac As New Facade.CheckFacade
        Dim dt As New DataTable
        CheckInfo.CheckDate = Format(Now, "yyyy-MM-dd")
        CheckInfo.CheckTime = Format(Now, "HH:mm:ss")
        CheckInfo.Head = GlobalUserID
        CheckInfo.UserID = cmbCheckUserID.Text
        CheckInfo.IsCheck = "N"
        '定義變數,並賦予初值
        Dim SellCardNum As Integer = 0
        Dim CancelCardNum As Integer = 0
        Dim ActualSellCardNum As Integer = 0
        Dim RechargeSum As String = 0
        Dim CancelCashSum As String = 0
        Dim ActualRechargeSum As String = 0

        '給實體賦初值,要是沒有,報錯:沒給儲存過程賦引數
        CheckInfo.RechargeCash = RechargeSum
        CheckInfo.CancelCash = CancelCashSum
        CheckInfo.Benefit = ActualRechargeSum

        '顯示售卡資訊
        <span style="color:#ff0000;">'在實體中添加了新的屬性過程CheckDetail,結賬表中並沒有這個欄位,為了實現顯示所有結賬資訊的需求新增的</span>
        CheckInfo.CheckDetail = "SellCard"
        dt = CheckFac.Check(CheckInfo)
        SellCardNum = SellCardNum + dt.Rows.Count
        If dt.Rows.Count <> 0 Then
            lblSelltip.Visible = False
            DgvSellCard.Rows.Add(dt.Rows.Count)
            For i = 0 To (dt.Rows.Count - 1)
                DgvSellCard.Rows(i).Cells(0).Value = dt.Rows(i).Item(0)
                DgvSellCard.Rows(i).Cells(1).Value = dt.Rows(i).Item(1)
                DgvSellCard.Rows(i).Cells(2).Value = Mid(dt.Rows(i).Item(2), 1, 10)
                DgvSellCard.Rows(i).Cells(3).Value = dt.Rows(i).Item(3)
            Next
            DgvSellCard.AllowUserToAddRows = False
        Else
            lblSelltip.Visible = True
            'Exit Sub  '不能有這句程式碼,因為此處的需求是連續將相關的記錄查找出來,不能間斷
        End If

        '顯示充值資訊
        CheckInfo.CheckDetail = "Recharge"
        dt = CheckFac.Check(CheckInfo)
        If dt.Rows.Count <> 0 Then
            lblRechargetip.Visible = False
            DgvRecharge.Rows.Add(dt.Rows.Count)
            For i = 0 To (dt.Rows.Count - 1)
                DgvRecharge.Rows(i).Cells(0).Value = dt.Rows(i).Item(0)
                DgvRecharge.Rows(i).Cells(1).Value = dt.Rows(i).Item(1)
                DgvRecharge.Rows(i).Cells(2).Value = Mid(dt.Rows(i).Item(2), 1, 10)
                DgvRecharge.Rows(i).Cells(3).Value = dt.Rows(i).Item(3)
                '若是如下方式寫,會報錯從字串“088        33        11        ”到型別“Double”的轉換無效
                'RechargeSum = RechargeSum + dt.Rows(i).Item(1)
                '避免上述錯誤的寫法
                '“System.FormatException”型別的未經處理的異常在 mscorlib.dll 中發生,其他資訊: 輸入字串的格式不正確。
                'RechargeSum = RechargeSum + Convert.ToInt32(dt.Rows(i).Item(1))
                '改成了以下寫法
                RechargeSum = RechargeSum + Val(dt.Rows(i).Item(1))
            Next
            DgvRecharge.AllowUserToAddRows = False
        Else
            lblRechargetip.Visible = True
        End If


        '顯示退卡資訊
        CheckInfo.CheckDetail = "CancelCard"
        dt = CheckFac.Check(CheckInfo)
        CancelCardNum = CancelCardNum + dt.Rows.Count
        If dt.Rows.Count <> 0 Then
            lblCanceltip.Visible = False
            DgvCancelCard.Rows.Add(dt.Rows.Count)
            For i = 0 To (dt.Rows.Count - 1)
                DgvCancelCard.Rows(i).Cells(0).Value = dt.Rows(i).Item(0)
                DgvCancelCard.Rows(i).Cells(1).Value = dt.Rows(i).Item(1)
                DgvCancelCard.Rows(i).Cells(2).Value = Mid(dt.Rows(i).Item(2), 1, 10)
                DgvCancelCard.Rows(i).Cells(3).Value = dt.Rows(i).Item(3)
                '若是這樣寫,會報錯
                'CancelCashSum = CancelCashSum +(dt.Rows(i).Item(1)
                'CancelCashSum = CancelCashSum + Convert.ToInt32(dt.Rows(i).Item(1))
                CancelCashSum = CancelCashSum + Val(dt.Rows(i).Item(1))
            Next
            DgvCancelCard.AllowUserToAddRows = False
        Else
            lblCanceltip.Visible = True
        End If
        '如果沒有結賬需要的資訊,結賬按鈕不可用,並給出相應的資訊
        If DgvCancelCard.Rows.Count = 0 And DgvRecharge.Rows.Count = 0 And DgvSellCard.Rows.Count = 0 Then
            lblChecktip.Visible = True
            btnCheck.Enabled = False
        Else
            lblChecktip.Visible = False
            '彙總介面的顯示資訊
            btnCheck.Enabled = True
            txtSellNum.Text = SellCardNum
            txtCancelNum.Text = CancelCardNum
            txtCancelCashSum.Text = CancelCashSum
            txtRechargeSum.Text = RechargeSum
            '下面的程式碼是否加ToString並未影響執行
            'txtActualSellNum.Text = SellCardNum - CancelCardNum
            txtActualSellNum.Text = (SellCardNum - CancelCardNum).ToString
            'txtActualGainCashSum.Text = RechargeSum - CancelCashSum
            txtActualGainCashSum.Text = (RechargeSum - CancelCashSum).ToString
        End If
    End Sub
    '正式結賬
    '注意:由於結賬資訊顯示和正式結賬用的是同一個儲存過程,所以為了照顧儲存過程裡邊的欄位,就把
    '一些欄位即使用不到,也寫了一遍
    Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
        '由於優化的想法是不選擇被結賬使用者,結賬按鈕不能用,故此處不用進行如下提示
        'If cmbCheckUserID.SelectedIndex = -1 Then
        '    MsgBox("請選擇被結賬使用者!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "提示")
        'End If
        Dim CheckInfo As New Entity.eCheck
        Dim CheckFac As New Facade.CheckFacade
        CheckInfo.UserID = Trim(cmbCheckUserID.Text)
        CheckInfo.Head = GlobalUserID
        CheckInfo.RechargeCash = Trim(txtRechargeSum.Text)
        CheckInfo.CancelCash = Trim(txtCancelCashSum.Text)
        CheckInfo.Benefit = Trim(txtRechargeSum.Text) - Trim(txtCancelCashSum.Text)
        CheckInfo.CheckDate = Format(Now, "yyyy-MM-dd")
        CheckInfo.CheckTime = Format(Now, "HH:mm:ss")
        CheckInfo.IsCheck = "Y"
        CheckInfo.CheckDetail = "InfoSum"
        Dim IsCheckSucceed As Boolean
        IsCheckSucceed = CheckFac.IsCheck(CheckInfo)
        If IsCheckSucceed = True Then
            MsgBox("恭喜你,結賬成功!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "提示")
            txtActualGainCashSum.Text = "0"
            txtActualSellNum.Text = "0"
            txtCancelCashSum.Text = "0"
            txtCancelNum.Text = "0"
            txtRechargeSum.Text = "0"
            txtSellNum.Text = "0"
            btnCheck.Enabled = False
            Exit Sub
        Else
            MsgBox("抱歉,結賬失敗!", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "提示")
        End If
    End Sub
End Class</span>

  上邊的程式碼用的是if選擇語句,根據選擇去顯示相應的資訊,所以,為了對應,我們也會有一個相應的用if選擇語句進行功能實現的儲存過程:

<span style="font-family:KaiTi_GB2312;font-size:18px;">USE [ComputerCharge_sys]
GO
/****** Object:  StoredProcedure [dbo].[proc_Check]    Script Date: 2016/4/9 16:40:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[proc_Check]	
	@Head char(11),
	@UserID char(11),
	@RechargeSum char(10),
	@CancelCashSum char(10) ,
	@ActualRechargeSum char(10),
	@CheckDate  char(10),
	@CheckTime  char(8),
	@IsCheck varchar(10),
	@CheckDetail char(10)
AS
BEGIN	
	declare @N varchar(2)	
	set @N='N'
	declare @sql char(500)

	--查詢表T_Card_Info中的售卡記錄
	if @CheckDetail ='SellCard'
	begin
	select @sql ='select CardNo ,StudentNo,RegisterDate ,RegisterTime  from T_Card_Info  where Head='+ char(39)
[email protected]
+ char(39)+char(32)+'and IsCheck='+char(39)[email protected]+char(39) exec(@sql) end --查詢表T_CancelCard_Info中的退卡記錄 if @CheckDetail ='CancelCard' begin select @sql ='select CardNo ,BackCash ,CancelDate ,CancelTime from T_CancelCard_Info where Head='+ char(39)[email protected]
+ char(39)+char(32)+'and IsCheck='+char(39)[email protected]+char(39) exec(@sql) end --查詢充值表的充值記錄 if @CheckDetail ='Recharge' begin select CardNo ,Recharge ,RechargeDate ,RechargeTime from T_Recharge_Info where [email protected] and IsCheck [email protected] --select @sql ='select CardNo ,Recharge ,RechargeDate ,RechargeTime from T_Recharge_Info where Head='+ char(39)[email protected]+ char(39)+char(32)+'and IsCheck='+char(39)[email protected]+char(39) exec(@sql) end if @CheckDetail ='InfoSum' begin update T_card_Info set IsCheck [email protected] where Head [email protected] and IsCheck = @N update T_CancelCard_Info set IsCheck [email protected] where Head [email protected] and IsCheck = @N update T_Recharge_Info set IsCheck [email protected] where Head [email protected] and IsCheck = @N insert into T_Check_Info (RechargeCash,CancelCash,Benefit,CheckDate,CheckTime,Head)values(@RechargeSum ,@CancelCashSum ,@ActualRechargeSum,@CheckDate ,@CheckTime ,@Head ) --set @[email protected][email protected]@error --if @error<>0 --rollback transaction --如果不等於0,則回滾事務,不能執行 --else --commit transaction --等於0,則執行該事務 end END</span>

  上述內容只是結賬功能的程式碼,純屬站在巨人的肩膀上學習、比葫蘆畫瓢而已,接下來才是自己的探索學習過程,無奈篇幅太長,請欣賞下一篇部落格

相關推薦

VB.net機房收費系統——結賬功能實現程式碼部分

  實現結賬功能的時候,被選項卡控制元件整的有點鬱悶,瞬間腦袋就凌亂了,聽上去自己好像很可笑的樣子……於是,便去爬巨人的肩膀了~   看了歡哥的部落格,發現她的結賬部落格是按照“索引”思想寫的,在結賬實體中添加了新的屬性過程(我新增的叫CheckDetail)結賬表中並沒有

機房收費系統之組合查詢程式碼部分

       最近的事情比較多,本該留出大塊時間整理組合查詢的程式碼部分,結果是分為一段一段的零散時間來整理的,最終整理的這些組合查詢程式碼可能還是有很多冗餘,本來不想拿出來的,但考慮到自己的不足就要展示給大家,這樣自己才能進步嘛,所以還是厚著臉皮把我冗餘的程式碼展示出來了,

VB.NET機房收費系統—數據庫設計

階段 數據類型 多人 不能 can log lai tex asi 之前第一遍機房收費的時候,用的數據庫是別人的。認知也僅僅能建立在別人的基礎上,等自考中《數據庫系統原理》這本書學完了之後,再去看曾經的數據庫,發現數據庫真的還須要進一步的優化。以下是我設計數據庫的

VB NET機房收費系統---匯出Excel表格

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!                       datagridview,翻譯成中文的意思是資料表格顯示,使用DataGridView控制元件,可以顯示和編輯來自不同型別的資料來源的表格,將資料

VB.NET機房收費系統之組合查詢

    之前用VB做組合查詢的時候沒有認真的思考過,這次再做機房決心不能就這麼放過,今天就來說一說組合查詢。     首先做組合查詢,我用的是窗體的繼承,簡化了不少程式碼,大家也寫了很多窗體繼承的文章

VB.NET機房收費系統之檢視

這次.NET版機房收費系統資料庫設計遵循了三正規化,變動最大的就是實現了學生和卡的分離,這樣避免了非關鍵字對關鍵字的傳遞依賴,卡表中的卡號在學生表中作為一個外來鍵,同樣將卡和學生聯絡起來,不過這樣分離

VB.NET機房收費系統】——三層VS七層使用者登入

先睹為快 來一張經典的七層機房收費系統包圖,PS:本人將 SQLHelper類單單拿出來,可將SQLHelper類歸到 D層中,不影響使用。對於不清楚SQLHelper類運用者,可參見【VB.NET

機房收費系統——結賬

結賬這部分算是機房收費系統的一個難點,之所以它難,是因為這個窗體不光涉及到程式碼,而且還涉及到算數的問題,還和報表有關,所以它是個難點,但是隻要把思路弄清楚了,再難的東西也不怕啦! 思維導圖: 思路有沒有清楚一點呢? 程式碼片段 先讓操作員的名字和label框實現同步:

第一次機房收費系統——結賬

前言:談到結賬,大家都覺得挺難的,當然我也是這麼覺得的,但是通過一段時間的磨練,最終還是解決了,那麼就來分享一下把! 頁面 首先談到頁面,我將臨時收費金額改成了上網收費金額。 彙總的計算 售卡張數 就是你今天所出售的卡數 注意: 是今天售的卡數。 退卡張數

合作機房收費系統SVN的安裝步驟

簡介         要說使用SVN,首先必須要了解SVN,下面是我對SVN的理解。SVN(subversion)是近年來崛起的版本管理工具,是cvs的接班人,目前絕大多數開源軟體都是用SVN作為程式

個人重構機房收費系統事務的使用

    雖然不是第一次做機房收費系統,對於機房收費系統需求也都瞭解,但是如果要做出讓自己滿意的機房收費系統就夠費腦筋啊。一個事務弄的我整了好長時間。 事務(Transaction):將彼此相關的多項操作合併成一個邏輯單元,以便於確保這些操作要麼全部執行,要麼全不執行。  

第一次機房收費系統--結賬

前言 初次碰到結賬這個問題,心裡還是有很多的抵觸,覺得太難了,下機的時候就覺得有些困難,因為涉及到了算賬的問題,現在開始結賬了,放眼望去,慢慢的全是賬,不管怎樣,先學做一個會計吧! 功能實現 其實結賬這裡分為兩大部分 一:從資料庫中匯出操作員使用者名稱和真實姓名 需要實現

機房收費系統--結賬

機房收費系統即將接近尾聲了,在敲結賬時因為理不清各個表之間的關係,所以後面進行的也比較慢。通過向別人請教,也上網查了一些,不過在慢慢敲的過程中,逐漸的理清了它的思路。接下來我介紹一下我的想法。 結賬

VB.NET機房重構---“報表”之旅

在第一次機房的時候,由於VB沒有自帶的報表,所以我們用的是第三方 的報表控制元件!設計這個報表真是用了我很多的時間!這次重構中,.net版的開發環境VS中就提供了一個現成的報表控制元件,再經過和資料庫

SQL儲存過程——機房收費系統結賬的那些事

       在機房收費系統中“結賬”窗體中有這樣一個需求:點選“結賬”按鈕以後需要將資料庫中,與已經選擇的操作員使用者名稱有關的所有充值記錄、退卡記錄、售卡記錄中的"isCheck"欄位的未結賬變成

機房收費系統之細化篇跨日期下機,MDI窗體的運用,MDI主窗體與子窗體的互動

      最近在細化機房收費系統時,發現在下機窗體出現了很多消費時間為負值的情況,有時還會彈出Bug,仔細一看原來是跨日期的消費時間問題,那麼如何設定跨日期的下機呢?在機房收費系統中的MDI 窗體如何運用呢?下面就這兩個問題進行梳理分享。 一、跨日期的下機 核

機房收費系統之手動下機獲取時間差、更新資料庫資料、判斷時間差

        下機窗體的梳理著實耗費了不少時間,的確是一個費腦細胞的活兒,不過過程也是挺享受的,那個專注力、那個廢寢忘食的勁頭兒少有吖^_^ 一、下機窗體的流程圖(如有不對的地方還望各位大神給予指導^_^): 二、錯誤集(本窗體中的大錯誤並不是很多,都是以前遇到

機房收費系統——組合查詢優化新增DTPicker控制元件

乾貨 組合查詢窗體中查詢欄位有日期有時間,那這樣我們還用文字框來顯示的話是不是使用者體驗很不好,本著提升使用者體驗的想法把文字框換成DTPicker控制元件。下面看看效果和怎麼實現的。 功能是當點選需

UML之機房收費系統九大圖BD,FD,DD

      前面幾篇部落格我們分享了UML各個圖的概念、圖示以及在機房收費系統中的畫法,今天我們來彙總一下UML的九大圖:用例圖、類圖、物件圖、狀態圖、順序圖、協作圖、活動圖、構件圖、配置圖。 一、用例圖(use case diagram)   &nb

機房收費系統UML互動圖協作圖與時序圖

【前言】       互動圖是一個統稱,它是用來描述物件之間的相互作用關係的,包括順序圖和協作圖。從本質來講,順序圖和協作圖的作用是相同的,只不過他們兩者的側重點不同。順序圖更加側重對訊息的描述,尤其