vc++課程設(shè)計(jì)-- 餐飲管理系統(tǒng)_第1頁(yè)
已閱讀1頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論