1. 程式人生 > >餐飲管理系統 VC MFC

餐飲管理系統 VC MFC

 VC++課程設計報告

Ø 軟硬體執行環境

開發環境

l AMD Athlon™ⅡNeo Processor K125,2GB記憶體,250GB硬碟

l Microsoft® Windows™ XP Professional

l Microsoft® Visual C++ 6.0

l Microsoft Office Access 2003

執行環境

l Intel® Pentium® 2及以上處理器,32M以上記憶體,4G以上硬碟

l Microsoft® Windows™ XP作業系統,

Microsoft® Windows 7作業系統

Ø 問題及難點所在

    1.資料庫操作。

     包括ACCESS

資料庫中資料表的製作,在程式中利用ADO技術進行資料的查詢,檢索,增加刪除等操作,以及資料庫。

   2.模組之間的連線問題。

     模組之間相互聯絡,進行資料交換,必須兼顧資料安全性和各個類之間的連線性的問題。

   3.系統安全性問題,由於資料庫中存在金額等重要資料,必須對每個使用者的訪問許可權加以限制,並可以修改使用者許可權。      

Ø 需求分析

    隨著現代社會的發展,餐飲行業作為服務業的龍頭企業規模不斷擴大,一個大型酒店的餐飲服務部門往往服務許多客人,而一個企業的經營管理人員往往分工明確,一個人或幾個人無法完成如此繁雜的賬目統計和餐飲結賬等工作,傳統的算賬、記賬等人工作業系統已經不能再適應現代企業的發展。為了使餐飲系統可以得到高效運轉,伴隨著計算機的普及,因此需要專業的餐飲管理系統來完成工作。

    我的課程設計就是在此背景下完成的,本套餐飲管理系統有著完整的客人消費流程,餐館的經理和營業員均可已使用該系統,該系統解決了人工計算餐飲費用的各種不利因素,實現科學的點菜和結賬管理,省時省力,適合大多數中小型餐館使用,市場前景廣闊。

Ø 概要設計

     首先,要實現餐飲管理的功能,需要設計五個功能模組,分別為開臺,點菜,加減菜,結賬,數量選擇等模組。然後先進行對話方塊的設計,分別設計IDD_diancaiIDD_jiacaiIDD_jiezhangdlg,IDD_kaitai,IDD_SHULIANG這五個對話方塊,在對話方塊上擺放控制元件,給控制元件修改ID號碼,同時給各個對話方塊建立一個類,分別為

CDiancaidlgCJiacaidlgCJiezhangdlgCKaitaidlg,CSLdlg,並根據需要利用類嚮導為控制元件關聯成員變數,建立成員函式和訊息響應函式。

     其次,要增加系統的安全效能,實現管理員的登入功能,為管理員設定許可權,分為經理和營業員兩種,分別對不同許可權的人開放不同的模組,在登入之前將所有功能都遮蔽。設計登入、註冊和賬戶許可權管理對話方塊,併為每個對話方塊設定類,給控制元件新增成員變數,編寫程式碼。

     本系統使用ACCESS資料庫對資料進行儲存,利用ADO技術訪問資料庫,實現資料的檢索,查詢,插入,刪除,更改等功能。在資料庫中設計了四張資料表,分別為caishiinfo存放菜式資訊,Login存放使用者名稱和密碼資訊,paybill存放賬單資訊,TableUSE存放桌子使用情況的資訊。然後再MFC程式中可以通過ADO語句來訪問和操作資料庫實現功能。

     對介面進行美化,使用MFC面板給應用程式新增自己喜歡的面板,給對話方塊新增FALSH外掛進行美化。

Ø 資料庫設計

    1.使用ACCESS2003建立canyin.mdb的資料庫,在其中新增四張資料表,分別用來存放菜式資訊,使用者資訊,賬單資訊,桌號資訊。

  2.CMyApp類中新增_ConnectionPtr 型別的變數m_pCon用於連線資料庫。在視窗初始化函式中新增如下程式碼,用於連線和訪問資料庫。

::CoInitialize(NULL);      //訪問COM

