数据库课程设计报告(仓库管理系统)
原文:http://blog.chinaunix.net/uid-13874038-id-191915.html
三?概要設(shè)計(jì)
3.1???E—R圖和相關(guān)說(shuō)明
?
類別(類別編號(hào),類別名稱,上級(jí)類別)
倉(cāng)庫(kù)(倉(cāng)庫(kù)編號(hào),隸屬單位,備注)
用戶(用戶名,密碼,權(quán)限類型);
客戶(客戶編號(hào),聯(lián)系人,單位,聯(lián)系電話,傳真,通信地址,郵政編碼)
?
產(chǎn)品(編號(hào),名稱,規(guī)格,計(jì)算單位,參考價(jià)格,數(shù)量下限,數(shù)量下限,有效期,警告
?
出庫(kù)(出庫(kù)類型,產(chǎn)品類型,單價(jià),數(shù)量,總價(jià)格,客戶單位,出庫(kù)倉(cāng)庫(kù),經(jīng)辦用戶,出庫(kù)日期)
入庫(kù)(入庫(kù)類型,產(chǎn)品名稱,生產(chǎn)日期,單價(jià),數(shù)量,總價(jià)格,客戶單位,入庫(kù)倉(cāng)庫(kù),經(jīng)辦用戶,入庫(kù)日期)
庫(kù)存(產(chǎn)品入庫(kù)單價(jià),庫(kù)存數(shù)量,生產(chǎn)日期)
四??邏輯設(shè)計(jì)
(一)、表的定義如下 :
Client表(客戶信息表)?????????Product(產(chǎn)品信息表)
?
ProinStore(庫(kù)存信息表)????????Takeout(出庫(kù)表)
?
?
StoreIn(入庫(kù)表)??????????????Users(用戶表)
?
?
ProType(產(chǎn)品類型表)???????Storehouse(倉(cāng)庫(kù)信息表)
??
?(二)、視圖定義如下:
一、report2(報(bào)表視圖)
CREATE VIEW??Report2
AS
SELECT SiType, Pid, Pprice, Pnum, (Pprice * Pnum) As Amount,
?Cid, Sid, EmpName, OptDate FROM StoreIn
UNION
SELECT Ttype, Pid, Pprice, Pnum, (Pprice * Pnum) As Amount, Cid, Sid, EmpName, OptDate FROM TakeOut
二、 庫(kù)存統(tǒng)計(jì)視圖
CREATE VIEW??Total_Num
AS
SELECT dbo.ProInStore.Pid, SUM(dbo.ProInStore.Pnum) AS Total
FROM dbo.ProInStore INNER JOIN
??????dbo.Product ON dbo.ProInStore.Pid = dbo.Product.Pid
GROUP BY dbo.ProInStore.Pid
三、庫(kù)存視圖
CREATE VIEW dbo.v_ProInStore
AS
SELECT p.Pid, SUM(s.Pnum) AS SumNum
FROM dbo.Product p INNER JOIN
??????dbo.ProInStore s ON p.Pid = s.Pid
GROUP BY p.Pid
四、入庫(kù)視圖
CREATE VIEW dbo.v_storein
AS
SELECT p.Pid, SUM(i.Pnum) AS SumNum, SUM(i.Pnum * i.Pprice)
??????AS SumPrice
FROM dbo.Product p INNER JOIN
??????dbo.StoreIn i ON p.Pid = i.Pid
GROUP BY p.Pid
五、出庫(kù)視圖
CREATE VIEW dbo.v_takeout
AS
SELECT p.Pid, SUM(t.Pnum) AS SumNum, SUM(t.Pnum * t.Pprice)
??????AS SumPrice
FROM dbo.Product p INNER JOIN
??????dbo.TakeOut t ON p.Pid = t.Pid
GROUP BY p.Pid
六、失效期統(tǒng)計(jì)視圖
CREATE VIEW dbo.Valid
AS
SELECT dbo.ProInStore.SpId AS?庫(kù)存記錄編號(hào), dbo.Product.Pname AS?產(chǎn)品名稱,
??????dbo.ProInStore.Pprice AS?產(chǎn)品價(jià)格, dbo.ProInStore.Pnum AS?產(chǎn)品數(shù)量,
??????dbo.ProInStore.MakeDate AS?生產(chǎn)日期, dbo.Storehouse.Sname AS?倉(cāng)庫(kù)名稱,
??????ROUND(DATEDIFF(day, DATEADD(day, dbo.Product.Valid, dbo.ProInStore.MakeDate),
??????GETDATE()), 0) AS?距離失效期的天數(shù)
FROM dbo.ProInStore INNER JOIN
??????dbo.Product ON dbo.ProInStore.Pid = dbo.Product.Pid AND DATEDIFF(day,
??????GETDATE(), dbo.ProInStore.MakeDate)
??????>= dbo.Product.Valid - dbo.Product.AlarmDays INNER JOIN
??????dbo.Storehouse ON dbo.ProInStore.Sid = dbo.Storehouse.Sid
五?詳細(xì)設(shè)計(jì)
總體模塊設(shè)計(jì)如下:
?
模塊一(基本信息管理)(由本人完成)
?
準(zhǔn)備工作:
一完成對(duì)數(shù)據(jù)庫(kù)連接和操作的類
????#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace???????????rename("EOF","adoEOF") rename("BOF","adoBOF")
?class ADOConn?
{//?定義變量
public:
_ConnectionPtr m_pConnection; //添加一個(gè)指向Connection對(duì)象的指針:
???????_RecordsetPtr m_pRecordset; //添加一個(gè)指向Recordset對(duì)象的指針:
public: //?定義方法
ADOConn();
???????virtual ~ADOConn();????//?初始化—連接數(shù)據(jù)庫(kù)
void??OnInitADOConn();
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); //?執(zhí)行查詢
BOOL ExecuteSQL(_bstr_t bstrSQL); //?執(zhí)行SQL語(yǔ)句,Insert Update _variant_t
void ExitConnect();
void Backup();???//備份數(shù)據(jù)庫(kù)
void Restore();//恢復(fù)數(shù)據(jù)庫(kù)};
一、用戶登陸:
??
實(shí)現(xiàn)代碼如下:
class CLoginDlg : public CDialog
{
// Construction
public:
???????CLoginDlg(CWnd* pParent = NULL);???// standard constructor
????~CLoginDlg();
// Dialog Data
???????//{{AFX_DATA(CLoginDlg)
???????enum { IDD = IDD_LOGIN_DIALOG };
???????CEdit??????m_control_username;
???????CEdit??????m_control_password;
???????int count;
???????int seconds;
???????CSMButton????m_ok;
???????CSMButton????m_cancel;
???????CString???m_Pwd;
???????CString???m_UserName;
???COLORREF m_clrText;
???????COLORREF m_clrBkgnd;
???????CBrush m_brBkgnd;
???????CBrush m_brControlBkgnd1;
???????CBrush m_brControlBkgnd2;
???protected:
???????virtual void DoDataExchange(CDataExchange* pDX);????// DDX/DDV support
?virtual void OnOK();
???????afx_msg BOOL OnEraseBkgnd(CDC* pDC);
???????afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
???????afx_msg void OnTimer(UINT nIDEvent);
???????virtual BOOL OnInitDialog();
???????//}}AFX_MSG
???????DECLARE_MESSAGE_MAP()
};
void CLoginDlg::OnOK()
{UpdateData(TRUE);
if (m_UserName == ""){
???????MessageBox("請(qǐng)輸入用戶名");
??????????????return;}
if (m_Pwd == ""){
??????????????MessageBox("請(qǐng)輸入密碼");
??????????????return;}
???????//定義CUsers對(duì)象,用于從表Users中讀取數(shù)據(jù)
???????CUsers user;
???????user.GetData(m_UserName);
?//如果讀取的數(shù)據(jù)與用戶輸入數(shù)據(jù)不同,則返回
???????if (user.GetPwd() != m_Pwd)
???????{???if (count<3)
????????????????{MessageBox("用戶信息不正確,無(wú)法登錄!");
????????????????????count++;
?????????????????m_Pwd.Empty();
?????????????????????m_control_password.SetFocus();
??????????????????UpdateData(FALSE);}
????????????????else
????????????????{
???????????????????????????MessageBox("你可能是非法用戶!","警告",MB_OK|MB_ICONHAND);
????????????????????????????exit(0); }}else{KillTimer(0);CDialog::OnOK();}}
二、客戶的實(shí)現(xiàn)代碼
void CClientManDlg::Refresh_Data()
{
????UpdateData(TRUE); //將控件的值讀取到成員變量中
????CString cSource;
????CString cCtype;??//讀取客戶類型值
????cCtype.Format("%d", m_Ctype.GetCurSel() + 1);
????//設(shè)置SELECT語(yǔ)句,按客戶單位排序
????cSource = "SELECT Cid, Cname AS?客戶單位, Contact AS?聯(lián)系人, Address AS?通信地址,";
????cSource += " Postcode AS?郵政編碼, Phone AS?聯(lián)系電話, Fax AS?傳真電話, Memo AS?備注";
????cSource += " FROM Client WHERE Ctype=" + cCtype + " ORDER BY Cname";
????m_adodc.SetRecordSource(cSource);
????m_adodc.Refresh();
????//設(shè)置表格列寬度
????_variant_t vIndex;
????vIndex = long(0);
????m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);
}
?
BOOL CClientManDlg::OnInitDialog()
{
????CDialog::OnInitDialog();
???
????// TODO: Add extra initialization here
????m_Ctype.SetCurSel(0);??//設(shè)置客戶類型
????Refresh_Data();??//刷新表格中的記錄集
?
????return TRUE;??// return TRUE unless you set the focus to a control
??????????????????// EXCEPTION: OCX Property Pages should return FALSE
}
?
void CClientManDlg::OnAddButton()
{
????// TODO: Add your control notification handler code here
????UpdateData(TRUE);
????//打開編輯對(duì)話框
????CClientEditDlg dlg;
????dlg.cCid = "";
????dlg.iCtype = m_Ctype.GetCurSel() + 1;
????if (dlg.DoModal() == IDOK)
????????Refresh_Data();
}
?
void CClientManDlg::OnSelchangeCtypeCombo()
{
????// TODO: Add your control notification handler code here
????Refresh_Data();
}
?
void CClientManDlg::OnModiButton()
{
????// TODO: Add your control notification handler code here
????if (m_adodc.GetRecordset().GetEof())
????{
????????MessageBox("請(qǐng)選擇要修改的記錄");
????????return;
????}
????UpdateData(TRUE);
????CClientEditDlg dlg;
????dlg.cCid = m_datagrid.GetItem(0); //記錄編號(hào)
????dlg.iCtype = m_Ctype.GetCurSel() + 1;??//客戶類型
????dlg.m_Cname = m_datagrid.GetItem(1); //單位名稱
????dlg.cCname = m_datagrid.GetItem(1);
????dlg.m_Contact = m_datagrid.GetItem(2); //聯(lián)系人
????dlg.m_Address = m_datagrid.GetItem(3); //通信地址
????dlg.m_Postcode = m_datagrid.GetItem(4); //郵政編碼
????dlg.m_Phone = m_datagrid.GetItem(5); //聯(lián)系電話
????dlg.m_Fax = m_datagrid.GetItem(6); //傳真
????dlg.m_Memo = m_datagrid.GetItem(7); //備注信息
?
????if (dlg.DoModal() == IDOK)
????????Refresh_Data();
}
?
void CClientManDlg::OnDelButton()
{
????// TODO: Add your control notification handler code here
????if (m_adodc.GetRecordset().GetEof())
????{
????????MessageBox("請(qǐng)選擇要?jiǎng)h除的記錄");
????????return;
????}
????CString Cid;
????Cid = m_datagrid.GetItem(0);
????CStoreIn obj;
????if (obj.HaveClient(Cid) == 1)
????{
????????MessageBox("客戶出現(xiàn)在入庫(kù)單中,不能刪除");
????????return;
????}
????CTakeOut obj1;
????if (obj1.HaveClient(Cid) == 1)
????{
????????MessageBox("客戶出現(xiàn)在出庫(kù)單中,不能刪除");
????????return;
????}
???
????if (MessageBox("是否刪除當(dāng)前記錄","請(qǐng)確定", MB_YESNO) == IDYES)
????{
????????CClient clt;
????????clt.sql_delete(m_datagrid.GetItem(0));
????????Refresh_Data();
????}??
}
三、倉(cāng)庫(kù)信息管理
void CStoreHouseManDlg::Refresh_Data()
{
????UpdateData(TRUE);
????CString cSource;
?
????cSource = "SELECT Sid, Sname AS?倉(cāng)庫(kù)單位, Memo AS?備注";
????cSource += " FROM Storehouse ORDER BY Sname";
????m_adodc.SetRecordSource(cSource);
????m_adodc.Refresh();
????//設(shè)置表格列寬度
????_variant_t vIndex;
????vIndex = long(0);
????m_datagrid.GetColumns().GetItem(vIndex).SetWidth(0);
????vIndex = long(1);
????m_datagrid.GetColumns().GetItem(vIndex).SetWidth(100);
????vIndex = long(2);
????m_datagrid.GetColumns().GetItem(vIndex).SetWidth(420);
}
?
void CStoreHouseManDlg::OnAddButton()
{
????// TODO: Add your control notification handler code here
????UpdateData(TRUE);
????//打開編輯對(duì)話框
????CStoreHouseEditDlg dlg;
????dlg.cSid = "";
????if (dlg.DoModal() == IDOK)
????????Refresh_Data();
}
void CStoreHouseManDlg::OnModiButton()
{
????// TODO: Add your control notification handler code here
????if (m_adodc.GetRecordset().GetEof())
????{
????????MessageBox("請(qǐng)選擇要修改的記錄");
????????return;
????}
????UpdateData(TRUE);
????CStoreHouseEditDlg dlg;
????dlg.cSid = m_datagrid.GetItem(0); //記錄編號(hào)
????dlg.m_Sname = m_datagrid.GetItem(1); //倉(cāng)庫(kù)名稱
????dlg.m_Memo = m_datagrid.GetItem(2); //備注信息
?
????if (dlg.DoModal() == IDOK)
????????Refresh_Data();????
}
?
void CStoreHouseManDlg::OnDelButton()
{
????// TODO: Add your control notification handler code here
????if (m_adodc.GetRecordset().GetEof())
????{
????????MessageBox("請(qǐng)選擇要?jiǎng)h除的記錄");
????????return;
????}
????CString Sid;
????Sid = m_datagrid.GetItem(0);
????CStoreIn obj;
????if (obj.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉(cāng)庫(kù)信息出現(xiàn)在入庫(kù)單中,不能刪除");
????????return;
????}
????CTakeOut obj1;
????if (obj1.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉(cāng)庫(kù)信息出現(xiàn)在出庫(kù)單中,不能刪除");
????????return;
????}
????CProInStore obj2;
????if (obj2.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉(cāng)庫(kù)信息出現(xiàn)在庫(kù)存產(chǎn)品信息中,不能刪除");
????????return;
????}
????if (MessageBox("是否刪除當(dāng)前記錄","請(qǐng)確定", MB_YESNO) == IDYES)
????{
????????CStorehouse sh;
????????sh.sql_delete(Sid);
????????Refresh_Data();
????}??????
}
?
BOOL CStoreHouseManDlg::OnInitDialog()
{
????CDialog::OnInitDialog();
???
????// TODO: Add extra initialization here
????Refresh_Data();
?
????return TRUE;??// return TRUE unless you set the focus to a control
??????????????????// EXCEPTION: OCX Property Pages should return FALSE
}
?
?
?
四、用戶信息管理
void CUserManDlg::OnAddButton()
{
????CUserEditDlg dlg;
????dlg.iUserType = 2;
????if (dlg.DoModal() == IDOK)
????????m_adodc.Refresh(); }
void CUserManDlg::OnModiButton()
{???if (m_datalist.GetText() == "")
????{
????????MessageBox("請(qǐng)選擇用戶");
????????return;
????}
????if (curUser.GetUserName() != "Admin" && curUser.GetUserName() != m_datalist.GetText()
????????&& m_datalist.GetBoundText() == "1")
????{???//除Admin外,其他管理員只能修改普通用戶信息
????????MessageBox("只能對(duì)普通用戶進(jìn)行密碼復(fù)位");
????????return;
????}
????if (MessageBox("是否對(duì)當(dāng)前用戶進(jìn)行密碼復(fù)位","請(qǐng)確認(rèn)", MB_YESNO) == IDYES){?????CUsers usr;
????????usr.SetPwd("888888"); //設(shè)置默認(rèn)密碼
????????usr.sql_updatePwd(m_datalist.GetText());
????????MessageBox("密碼已經(jīng)復(fù)位");}}
void CUserManDlg::OnDelButton()
{ if (m_datalist.GetText() == ""){
????????MessageBox("請(qǐng)選擇用戶");
????????return;}
????if (curUser.GetUserName() != "Admin" && m_datalist.GetBoundText() == "1"){??//除Admin外,其他管理員只能刪除普通用戶
????????MessageBox("只能刪除普通用戶");
????????return;}if (m_datalist.GetText() == "Admin"){
????????MessageBox("不能刪除Admin用戶");
????????return;}
????if (MessageBox("是否刪除當(dāng)前用戶","請(qǐng)確認(rèn)", MB_YESNO) == IDYES)
????{???CUsers usr;
????????usr.sql_delete(m_datalist.GetText());
????????m_adodc.Refresh();}?}
五、用戶密碼修改
void CChangePwdDlg::OnOK()
{//將對(duì)話框中編輯框的數(shù)據(jù)讀取到成員變量中
????UpdateData(TRUE);
????//檢查數(shù)據(jù)有效性
????if (m_OldPwd == "")
????{
????????MessageBox("請(qǐng)輸入舊密碼");
????????return;
????}
????if (m_NewPwd1 == "")
????{
????????MessageBox("請(qǐng)輸入新密碼");
????????return;
????}
????if (m_NewPwd1 != m_NewPwd2)
????{
????????MessageBox("兩次輸入的新密碼不同");
????????return;
????}
?
????//定義CUsers對(duì)象,用于從表Users中讀取數(shù)據(jù)
????CUsers user;
????user.GetData(m_UserName);
????//如果讀取的數(shù)據(jù)與用戶輸入數(shù)據(jù)不同,則返回
????if (user.GetPwd() != m_OldPwd)
????{
????????MessageBox("用戶密碼不正確!");
????????return;
????}??
???
????user.SetPwd(m_NewPwd1);
????user.sql_updatePwd(m_UserName);
???
????MessageBox("密碼修改成功,下次登錄請(qǐng)使用新密碼");
?
????CDialog::OnOK();
}
七?測(cè)試結(jié)果
一、進(jìn)入系統(tǒng)
????
輸入密碼正確進(jìn)入主界面
二、進(jìn)入主界面
三、進(jìn)入客戶信息管理
點(diǎn)擊添加按鈕????????????????????
選中要修改的表項(xiàng)
如下:
點(diǎn)擊修改:
同樣選中要?jiǎng)h除的表項(xiàng)????點(diǎn)擊刪除得到如下
點(diǎn)擊確定即可刪除,不想刪除點(diǎn)擊“否”。
?
?
?
?
四、進(jìn)入倉(cāng)庫(kù)管理
操作步驟相同不在贅述了。
五、進(jìn)入用戶管理???????六、進(jìn)入用戶密碼修改
八?小結(jié)
在這次課程設(shè)計(jì)中,讓我學(xué)到了很多在課堂和書本上學(xué)不到的知識(shí),我在這次課程設(shè)計(jì)中最大的收獲有以下幾個(gè)方面:
一、領(lǐng)略到了數(shù)據(jù)庫(kù)設(shè)計(jì)在計(jì)算機(jī)領(lǐng)域的重要性。數(shù)據(jù)庫(kù)作為一個(gè)永久存儲(chǔ)形式在應(yīng)用中發(fā)揮著重要的作用。在數(shù)據(jù)庫(kù)設(shè)計(jì)中,我明白了數(shù)據(jù)庫(kù)設(shè)計(jì)中不是范式越高越好的。我們要根據(jù)我們的應(yīng)用來(lái)決定,一切應(yīng)該以需求為首要選擇。
?二、對(duì)變成環(huán)境、一些控件的使用和界面的美化方面更加熟悉。因?yàn)椤秱}(cāng)庫(kù)管理系統(tǒng)》中涉及到很多控件的使用,只有很好的使用這些控件才可以給出一個(gè)很好的界面呈現(xiàn)在用戶的面前。這樣更有利于數(shù)據(jù)庫(kù)和用戶之間的交流。這里就要涉及一些平時(shí)不太常見的控件的使用問題。為了更好的在系統(tǒng)中利用這些控件,我上網(wǎng)查詢了一些關(guān)于控件使用的資料,最主要的是MSDN上面、還有借了一些這方面的書籍。在界面的美化方面,我了解了一些WINDOWS自定義界面的知識(shí),現(xiàn)在的軟件其實(shí)好多面向用戶的時(shí)候用戶首先看的就是一個(gè)軟件的界面是否有好,是否漂亮。其實(shí),界面美化是很重要的。因?yàn)槊?#xff0c;是人一直追求的。主要知識(shí)有:自定義窗口形狀,按鈕的3D效果,控件的自定義等等。這些都是通過(guò)面向?qū)ο缶幊痰囊恍┨匦詫?shí)現(xiàn)的,又得是通過(guò)多態(tài),又得是通過(guò)類的繼承。
三、利用軟件工程學(xué)開發(fā)系統(tǒng)。雖然這個(gè)《倉(cāng)庫(kù)管理系統(tǒng)》是一個(gè)小的系統(tǒng),但只有從這些小的項(xiàng)目中就利用軟件工程學(xué)的知識(shí),這樣可以開發(fā)在系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)中我們可以總結(jié)很多經(jīng)驗(yàn)和教訓(xùn)。我們一般按照瀑布開發(fā)模型、增量模型、?螺旋模型來(lái)做我們的項(xiàng)目。
參考文獻(xiàn)
?[1]SQL Server 2000數(shù)據(jù)庫(kù)及應(yīng)用?徐人鳳?曾建華?高等教育出版社?2004年1月
?[2]軟件編程規(guī)范?徐人鳳?孫宏偉?王梅?2005年7月高等教育出版社
?[3]《SQL Server數(shù)據(jù)庫(kù)開發(fā)經(jīng)典案例解析?》,清華大學(xué)出版社,2006年
?[4]《SQL SERVER 2000開發(fā)與應(yīng)用》,機(jī)械工業(yè)出版社,2003年7月
[5]《數(shù)據(jù)庫(kù)系統(tǒng)概論(第三版)?薩師煊????王珊
總結(jié)
以上是生活随笔為你收集整理的数据库课程设计报告(仓库管理系统)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 判断系统大小字节序
- 下一篇: 返利是什么意思