社区
VB基础类
帖子详情
RECORDSET对象的UPDATE方法时出现以下错误提示
mrlsr
2001-07-19 10:49:27
我在用执行RECORDSET对象的UPDATE方法时出现以下错误提示:
实时错误‘-2147467259 (80004005)“:
键列信息不足或不正确。更新影响到过多的行。
请问是什么地方错误了?
...全文
150
13
打赏
收藏
RECORDSET对象的UPDATE方法时出现以下错误提示
我在用执行RECORDSET对象的UPDATE方法时出现以下错误提示: 实时错误‘-2147467259 (80004005)“: 键列信息不足或不正确。更新影响到过多的行。 请问是什么地方错误了?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
LANDEHUTU
2001-09-08
打赏
举报
回复
执行时超时,执行时有三种方法:1.adoConnection.excute, 它的执行时间取决于adoConnection.CommandTimeOut 缺省是30秒,我也被害惨了,我一直以为是0秒,一直执行;
2. adoCommand.excute它的执行时间取决于adoCommand.CommandTimeOut 缺省是30秒;
3. adoRecSet.Open strSql,adoConnection它的执行时间取决于adoConnection.CommandTimeOut 缺省是30秒,当时我改的那个表有一百多万条记录,40多个字段.执行一次等半天.
natfit
2001-07-20
打赏
举报
回复
没有主键!
fool_chen
2001-07-20
打赏
举报
回复
不对,应该是你的数据库里有一个字段是无重复索引,两个记录想同,.update后就出现了你说的错误。或者要向数据库里update的数据值与字段类型不符也有
同意
Ganman
2001-07-20
打赏
举报
回复
出现了相同的记录,回到数据库删掉记录,一切ok
建议:最好不要到表里手动直接改动记录!
小牛
2001-07-20
打赏
举报
回复
不对,应该是你的数据库里有一个字段是无重复索引,两个记录想同,.update后就出现了你说的错误。或者要向数据库里update的数据值与字段类型不符也有这种情况。
Netis_Sun
2001-07-20
打赏
举报
回复
1。你先检查一下子段的次序和值的类型是否正确?
2。你可以试一下updatebatch adocurrent...
fast_qiu
2001-07-20
打赏
举报
回复
见者有分哦。呵呵
DTWUJP
2001-07-19
打赏
举报
回复
把更新源码贴出帮你分析分析。
kyuwong
2001-07-19
打赏
举报
回复
xxfeiyu
2001-07-19
打赏
举报
回复
gz
hz1101
2001-07-19
打赏
举报
回复
这个问题我找出好久也没找出原因!
houyingjun
2001-07-19
打赏
举报
回复
你可以定义指针或游标嘛
好多的分,大家平分了吧,你也拿不走了
mrlsr
2001-07-19
打赏
举报
回复
我已经找到原因了,就是ADO不能对两条完全相同的记录进行修改!
餐厅管理信息系统课程设计
餐饮管理系统 一、需求分析 随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。餐饮管理系统正是在这样的情况之下越来越受到重视。餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。 设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。 系统功能概述 民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。众所周知,在定量管理的具体实现
方法
和手段方面,最有效的工具就是计算机管理。 传统的手工操作管理存在着许多无法避免的问题,例如: 人工计算机账单金额
出现
差错; 收银工作中跑单、漏单、偷钱现象普遍; 个别服务员作弊、改单、宰客情形
时
有发生; 客人消费单据难以保存和查询。 如果借助计算机来管理,就可以轻松的解决处理这些问题。一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。 功能模块划分 1. 前台操作系统 订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。 结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。 交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。 2. 后台管理维护系统 用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。 菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。 付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。 系统流程分析 系统流程图1所示。当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。用户登录以后,系统自动判断出其操作权限。操作权限包括普通员工和管理人员。新用户的操作权限默认为是普通员工。普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。 • 图1 当有顾客订餐的
时
候,员工输入桌台号和食物代码即可进行点菜,在结账以前,加菜是允许的。当顾客结账的
时
候,员工输入桌台号,选择顾客的付款方式,即可完成结账。 在下班
时
间,员工可以统计当班期间的消费情况。这样,员工注销此次登录,退出系统,一天的工作就到此结束。 管理人员可以随
时
进行系统设置,包括菜谱设置、用户权限设置、付款方式设置等。 功能模块调用 餐饮管理系统调用了
以下
功能模块: 用户注册模块、用户登录模块、数据显示模块。 二、概念设计 图2 给出了餐饮管理系统的E-R实体关系图。收银员、餐桌、菜单三者之间的关系是订餐,其中订餐关系包括的属性有:餐桌编号、菜肴编号、菜肴名称、菜肴单价、菜肴数量、菜肴价格、菜肴折扣、是否结账、结账
时
间。 三、逻辑设计 将E-R关系模型转化为二维表。本系统主要需要6个表,分别为用户信息表(UserInfo)、菜谱信息表(MenuInfo)、订餐信息表(OrderInfo)、桌台信息表(DeskInfo)、付款方式表(PayModeInfo)、当班统计表(CaldayInfo),各个表中字段的类型以及说明如表1-表6所示。 表1 用户信息表 表2 菜谱信息表 表3 订餐信息表 表4 桌台信息表 表5 付款方式表 表6 当班统计表 其中,用户信息表主要存储用户的基本信息,权限项决定了用户的操作权限。菜谱信息表存储食物的基本信息。价格项为结账与结算提供依据。桌台信息表存储各个桌台的消费情况,如消费金额、是否结账等。订餐信息表存储各个桌台的点菜情况。付款方式表存储了基本的付款方式,供结账
时
选择。当班统计表存储员工当班期间的营业情况。 四、数据库设计 数据库管理系统采用Microsoft SQL Server 2000作为后台数据库。首先,在企业管理器中建立一个名为MenuManageSys的数据库,然后建立以上6个数据库表,并设定主键、长度。这样,数据库的设计已经完成。 五、详细设计 本餐饮管理系统采用Visual C++ + SQL Server来开发。利用ADO技术调用后台数据库,使用了两个ADO智能指针_ConnectionPtr和_
Recordset
Ptr,其中_ConnectionPtr用来连接后台SQL Server数据库,_
Recordset
Ptr指针用来对数据库的表中的记录集进行操作。工程使用的是基于对话框的程序,每个对话框为一个类,父类为CDialog,实现的一些功能都封装在类的函数中,体现了面向
对象
编程语言C++的特性。 导入ADO接口:在工程的stdafx.h文件里直接引入符号#import引入ADO库文件,加入下面一行代码,以使编译器能正确编译: #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF","adoEOF") 用_ConnectionPtr指针连接数据库:在CmenuManageSysApp类的BOOL InitInstance()函数中加入
以下
代码: m_pConnection.CreateInstance("ADODB.Connection"); try { m_pConnection->ConnectionTimeout = 8; m_pConnection->PutCursorLocation(adUseClient); m_pConnection->Open("driver={SQL Server};Server=172.29.130.47; DATABASE=MenuManageSys;UID=;PWD=","","",adModeUnknown); } catch(_com_error e) { AfxMessageBox("数据库连接失败!"); return FALSE; } 1.设计工程框架 餐饮管理系统的框架是一个对话框类型的操作界面,用户注册、登录后,可对餐饮管理的各个功能模块进行操作。 1.1设置主界面 系统主界面如图3: 图3 每个事件的对应代码如下: (1) 单击“注册”菜单,弹出“注册”对话框,代码如下: void CMenuManageSysDlg::OnRegister() { CRegisterDlg dlg(this); dlg.DoModal(); } (2) 单击“登录”菜单,弹出“登录”对话框,代码如下: void CMenuManageSysDlg::OnLogin() { CLoginDlg dlg(this); dlg.DoModal(); } (3) 单击“订餐”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::On
Update
OrderSystem(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (4) 如果用户已经登录,弹出“餐桌信息”对话框,否则
提示
用户登录,代码如下: void CMenuManageSysDlg::OnOrderSystem() { CDeskDlg dlg; dlg.DoModal(); } (5) 单击“结账”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::On
Update
PayCheck(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (6) 如果用户已经登录,弹出“结账”对话框,否则
提示
用户先登录,代码如下: void CMenuManageSysDlg::OnPayCheck() { CPayDlg dlg; dlg.DoModal(); } (7) 单击“下班”菜单,判断用户是否登录,代码如下: void CMenuManageSysDlg::On
Update
ChangeDuty(CCmdUI* pCmdUI) { if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (8) 如果用户已经登录,弹出“交接班”对话框,否则
提示
用户先登录,代码如下: void CMenuManageSysDlg::OnChangeDuty() { COffdutyDlg dlg; dlg.DoModal(); } (9) 单击“用户权限设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::On
Update
SetLevel(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行用户级别设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (10) 如果权限是管理人员,弹出“权限设置”对话框,如果是普通员工会
提示
无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnSetLevel() { CLevelDlg dlg; dlg.DoModal(); } (11) 单击“菜谱设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::On
Update
SetMenu(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行菜谱设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (12)如果权限是管理人员,弹出“菜谱设置”对话框,如果是普通员工会
提示
无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnSetMenu() { CMenuSetDlg dlg; dlg.DoModal(); } (13)单击“付款方式设置”菜单,判断用户是否登录及其权限,代码如下: void CMenuManageSysDlg::On
Update
PaymodeSet(CCmdUI* pCmdUI) { if(theApp.m_Level==1) { pCmdUI->Enable(true); } else if(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行付款方式设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } } (14)如果权限是管理人员,弹出“设置付款方式”对话框,如果是普通员工会
提示
无权进行用户级别设置,代码如下: void CMenuManageSysDlg::OnPaymodeSet() { CSetPaymodeDlg dlg; dlg.DoModal(); } (15)单击“注销”菜单,
提示
用户本次登录已注销,代码如下: void CMenuManageSysDlg::OnLogout() { if(MessageBox("您确定要注销吗","注销询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { theApp.m_Level=-1; AfxMessageBox("本次登录已注销"); } } (16)单击“退出系统”,在确定退出后,关闭系统,代码如下: void CMenuManageSysDlg::OnExitSystem() { if(MessageBox("真的要退出系统吗","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { CDialog::OnOK(); } } 1.2设计注册模块 注册模块如图4: 图4 注册模块 在输入了完整的信息,按下“确定”按钮后,如果没有重复用户,则注册成功,代码如下: void CRegisterDlg::OnRegisterBtn() { // TODO: Add your control notification handler code here
Update
Data(TRUE); if(!m_strUserName.IsEmpty()&&!m_strUserNative.IsEmpty() &&!m_strUserAdddress.IsEmpty() &&!m_strUserPwd.IsEmpty()&& !m_strUserPwdAgain.IsEmpty() && !m_strUserNum.IsEmpty() &&m_nUserAge != 0) { if(m_strUserPwd.CompareNoCase(m_strUserPwdAgain) != 0 ) { MessageBox("密码有误,请重新输入密码。","系统注册"); } else { try { m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open("SELECT*FROMUserInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_error e) { CString temp; temp.Format("连接数据库
错误
信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_p
Recordset
->AddNew(); m_p
Recordset
->PutCollect("UserName",_variant_t(m_strUserName)); m_p
Recordset
->PutCollect("UserPwd",_variant_t(m_strUserPwd)); m_p
Recordset
->PutCollect("UserNative",_variant_t(m_strUserNative)); m_p
Recordset
->PutCollect("UserAddress",_variant_t(m_strUserAdddress)); m_p
Recordset
->PutCollect("UserNum",_variant_t(m_strUserNum)); CString str; if(m_nUserSex==0) { m_p
Recordset
->PutCollect("UserSex",_variant_t("男")); } else m_p
Recordset
->PutCollect("UserSex",_variant_t("女")); str.Format("%d",m_nUserAge); m_p
Recordset
->PutCollect("UserAge",_variant_t(str)); str.Format("%d",0); m_p
Recordset
->PutCollect("UserLevel",_variant_t(str)); m_p
Recordset
->
Update
(); m_p
Recordset
->Close(); m_p
Recordset
= NULL; MessageBox("恭喜您注册成功","系统注册"); CDialog::OnOK(); return; } } else { MessageBox("请输入完整注册信息","系统注册"); } } 登录模块如图5: 图5 登录模块 输入完整信息,并单击“确定”按钮后,如果用户名不存在,则重新输入;如果密码
错误
,则重新输入,在重新输入三次密码后还不正确,则退出登录界面,登录失败。代码如下: void CLoginDlg::OnOK() {
Update
Data(TRUE); if(!m_strUserName.IsEmpty() && !m_strPassword.IsEmpty()) { try { CString sql,str; // str.Format("%d",m_nUserNum); sql = "SELECT * FROM UserInfo WHERE UserName='"+m_strUserName+"' and UserNum='"+m_strUserNum+"' and UserPwd = '"+m_strPassword+"' "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_p
Recordset
->adoEOF) { m_p
Recordset
->Close(); sql= "SELECT * FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; try { m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_p
Recordset
->adoEOF) { MessageBox("此用户不存在!","登录系统"); } else { if(count>=2) { MessageBox("登录次数过多,系统关闭","系统登录
错误
",MB_OK|MB_ICONWARNING); CDialog::OnOK(); } else { MessageBox("密码
错误
!","登录系统"); count++; } return; } } catch(_com_error e)///捕捉异常 { CString temp; temp.Format("连接数据库
错误
信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } } else { theApp.m_Level = m_p
Recordset
->GetCollect("UserLevel").lVal; theApp.m_name = m_strUserName; MessageBox("登录成功!","登录系统",MB_OKCANCEL|MB_ICONQUESTION); CDialog::OnOK(); return; } } catch(_com_error e)///捕捉异常 { CString temp; temp.Format("连接数据库
错误
信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_p
Recordset
->Close(); m_p
Recordset
= NULL; } else { MessageBox("请输入用户名和密码","登录系统"); } } 到此,注册模块与登录模块就设计完成。新用户注册以后,凭借其用户名和密码可以登陆,从而对系统进行操作。 3.功能模块设计 根据功能模块划分,可以将餐饮管理系统的功能模块划分为值班员管理模块、菜谱管理模块、用户管理模块、订餐模块、结账模块,下面对工程各个功能进行介绍。 3.1订餐模块设计 订餐模块的功能是员工输入桌台号码和食物代码进行点菜、根据需要加菜、下单。订餐模块如图6所示: 图6 订餐模块 为对话框类添加3个数据集
对象
: _
Recordset
Ptr m_p
Recordset
_Desk; _
Recordset
Ptr m_p
Recordset
_Order; _
Recordset
Ptr m_p
Recordset
_Menu; 对话框类的各成员函数的代码如下: CDeskDlg::CDeskDlg(CWnd* pParent /*=NULL*/) : CDialog(CDeskDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDeskDlg) m_nOrderDeskNumber = 0; m_nOrderFoodNumber = 0; m_nOrderFoodRebate = 100; m_nOrderFoodAcount = 1; //}}AFX_DATA_INIT } BOOL CDeskDlg::OnInitDialog() //对话框初始化函数 { CDialog::OnInitDialog(); GetDlgItem(IDOK)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDeskDlg::OnOrderBtn() //点菜消息按钮 {
Update
Data(TRUE); CString str; CString sql; if(m_nOrderDeskNumber == 0) { AfxMessageBox("请输入餐桌编号"); return; } if(m_nOrderFoodNumber != 0 ) { str.Format("%d",m_nOrderFoodNumber); sql = "SELECT * FROM MenuInfo WHERE FoodNum = "+str+" "; m_p
Recordset
_Menu.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Menu->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Menu->GetRecordCount()==0) { AfxMessageBox("该菜肴编号不存在,请重新输入编号"); return; } else { int m_nTempPrice; CString m_strTempName; m_nTempPrice = m_p
Recordset
_Menu->GetCollect("FoodPrice").lVal;//食物价格 m_strTempName = m_p
Recordset
_Menu->GetCollect("FoodName").bstrVal;//食物名称 m_p
Recordset
_Menu->Close(); str.Format("%d",m_nOrderDeskNumber);//桌子编号 sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" "; m_p
Recordset
_Order.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_p
Recordset
_Order->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_p
Recordset
_Order->PutCollect("DeskNum" ,_variant_t(str));//餐桌编号 str.Format("%d" , m_nOrderFoodNumber); m_p
Recordset
_Order->PutCollect("FoodNum" ,_variant_t(str));//食物编号 str.Format("%d",m_nTempPrice); m_p
Recordset
_Order->PutCollect("FoodSignalPrice" ,_variant_t(str));//食物单价 str.Format("%d",m_nOrderFoodAcount); m_p
Recordset
_Order->PutCollect("FoodAcount" ,_variant_t(str));//食物数量 m_nTempPrice *=m_nOrderFoodAcount; str.Format("%d",m_nTempPrice); m_p
Recordset
_Order->PutCollect("FoodPrice" ,_variant_t(str));//食物价格 str.Format("%d",m_nOrderFoodRebate); m_p
Recordset
_Order->PutCollect("FoodRebate" ,_variant_t(str));//食物折扣 int m_nTempRePrice; m_nTempRePrice = (int)m_nTempPrice*m_nOrderFoodRebate/100; str.Format("%d",m_nTempRePrice); m_p
Recordset
_Order->PutCollect("FoodRePrice" ,_variant_t(str)); //折后价格(小计) m_p
Recordset
_Order->PutCollect("FoodName" ,_variant_t(m_strTempName));//食物名称 int m_nTempCheck; m_nTempCheck = 0; str.Format("%d",m_nTempCheck); m_p
Recordset
_Order->PutCollect("FoodCheck" ,_variant_t(str));//是否结帐 CString paytime; CTime now=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d %H:%M:%S")); m_p
Recordset
_Order->PutCollect("FoodTime",_variant_t(paytime));//点菜
时
间 m_p
Recordset
_Order->
Update
(); m_p
Recordset
_Order ->Close(); str.Format("%d",m_nOrderDeskNumber); CString str1; str1.Format("%d" , 0); sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" and FoodCheck = "+str1+" "; m_p
Recordset
_Order.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_p
Recordset
_Order); m_dbFood.SetColumnHeaders(2) ; m_dbFood.Refresh(); GetDlgItem(IDOK)->EnableWindow(TRUE); } } else { AfxMessageBox("请输入菜肴编号"); return; } } void CDeskDlg::OnOK() //下单消息按钮 { CString str,sql,str1; int m_nTempRePrice; m_nTotalPrice = 0; while(!m_p
Recordset
_Order->adoEOF) { m_nTempRePrice=m_p
Recordset
_Order->GetCollect("FoodRePrice").lVal; m_nTotalPrice += m_nTempRePrice; m_p
Recordset
_Order->MoveNext(); } if(m_nTotalPrice>0) { int temp=0; str1.Format("%d",temp); str.Format("%d",m_nOrderDeskNumber); sql = "SELECT * FROM DeskInfo WHERE DeskNum = "+str+" and DeskCheck = "+str1+""; m_p
Recordset
_Desk.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Desk->GetRecordCount()==0) { m_p
Recordset
_Desk->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_p
Recordset
_Desk->PutCollect("DeskNum",(_variant_t)str); str.Format("%d",m_nTotalPrice); m_p
Recordset
_Desk->PutCollect("DeskPrice",(_variant_t)str); temp = 0; str.Format("%d" , temp); m_p
Recordset
_Desk->PutCollect("DeskCheck",(_variant_t)str); } else { str.Format("%d",m_nTotalPrice); m_p
Recordset
_Desk->PutCollect("DeskPrice",(_variant_t)str); } m_p
Recordset
_Desk->
Update
(); m_p
Recordset
_Desk->Close(); } CDialog::OnOK(); } void CDeskDlg::On
Update
OrderDeskNumber() //根据餐桌号自动将原来已点的食物信息绑定到数据列表 {
Update
Data(TRUE); CString str,sql; str.Format("%d",m_nOrderDeskNumber); CString str1; int temp=0; str1.Format("%d" , temp); sql = "SELECT * FROM OrderInfo WHERE DeskNum = "+str+" and FoodCheck = "+str1+" "; m_p
Recordset
_Order.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_p
Recordset
_Order); m_dbFood.SetColumnHeaders(2) ; m_dbFood.Refresh(); } 3.2结账模块设计 结账模块的功能是员工输入桌台代码进行结账、选择结账方式(包括现金结账、信用卡结账、支票结账、签单等)、自动找零。结账模块如图7所示: 图7 结账模块 为对话框类添加3个数据集
对象
,代码如下: _
Recordset
Ptr m_p
Recordset
_Paymode; _
Recordset
Ptr m_p
Recordset
_Order; _
Recordset
Ptr m_p
Recordset
_Desk; 对话框类的各成员函数的代码如下: CPayDlg::CPayDlg(CWnd* pParent /*=NULL*/) : CDialog(CPayDlg::IDD, pParent) { //{{AFX_DATA_INIT(CPayDlg) m_strPaymode = _T(""); m_strPayUserName = _T(""); m_nPayDeskNumber = 0; m_nPayTotalPrice = 0; m_nPayRealPrice = 0; m_nPayRePrice = 0; m_timePay = COleDateTime::GetCurrentTime(); //}}AFX_DATA_INIT } BOOL CPayDlg::OnInitDialog() //对话框初始化函数 { CDialog::OnInitDialog(); m_strPayUserName=theApp.m_name; CString sql; sql="SELECT * FROM PayModeInfo"; m_p
Recordset
_Paymode.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Paymode->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Paymode->GetRecordCount()!=0) { while(!m_p
Recordset
_Paymode->adoEOF) { m_coPaymode.AddString((LPCTSTR)(_bstr_t)m_p
Recordset
_Paymode->GetCollect("NAME")); m_p
Recordset
_Paymode->MoveNext(); } m_p
Recordset
_Paymode->Close(); m_coPaymode.SetCurSel(0); }
Update
Data(FALSE); return TRUE; } void CPayDlg::On
Update
PayDeskNumber() //自动将对应桌号的点菜信息以及消费情况显示在桌面上 {
Update
Data(TRUE); CString sql,str,str1; int temp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskNum="+str+" AND DeskCheck="+str1+" "; m_p
Recordset
_Desk.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Desk->GetRecordCount()!=0) { m_nPayTotalPrice=m_p
Recordset
_Desk->GetCollect("DeskPrice").lVal; } m_p
Recordset
_Desk->Close(); sql="SELECT * FROM OrderInfo WHERE DeskNum="+str+" AND FoodCheck="+str1+" "; m_p
Recordset
_Order.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPay.SetRefDataSource(NULL); m_dbPay.SetRefDataSource((LPUNKNOWN)m_p
Recordset
_Order); m_dbPay.SetColumnHeaders(1); m_dbPay.Refresh();
Update
Data(FALSE); } void CPayDlg::On
Update
PayRealprice() //根据实收金额自动计算找零金额 {
Update
Data(TRUE); m_nPayRePrice=m_nPayRealPrice-m_nPayTotalPrice;
Update
Data(FALSE); } void CPayDlg::OnOK() //确定按钮消息函数,将数据写回DESK表和ORDER表,结账完成 {
Update
Data(TRUE); if(!m_strPaymode.IsEmpty()&&m_nPayRealPrice!=0) { CString sql,str,str1; int temp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskNum="+str+" AND DeskCheck="+str1+" "; m_p
Recordset
_Desk.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Desk->GetRecordCount!=0) { temp=1; str.Format("%d",temp); m_p
Recordset
_Desk->PutCollect("DeskCheck",(_variant_t)str); int selmode; selmode=m_coPaymode.GetCurSel(); m_coPaymode.GetLBText(selmode,m_strPaymode); m_p
Recordset
_Desk->PutCollect("DeskPaymode",_variant_t(m_strPaymode)); CString paytime; CTime now=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d %H:%M:%S")); m_p
Recordset
_Desk->PutCollect("DeskDateTime",(_variant_t)paytime); m_p
Recordset
_Desk->PutCollect("DeskName",(_variant_t)m_strPayUserName); } m_p
Recordset
_Desk->
Update
(); m_p
Recordset
_Desk->Close(); str.Format("%d",m_nPayDeskNumber); sql="SELECT * FROM OrderInfo WHERE DeskNum="+str+" AND FoodCheck="+str1+" "; m_p
Recordset
_Order.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Order->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Order->GetRecordCount()!=0) { temp=1; str.Format("%d",temp); while(!m_p
Recordset
_Order->adoEOF) { m_p
Recordset
_Order->PutCollect("FoodCheck",(_variant_t)str); m_p
Recordset
_Order->
Update
(); m_p
Recordset
_Order->MoveNext(); } } m_p
Recordset
_Order->Close(); str.Format("%d",m_nPayDeskNumber); str+="号桌已结账"; AfxMessageBox(str); CDialog::OnOK(); } else { AfxMessageBox("请输入完整信息"); } } 到此,结账模块已经设计完成。 3.3交接班模块设计 交接班模块的功能是管理员统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作做准备。交接班模块如图8所示: 图8 交接班模块 为对话框类添加两个数据集
对象
,代码如下: _
Recordset
Ptr m_p
Recordset
_Off; _
Recordset
Ptr m_p
Recordset
_Desk; 对话框类的各成员函数的代码如下: COffdutyDlg::COffdutyDlg(CWnd* pParent /*=NULL*/) : CDialog(COffdutyDlg::IDD, pParent) { //{{AFX_DATA_INIT(COffdutyDlg) m_strDayName = _T(""); m_nTotalAcount = 0; m_timeDay = 0; //}}AFX_DATA_INIT } BOOL COffdutyDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); m_timeDay=CTime::GetCurrentTime(); m_strDayName=theApp.m_name;
Update
Data(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void COffdutyDlg::OnCalDayBtn() //统计按钮,负责当班统计 { CString sql,str; int temp=1; str.Format("%d",temp); sql="SELECT * FROM DeskInfo WHERE DeskCheck="+str+" AND DeskName='"+m_strDayName+"' "; m_p
Recordset
_Desk.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Desk->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); int renminbi_jine=0,qita_jine=0,total_jine=0,acount=0; if(m_p
Recordset
_Desk->GetRecordCount!=0) { while(!m_p
Recordset
_Desk->adoEOF) { str=m_p
Recordset
_Desk->GetCollect("DeskPaymode").bstrVal; if(str.CompareNoCase("人民币")==0) { renminbi_jine+=m_p
Recordset
_Desk->GetCollect("DeskPrice").lVal; } else { qita_jine+=m_p
Recordset
_Desk->GetCollect("DeskPrice").lVal; } acount++; m_p
Recordset
_Desk->MoveNext(); } } m_p
Recordset
_Desk->Close(); total_jine=renminbi_jine+qita_jine; m_p
Recordset
_Off.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
_Off->Open("SELECT * FROM CalDayInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
_Off->GetRecordCount!=0) { while(!m_p
Recordset
_Off->adoEOF) { m_p
Recordset
_Off->Delete(adAffectCurrent); m_p
Recordset
_Off->
Update
(); m_p
Recordset
_Off->MoveNext(); } } m_p
Recordset
_Off->AddNew(); m_p
Recordset
_Off->PutCollect("mode",_variant_t("人民币")); str.Format("%d",renminbi_jine); m_p
Recordset
_Off->PutCollect("money",_variant_t(str)); m_p
Recordset
_Off->AddNew(); m_p
Recordset
_Off->PutCollect("mode",_variant_t("其他")); str.Format("%d",qita_jine); m_p
Recordset
_Off->PutCollect("money",_variant_t(str)); m_p
Recordset
_Off->AddNew(); m_p
Recordset
_Off->PutCollect("mode",_variant_t("合计")); str.Format("%d",total_jine); m_p
Recordset
_Off->PutCollect("money",_variant_t(str)); m_dbTotalDay.SetRefDataSource(NULL); m_dbTotalDay.SetRefDataSource((LPUNKNOWN)m_p
Recordset
_Off); m_dbTotalDay.SetColumnHeaders(2); m_dbTotalDay.Refresh(); m_p
Recordset
_Off->
Update
(); m_nTotalAcount=acount;
Update
Data(FALSE); } 3.4用户权限管理模块设计 用户权限模块的功能是方便管理人员查询员工的基本资料,设置员工的操作权限。用户权限设置模块的设计如图9: 图9 权限设置模块 对话框类的各成员函数的代码如下: CLevelDlg::CLevelDlg(CWnd* pParent /*=NULL*/) : CDialog(CLevelDlg::IDD, pParent) { //{{AFX_DATA_INIT(CLevelDlg) m_strUserName = _T(""); m_strUserNum = _T(""); m_strLevelSelect = _T(""); //}}AFX_DATA_INIT } BOOL CLevelDlg::OnInitDialog() { CDialog::OnInitDialog(); m_coLevelSelect.AddString("管理员"); m_coLevelSelect.AddString("用户"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE);
Update
Data(FALSE); CString sql; sql="SELECT * FROM UserInfo "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CLevelDlg::OnChange() { GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(TRUE); GetDlgItem(IDC_CONFIRM)->EnableWindow(TRUE);
Update
Data(TRUE); CString sql; sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); } void CLevelDlg::OnConfirm() {
Update
Data(TRUE); if(!m_strLevelSelect.IsEmpty()) { if(m_strLevelSelect.CompareNoCase("管理员")==0) { CString str,sql; int temp=1; str.Format("%d",temp); sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_p
Recordset
->PutCollect("UserLevel",_variant_t(str)); m_p
Recordset
->
Update
(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } else { CString str,sql; int temp=0; str.Format("%d",temp); sql="SELECT UserName,UserNum,UserLevel,UserPwd FROM UserInfo WHERE UserName='"+m_strUserName+"' AND UserNum='"+m_strUserNum+"' "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_p
Recordset
->PutCollect("UserLevel",_variant_t(str)); m_p
Recordset
->
Update
(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } } else { AfxMessageBox("请选择权限"); } } void CLevelDlg::OnShowAll() { CString sql; sql="SELECT * FROM UserInfo "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } 至此,权限设置模块设计完成。 3.5菜谱管理模块设计 菜谱管理模块的功能是管理人员进行新菜式的录入、菜式修改、删除等菜式维护。菜谱管理模块如图10: 图10 菜单管理模块 对话框类的各成员函数的代码如下: CMenuSetDlg::CMenuSetDlg(CWnd* pParent /*=NULL*/) : CDialog(CMenuSetDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMenuSetDlg) m_nInputNum = 0; m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); //}}AFX_DATA_INIT } BOOL CMenuSetDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CMenuSetDlg::On
Update
EditInputNum() {
Update
Data(TRUE); if(m_nInputNum!=0) { GetDlgItem(IDC_INQUIRY)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } } void CMenuSetDlg::OnInquiry() //查询 {
Update
Data(TRUE); CString sql,str; str.Format("%d",m_nInputNum); sql="SELECT * FROM MenuInfo WHERE FoodNum="+str+" "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
->GetRecordCount()!=0) { m_nInputNum=0; m_nNum=m_p
Recordset
->GetCollect("FoodNum").lVal; m_strName=m_p
Recordset
->GetCollect("FoodName").bstrVal; m_strType=m_p
Recordset
->GetCollect("FoodType").bstrVal; m_nPrice=m_p
Recordset
->GetCollect("FoodPrice").lVal; m_nCost=m_p
Recordset
->GetCollect("FoodCost").lVal; m_strRemark=m_p
Recordset
->GetCollect("FoodRemark").bstrVal; GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(TRUE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } else { // m_nInputNum=0; AfxMessageBox("您所查找的菜肴不存在"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); }
Update
Data(FALSE); } void CMenuSetDlg::OnAddNew() //新增 { m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T(""); GetDlgItem(IDC_ADDSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE);
Update
Data(FALSE); } void CMenuSetDlg::OnAddSave() //保存所增加项 {
Update
Data(TRUE); if(m_nCost!=0 && m_nNum!=0 && m_nPrice!=0 && !m_strName.IsEmpty() && !m_strRemark.IsEmpty() && !m_strType.IsEmpty()) { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); CString str,sql; str.Format("%d",m_nNum); sql="SELECT * FROM MenuInfo WHERE FoodNum="+str+""; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
->GetRecordCount()!=0) { AfxMessageBox("菜肴号码已存在"); } else { m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open("SELECT * FROM MenuInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_nNum==0) { AfxMessageBox("菜肴号码不能为0"); return; } else { m_p
Recordset
->AddNew(); str.Format("%d",m_nNum); m_p
Recordset
->PutCollect("FoodNum",_variant_t(str)); m_p
Recordset
->PutCollect("FoodName",_variant_t(m_strName)); m_p
Recordset
->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_p
Recordset
->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_p
Recordset
->PutCollect("FoodCost",_variant_t(str)); m_p
Recordset
->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_p
Recordset
->
Update
(); m_p
Recordset
->Close(); AfxMessageBox("已保存"); m_nCost = 0; m_strName = _T(""); m_nNum = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T("");
Update
Data(FALSE); } } } else AfxMessageBox("请输入完整信息"); } void CMenuSetDlg::OnModify() //修改 { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); m_nCost = 0; m_nPrice = 0; m_strRemark = _T(""); m_strType = _T("");
Update
Data(FALSE); } void CMenuSetDlg::OnModifysave() //保存修改 {
Update
Data(TRUE); if(!m_strType.IsEmpty()&&m_nPrice!=0&&m_nCost!=0&&!m_strRemark.IsEmpty()) { CString str,sql; str.Format("%d",m_nNum); // m_p
Recordset
->PutCollect("FoodNum",_variant_t(str)); // m_p
Recordset
->PutCollect("FoodName",_variant_t(m_strName)); m_p
Recordset
->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_p
Recordset
->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_p
Recordset
->PutCollect("FoodCost",_variant_t(str)); m_p
Recordset
->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_p
Recordset
->
Update
(); AfxMessageBox("修改成功"); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } else { AfxMessageBox("请输入完整信息"); } } void CMenuSetDlg::OnDel() { m_p
Recordset
->Delete(adAffectCurrent); m_p
Recordset
->Close(); AfxMessageBox("删除成功"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); } 至此,菜谱管理模块设计完成。 3.6付款方式设置模块设计 付款方式设置模块如图11: 图11 付款方式模块 对话框类的各成员函数的代码如下: CSetPaymodeDlg::CSetPaymodeDlg(CWnd* pParent /*=NULL*/) : CDialog(CSetPaymodeDlg::IDD, pParent) { //{{AFX_DATA_INIT(CSetPaymodeDlg) m_strPaymode = _T(""); //}}AFX_DATA_INIT } BOOL CSetPaymodeDlg::OnInitDialog() //对话框初始化 { CDialog::OnInitDialog(); m_bAdd=FALSE; m_bDel=FALSE; m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); CString sql; sql="SELECT * FROM PayModeInfo"; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSetPaymodeDlg::OnPaymodeAddBtn() //单击按钮后,开始新增 { m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=TRUE; m_bDel=FALSE; } void CSetPaymodeDlg::OnPaymodeDelBtn() //单击按钮后,开始删除 { m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=FALSE; m_bDel=TRUE; } void CSetPaymodeDlg::OnOK() //确定添加或者删除 {
Update
Data(TRUE); if(!m_strPaymode.IsEmpty()) { if(m_bAdd==TRUE) { CString str; BOOL flag=0; m_p
Recordset
->MoveFirst(); while(!m_p
Recordset
->adoEOF) { str=m_p
Recordset
->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { MessageBox("您输入的付款方式已存在","输入
错误
",MB_OK|MB_ICONWARNING); flag=1; break; } else m_p
Recordset
->MoveNext(); } /* CString sql; sql="SELECT * FROM PayModeInfo WHERE NAME='"+m_strPaymode+"' "; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
->GetRecordCount()==0) { MessageBox("您输入的付款方式已存在","输入
错误
",MB_OK|MB_ICONWARNING); flag=1; } */ if(flag==0) { m_p
Recordset
->MoveLast(); m_p
Recordset
->AddNew(); m_p
Recordset
->PutCollect("NAME",_variant_t(m_strPaymode)); m_p
Recordset
->
Update
(); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bAdd=FALSE; } } if(m_bDel==TRUE) { BOOL flag=0;
Update
Data(TRUE); CString str; int newid; /* m_p
Recordset
->MoveFirst(); while(!m_p
Recordset
->adoEOF) { str=m_p
Recordset
->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { flag=1; m_p
Recordset
->Delete(adAffectCurrent); m_p
Recordset
->
Update
(); break; } else m_p
Recordset
->MoveNext(); } */ CString sql; sql="SELECT * FROM PayModeInfo WHERE NAME='"+m_strPaymode+"'"; m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_p
Recordset
->GetRecordCount()!=0) { flag=1; m_p
Recordset
->Delete(adAffectCurrent); m_p
Recordset
->
Update
(); m_p
Recordset
.CreateInstance("ADODB.
Recordset
"); m_p
Recordset
->Open("SELECT * FROM PayModeInfo",_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_p
Recordset
); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bDel=FALSE; } if(flag==0) { MessageBox("您输入的付款方式不存在,请查询后确认","输入
错误
",MB_OK|MB_ICONWARNING); } m_dbPaymode.Refresh(); m_bDel=FALSE; } m_editPaymode.SetWindowText(""); m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); } else { AfxMessageBox("请输入付款方式"); } } 至此,付款方式设置模块设计完成。 六、系统演示 系统设计并编写完成后,编译运行程序,初始界面如图12所示: 图12 1. 系统登录 单击“登录”菜单,弹出登录界面,在登陆界面输入框中分别输入用户编号、用户名和密码,如图13所示。 如果用户名和密码都正确,那么就可以登陆系统,系统
提示
如图14所示。 图13 图14 如果用户名不存在或密码输入不正确,系统
提示
如图15和图16所示,将无法进入系统。 图15 图16 如果未登录就进行其他操作,系统
提示
如图17所示。只有登录后才能操作其他功能。单击“注册”菜单,弹出注册对话框如图18所示。 按要求填写完注册信息,如果注册名未被注册,并且前后两次输入的密码一致,那么系统给出如图19所示
提示
。 如果前后两次输入密码不一致,系统给出如图20所示
提示
,此
时
注册不成功。 图19 图20 2.订餐操作 系统登录后,单击“订餐”菜单,弹出“餐桌信息”对话框,如图21所示。 餐桌第一次订餐
时
,输入餐桌编号、食物编号、数量以及折扣,单击“点菜”按钮,在右侧点菜信息栏中列举了该餐桌所点的菜肴,如图22所示。 图21 图22 如果餐桌已经订过餐,但是还没有结账,则在餐桌编号输入框输入餐桌号,在点菜信息栏中显示该桌已点的菜。 单击“下单”按钮,即可把点菜信息记录下来。 3.结账操作 单击“结账”菜单,弹出“结账单”对话框。输入桌台号,自动显示对应的点菜信息以及消费金额。选取付款方式和实收金额后,界面会自动显示找零金额,结果如图23所示。 图23 4.用户权限设置 单击“管理”|“用户权限设置”,弹出“权限设置”对话框,如图24所示,所有用户的信息都显示在数据列表中。 输入要查询的用户编号和名称,单击“更改”,该用户的信息就显示在列表中,结果如图25所示。 图24 图25 选择权限,单击确定后,如图26所示,用户权限已被修改。 图26 单击“显示全部”,结果如图27所示。 图27 5.菜谱管理 单击“管理”|“菜谱设置”菜单,弹出“菜谱设置”对话框,如图28所示。 图28 在“菜谱设置”对话框中可以对菜谱进行查找、添加、删除、修改等操作。 6.付款方式设置 单击“管理”|“付款方式设置”菜单,弹出“付款方式”对话框,如图29所示。 单击“新增”或“删除”按钮,显示新增付款方式文本框和“确定”按钮,如图30所示。 图29 图30 在文本框中输入要增加/删除的付款方式,并单击“确定”按钮,将新增或删除所选择的付款方式。 7.注销用户 单击“注销”菜单,弹出“注销询问”对话框如图31所示。选择“确定”,注销成功,如图32所示。 图31 图32 8.系统退出 单击“退出系统”菜单,弹出“退出询问”对话框如图33所示。选择“确定”,则系统退出。 图33 至此,系统的全部功能已经演示完毕。 七、结束语 经过两个多星期的
时
间,终于完成了本系统的设计。虽然本系统有一些漏洞和不完善的地方,但是本系统结合餐饮管理的实际情况,基于数据库设计通用的模块,对餐饮管理的前台和后台操作进行功能模块的设计,实现了餐饮管理的基本功能。 在设计的过程中,遇到了很多的技术上的问题。例如,第一次接触ADO数据库访问技术,对用ADO来连接数据库不是很了解,
出现
了很多的问题,设计受到了很大的阻碍。经过向专业指导老师请教和参阅了有关书籍后,终于把一些问题解决了。在本次设计中,我懂得了“书到用
时
方恨少”的道理,发现了自己在专业方面还有很多要提高的地方,在今后的学习中,我一定努力进步! 参考文献: [1] 萨师煊,王珊.数据库系统概论[M]第3版.北京:高等教育出版社,2000 [2] 侯其锋,李晓华,李莎.Visual C++数据库通用模块开发与系统移植.北京:清华大学出版社,2007 致 谢 在这次课程设计中,戴小鹏老师给了我很大的帮助。他对我的精心指导和关心,使我在设计的过程中受到了很大的启发。特别是他的那份耐心和责任心,使我在今后的学习和工作中受益匪浅。在此,特向戴小鹏老师表示衷心的感谢!
Recordset
对象
一、
Recordset
对象
简述
Recordset
对象
表示的是来自基本表或命令执行结果的记录全集。在任何情况下,该
对象
所指的当前记录均为集合内的单条记录。使用
Recordset
对象
可以操作来自提供程序的数据,通过该
对象
几乎可以对所有数据进行操作。所有
Recordset
对象
均使用记录(行)和字段(列)进行构造。
Recordset
对象
实际上是依附于 Connection
对象
和 Co
mysql
对象
关闭
时
不允许操作_解决“
对象
关闭
时
,不允许操作。”的办法?
在网站增加到了一个《历史上的今天》栏目,在本地和服务器上查看都正常,但是通过域名访问就
出现
这样的
提示
:ADODB.
Recordset
错误
'800a0e78'
对象
关闭
时
,不允许操作。/index.asp,行2...在网站增加到了一个《历史上的今天》栏目,在本地和服务器上查看都正常,但是通过域名访问就
出现
这样的
提示
:ADODB.
Recordset
错误
'800a0e78'
对象
关闭
时
,不允许操作。/i...
asp
Recordset
对象
一、
Recordset
对象
简述
Recordset
对象
表示的是来自基本表或命令执行结果的记录全集。在任何情况下,该
对象
所指的当前记录均为集合内的单条记录。使用
Recordset
对象
可以操作来自提供程序的数据,通过该
对象
几乎可以对所有数据进行操作。所有
Recordset
对象
均使用记录(行)和字段(列)进行构造。
Recordset
对象
实际上是依附于 Connection
对象
和
3704
对象
关闭
时
_运行
时
出现
了“
对象
关闭
时
不允许操作”实
时
错误
3704,请问大家怎么改呢?...
运行
时
出现
了“
对象
关闭
时
不允许操作”实
时
错误
3704,请问大家怎么改呢?Option Explicit‘这是公共模块Public adocon As ADODB.ConnectionPublic adminp As BooleanPublic readp As BooleanPublic username As StringPublic Function executesql(ByVal sql ...
VB基础类
7,763
社区成员
197,609
社区内容
发帖
与我相关
我的任务
VB基础类
VB 基础类
复制链接
扫一扫
分享
社区描述
VB 基础类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章