HRESULT hr;       //函式返回值,如果這個函式執行完返回時將有包含實際意義的數字,如果立即返回將包含狀態資訊

try   /*try關鍵字用來表示一個程式碼塊,在可能發生的異常。

對於每一個try語句,必須有至少有一個相應的catch子句。如果出現異常,c

atch子句引數進行評估,以確定它是否是能夠處理特殊情況。特殊條件下,

如果不能處理任何相應的try語句的catch子句,然後控制權轉移的方法呼叫鏈和以前的所有異常型別進行評估,

直到找到一個能夠處理的條件。*/

{

hr=m_pCon.CreateInstance("ADODB.Connection");   //建立連線。CreateInstance是智慧指標本身的函式

if(SUCCEEDED(hr))

{

m_pCon->ConnectionTimeout=3;

hr=m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=canyin.mdb","","",adModeUnknown);

     //開啟到資料庫的連線,同步開啟連線

}

}

catch(_com_error e)

{

CString temp;

temp.Format("連線資料庫錯誤資訊:%s",e.ErrorMessage());    //格式化輸出資訊

::MessageBox(NULL,temp,"提示資訊",NULL);            //彈出訊息提醒框

return false;

}

連線資料庫後即可在每個類中新增_ConnectionPtr型別的變數操作資料庫。

Ø 詳細設計

       下面對各個類的設計做詳細介紹。

l 1、使用者登入模組

     左側插入了一個Flash外掛,右側新增控制元件,ID號和相應變數如下:

     ID號和相應函式為:         

             IDOK          OnOK

             IDCANCEL     OnCancle

(1)用語句extern CMyApp theApp;引入全域性變數,然後建立_RecordsetPtr 的變數m_pRs用於操作資料庫,設定全域性變數i用於計算登入輸入的次數,當登入超過三次還未輸入正確使用者名稱和密碼的話就自動退出程式。

2)登入按鈕的實現

首先判斷編輯框是否出現輸入異常的情況,然後檢索資料庫確定該使用者名稱和密碼是否正確,如果連線資料庫成功則在login資料表中按照關鍵字進行使用者名稱和密碼的匹配,如果匹配成功,則登入成功,可以進行下一步操作。如果使用者名稱和密碼輸入有誤,則彈出訊息框進行提示,然後初始化編輯框,再次接受使用者名稱密碼。如果連線資料庫沒有成功,則彈出訊息框進行提示。

在其中全域性變數進行計數,如果輸入超過三次則推出程式。登入成功之後,將使用者名稱和密碼存入到theApp的成員變數中以備在theApp對所登入的使用者許可權進行管理。

下面為具體實現的程式碼:

void CLogindlg::OnOK()                              //登陸按鈕的操作

{

// TODO: Add extra validation here

    UpdateData();                                //呼叫函式進行資料交換

if(!m_Uname.IsEmpty()||!m_Upasswd.IsEmpty())    //判斷使用者名稱和密碼編輯框是否為空

{

CString sql="SELECT * FROM Login WHERE Uname='"+m_Uname+"' and Upasswd='"+m_Upasswd+"'";

                            //在資料表中查詢是否存在該使用者名稱和密碼

try

{

m_pRs.CreateInstance("ADODB.Recordset");

m_pRs->Open((_variant_t)sql,theApp.m_pCon.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

if(m_pRs->adoEOF)

{

AfxMessageBox("使用者名稱或密碼錯誤!");

m_Uname="";

m_Upasswd="";               //初始化編輯框

i++;                         //用全域性變數i控制輸入錯誤次數

UpdateData(false);

if(i==3)           

{

OnCancel();           //如果輸入資訊超過三次就退出系統

}

}

else

{

theApp.name=m_Uname;

theApp.pwd=m_Upasswd;    //登陸成功後將使用者名稱和密碼儲存

CDialog::OnOK();          

return;

}

}

catch(_com_error e)       //無法連線資料庫

{

CString temp;

temp.Format("連線資料庫錯誤資訊:%s",e.ErrorMessage());

AfxMessageBox(temp);           

return;

}

}

else

{

AfxMessageBox("使用者名稱密碼不能為空");      //編輯框為空

}

}

(3)退出模組直接呼叫  CDialog::OnCancel()  函式退出即可。

l 2.開臺模組實現

1)用語句extern CMyApp theApp;引入全域性變數,然後建立_RecordsetPtr 的變數m_pRs用於操作資料庫。開臺模組中在上方顯示一個列表框,列表框內顯示所有桌子的資訊,第一欄是桌號,第二欄是“有人”或者“沒人”的顯示。選擇有人的桌子會自動報錯,選中一個沒有人的桌子,雙擊則會在下方的編輯框中顯示選中的桌號,選擇確定鍵則完成選擇。選擇完成之後資料庫中對桌號資訊進行更改,按取消按鈕取消操作

