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