版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> VC++課程設(shè)計(jì)報(bào)告</p><p> 設(shè)計(jì)題目: 餐飲管理系統(tǒng) </p><p> 院 系: </p><p> 班 級(jí): </p><p> 學(xué) 號(hào):
2、 </p><p> 設(shè) 計(jì) 者: </p><p><b> 課程設(shè)計(jì)任務(wù)書(shū)</b></p><p> VC++課程設(shè)計(jì)報(bào)告</p><p><b> 軟硬件運(yùn)行環(huán)境</b></p><p
3、><b> 開(kāi)發(fā)環(huán)境</b></p><p> AMD Athlon?ⅡNeo Processor K125,2GB內(nèi)存,250GB硬盤(pán)</p><p> Microsoft® Windows? XP Professional</p><p> Microsoft® Visual C++ 6.0</p&g
4、t;<p> Microsoft Office Access 2003</p><p><b> 運(yùn)行環(huán)境</b></p><p> Intel® Pentium® 2及以上處理器,32M以上內(nèi)存,4G以上硬盤(pán)</p><p> Microsoft® Windows? XP操作系統(tǒng),</
5、p><p> Microsoft® Windows 7操作系統(tǒng)</p><p><b> 問(wèn)題及難點(diǎn)所在</b></p><p><b> 1.數(shù)據(jù)庫(kù)操作。</b></p><p> 包括ACCESS數(shù)據(jù)庫(kù)中數(shù)據(jù)表的制作,在程序中利用ADO技術(shù)進(jìn)行數(shù)據(jù)的查詢(xún),檢索,增加刪除等操作,以及
6、數(shù)據(jù)庫(kù)。</p><p> 2.模塊之間的連接問(wèn)題。</p><p> 模塊之間相互聯(lián)系,進(jìn)行數(shù)據(jù)交換,必須兼顧數(shù)據(jù)安全性和各個(gè)類(lèi)之間的連接性的問(wèn)題。</p><p> 3.系統(tǒng)安全性問(wèn)題,由于數(shù)據(jù)庫(kù)中存在金額等重要數(shù)據(jù),必須對(duì)每個(gè)用戶(hù)的訪(fǎng)問(wèn)權(quán)限加以限制,并可以修改用戶(hù)權(quán)限。 </p><p><b> 需求分析&
7、lt;/b></p><p> 隨著現(xiàn)代社會(huì)的發(fā)展,餐飲行業(yè)作為服務(wù)業(yè)的龍頭企業(yè)規(guī)模不斷擴(kuò)大,一個(gè)大型酒店的餐飲服務(wù)部門(mén)往往服務(wù)許多客人,而一個(gè)企業(yè)的經(jīng)營(yíng)管理人員往往分工明確,一個(gè)人或幾個(gè)人無(wú)法完成如此繁雜的賬目統(tǒng)計(jì)和餐飲結(jié)賬等工作,傳統(tǒng)的算賬、記賬等人工操作系統(tǒng)已經(jīng)不能再適應(yīng)現(xiàn)代企業(yè)的發(fā)展。為了使餐飲系統(tǒng)可以得到高效運(yùn)轉(zhuǎn),伴隨著計(jì)算機(jī)的普及,因此需要專(zhuān)業(yè)的餐飲管理系統(tǒng)來(lái)完成工作。</p>
8、<p> 我的課程設(shè)計(jì)就是在此背景下完成的,本套餐飲管理系統(tǒng)有著完整的客人消費(fèi)流程,餐館的經(jīng)理和營(yíng)業(yè)員均可已使用該系統(tǒng),該系統(tǒng)解決了人工計(jì)算餐飲費(fèi)用的各種不利因素,實(shí)現(xiàn)科學(xué)的點(diǎn)菜和結(jié)賬管理,省時(shí)省力,適合大多數(shù)中小型餐館使用,市場(chǎng)前景廣闊。</p><p><b> 概要設(shè)計(jì)</b></p><p> 首先,要實(shí)現(xiàn)餐飲管理的功能,需要設(shè)計(jì)五個(gè)功能模塊,
9、分別為開(kāi)臺(tái),點(diǎn)菜,加減菜,結(jié)賬,數(shù)量選擇等模塊。然后先進(jìn)行對(duì)話(huà)框的設(shè)計(jì),分別設(shè)計(jì)IDD_diancai,IDD_jiacai,IDD_jiezhangdlg,IDD_kaitai,IDD_SHULIANG這五個(gè)對(duì)話(huà)框,在對(duì)話(huà)框上擺放控件,給控件修改ID號(hào)碼,同時(shí)給各個(gè)對(duì)話(huà)框建立一個(gè)類(lèi),分別為CDiancaidlg,CJiacaidlg,CJiezhangdlg,CKaitaidlg,CSLdlg,并根據(jù)需要利用類(lèi)向?qū)榭丶P(guān)聯(lián)成員變量,
10、建立成員函數(shù)和消息響應(yīng)函數(shù)。</p><p> 其次,要增加系統(tǒng)的安全性能,實(shí)現(xiàn)管理員的登錄功能,為管理員設(shè)置權(quán)限,分為經(jīng)理和營(yíng)業(yè)員兩種,分別對(duì)不同權(quán)限的人開(kāi)放不同的模塊,在登錄之前將所有功能都屏蔽。設(shè)計(jì)登錄、注冊(cè)和賬戶(hù)權(quán)限管理對(duì)話(huà)框,并為每個(gè)對(duì)話(huà)框設(shè)置類(lèi),給控件添加成員變量,編寫(xiě)代碼。</p><p> 本系統(tǒng)使用ACCESS數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ),利用ADO技術(shù)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)的
11、檢索,查詢(xún),插入,刪除,更改等功能。在數(shù)據(jù)庫(kù)中設(shè)計(jì)了四張數(shù)據(jù)表,分別為caishiinfo存放菜式信息,Login存放用戶(hù)名和密碼信息,paybill存放賬單信息,TableUSE存放桌子使用情況的信息。然后再M(fèi)FC程序中可以通過(guò)ADO語(yǔ)句來(lái)訪(fǎng)問(wèn)和操作數(shù)據(jù)庫(kù)實(shí)現(xiàn)功能。</p><p> 對(duì)界面進(jìn)行美化,使用MFC皮膚給應(yīng)用程序添加自己喜歡的皮膚,給對(duì)話(huà)框添加FALSH插件進(jìn)行美化。</p><
12、;p> 框圖如下: </p><p><b> 數(shù)據(jù)庫(kù)設(shè)計(jì)</b></p><p> 1.使用ACCESS2003建立canyin.mdb的數(shù)據(jù)庫(kù),在其中添加四張數(shù)據(jù)表,分別用來(lái)存放菜式信息,用戶(hù)信息,賬單信息,桌號(hào)信息。</p><p> 2.在CMyApp類(lèi)中添加_ConnectionPtr 類(lèi)型的變量m_pCon用于
13、連接數(shù)據(jù)庫(kù)。在窗口初始化函數(shù)中添加如下代碼,用于連接和訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。</p><p> ::CoInitialize(NULL); //訪(fǎng)問(wèn)COM庫(kù)</p><p> HRESULT hr; //函數(shù)返回值,如果這個(gè)函數(shù)執(zhí)行完返回時(shí)將有包含實(shí)際意義的數(shù)字,如果立即返回將包含狀態(tài)信息</p><p> try /*try關(guān)鍵字用來(lái)表示一個(gè)
14、代碼塊,在可能發(fā)生的異常。</p><p> 對(duì)于每一個(gè)try語(yǔ)句,必須有至少有一個(gè)相應(yīng)的catch子句。如果出現(xiàn)異常,c</p><p> atch子句參數(shù)進(jìn)行評(píng)估,以確定它是否是能夠處理特殊情況。特殊條件下,</p><p> 如果不能處理任何相應(yīng)的try語(yǔ)句的catch子句,然后控制權(quán)轉(zhuǎn)移的方法調(diào)用鏈和以前的所有異常類(lèi)型進(jìn)行評(píng)估,</p>
15、<p> 直到找到一個(gè)能夠處理的條件。*/</p><p><b> {</b></p><p> hr=m_pCon.CreateInstance("ADODB.Connection"); //創(chuàng)建連接。CreateInstance是智能指針本身的函數(shù)</p><p> if(SUCCEEDED(hr
16、))</p><p><b> {</b></p><p> m_pCon->ConnectionTimeout=3;</p><p> hr=m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=canyin.mdb",""
17、;,"",adModeUnknown);</p><p> //打開(kāi)到數(shù)據(jù)庫(kù)的連接,同步打開(kāi)連接</p><p><b> }</b></p><p><b> }</b></p><p> catch(_com_error e)</p><p>
18、<b> {</b></p><p> CString temp;</p><p> temp.Format("連接數(shù)據(jù)庫(kù)錯(cuò)誤信息:%s",e.ErrorMessage()); //格式化輸出信息</p><p> ::MessageBox(NULL,temp,"提示信息",NULL);
19、 //彈出消息提醒框</p><p> return false;</p><p><b> }</b></p><p> 連接數(shù)據(jù)庫(kù)后即可在每個(gè)類(lèi)中添加_ConnectionPtr類(lèi)型的變量操作數(shù)據(jù)庫(kù)。</p><p><b> 詳細(xì)設(shè)計(jì)</b></p>&
20、lt;p> 下面對(duì)各個(gè)類(lèi)的設(shè)計(jì)做詳細(xì)介紹。</p><p><b> 1、用戶(hù)登錄模塊</b></p><p><b> 流程圖:</b></p><p> 左側(cè)插入了一個(gè)Flash插件,右側(cè)添加控件,ID號(hào)和相應(yīng)變量如下:</p><p> ID號(hào)和相應(yīng)函數(shù)為: &
21、lt;/p><p> IDOK OnOK</p><p> IDCANCEL OnCancle</p><p> 用語(yǔ)句extern CMyApp theApp;引入全局變量,然后建立_RecordsetPtr 的變量m_pRs用于操作數(shù)據(jù)庫(kù),設(shè)置全局變量i用于計(jì)算登錄輸入的次數(shù),當(dāng)?shù)卿洺^(guò)三次還未輸入正確用戶(hù)名和密碼的話(huà)就自動(dòng)退出程序。
22、</p><p> ?。?)登錄按鈕的實(shí)現(xiàn)</p><p> 首先判斷編輯框是否出現(xiàn)輸入異常的情況,然后檢索數(shù)據(jù)庫(kù)確定該用戶(hù)名和密碼是否正確,如果連接數(shù)據(jù)庫(kù)成功則在login數(shù)據(jù)表中按照關(guān)鍵字進(jìn)行用戶(hù)名和密碼的匹配,如果匹配成功,則登錄成功,可以進(jìn)行下一步操作。如果用戶(hù)名和密碼輸入有誤,則彈出消息框進(jìn)行提示,然后初始化編輯框,再次接受用戶(hù)名密碼。如果連接數(shù)據(jù)庫(kù)沒(méi)有成功,則彈出消息框進(jìn)行提
23、示。</p><p> 在其中全局變量進(jìn)行計(jì)數(shù),如果輸入超過(guò)三次則推出程序。登錄成功之后,將用戶(hù)名和密碼存入到theApp的成員變量中以備在theApp對(duì)所登錄的用戶(hù)權(quán)限進(jìn)行管理。</p><p> 下面為具體實(shí)現(xiàn)的代碼:</p><p> void CLogindlg::OnOK() //登陸按鈕的操
24、作</p><p><b> {</b></p><p> // TODO: Add extra validation here</p><p> UpdateData(); //調(diào)用函數(shù)進(jìn)行數(shù)據(jù)交換</p><p> if(!m_Uname.IsEm
25、pty()||!m_Upasswd.IsEmpty()) //判斷用戶(hù)名和密碼編輯框是否為空</p><p><b> {</b></p><p> CString sql="SELECT * FROM Login WHERE Uname='"+m_Uname+"' and Upasswd='"
26、+m_Upasswd+"'";</p><p> //在數(shù)據(jù)表中查詢(xún)是否存在該用戶(hù)名和密碼</p><p><b> try</b></p><p><b> {</b></p><p> m_pRs.CreateInstance("ADODB.Reco
27、rdset");</p><p> m_pRs->Open((_variant_t)sql,theApp.m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);</p><p> if(m_pRs->adoEOF)</p><p><b> {<
28、;/b></p><p> AfxMessageBox("用戶(hù)名或密碼錯(cuò)誤!");</p><p> m_Uname="";</p><p> m_Upasswd=""; //初始化編輯框</p><p> i++;
29、 //用全局變量i控制輸入錯(cuò)誤次數(shù)</p><p> UpdateData(false);</p><p> if(i==3) </p><p><b> {</b></p><p> OnCancel(); //如果輸入信息超過(guò)三次就退出系統(tǒng)&l
30、t;/p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> theApp.name=m_Uname;<
31、/p><p> theApp.pwd=m_Upasswd; //登陸成功后將用戶(hù)名和密碼保存</p><p> CDialog::OnOK(); </p><p><b> return;</b></p><p><b> }</b></p><p&g
32、t;<b> }</b></p><p> catch(_com_error e) //無(wú)法連接數(shù)據(jù)庫(kù)</p><p><b> {</b></p><p> CString temp;</p><p> temp.Format("連接數(shù)據(jù)庫(kù)錯(cuò)誤信息:%s"
33、,e.ErrorMessage());</p><p> AfxMessageBox(temp); </p><p> return;</p><p><b> }</b></p><p><b> }</b></p><p><b&
34、gt; else</b></p><p><b> {</b></p><p> AfxMessageBox("用戶(hù)名密碼不能為空"); //編輯框?yàn)榭?lt;/p><p><b> }</b></p><p><b> }</b>
35、;</p><p> 退出模塊直接調(diào)用 CDialog::OnCancel() 函數(shù)退出即可。</p><p><b> 2.開(kāi)臺(tái)模塊實(shí)現(xiàn)</b></p><p><b> 流程圖:</b></p><p> ?。?)用語(yǔ)句extern CMyApp theApp;引入全局變量,然后建立_
36、RecordsetPtr 的變量m_pRs用于操作數(shù)據(jù)庫(kù)。開(kāi)臺(tái)模塊中在上方顯示一個(gè)列表框,列表框內(nèi)顯示所有桌子的信息,第一欄是桌號(hào),第二欄是“有人”或者“沒(méi)人”的顯示。選擇有人的桌子會(huì)自動(dòng)報(bào)錯(cuò),選中一個(gè)沒(méi)有人的桌子,雙擊則會(huì)在下方的編輯框中顯示選中的桌號(hào),選擇確定鍵則完成選擇。選擇完成之后數(shù)據(jù)庫(kù)中對(duì)桌號(hào)信息進(jìn)行更改,按取消按鈕取消操作。</p><p> 具體的ID號(hào)和對(duì)應(yīng)的函數(shù)和變量如下:
37、 </p><p> 為確定鍵設(shè)置了OnButtonOk函數(shù),為列表框相應(yīng)雙擊消息設(shè)置OnDblclkList1函數(shù),實(shí)現(xiàn)雙擊桌號(hào)能將信息存入編輯框中。 </p><p> ?。?)列表框控件初始化。</p><p> 在相應(yīng)該類(lèi)的OnInitDialog函數(shù)中,先為列表框設(shè)置風(fēng)格,然后添加兩列并命名,在桌號(hào)的tableu
38、seid數(shù)據(jù)表中查詢(xún)桌子的使用情況,將桌號(hào)和使用情況分別存入兩個(gè)變量中,根據(jù)信息的不同將信息分別顯示到列表框的兩列中,查詢(xún)?cè)摂?shù)據(jù)表中的所有數(shù)據(jù)得到列表框,以供用戶(hù)進(jìn)行桌子的選擇。</p><p><b> 核心代碼如下:</b></p><p> m_Zhuolist.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSEL
39、ECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);</p><p> //為列表控件設(shè)置風(fēng)格</p><p> m_Zhuolist.InsertColumn(0,"桌號(hào)",LVCFMT_LEFT,140,0); //為列表控件添加第一列并命名</p><p
40、> m_Zhuolist.InsertColumn(1,"狀態(tài)",LVCFMT_LEFT,140,1); //為列表控件添加第二列并命名</p><p> CString sql="select * from tableuse"; </p><p> m_pRs=theApp.m_pCon->Execute((_bstr_
41、t)sql,NULL,adCmdText);</p><p> //數(shù)據(jù)庫(kù)操作,查詢(xún)餐臺(tái)號(hào)信息</p><p> int i=0; //定義變量控制列表控件中的顯示順序</p><p> while(m_pRs->adoEOF==0) //如果數(shù)據(jù)不為空則查詢(xún)數(shù)據(jù)表并將結(jié)果添加到列表控件中</p&g
42、t;<p><b> {</b></p><p> CString str=(char*)(_bstr_t)m_pRs->GetCollect("桌號(hào)"); //將餐臺(tái)號(hào)信息存入str變量中</p><p> int tableuseid=atoi((char*)(_bstr_t)m_pRs->GetCollec
43、t("tableuseid")); </p><p> //將使用信息轉(zhuǎn)換為整型變量后存入tableuseid中</p><p> m_Zhuolist.InsertItem(i,""); //在控件列表中插入一行</p><p> m_Zhuolist.SetItemText(i,0,str); //將餐臺(tái)號(hào)
44、信息添加至第一列</p><p> //對(duì)tableuseid變量的值進(jìn)行判斷</p><p> if(tableuseid==0) </p><p> m_Zhuolist.SetItemText(i,1,"空閑"); //如果為真表示空閑,在第二列將信息填入</p>&l
45、t;p> if(tableuseid==1)</p><p> m_Zhuolist.SetItemText(i,1,"有人"); //如果為假表示有人,在第二列將信息填入</p><p> i++; //控制行的變量自增</p><p> m_pRs->
46、MoveNext(); //數(shù)據(jù)庫(kù)操作:移向下一行記錄</p><p><b> }</b></p><p> (3)編輯框控件顯示選擇的桌號(hào)</p><p> 相應(yīng)鼠標(biāo)雙擊的消息響應(yīng)函數(shù),當(dāng)營(yíng)業(yè)員鼠標(biāo)雙擊選擇桌號(hào)后,用編輯框關(guān)聯(lián)的成員變量的GetItemText函數(shù)獲得單擊列表位置所在行的第一列,然
47、后存入變量中進(jìn)行顯示。</p><p><b> 具體代碼如下:</b></p><p> void CKaitaidlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) </p><p><b> {</b></p><p> CString
48、 str;</p><p> str=m_Zhuolist.GetItemText(m_Zhuolist.GetSelectionMark(),0);</p><p> //獲取當(dāng)前列表控件中鼠標(biāo)單擊位置所在行的第一列文本</p><p> m_ZhuoHao=str; //將文本添加到編輯框中</p><p>
49、 UpdateData(false); </p><p> *pResult = 0;</p><p><b> }</b></p><p> (4)開(kāi)臺(tái)成功的“確定”按鈕的操作</p><p> 首先判斷編輯框不為空,然后查詢(xún)?cè)摬团_(tái)號(hào)是否正在被使用,如果正在被使用的話(huà)就提示有人了,并初始化編輯
50、框。如果不被使用的話(huà),則在數(shù)據(jù)庫(kù)中檢索這張桌子,找到后將使用情況進(jìn)行更改,然后調(diào)用點(diǎn)菜模塊,彈出點(diǎn)菜對(duì)話(huà)框進(jìn)行點(diǎn)菜。</p><p> void CKaitaidlg::OnButtonOk() </p><p><b> {</b></p><p> UpdateData(); //數(shù)據(jù)交換</p><p&g
51、t; if(m_ZhuoHao.IsEmpty()) //如果填入編輯框中的數(shù)據(jù)為空</p><p> AfxMessageBox("桌號(hào)不能為空");</p><p> else //對(duì)編輯框中的數(shù)據(jù)進(jìn)行處理</p><p><b> {</b></p>&l
52、t;p> CString Str="select * from TableUSE where TableUSEID=1"; //如果不為空則查詢(xún)哪些餐臺(tái)正在使用</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Str,NULL,adCmdText);</p><p> while(!m_pRs->a
53、doEOF) //當(dāng)記錄不為空的時(shí)候</p><p><b> {</b></p><p> Value=(char*)(_bstr_t)m_pRs->GetCollect("桌號(hào)"); //用全局變量保存正在使用的餐臺(tái)號(hào)</p><p> if(m_ZhuoHao==Value) /
54、/如果編輯框中的值與該變量相等</p><p><b> {</b></p><p> AfxMessageBox("有人了"); //提示有人了</p><p> m_ZhuoHao="";</p><p> UpdateData(false);</p&g
55、t;<p><b> return;</b></p><p><b> }</b></p><p> m_pRs->MoveNext(); //繼續(xù)下一條記錄</p><p><b> }</b></p><p> m_pRs=
56、NULL; //初始化指針</p><p> CString Str1="select * from TableUSE where 桌號(hào)="+m_ZhuoHao+""; </p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Str1,NULL,adCmdTe
57、xt);</p><p> if(m_pRs->adoEOF) //當(dāng)記錄為空時(shí)</p><p><b> {</b></p><p> AfxMessageBox("沒(méi)有這種桌子"); //輸出信息</p><p> m_ZhuoHao="&quo
58、t;; //編輯框初始化顯示</p><p> UpdateData(false); </p><p><b> return;</b></p><p><b> }</b></p><p> m_pRs=NULL;
59、 //初始化指針</p><p> CDiancaidlg dlg; //定義一個(gè)點(diǎn)菜窗體實(shí)例</p><p> dlg.m_ZhuoHao = m_ZhuoHao; </p><p> dlg.DoModal(); //彈出點(diǎn)菜窗體</p><p> CDi
60、alog::OnOK(); </p><p><b> }</b></p><p><b> }</b></p><p><b> 3.點(diǎn)菜模塊實(shí)現(xiàn)</b></p><p><b> 流程圖:</b></p>&l
61、t;p> 用語(yǔ)句extern CMyApp theApp;引入全局變量,然后建立_RecordsetPtr 的變量m_pRs用于操作數(shù)據(jù)庫(kù)。上面的桌號(hào)自動(dòng)進(jìn)行填充,下面列表的左側(cè)是所有菜式的信息列表,包括菜名的菜價(jià)。用戶(hù)鼠標(biāo)單擊選擇的菜品,中間有兩個(gè)按鈕,“>>”用于實(shí)現(xiàn)將用戶(hù)選中的菜式放入到右側(cè)的列表框中。“<<”按鈕實(shí)現(xiàn)當(dāng)用戶(hù)在右側(cè)列表框中選中一個(gè)菜后,單擊該按鈕可以將該菜式從本桌已點(diǎn)的菜式中去掉。單
62、擊確定按鈕完成點(diǎn)菜的操作,同時(shí)將右側(cè)列表框的菜式信息存入caishiinfo數(shù)據(jù)表中。</p><p> 本對(duì)話(huà)框的控件關(guān)聯(lián)的變量如下:</p><p> 對(duì)話(huà)框具體設(shè)計(jì)如下:</p><p> ?。?)窗口初始化函數(shù)</p><p> 首先在caishiinfo數(shù)據(jù)表中檢索數(shù)據(jù),然后用SetExtendedStyle函數(shù)為列表框添加樣
63、式,然后插入兩列,在數(shù)據(jù)庫(kù)中找到所有的菜式信息,提取信息并把信息放入到左側(cè)的列表框中,完成IDC_LIST2列表框的初始化。然后在左側(cè)列表框中添加兩列信息,完成對(duì)IDC_LIST3函數(shù)的初始化。</p><p><b> 具體實(shí)現(xiàn)代碼如下:</b></p><p> BOOL CDiancaidlg::OnInitDialog()</p><p
64、><b> {</b></p><p> CDialog::OnInitDialog();</p><p> CString Sql="select * from caishiinfo"; //從caishiinfo數(shù)據(jù)表中提取數(shù)據(jù)</p><p> m_CaidanLis
65、t.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);</p><p> //為菜單列表進(jìn)行樣式設(shè)置</p><p> m_CaidanList.InsertColumn(0,"菜名",
66、LVCFMT_LEFT,100,0);</p><p> m_CaidanList.InsertColumn(1,"菜價(jià)(元)",LVCFMT_LEFT,100,1);</p><p> //為菜單列表添加兩列并命名</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adC
67、mdText);</p><p> while(!m_pRs->adoEOF) //當(dāng)指針記錄不為空</p><p><b> {</b></p><p> CString TheValue,TheValue1;</p><p> TheVa
68、lue=(char*)(_bstr_t)m_pRs->GetCollect("菜名"); //將“菜名”信息存入TheValue</p><p> TheValue1=(char*)(_bstr_t)m_pRs->GetCollect("菜價(jià)"); //將“菜價(jià)”信息存入TheValue1</p><p>
69、m_CaidanList.InsertItem(0,""); //為列表框插入一行</p><p> m_CaidanList.SetItemText(0,0,TheValue); //設(shè)置該行的第一列</p><p> m_CaidanList.SetItemText(0
70、,1,TheValue1); //設(shè)置該行第二列</p><p> m_pRs->MoveNext(); //繼續(xù)下一條記錄</p><p><b> }</b></p><p> m_CaidanCheck.Inse
71、rtColumn(0,"菜名",LVCFMT_LEFT,100,0);</p><p> m_CaidanCheck.InsertColumn(1,"數(shù)量(盤(pán))",LVCFMT_LEFT,100,1); //為菜單列表添加兩列并命名</p><p> return TRUE;</p><p><b> }<
72、;/b></p><p><b> “>>”按鈕的實(shí)現(xiàn)</b></p><p> 該按鈕負(fù)責(zé)將用戶(hù)選中的菜式添加到右側(cè)列表框中。首先實(shí)例化一個(gè)數(shù)量選擇的對(duì)象,該對(duì)話(huà)框建立之后,后的菜單中所選項(xiàng)的序號(hào),然后后的選擇想的文本,然后將菜式名稱(chēng)和數(shù)量寫(xiě)入右側(cè)點(diǎn)菜列表框中。</p><p><b> 實(shí)現(xiàn)代碼如下:<
73、;/b></p><p> void CDiancaidlg::OnButtonadd() </p><p><b> {</b></p><p> CSLdlg Sldlg; //數(shù)量類(lèi)實(shí)例化一個(gè)對(duì)象</p><p> if(Sldlg.DoModal()==IDOK) //創(chuàng)建“點(diǎn)菜
74、數(shù)量”窗口的模態(tài)對(duì)話(huà)框</p><p><b> {</b></p><p> int i = m_CaidanList.GetSelectionMark(); //獲取菜單中所選擇的項(xiàng)的序號(hào)</p><p> CString str = m_CaidanList.GetItemText(i,0);
75、 //獲取選擇項(xiàng)的文本</p><p> m_CaidanCheck.InsertItem(0,"");</p><p> m_CaidanCheck.SetItemText(0,0,str); //將文本寫(xiě)入點(diǎn)菜欄</p><p> m_CaidanCheck.SetItemText(0,1,Sldlg.m
76、_ShuLiang);//將數(shù)量寫(xiě)入點(diǎn)菜欄</p><p><b> }</b></p><p><b> }</b></p><p><b> “>>”按鈕的實(shí)現(xiàn)</b></p><p> 代碼為: m_CaidanCheck.DeleteItem(m
77、_CaidanCheck.GetSelectionMark());</p><p> 即將選中的菜式從右側(cè)列表框中刪除掉 </p><p><b> “確定”按鈕的操作</b></p><p> 首次按確定按鈕修改TableUSE 中的信息,如果點(diǎn)菜不為空的話(huà)就將該桌定義為有人,然后通過(guò)菜名的檢索在數(shù)據(jù)表中查詢(xún)菜價(jià)信息,然后將總價(jià)算出存
78、入全局變量中,并存入數(shù)據(jù)表中,完成點(diǎn)菜操作。</p><p><b> 實(shí)現(xiàn)代碼如下:</b></p><p> void CDiancaidlg::OnButtonOk() </p><p><b> {</b></p><p> UpdateData();</p><
79、p> CString Sql;</p><p> int i = m_CaidanCheck.GetItemCount(); //獲取點(diǎn)菜列表項(xiàng)的總數(shù)</p><p> if(i==0) //如果點(diǎn)菜個(gè)數(shù)為零</p><p><b> {</b></p><p> AfxMessageBox(&
80、quot;請(qǐng)點(diǎn)菜"); //彈出對(duì)話(huà)框</p><p><b> return;</b></p><p><b> }</b></p><p> Sql="update TableUSE set TableUSEID=1 where 桌號(hào)="+m_ZhuoHao+" &q
81、uot;;</p><p> theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText); //點(diǎn)菜成功就將該餐廳號(hào)的使用狀態(tài)改變</p><p> CString Sql1,Str,Str1,Value,TotleValue;</p><p> double Totle=0;</
82、p><p> for(int n=0;n<i;n++) //遍歷點(diǎn)菜列表將數(shù)據(jù)存入數(shù)據(jù)表</p><p><b> {</b></p><p> Str=m_CaidanCheck.GetItemText(n,0); //獲取第N行第一列的數(shù)據(jù)信息</p><p> Str1=m_CaidanChe
83、ck.GetItemText(n,1); //獲取第N行第二列的數(shù)據(jù)信息</p><p> Sql1="select * from caishiinfo where 菜名='"+Str+"'"; //獲取菜價(jià)信息</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,
84、NULL,adCmdText);</p><p> Value=(char*)(_bstr_t)m_pRs->GetCollect("菜價(jià)"); //將菜價(jià)信息存入變量</p><p> Totle=atof(Value)*atof(Str1); //獲得消費(fèi)總額存入變量</p><p> TotleValue=(char*)(
85、_bstr_t)Totle; //格式轉(zhuǎn)換</p><p> Sql1="insert into paybill(桌號(hào),菜名,數(shù)量,消費(fèi)) values("+m_ZhuoHao+",'"+Str+"',"+Str1+","+TotleValue+")";</p><p>
86、 theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText); //將此桌的點(diǎn)菜信息和消費(fèi)明細(xì)寫(xiě)入數(shù)據(jù)表</p><p><b> }</b></p><p> AfxMessageBox("點(diǎn)菜成功"); //彈出對(duì)話(huà)框</p><p> CDialog::O
87、nOK();</p><p><b> }</b></p><p> 4.數(shù)量選擇模塊的實(shí)現(xiàn)</p><p> 當(dāng)單擊“>>”按鈕時(shí)會(huì)自動(dòng)彈出選菜的對(duì)話(huà)框,用戶(hù)在選菜對(duì)話(huà)框中輸入要選擇的份數(shù),將該份數(shù)保存后存入變量中,然后可供點(diǎn)菜對(duì)話(huà)框使用。</p><p> 控件的ID號(hào)及變量名如下:</p
88、><p><b> 對(duì)話(huà)框設(shè)計(jì)如下:</b></p><p><b> 確定鍵的代碼如下:</b></p><p> void CSLdlg::OnButtonok() //響應(yīng)點(diǎn)菜數(shù)量對(duì)話(huà)框的確定按鈕</p><p><b> {</b></p>
89、<p> UpdateData();</p><p> if(m_ShuLiang.IsEmpty()||m_ShuLiang=="0") //判斷數(shù)量</p><p><b> {</b></p><p> AfxMessageBox("數(shù)量至少為1");</p>
90、;<p><b> return;</b></p><p><b> }</b></p><p> CDialog::OnOK();</p><p><b> }</b></p><p><b> 5.加減菜模塊實(shí)現(xiàn)</b><
91、/p><p><b> 流程圖:</b></p><p> (1)加減菜模塊完成功能為在進(jìn)餐中要對(duì)所點(diǎn)的菜式進(jìn)行修改,有加菜和減菜操作。用語(yǔ)句extern CMyApp theApp;引入全局變量,然后建立_RecordsetPtr 的變量m_pRs用于操作數(shù)據(jù)庫(kù)。在上方的下拉列表框中選擇桌號(hào),選擇之后右側(cè)列表框中顯示該桌的菜式信息,左側(cè)列表框顯示所有的菜式信息。然后
92、可以通過(guò)“>>”“<<”按鈕對(duì)菜式進(jìn)行修改,同時(shí)在后臺(tái)完成總金額的修改,單擊確定修改成功。</p><p><b> 控件及變量如下:</b></p><p><b> 對(duì)話(huà)框如下:</b></p><p><b> 窗口初始化</b></p><p&
93、gt; 首先在菜式信息表中查詢(xún)菜式信息,變成列表樣式填入到左側(cè)的列表框中,然后paybill數(shù)據(jù)表中查詢(xún)賬單信息,為下拉列表控件添加正在使用的餐臺(tái)號(hào)信息。</p><p><b> 以下為具體代碼:</b></p><p> BOOL CJiacaidlg::OnInitDialog() </p><p><b> {<
94、/b></p><p> CDialog::OnInitDialog();</p><p> CString Sql="select * from caishiinfo"; //查詢(xún)數(shù)據(jù)</p><p> m_CaidanList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|
95、LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);</p><p> //對(duì)菜單樣式進(jìn)行設(shè)置</p><p> m_CaidanList.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0); //為菜單列表添加兩列并命名</p><p&
96、gt; m_CaidanList.InsertColumn(1,"菜價(jià)(元)",LVCFMT_LEFT,100,1);</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText); //將數(shù)據(jù)表中的菜單信息讀入菜單列表中</p><p> while(!m_pRs->adoEO
97、F) //如果不為空</p><p><b> {</b></p><p> CString TheValue,TheValue1;</p><p> TheValue=(char*)(_bstr_t)m_pRs->GetCollect("菜名");</p><p> TheV
98、alue1=(char*)(_bstr_t)m_pRs->GetCollect("菜價(jià)"); //分別將菜名和菜價(jià)信息存入變量</p><p> m_CaidanList.InsertItem(0,""); //插入一行</p><p> m_CaidanList.SetItemText(0,0,TheValue);
99、 //將菜名添加到第一行</p><p> m_CaidanList.SetItemText(0,1,TheValue1); //將菜價(jià)添加到第二行</p><p> m_pRs->MoveNext(); //繼續(xù)下一條記錄</p><p><b> }</b></p><p> //為點(diǎn)菜列表進(jìn)
100、行樣式設(shè)置</p><p> m_CaidanCheck.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);</p><p> m_CaidanCheck.InsertColumn(0,"菜名&q
101、uot;,LVCFMT_LEFT,100,0);</p><p> m_CaidanCheck.InsertColumn(1,"數(shù)量(盤(pán))",LVCFMT_LEFT,100,1); //為點(diǎn)菜列表添加兩列并分別命名</p><p> Sql="select distinct 桌號(hào) from paybill";
102、 //去除重復(fù)的餐臺(tái)號(hào)信息</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText); //向下拉控件中添加數(shù)據(jù)</p><p> while(m_pRs->adoEOF==0) /
103、/如果為空</p><p><b> {</b></p><p> CString zhuohao=(char*)(_bstr_t)m_pRs->GetCollect("桌號(hào)"); //將餐臺(tái)號(hào)信息存入變量</p><p> m_ZhuohaoCombo.AddString(zhuohao);
104、 //為下拉列表添加餐臺(tái)號(hào)信息</p><p> m_pRs->MoveNext(); //繼續(xù)下一條記錄</p><p><b> }</b></p><p> return TRUE; </p><p>
105、;<b> }</b></p><p> 對(duì)IDC_LIST3進(jìn)行初始化操作</p><p> 相應(yīng)下拉列表控件IDC_COMBO1控件的Selchange消息,獲取桌號(hào)信息,根據(jù)桌號(hào)在賬單列表中將菜式和數(shù)量信息提取出來(lái)并存入IDC_LIST3列表框中。</p><p><b> 具體代碼如下:</b><
106、/p><p> void CJiacaidlg::OnSelchangeCombo1() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> CString str;</p&
107、gt;<p> m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),str); //獲取所選選項(xiàng)的信息</p><p> CString sql="select * from paybill where 桌號(hào)="+str+""; </p><p> //到數(shù)據(jù)表中查詢(xún)
108、相關(guān)餐臺(tái)號(hào)的信息</p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);</p><p> m_CaidanCheck.DeleteAllItems(); //菜單選擇列表框初始化清空</p><p> //將查到的信息寫(xiě)入點(diǎn)菜列表中</p><
109、p> while(!m_pRs->adoEOF) //如果不為空</p><p><b> {</b></p><p> CString valuename=(char*)(_bstr_t)m_pRs->GetCollect("菜名");</p><p> CString valuenum=(ch
110、ar*)(_bstr_t)m_pRs->GetCollect("數(shù)量"); //將菜名和數(shù)量信息分別存入變量</p><p> m_CaidanCheck.InsertItem(0,""); //為菜單列表添加一行</p><p> m_CaidanCheck.SetItemText(0,0,valuenam
111、e); //將菜名添加到該行第一列</p><p> m_CaidanCheck.SetItemText(0,1,valuenum); //將數(shù)量添加到該行第二列</p><p> m_pRs->MoveNext(); //下一條記錄</p><p><b> }</
112、b></p><p><b> }</b></p><p><b> ">>"按鈕的操作</b></p><p> 選中一項(xiàng),點(diǎn)擊按鈕之后,彈出添加數(shù)量信息的對(duì)話(huà)框,獲得當(dāng)前選中項(xiàng)的序號(hào),在右側(cè)列表框中將該菜式的菜名和數(shù)量信息寫(xiě)入。</p><p> v
113、oid CJiacaidlg::OnButtonadd() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> CSLdlg Sldlg; </p><p>
114、 if(Sldlg.DoModal()==IDOK) //添加數(shù)量信息</p><p><b> {</b></p><p> int i = m_CaidanList.GetSelectionMark(); //獲取當(dāng)前選中項(xiàng)的序號(hào)</p><p> CString str = m_CaidanList.GetI
115、temText(i,0);</p><p> m_CaidanCheck.InsertItem(0,""); //插入一行</p><p> m_CaidanCheck.SetItemText(0,0,str);//將選中項(xiàng)信息添加到點(diǎn)菜列表中</p><p> m_CaidanCheck.SetItemText(0,1,Sldlg.m
116、_ShuLiang); //將數(shù)量信息添加到點(diǎn)菜列表</p><p><b> }</b></p><p><b> }</b></p><p><b> "<<"按鈕的操作</b></p><p><b> 代碼為: &l
117、t;/b></p><p> m_CaidanCheck.DeleteItem(m_CaidanCheck.GetSelectionMark());</p><p><b> 作用為刪除選中項(xiàng)。</b></p><p><b> “確定”按鈕的操作</b></p><p> 首先確認(rèn)所
118、選擇的桌號(hào),然后獲取點(diǎn)菜列表框內(nèi)的菜式總數(shù),確認(rèn)不為空時(shí)執(zhí)行操作。刪去該桌的原有賬單信息,再將現(xiàn)在的賬單按項(xiàng)目存入paybill 數(shù)據(jù)表中,并計(jì)算總價(jià)。</p><p><b> 具體代碼如下:</b></p><p> void CJiacaidlg::OnButtonOK() </p><p><b> {</b>
119、;</p><p> // TODO: Add your control notification handler code here</p><p> UpdateData();</p><p> CString Sql;</p><p> CString zhuohao;</p><p> if(m_Zh
120、uohaoCombo.GetCurSel()==-1) //如果沒(méi)有選擇數(shù)據(jù)則要求選擇</p><p><b> {</b></p><p> AfxMessageBox("請(qǐng)選擇要加菜的桌號(hào)");</p><p><b> return;</b></p>&l
121、t;p><b> }</b></p><p> m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),zhuohao); //獲取所選擇的信息</p><p> int i = m_CaidanCheck.GetItemCount(); //獲取點(diǎn)菜列表的項(xiàng)目總數(shù)</p><
122、;p> if(i==0) //如果為0則提示請(qǐng)點(diǎn)菜</p><p><b> {</b></p><p> AfxMessageBox("請(qǐng)點(diǎn)菜");</p><p><b> return;</b></p><p><b> }</b&
123、gt;</p><p> CString Sql1,Str,Str1,Value,TotleValue;</p><p> Sql1="delete from paybill where 桌號(hào)="+zhuohao+""; //刪去此帳臺(tái)號(hào)原有的賬單信息</p><p> theApp.m_pCon->
124、Execute((_bstr_t)Sql1,NULL,adCmdText); </p><p> double Totle=0; //記錄總消費(fèi)</p><p> for(int n=0;n<i;n++)</p><p><b> {</b></p><p> Str=m_C
125、aidanCheck.GetItemText(n,0); //獲取第N行第一列的文本</p><p> Str1=m_CaidanCheck.GetItemText(n,1); //獲取第N行第二列的文本</p><p> Sql1="select * from caishiinfo where 菜名='"+Str+"'"
126、;; </p><p> m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText); //在菜單表中獲取菜名一致的信息</p><p> Value=(char*)(_bstr_t)m_pRs->GetCollect("菜價(jià)"); //獲取該菜名的菜價(jià)信息</p
127、><p> Totle=atof(Value)*atof(Str1); //將數(shù)量與菜價(jià)轉(zhuǎn)換為整形數(shù)相乘得到總消費(fèi)額</p><p> TotleValue=(char*)(_bstr_t)Totle; //將總消費(fèi)轉(zhuǎn)換為CString類(lèi)型</p><p> Sql1="insert into paybill(桌號(hào),菜名,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- vc++課程設(shè)計(jì)報(bào)告---球員管理系統(tǒng)
- vc++課程設(shè)計(jì)--工資管理
- vc++課程設(shè)計(jì)--工資管理
- vc++課程設(shè)計(jì)報(bào)告
- vc++課程設(shè)計(jì)報(bào)告--圖書(shū)館管理系統(tǒng)
- VC++課程設(shè)計(jì)--工資管理.doc
- vc++軟件課程設(shè)計(jì)報(bào)告
- 同學(xué)錄系統(tǒng)vc++課程設(shè)計(jì)
- vc++庫(kù)函數(shù)課程設(shè)計(jì)
- vc++課程設(shè)計(jì)報(bào)告-小型超市商品管理系統(tǒng)
- vc++課程設(shè)計(jì)報(bào)告-小型超市商品管理系統(tǒng)
- vc++課程設(shè)計(jì)報(bào)告----對(duì)抗游戲
- vc++課程設(shè)計(jì)報(bào)告--對(duì)抗游戲
- vc++網(wǎng)絡(luò)聊天軟件課程設(shè)計(jì)
- vc++火車(chē)票信息管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- vc++課設(shè)課程設(shè)計(jì)報(bào)告
- 【vc++課程設(shè)計(jì)】學(xué)生成績(jī)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- [vc++畢設(shè)]c++課程設(shè)計(jì)報(bào)告(人事管理系統(tǒng))
- vc++課程設(shè)計(jì)----用winsock實(shí)現(xiàn)聊天
- vc++課程設(shè)計(jì)《算術(shù)表達(dá)式》
評(píng)論
0/150
提交評(píng)論