具體的ID號和對應的函式和變數如下:                               

為確定鍵設定了OnButtonOk函式,為列表框相應雙擊訊息設定OnDblclkList1函式,實現雙擊桌號能將資訊存入編輯框中。 

2)列表框控制元件初始化。

     在相應該類的OnInitDialog函式中,先為列表框設定風格,然後新增兩列並命名,在桌號的tableuseid資料表中查詢桌子的使用情況,將桌號和使用情況分別存入兩個變數中,根據資訊的不同將資訊分別顯示到列表框的兩列中,查詢該資料表中的所有資料得到列表框,以供使用者進行桌子的選擇。

核心程式碼如下:

m_Zhuolist.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                     //為列表控制元件設定風格

m_Zhuolist.InsertColumn(0,"桌號",LVCFMT_LEFT,140,0);   //為列表控制元件新增第一列並命名

m_Zhuolist.InsertColumn(1,"狀態",LVCFMT_LEFT,140,1);   //為列表控制元件新增第二列並命名

CString sql="select * from tableuse";    

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

                                //資料庫操作,查詢餐檯號資訊

int i=0;                     //定義變數控制列表控制元件中的顯示順序

while(m_pRs->adoEOF==0)      //如果資料不為空則查詢資料表並將結果新增到列表控制元件中

{

CString str=(char*)(_bstr_t)m_pRs->GetCollect("桌號");   //將餐檯號資訊存入str變數中

int tableuseid=atoi((char*)(_bstr_t)m_pRs->GetCollect("tableuseid"));  

                                //將使用資訊轉換為整型變數後存入tableuseid

m_Zhuolist.InsertItem(i,"");    //在控制元件列表中插入一行

m_Zhuolist.SetItemText(i,0,str);  //將餐檯號資訊新增至第一列

//tableuseid變數的值進行判斷

if(tableuseid==0)                        

m_Zhuolist.SetItemText(i,1,"空閒");    //如果為真表示空閒,在第二列將資訊填入

if(tableuseid==1)

m_Zhuolist.SetItemText(i,1,"有人");    //如果為假表示有人,在第二列將資訊填入

i++;                                  //控制行的變數自增

m_pRs->MoveNext();                    //資料庫操作:移向下一行記錄

}

3)編輯框控制元件顯示選擇的桌號

      相應滑鼠雙擊的訊息響應函式,當營業員滑鼠雙擊選擇桌號後,用編輯框關聯的成員變數的GetItemText函式獲得單擊列表位置所在行的第一列,然後存入變數中進行顯示。

具體程式碼如下:

void CKaitaidlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) 

{

CString str;

str=m_Zhuolist.GetItemText(m_Zhuolist.GetSelectionMark(),0);

                             //獲取當前列表控制元件中滑鼠單擊位置所在行的第一列文字

m_ZhuoHao=str;             //將文字新增到編輯框中

UpdateData(false);         

*pResult = 0;

}

4)開臺成功的“確定”按鈕的操作

   首先判斷編輯框不為空,然後查詢該餐檯號是否正在被使用,如果正在被使用的話就提示有人了,並初始化編輯框。如果不被使用的話,則在資料庫中檢索這張桌子,找到後將使用情況進行更改,然後呼叫點菜模組,彈出點菜對話方塊進行點菜。

void CKaitaidlg::OnButtonOk() 

{

UpdateData();     //資料交換

if(m_ZhuoHao.IsEmpty())         //如果填入編輯框中的資料為空

AfxMessageBox("桌號不能為空");

else             //對編輯框中的資料進行處理

{

CString Str="select * from TableUSE where TableUSEID=1";  //如果不為空則查詢哪些餐檯正在使用

m_pRs=theApp.m_pCon->Execute((_bstr_t)Str,NULL,adCmdText);

while(!m_pRs->adoEOF)        //當記錄不為空的時候

{

Value=(char*)(_bstr_t)m_pRs->GetCollect("桌號"); //用全域性變數儲存正在使用的餐檯號

if(m_ZhuoHao==Value)        //如果編輯框中的值與該變數相等

{

AfxMessageBox("有人了");      //提示有人了

m_ZhuoHao="";

UpdateData(false);

return;

}

m_pRs->MoveNext();           //繼續下一條記錄

}

m_pRs=NULL;                     //初始化指標

CString Str1="select * from TableUSE where 桌號="+m_ZhuoHao+"";  

m_pRs=theApp.m_pCon->Execute((_bstr_t)Str1,NULL,adCmdText);

if(m_pRs->adoEOF)              //當記錄為空時

{

AfxMessageBox("沒有這種桌子");  //輸出資訊

m_ZhuoHao="";                   //編輯框初始化顯示

UpdateData(false);     

return;

}

m_pRs=NULL;                     //初始化指標

CDiancaidlg dlg;               //定義一個點菜窗體例項

dlg.m_ZhuoHao = m_ZhuoHao;      

dlg.DoModal();                //彈出點菜窗體

CDialog::OnOK();           

}

}

l 3.點菜模組實現

(1)用語句extern CMyApp theApp;引入全域性變數,然後建立_RecordsetPtr 的變數m_pRs用於操作資料庫。上面的桌號自動進行填充,下面列表的左側是所有菜式的資訊列表,包括菜名的菜價。使用者滑鼠單擊選擇的菜品,中間有兩個按鈕,“>>”用於實現將使用者選中的菜式放入到右側的列表框中。“<<”按鈕實現當用戶在右側列表框中選中一個菜後,單擊該按鈕可以將該菜式從本桌已點的菜式中去掉。單擊確定按鈕完成點菜的操作,同時將右側列表框的菜式資訊存入caishiinfo資料表中。

本對話方塊的控制元件關聯的變數如下:

對話方塊具體設計如下:

2)視窗初始化函式

   首先在caishiinfo資料表中檢索資料,然後用SetExtendedStyle函式為列表框新增樣式,然後插入兩列,在資料庫中找到所有的菜式資訊,提取資訊並把資訊放入到左側的列表框中,完成IDC_LIST2列表框的初始化。然後在左側列表框中新增兩列資訊,完成對IDC_LIST3函式的初始化。

具體實現程式碼如下:

   BOOL CDiancaidlg::OnInitDialog()

{

CDialog::OnInitDialog();

CString Sql="select * from caishiinfo";                    //caishiinfo資料表中提取資料

m_CaidanList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                                                    //為選單列表進行樣式設定

m_CaidanList.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_CaidanList.InsertColumn(1,"菜價()",LVCFMT_LEFT,100,1);

                                                      //為選單列表新增兩列並命名

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);

while(!m_pRs->adoEOF)                                  //當指標記錄不為空

{

CString TheValue,TheValue1;

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("菜名");        //將“菜名”資訊存入TheValue

TheValue1=(char*)(_bstr_t)m_pRs->GetCollect("菜價");       //將“菜價”資訊存入TheValue1

m_CaidanList.InsertItem(0,"");                             //為列表框插入一行

m_CaidanList.SetItemText(0,0,TheValue);                    //設定該行的第一列

m_CaidanList.SetItemText(0,1,TheValue1);                   //設定該行第二列

m_pRs->MoveNext();                                         //繼續下一條記錄

}

m_CaidanCheck.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_CaidanCheck.InsertColumn(1,"數量()",LVCFMT_LEFT,100,1); //為選單列表新增兩列並命名

return TRUE;

}

(3)“>>”按鈕的實現

      該按鈕負責將使用者選中的菜式新增到右側列表框中。首先例項化一個數量選擇的物件,該對話方塊建立之後,後的選單中所選項的序號,然後後的選擇想的文字,然後將菜式名稱和數量寫入右側點菜列表框中。

實現程式碼如下:

void CDiancaidlg::OnButtonadd()  

{

CSLdlg Sldlg;    //數量類例項化一個物件

if(Sldlg.DoModal()==IDOK)       //建立“點菜數量”視窗的模態對話方塊

{

int i = m_CaidanList.GetSelectionMark();            //獲取選單中所選擇的項的序號

CString str = m_CaidanList.GetItemText(i,0);        //獲取選擇項的文字

m_CaidanCheck.InsertItem(0,"");

m_CaidanCheck.SetItemText(0,0,str);                 //將文字寫入點菜欄

m_CaidanCheck.SetItemText(0,1,Sldlg.m_ShuLiang); //將數量寫入點菜欄

}

}

(4)“>>”按鈕的實現

     程式碼為:  m_CaidanCheck.DeleteItem(m_CaidanCheck.GetSelectionMark());

   即將選中的菜式從右側列表框中刪除掉  

(5)“確定”按鈕的操作

      首次按確定按鈕修改TableUSE 中的資訊,如果點菜不為空的話就將該桌定義為有人,然後通過菜名的檢索在資料表中查詢菜價資訊,然後將總價算出存入全域性變數中,並存入資料表中,完成點菜操作。

實現程式碼如下:

void CDiancaidlg::OnButtonOk() 

{

UpdateData();

CString Sql;

int i = m_CaidanCheck.GetItemCount();   //獲取點菜列表項的總數

if(i==0)    //如果點菜個數為零

{

AfxMessageBox("請點菜");    //彈出對話方塊

return;

}

Sql="update TableUSE set TableUSEID=1 where 桌號="+m_ZhuoHao+" ";

theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);             //點菜成功就將該餐廳號的使用狀態改變

CString Sql1,Str,Str1,Value,TotleValue;

double Totle=0;

for(int n=0;n<i;n++)     //遍歷點菜列表將資料存入資料表

{

Str=m_CaidanCheck.GetItemText(n,0);   //獲取第N行第一列的資料資訊

Str1=m_CaidanCheck.GetItemText(n,1);  //獲取第N行第二列的資料資訊

Sql1="select * from caishiinfo where 菜名='"+Str+"'";    //獲取菜價資訊

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);

Value=(char*)(_bstr_t)m_pRs->GetCollect("菜價");   //將菜價資訊存入變數

Totle=atof(Value)*atof(Str1);  //獲得消費總額存入變數

TotleValue=(char*)(_bstr_t)Totle; //格式轉換

Sql1="insert into paybill(桌號,菜名,數量,消費) values("+m_ZhuoHao+",'"+Str+"',"+Str1+","+TotleValue+")";

theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);  //將此桌的點菜資訊和消費明細寫入資料表

}

AfxMessageBox("點菜成功");   //彈出對話方塊

CDialog::OnOK();

}

l 4.數量選擇模組的實現

   當單擊“>>”按鈕時會自動彈出選菜的對話方塊,使用者在選菜對話方塊中輸入要選擇的份數,將該份數儲存後存入變數中,然後可供點菜對話方塊使用。

控制元件的ID號及變數名如下:

對話方塊設計如下:

確定鍵的程式碼如下:

void CSLdlg::OnButtonok()       //響應點菜數量對話方塊的確定按鈕

{

UpdateData();

if(m_ShuLiang.IsEmpty()||m_ShuLiang=="0")      //判斷數量

{

AfxMessageBox("數量至少為1");

return;

}

CDialog::OnOK();

}

l 5.加減菜模組實現

     (1)加減菜模組完成功能為在進餐中要對所點的菜式進行修改,有加菜和減菜操作。用語句extern CMyApp theApp;引入全域性變數,然後建立_RecordsetPtr 的變數m_pRs用於操作資料庫。在上方的下拉列表框中選擇桌號,選擇之後右側列表框中顯示該桌的菜式資訊,左側列表框顯示所有的菜式資訊。然後可以通過“>>”“<<”按鈕對菜式進行修改,同時在後臺完成總金額的修改,單擊確定修改成功。

  控制元件及變數如下:

對話方塊如下:

(2)視窗初始化

     首先在菜式資訊表中查詢菜式資訊,變成列表樣式填入到左側的列表框中,然後paybill資料表中查詢賬單資訊,為下拉列表控制元件新增正在使用的餐檯號資訊。

以下為具體程式碼:

BOOL CJiacaidlg::OnInitDialog() 

{

CDialog::OnInitDialog();

CString Sql="select * from caishiinfo"; //查詢資料

m_CaidanList.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

                                   //對選單樣式進行設定

m_CaidanList.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);     //為選單列表新增兩列並命名

m_CaidanList.InsertColumn(1,"菜價()",LVCFMT_LEFT,100,1);

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);  //將資料表中的選單資訊讀入選單列表中

while(!m_pRs->adoEOF)      //如果不為空

{

CString TheValue,TheValue1;

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

TheValue1=(char*)(_bstr_t)m_pRs->GetCollect("菜價"); //分別將菜名和菜價資訊存入變數

m_CaidanList.InsertItem(0,"");            //插入一行

m_CaidanList.SetItemText(0,0,TheValue);    //將菜名新增到第一行

m_CaidanList.SetItemText(0,1,TheValue1);   //將菜價新增到第二行

m_pRs->MoveNext();  //繼續下一條記錄

}

//為點菜列表進行樣式設定

m_CaidanCheck.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

m_CaidanCheck.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_CaidanCheck.InsertColumn(1,"數量()",LVCFMT_LEFT,100,1);           //為點菜列表新增兩列並分別命名

Sql="select distinct 桌號 from paybill";                          //去除重複的餐檯號資訊

m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql,NULL,adCmdText);        //向下拉控制元件中新增資料

while(m_pRs->adoEOF==0)                                     //如果為空

{

CString zhuohao=(char*)(_bstr_t)m_pRs->GetCollect("桌號");  //將餐檯號資訊存入變數

m_ZhuohaoCombo.AddString(zhuohao);                       //為下拉列表新增餐檯號資訊

m_pRs->MoveNext();                                       //繼續下一條記錄

}

return TRUE; 

}

(3)對IDC_LIST3 進行初始化操作

相應下拉列表控制元件IDC_COMBO1控制元件的Selchange訊息,獲取桌號資訊,根據桌號在賬單列表中將菜式和數量資訊提取出來並存入IDC_LIST3 列表框中。

具體程式碼如下:

void CJiacaidlg::OnSelchangeCombo1() 

{

// TODO: Add your control notification handler code here

CString str;

m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),str);   //獲取所選選項的資訊

CString sql="select * from paybill where 桌號="+str+"";     

    //到資料表中查詢相關餐檯號的資訊

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

m_CaidanCheck.DeleteAllItems();      //選單選擇列表框初始化清空

//將查到的資訊寫入點菜列表中

while(!m_pRs->adoEOF)  //如果不為空

{

CString valuename=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

CString valuenum=(char*)(_bstr_t)m_pRs->GetCollect("數量");   //將菜名和數量資訊分別存入變數

m_CaidanCheck.InsertItem(0,"");               //為選單列表新增一行

m_CaidanCheck.SetItemText(0,0,valuename);     //將菜名新增到該行第一列

m_CaidanCheck.SetItemText(0,1,valuenum);      //將數量新增到該行第二列

m_pRs->MoveNext();                            //下一條記錄

}

}

(4)">>"按鈕的操作

    選中一項,點選按鈕之後,彈出新增數量資訊的對話方塊,獲得當前選中項的序號,在右側列表框中將該菜式的菜名和數量資訊寫入。

   void CJiacaidlg::OnButtonadd() 

