C++项目开发全程实录(第2版)
上QQ阅读APP看书,第一时间看更新

2.10 结账模块设计

视频讲解

2.10.1 结账模块概述

结账模块可对当前顾客消费进行结算,顾客结账完成后系统自动将收入金额的数据写入数据表中,从而能很好地反映营业情况。结账模块的运行效果如图2.38所示。

图2.38 结账模块的运行效果

2.10.2 结账模块技术分析

在结账时,如果顾客所在的餐台号比较靠后,在下拉列表框控件中就必须按下拉按钮逐个寻找,在结账顾客数量较多的情况下,这种方法显然严重影响了工作效率。为此笔者为下拉列表框控件增加了手动输入的功能,使营业员在结账时既可以在下拉列表框中选择桌号,也可以手动输入桌号,极大地方便了使用者,提高了结账速度和顾客的满意程度。

要实现上述功能,就必须给列表控件添加一个EDITCHANGE事件,在事件中添加相应代码对输入的信息进行判断。本系统中的餐台号都是4位数,因此在事件中首先判断输入的是不是一个4位数,如果不是,则提示错误信息;如果是,则显示相应的消费信息。实现这一功能需要使用CString类提供的GetLength方法,语法如下:


     int GetLength()

返回值是一个整型数,是字符串的长度。

2.10.3 结账模块实现过程

 本模块使用的数据表:paybill、TableUse

(1)在Resources选项卡中插入一个对话框资源,为其新建一个CJiezhangdlg类,在类中定义一个_RecordsetPtr类型变量m_pRs并导入全局变量theApp。在“结账”对话框中添加5个静态文本控件、3个编辑框控件、一个下拉列表框控件、一个列表控件和两个按钮控件。

各个控件属性及变量设置如表2.7所示。

表2.7 控件属性及变量设置

(2)为对话框进行初始化设置,为类添加一个成员变量res,类型为Bool型。该变量主要控制下拉列表框控件接受数据的方式,False为下拉选择型,True为手动输入型。

为类添加一个WM_INITDIALOG消息,对列表控件设置样式并对其内容进行初始化设置。代码如下:

代码贴士

❶ GetRecordCount:该方法的返回值就是下拉列表框控件中的总行数。

❷ AddString:该方法用于向下拉列表框中插入选项。

(3)在对话框左边的控件窗口中选择下拉列表框控件,再在右边消息窗口中选择SELCHANGE事件。代码如下:

代码贴士

❶ GetLBText:该方法用于获取相应行的文本信息并将其存入字符变量中。

❷ DeleteAllItems:该方法用于删除列表控件中的所有数据。

(4)在对话框左边的控件窗口中选择下拉列表框控件,在右边消息窗口中选择EDITCHANGE事件并添加如下代码:

(5)在顾客付款后,应在“实收”编辑框中输入顾客的付款金额,此时“找零”编辑框中应该实时计算出应找给顾客的金额。

为达到上述目的,先在对话框中选中对应“实收”的编辑框控件名,再在右边选择它的EN_CHANGE事件,在此事件中添加如下代码:

(6)在单击“结账”按钮时,系统自动将当前餐台号的使用状态变成空闲状态,并将账单数据表清空,然后将这次结账的收入写进日收入数据表中,方便查询日收入,代码如下:

(7)给“再见”按钮添加如下代码:


     CDialog::OnCancel();

2.10.4 单元测试

图2.39 结账模块提示出错

在结账模块中,如果在下拉列表框控件中没有任何数据被输入或选择时,直接单击了“结账”按钮或误按了Enter键,将会出现如图2.39所示的提示信息。

导致这种错误的原因主要是系统没有对下拉列表框控件的输入进行判断,如果下拉列表框控件的属性是Drop List,则只需判断它的当前项的值是否等于-1即可,-1表示没有选择,代码如下:

但在本系统中,由于列表控件既要接受下拉选择,又要接受文本输入,所以将其属性设置为Drop-Down。在判断其是否有数值输入时需要判断输入的位数,因为只有当输入位数与餐台号位数相等时,系统才通过验证,代码如下: