数据库课程设计报告(仓库管理系统)
原文:http://blog.chinaunix.net/uid-13874038-id-191915.html
三?概要設計
3.1???E—R圖和相關說明
?
類別(類別編號,類別名稱,上級類別)
倉庫(倉庫編號,隸屬單位,備注)
用戶(用戶名,密碼,權限類型);
客戶(客戶編號,聯系人,單位,聯系電話,傳真,通信地址,郵政編碼)
?
產品(編號,名稱,規格,計算單位,參考價格,數量下限,數量下限,有效期,警告
?
出庫(出庫類型,產品類型,單價,數量,總價格,客戶單位,出庫倉庫,經辦用戶,出庫日期)
入庫(入庫類型,產品名稱,生產日期,單價,數量,總價格,客戶單位,入庫倉庫,經辦用戶,入庫日期)
庫存(產品入庫單價,庫存數量,生產日期)
四??邏輯設計
(一)、表的定義如下 :
Client表(客戶信息表)?????????Product(產品信息表)
?
ProinStore(庫存信息表)????????Takeout(出庫表)
?
?
StoreIn(入庫表)??????????????Users(用戶表)
?
?
ProType(產品類型表)???????Storehouse(倉庫信息表)
??
?(二)、視圖定義如下:
一、report2(報表視圖)
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
二、 庫存統計視圖
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
三、庫存視圖
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
四、入庫視圖
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
五、出庫視圖
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
六、失效期統計視圖
CREATE VIEW dbo.Valid
AS
SELECT dbo.ProInStore.SpId AS?庫存記錄編號, dbo.Product.Pname AS?產品名稱,
??????dbo.ProInStore.Pprice AS?產品價格, dbo.ProInStore.Pnum AS?產品數量,
??????dbo.ProInStore.MakeDate AS?生產日期, dbo.Storehouse.Sname AS?倉庫名稱,
??????ROUND(DATEDIFF(day, DATEADD(day, dbo.Product.Valid, dbo.ProInStore.MakeDate),
??????GETDATE()), 0) AS?距離失效期的天數
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
五?詳細設計
總體模塊設計如下:
?
模塊一(基本信息管理)(由本人完成)
?
準備工作:
一完成對數據庫連接和操作的類
????#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace???????????rename("EOF","adoEOF") rename("BOF","adoBOF")
?class ADOConn?
{//?定義變量
public:
_ConnectionPtr m_pConnection; //添加一個指向Connection對象的指針:
???????_RecordsetPtr m_pRecordset; //添加一個指向Recordset對象的指針:
public: //?定義方法
ADOConn();
???????virtual ~ADOConn();????//?初始化—連接數據庫
void??OnInitADOConn();
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); //?執行查詢
BOOL ExecuteSQL(_bstr_t bstrSQL); //?執行SQL語句,Insert Update _variant_t
void ExitConnect();
void Backup();???//備份數據庫
void Restore();//恢復數據庫};
一、用戶登陸:
??
實現代碼如下:
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("請輸入用戶名");
??????????????return;}
if (m_Pwd == ""){
??????????????MessageBox("請輸入密碼");
??????????????return;}
???????//定義CUsers對象,用于從表Users中讀取數據
???????CUsers user;
???????user.GetData(m_UserName);
?//如果讀取的數據與用戶輸入數據不同,則返回
???????if (user.GetPwd() != m_Pwd)
???????{???if (count<3)
????????????????{MessageBox("用戶信息不正確,無法登錄!");
????????????????????count++;
?????????????????m_Pwd.Empty();
?????????????????????m_control_password.SetFocus();
??????????????????UpdateData(FALSE);}
????????????????else
????????????????{
???????????????????????????MessageBox("你可能是非法用戶!","警告",MB_OK|MB_ICONHAND);
????????????????????????????exit(0); }}else{KillTimer(0);CDialog::OnOK();}}
二、客戶的實現代碼
void CClientManDlg::Refresh_Data()
{
????UpdateData(TRUE); //將控件的值讀取到成員變量中
????CString cSource;
????CString cCtype;??//讀取客戶類型值
????cCtype.Format("%d", m_Ctype.GetCurSel() + 1);
????//設置SELECT語句,按客戶單位排序
????cSource = "SELECT Cid, Cname AS?客戶單位, Contact AS?聯系人, Address AS?通信地址,";
????cSource += " Postcode AS?郵政編碼, Phone AS?聯系電話, Fax AS?傳真電話, Memo AS?備注";
????cSource += " FROM Client WHERE Ctype=" + cCtype + " ORDER BY Cname";
????m_adodc.SetRecordSource(cSource);
????m_adodc.Refresh();
????//設置表格列寬度
????_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);??//設置客戶類型
????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);
????//打開編輯對話框
????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("請選擇要修改的記錄");
????????return;
????}
????UpdateData(TRUE);
????CClientEditDlg dlg;
????dlg.cCid = m_datagrid.GetItem(0); //記錄編號
????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); //聯系人
????dlg.m_Address = m_datagrid.GetItem(3); //通信地址
????dlg.m_Postcode = m_datagrid.GetItem(4); //郵政編碼
????dlg.m_Phone = m_datagrid.GetItem(5); //聯系電話
????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("請選擇要刪除的記錄");
????????return;
????}
????CString Cid;
????Cid = m_datagrid.GetItem(0);
????CStoreIn obj;
????if (obj.HaveClient(Cid) == 1)
????{
????????MessageBox("客戶出現在入庫單中,不能刪除");
????????return;
????}
????CTakeOut obj1;
????if (obj1.HaveClient(Cid) == 1)
????{
????????MessageBox("客戶出現在出庫單中,不能刪除");
????????return;
????}
???
????if (MessageBox("是否刪除當前記錄","請確定", MB_YESNO) == IDYES)
????{
????????CClient clt;
????????clt.sql_delete(m_datagrid.GetItem(0));
????????Refresh_Data();
????}??
}
三、倉庫信息管理
void CStoreHouseManDlg::Refresh_Data()
{
????UpdateData(TRUE);
????CString cSource;
?
????cSource = "SELECT Sid, Sname AS?倉庫單位, Memo AS?備注";
????cSource += " FROM Storehouse ORDER BY Sname";
????m_adodc.SetRecordSource(cSource);
????m_adodc.Refresh();
????//設置表格列寬度
????_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);
????//打開編輯對話框
????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("請選擇要修改的記錄");
????????return;
????}
????UpdateData(TRUE);
????CStoreHouseEditDlg dlg;
????dlg.cSid = m_datagrid.GetItem(0); //記錄編號
????dlg.m_Sname = m_datagrid.GetItem(1); //倉庫名稱
????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("請選擇要刪除的記錄");
????????return;
????}
????CString Sid;
????Sid = m_datagrid.GetItem(0);
????CStoreIn obj;
????if (obj.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉庫信息出現在入庫單中,不能刪除");
????????return;
????}
????CTakeOut obj1;
????if (obj1.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉庫信息出現在出庫單中,不能刪除");
????????return;
????}
????CProInStore obj2;
????if (obj2.HaveStore(Sid) == 1)
????{
????????MessageBox("此倉庫信息出現在庫存產品信息中,不能刪除");
????????return;
????}
????if (MessageBox("是否刪除當前記錄","請確定", 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("請選擇用戶");
????????return;
????}
????if (curUser.GetUserName() != "Admin" && curUser.GetUserName() != m_datalist.GetText()
????????&& m_datalist.GetBoundText() == "1")
????{???//除Admin外,其他管理員只能修改普通用戶信息
????????MessageBox("只能對普通用戶進行密碼復位");
????????return;
????}
????if (MessageBox("是否對當前用戶進行密碼復位","請確認", MB_YESNO) == IDYES){?????CUsers usr;
????????usr.SetPwd("888888"); //設置默認密碼
????????usr.sql_updatePwd(m_datalist.GetText());
????????MessageBox("密碼已經復位");}}
void CUserManDlg::OnDelButton()
{ if (m_datalist.GetText() == ""){
????????MessageBox("請選擇用戶");
????????return;}
????if (curUser.GetUserName() != "Admin" && m_datalist.GetBoundText() == "1"){??//除Admin外,其他管理員只能刪除普通用戶
????????MessageBox("只能刪除普通用戶");
????????return;}if (m_datalist.GetText() == "Admin"){
????????MessageBox("不能刪除Admin用戶");
????????return;}
????if (MessageBox("是否刪除當前用戶","請確認", MB_YESNO) == IDYES)
????{???CUsers usr;
????????usr.sql_delete(m_datalist.GetText());
????????m_adodc.Refresh();}?}
五、用戶密碼修改
void CChangePwdDlg::OnOK()
{//將對話框中編輯框的數據讀取到成員變量中
????UpdateData(TRUE);
????//檢查數據有效性
????if (m_OldPwd == "")
????{
????????MessageBox("請輸入舊密碼");
????????return;
????}
????if (m_NewPwd1 == "")
????{
????????MessageBox("請輸入新密碼");
????????return;
????}
????if (m_NewPwd1 != m_NewPwd2)
????{
????????MessageBox("兩次輸入的新密碼不同");
????????return;
????}
?
????//定義CUsers對象,用于從表Users中讀取數據
????CUsers user;
????user.GetData(m_UserName);
????//如果讀取的數據與用戶輸入數據不同,則返回
????if (user.GetPwd() != m_OldPwd)
????{
????????MessageBox("用戶密碼不正確!");
????????return;
????}??
???
????user.SetPwd(m_NewPwd1);
????user.sql_updatePwd(m_UserName);
???
????MessageBox("密碼修改成功,下次登錄請使用新密碼");
?
????CDialog::OnOK();
}
七?測試結果
一、進入系統
????
輸入密碼正確進入主界面
二、進入主界面
三、進入客戶信息管理
點擊添加按鈕????????????????????
選中要修改的表項
如下:
點擊修改:
同樣選中要刪除的表項????點擊刪除得到如下
點擊確定即可刪除,不想刪除點擊“否”。
?
?
?
?
四、進入倉庫管理
操作步驟相同不在贅述了。
五、進入用戶管理???????六、進入用戶密碼修改
八?小結
在這次課程設計中,讓我學到了很多在課堂和書本上學不到的知識,我在這次課程設計中最大的收獲有以下幾個方面:
一、領略到了數據庫設計在計算機領域的重要性。數據庫作為一個永久存儲形式在應用中發揮著重要的作用。在數據庫設計中,我明白了數據庫設計中不是范式越高越好的。我們要根據我們的應用來決定,一切應該以需求為首要選擇。
?二、對變成環境、一些控件的使用和界面的美化方面更加熟悉。因為《倉庫管理系統》中涉及到很多控件的使用,只有很好的使用這些控件才可以給出一個很好的界面呈現在用戶的面前。這樣更有利于數據庫和用戶之間的交流。這里就要涉及一些平時不太常見的控件的使用問題。為了更好的在系統中利用這些控件,我上網查詢了一些關于控件使用的資料,最主要的是MSDN上面、還有借了一些這方面的書籍。在界面的美化方面,我了解了一些WINDOWS自定義界面的知識,現在的軟件其實好多面向用戶的時候用戶首先看的就是一個軟件的界面是否有好,是否漂亮。其實,界面美化是很重要的。因為美,是人一直追求的。主要知識有:自定義窗口形狀,按鈕的3D效果,控件的自定義等等。這些都是通過面向對象編程的一些特性實現的,又得是通過多態,又得是通過類的繼承。
三、利用軟件工程學開發系統。雖然這個《倉庫管理系統》是一個小的系統,但只有從這些小的項目中就利用軟件工程學的知識,這樣可以開發在系統設計和實現中我們可以總結很多經驗和教訓。我們一般按照瀑布開發模型、增量模型、?螺旋模型來做我們的項目。
參考文獻
?[1]SQL Server 2000數據庫及應用?徐人鳳?曾建華?高等教育出版社?2004年1月
?[2]軟件編程規范?徐人鳳?孫宏偉?王梅?2005年7月高等教育出版社
?[3]《SQL Server數據庫開發經典案例解析?》,清華大學出版社,2006年
?[4]《SQL SERVER 2000開發與應用》,機械工業出版社,2003年7月
[5]《數據庫系統概論(第三版)?薩師煊????王珊
總結
以上是生活随笔為你收集整理的数据库课程设计报告(仓库管理系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 判断系统大小字节序
- 下一篇: 把oa系统部署到云服务器,oa系统怎么部