{

// TODO: Add your control notification handler code here

CSLdlg Sldlg;          

if(Sldlg.DoModal()==IDOK)        //新增數量資訊

{

int i = m_CaidanList.GetSelectionMark();    //獲取當前選中項的序號

CString str = m_CaidanList.GetItemText(i,0);

m_CaidanCheck.InsertItem(0,"");   //插入一行

m_CaidanCheck.SetItemText(0,0,str);//將選中項資訊新增到點菜列表中

m_CaidanCheck.SetItemText(0,1,Sldlg.m_ShuLiang);  //將數量資訊新增到點菜列表

}

}

(5)"<<"按鈕的操作

   程式碼為: 

        m_CaidanCheck.DeleteItem(m_CaidanCheck.GetSelectionMark());

   作用為刪除選中項。

(6)“確定”按鈕的操作

     首先確認所選擇的桌號,然後獲取點菜列表框內的菜式總數,確認不為空時執行操作。刪去該桌的原有賬單資訊,再將現在的賬單按專案存入paybill 資料表中,並計算總價。

具體程式碼如下:

void CJiacaidlg::OnButtonOK() 

{

// TODO: Add your control notification handler code here

UpdateData();

CString Sql;

CString zhuohao;

if(m_ZhuohaoCombo.GetCurSel()==-1)            //如果沒有選擇資料則要求選擇

{

AfxMessageBox("請選擇要加菜的桌號");

return;

}

m_ZhuohaoCombo.GetLBText(m_ZhuohaoCombo.GetCurSel(),zhuohao);   //獲取所選擇的資訊

int i = m_CaidanCheck.GetItemCount();      //獲取點菜列表的專案總數

if(i==0)      //如果為0則提示請點菜

{

AfxMessageBox("請點菜");

return;

}

CString Sql1,Str,Str1,Value,TotleValue;

Sql1="delete from paybill where 桌號="+zhuohao+"";        //刪去此帳臺號原有的賬單資訊

theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);      

double Totle=0;            //記錄總消費

for(int n=0;n<i;n++)

{

     Str=m_CaidanCheck.GetItemText(n,0);    //獲取第N行第一列的文字

        Str1=m_CaidanCheck.GetItemText(n,1);   //獲取第N行第二列的文字

     Sql1="select * from caishiinfo where 菜名='"+Str+"'";    

     m_pRs=theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText);  //在選單表中獲取菜名一致的資訊

     Value=(char*)(_bstr_t)m_pRs->GetCollect("菜價");           //獲取該菜名的菜價資訊

     Totle=atof(Value)*atof(Str1);           //將數量與菜價轉換為整形數相乘得到總消費額

     TotleValue=(char*)(_bstr_t)Totle;       //將總消費轉換為CString型別

     Sql1="insert into paybill(桌號,菜名,數量,消費) values("+zhuohao+",'"+Str+"',"+Str1+","+TotleValue+")";

                    //將選單資訊插入到資料表中

     theApp.m_pCon->Execute((_bstr_t)Sql1,NULL,adCmdText); 

}

AfxMessageBox("操作成功");

CDialog::OnOK();

l 6.結賬模組實現

1)首先用語句extern CMyApp theApp;引入全域性變數,然後建立_RecordsetPtr 的變數m_pRs用於操作資料庫。使用者先在下拉列表框中選擇桌號,然後消費明細會自動顯示在列表框中,應收編輯框被填充,輸入實收編輯框中的內容,找零編輯框會自動填充,當實收金額合適時,完成操作,並且對該桌號的資訊進行初始化,使其變為不在使用,並且在賬單中清空該桌號的賬單資訊。

控制元件及變數名如下所示:

對話方塊設計如下:

(2)視窗初始化函式

   下拉列表框IDC_COMBO1的初始化,在TableUSE 資料表中查詢正在使用的餐檯號,將其存入變數中,然後新增到下拉列表框中以供選擇。然後初始化IDC_mimgxi列表框,為其新增菜名,數量,消費資訊。

實現程式碼如下:

BOOL CJiezhangdlg::OnInitDialog() 

{

CDialog::OnInitDialog();

CString TheValue;

m_pRs=theApp.m_pCon->Execute((_bstr_t)("select * from TableUSE where TableUSEID=1"),NULL,adCmdText);//獲取正在消費的餐檯號

if(m_pRs->GetRecordCount()==0)    //如果記錄為0則返回

return true;

if(m_pRs->GetRecordCount()==1)    //如果記錄為1則將資料新增到下拉列表中

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("桌號");

m_Combo.AddString(TheValue);

return true;

}

while(!m_pRs->adoEOF)  //當記錄不為空時

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("桌號");       //獲取記錄中的餐檯號資訊

m_Combo.AddString(TheValue);     //將餐檯號資訊新增到下拉控制元件列表中

m_pRs->MoveNext();               //繼續下一條記錄

}

m_pRs=NULL;        //初始化指標

//設定消費明細列表樣式

m_MingXi.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVATE|LVS_EX_GRIDLINES);

//給消費明細列表新增三列並分別命名

m_MingXi.InsertColumn(0,"菜名",LVCFMT_LEFT,100,0);

m_MingXi.InsertColumn(1,"數量",LVCFMT_LEFT,100,1);

m_MingXi.InsertColumn(2,"消費()",LVCFMT_LEFT,120,1);

return true;

}

(3)IDC_mingxi列表框內容顯示

    相應下拉列表框的selchange訊息,當下拉列表框的內容變化之後,獲取列表框的資訊並存入變數,通過桌號檢索獲取賬單資訊,在列表框中按照菜名,數量,消費的格式將詳細賬單資訊顯示出來。將消費總額放在應收控制元件中顯示。

    void CJiezhangdlg::OnSelchangeCombo1() 

{

UpdateData();

CString str,sql,caiming,shuliang,xiaofei,xiaofeitotle,TheValue;

double totle=0;       //存放總金額數值

m_Combo.GetLBText(m_Combo.GetCurSel(),str);      //獲取當前選擇項的文字資訊並存入變數

sql="select * from paybill where 桌號="+str+"";   //查詢當前餐檯號的賬單資訊

m_pRs=theApp.m_pCon->Execute((_bstr_t)sql,NULL,adCmdText);

m_MingXi.DeleteAllItems(); //清空列表控制元件

while(m_pRs->adoEOF==0)  //如果記錄不為空

{

TheValue=(char*)(_bstr_t)m_pRs->GetCollect("消費");   //獲得消費資訊並存入變數

totle+=atof(TheValue);           //轉換型別並相加

caiming=(char*)(_bstr_t)m_pRs->GetCollect("菜名");

shuliang=(char*)(_bstr_t)m_pRs->GetCollect("數量");

xiaofei=(char*)(_bstr_t)m_pRs->GetCollect("消費");    //獲得資訊並存入變數

m_MingXi.InsertItem(0,"");      //插入一行

m_MingXi.SetItemText(0,0,caiming);

m_MingXi.SetItemText(0,1,shuliang);

m_MingXi.SetItemText(0,2,xiaofei);   //分別在一二三行新增資訊

m_pRs->MoveNext();  //繼續下一條記錄

}

xiaofeitotle=(char*)(_bstr_t)totle;   //轉換格式

m_YingShou.SetWindowText(xiaofeitotle);   //將消費總額放在應收控制元件中顯示

UpdateData(false);

}

(4)確定按鈕的操作

     首先進行相應餐檯號的異常判斷,該客人需要付款時先獲得相應餐檯號的消費資訊,獲得總金額,實收金額和應收金額,將找零金額計算出,寫入找零編輯框中。

   void CJiezhangdlg::OnButtonOk2() 

{

// TODO: Add your control notification handler code here

UpdateData();

CString str,str1,str2,str3;

CString TheValue;

CString ShiShou,YingShou;

m_Combo.GetWindowText(str1);         //獲取餐檯號

if(str1.Ge