版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
/分布式數(shù)據(jù)庫課程設(shè)計和實現(xiàn)——面對連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計和實現(xiàn)學院:計算機學院專業(yè):計算機科學和技術(shù)專業(yè)組長:張王成2120111220組員:耿丙輝2120111140閆高潔2120111212李杰2120111157石玉龍2120111246日期:2011年11月27日書目1. 連鎖超市管理系統(tǒng)概述 11.1 背景介紹 11.2可行性分析 11.3系統(tǒng)目標和先進之處 21.4小組成員和任務支配 32. 需求分析 42.1用戶需求概述 42.2業(yè)務需求分析 52.3功能分析 63. 系統(tǒng)總體設(shè)計 83.1繪制用例圖設(shè)計系統(tǒng)功能 83.2繪制系統(tǒng)流程圖 93.3系統(tǒng)開發(fā)環(huán)境 103.4系統(tǒng)的運行環(huán)境 113.5系統(tǒng)運行演示 113.6系統(tǒng)類庫設(shè)計 144. 分布式數(shù)據(jù)庫分析和設(shè)計 164.1數(shù)據(jù)庫分析 164.2數(shù)據(jù)庫概念設(shè)計 164.3數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計 204.4分片和位置支配設(shè)計 24站點通信模型 24數(shù)據(jù)表的分片和位置支配設(shè)計 255. 基于SQL的SMS的詳細設(shè)計(實現(xiàn)) 275.1公共類設(shè)計 27文件操作類CFileOperate 27時間格式轉(zhuǎn)換類CMyTime 29數(shù)據(jù)操作類CADOConn 29數(shù)據(jù)庫表的操作類CtablePartInfo 375.2界面窗口設(shè)計 41系統(tǒng)啟動登錄開發(fā) 41主界面對話框設(shè)計 43通用報表對話框設(shè)計開發(fā) 44打印對話框設(shè)計開發(fā) 465.3基本資料模塊設(shè)計 485.3.1基本資料管理功能開發(fā) 485.3.2價格自動生成功能開發(fā) 525.3.3報表功能實現(xiàn) 545.4進貨/銷售模塊設(shè)計 55進貨/銷售登記設(shè)計 55進貨設(shè)計 59月度統(tǒng)計設(shè)計 615.5庫存模塊設(shè)計 625.5.1庫存查詢功能開發(fā) 625.5.2庫存報警功能開發(fā) 636. 開發(fā)技巧和難點分析 646.1OLE技術(shù)運用 646.2MFCGridControl控件的運用 65連鎖超市管理系統(tǒng)概述背景介紹隨著市場經(jīng)濟的發(fā)展和人民生活水平的提高,原來單一、小規(guī)模的超市已無法滿足人民對購物環(huán)境的要求,大規(guī)模、物品豐富的超市正在蓬勃發(fā)展。超市銷售數(shù)據(jù)規(guī)模的日益浩大,商品數(shù)目的快速增長,接受以往的手工管理已干脆或間接地降低了工作效率,最終影響超市的日常運轉(zhuǎn)。另外超市的發(fā)張壯大,尤其是連鎖超市(如家樂福、美廉美)的擴張,使得他們具有地域上分散而管理上又相對集中的特點,往往既要有各門店的局部限制和分散管理,同時也要有整個組織的全局限制和高層次的協(xié)同管理。因此把這些門店和中心通過網(wǎng)絡(luò)連接起來,設(shè)計開發(fā)一款基于分布式數(shù)據(jù)庫的連鎖超市管理系統(tǒng)SMS(Supermarketmanagementsystem)勢在必行。1.2可行性分析(1)經(jīng)濟可行性運用連鎖超市管理系統(tǒng)對超市連鎖店進行信息化管理將干脆提高公司管理部門的工作效率。通過網(wǎng)絡(luò)遠程提交匯總各門店的信息,節(jié)約了許多的時間和金錢。另一方面,用信息化管理統(tǒng)計大量數(shù)據(jù),節(jié)約了許多的人力和財力,為管理者供應更好的決策支持。(2)技術(shù)可行性網(wǎng)絡(luò)應用基礎(chǔ)設(shè)施完善,由于信息技術(shù)的發(fā)展,我國的計算機網(wǎng)絡(luò)飛速發(fā)展,先后建成了中國公眾多媒體通信網(wǎng)、ChinaNet、中國教化和科研計算機網(wǎng)絡(luò)等組成了中國Internet主體,網(wǎng)絡(luò)應用進入企業(yè)和一般家庭,這為發(fā)展連鎖超市網(wǎng)絡(luò)辦公供應了基礎(chǔ)設(shè)施。網(wǎng)絡(luò)平安技術(shù)應用,包括加密算法、CA數(shù)字認證、數(shù)字簽名等,為網(wǎng)絡(luò)辦公系統(tǒng)的應用供應平安保證,它實現(xiàn)了網(wǎng)絡(luò)傳輸數(shù)據(jù)的平安性、完整性等。最終,就是網(wǎng)絡(luò)技術(shù)的普及和駕馭,如網(wǎng)絡(luò)互聯(lián)、網(wǎng)絡(luò)平安技術(shù)、網(wǎng)絡(luò)數(shù)據(jù)庫技術(shù)等,使我們有實力開發(fā)實現(xiàn)適合自己的管理系統(tǒng)。因此,公司構(gòu)建跨區(qū)域的管理系統(tǒng)的技術(shù)瓶頸問題(網(wǎng)絡(luò)應用基礎(chǔ)設(shè)施、網(wǎng)絡(luò)平安、開發(fā)技術(shù))得到了有效解決,公司構(gòu)建網(wǎng)絡(luò)管理系統(tǒng)技術(shù)上可行。(3)操作可行性由于SMS的操作是基于C/S的客戶端的頁面操作,簡潔明白,用戶無需學習,一般都能夠很簡潔的知道如何操作。而管理員也無需具備專業(yè)學問,只須要對一些數(shù)據(jù)進行輸入以及平常的日常維護就夠了。1.3系統(tǒng)目標和先進之處(1)系統(tǒng)目標為連鎖超市提高效率、降低成本;實現(xiàn)連鎖超市管理的優(yōu)化,簡化工作流程,節(jié)約人力物力,提高工作效率,極大地滿足客戶須要;對各環(huán)節(jié)進行限制分析,實現(xiàn)統(tǒng)一調(diào)度。滿足連鎖超市的基本管理功能,發(fā)揮信息系統(tǒng)的靈敏性,減輕企業(yè)管理人員和操作人員的工作負擔,提高工作效率。本系統(tǒng)是一項功能比較完善的連鎖超市管理系統(tǒng),對連鎖店運作過程中的后臺數(shù)據(jù)可以隨時進行分析,便于企業(yè)管理人員的經(jīng)營、決策。全面體現(xiàn)了現(xiàn)代企業(yè)管理理論所提倡的工作高效、環(huán)境輕松的氛圍。(2)系統(tǒng)先進之處多數(shù)處理就地完成。各地的計算機由數(shù)據(jù)通信網(wǎng)絡(luò)相聯(lián)系??朔酥行臄?shù)據(jù)庫的弱點:降低了數(shù)據(jù)傳輸代價。提高了系統(tǒng)的牢靠性,局部系統(tǒng)發(fā)生故障,其他部分還可接著工作。各個數(shù)據(jù)庫的位置是透亮的,便利系統(tǒng)的擴充。為了協(xié)調(diào)整個系統(tǒng)的事務活動,事務管理的性能花費高。1.4小組成員和任務支配任務支配成員姓名任務支配、組織調(diào)度調(diào)查、明確連鎖超市的需求和業(yè)務流程系統(tǒng)總體設(shè)計系統(tǒng)的編碼實現(xiàn)設(shè)計文檔的最終排版、批閱張王成建立實體-關(guān)系模型,E-R圖的繪制UML建模中的用例的分析設(shè)計、用例圖的繪制數(shù)據(jù)庫支配和分片的概要設(shè)計,相關(guān)圖例的繪制設(shè)系統(tǒng)聯(lián)合測試石玉龍調(diào)查、明確連鎖超市的需求和業(yè)務流程基于SQLserver和Access的分布式數(shù)據(jù)庫實現(xiàn)系統(tǒng)的編碼實現(xiàn)耿丙輝基于SQLserver和Access的分布式數(shù)據(jù)庫實現(xiàn)系統(tǒng)的編碼實現(xiàn)匯報PPT制作,項目最終成果匯報閆高潔核心數(shù)據(jù)庫表的設(shè)計系統(tǒng)通信模型的建立,相關(guān)圖例的繪制數(shù)據(jù)庫支配和分片的概要設(shè)計,相關(guān)圖例的繪制系統(tǒng)聯(lián)合測試李杰需求分析2.1用戶需求概述下面是通過調(diào)查探討獲得的關(guān)于連鎖超市主要信息數(shù)據(jù)的需求分析結(jié)果:(1)連鎖超市通常由一個中心(公司總部)、多個遠程連鎖店(門店)組成,并且每個連鎖店分布在不同地域。(2)連鎖超市的各個部門之間、各個分店之間、分店和總部之間須要交換數(shù)據(jù),這種數(shù)據(jù)交換是通過局域網(wǎng)和廣域網(wǎng)進行的。(3)公司總部負責產(chǎn)生并管理該連鎖超市的整體匯總數(shù)據(jù),即各門店的明細匯總表數(shù)據(jù),如銷售匯總表等。(4)每一個遠程站點(各門店和公司總部)分別有一個數(shù)據(jù)庫系統(tǒng),各自組成一個獨立的子系統(tǒng),可以分別獨立進行本部門業(yè)務處理。(5)總部為了便于對各店進行管理,同時也為了比較各店的銷售狀況,要求門店將全部商品歸入相應的商品類別,由總部統(tǒng)一管理并供應各門店運用,而且,商品類別信息數(shù)據(jù)在各門店都要經(jīng)常運用。(6)有關(guān)商品信息、供應商信息、POS機信息、進貨信息和銷售信息等經(jīng)營基礎(chǔ)數(shù)據(jù)都是各門店單獨管理和運用,門店之間互不相關(guān)。(7)整個連鎖超市的職員信息由公司總部管理和維護,各門店只可以查詢本部門的職員信息。2.2業(yè)務需求分析通過對超市的營業(yè)、管理業(yè)務流程的調(diào)查,得到下面的業(yè)務需求??梢詫ι唐奉悇e、商品、供應商、POS機等基礎(chǔ)信息進行管理??梢詫崿F(xiàn)選購 開單、銷售開單、選購 退貨、銷售退貨等基本功能。軟件可依據(jù)商品資料中設(shè)置的最高庫存、最低庫存進行庫存報警。商品的批發(fā)價、零售價可自動生成,減輕定價的工作量??梢陨筛黝惤y(tǒng)計報表,供應詳盡的營業(yè)報告,實現(xiàn)對商品進、銷、存及利潤等財務狀況了如指掌。全部單據(jù)、報表均可以在打印前預覽,并且可以導出為Excel文件,然后依據(jù)實際須要進行特別的編排處理。為了系統(tǒng)平安,每次用戶登錄都創(chuàng)建相應的日志文件,記錄用戶的全部操作。此外,對系統(tǒng)的性能主要有以下幾個方面的需求。系統(tǒng)在設(shè)計過程中應充分考慮到可擴充性,要求操作界面美觀大方,簡潔上手。2.3功能分析依據(jù)對系統(tǒng)的業(yè)務調(diào)查和用戶的需求分析,結(jié)合計算機信息管理的特點,設(shè)計系統(tǒng)實現(xiàn)的功能如下?;A(chǔ)信息管理基礎(chǔ)信息管理包括業(yè)種商品類別信息、商品信息、供應商信息、POS機信息和價格信息維護和管理,實現(xiàn)的功能包括:基本信息的添加、刪除和更新操作。生成各類基礎(chǔ)信息報表。打印和導出報表。進貨管理進貨管理主要實現(xiàn)對商品的選購 入庫信息進行管理,詳細實現(xiàn)功能如下:進貨開單,實現(xiàn)商品的進貨結(jié)算、入庫操作。進貨退貨,退還商家相關(guān)的商品。生成進貨、退貨的單據(jù)、商品報表。打印和導出報表。銷售管理銷售管理主要實現(xiàn)對商品的銷售出庫相關(guān)信息進行管理,詳細實現(xiàn)的功能如下:銷售開單,實現(xiàn)商品的銷售結(jié)算、出庫操作。銷售退貨,允許客戶退出相關(guān)的商品。生成銷售、銷售退貨的單據(jù)、商品報表。打印和導出報表。庫存管理庫存管理主要實現(xiàn)對商品的庫存相關(guān)信息進行管理,詳細實現(xiàn)的功能如下:庫存查詢,可以查看全部庫存商品的相關(guān)信息。庫存報警,對庫存過多或過少的商品進行報表統(tǒng)計。庫存盤點,可以修改商品的庫存數(shù)量。帳務管理帳務管理主要實現(xiàn)對營業(yè)員的銷售商品、業(yè)務提成、營業(yè)收入等狀況進行分類報表統(tǒng)計。數(shù)據(jù)管理數(shù)據(jù)管理主要實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)進行備份、還原及清理等相關(guān)工作。系統(tǒng)管理系統(tǒng)管理主要實現(xiàn)登錄用戶(職員)管理、系統(tǒng)日志、修改登錄密碼等相關(guān)工作。系統(tǒng)總體設(shè)計3.1繪制用例圖設(shè)計系統(tǒng)功能用例圖表示了角色和用例以及它們之間的關(guān)系。它描述了系統(tǒng)、子系統(tǒng)和類的一樣的功能集合,表現(xiàn)為系統(tǒng)和一個或多個外部交互者(角色)的消息交互動作序列。也就是角色(用戶或外部系統(tǒng))和系統(tǒng)(要設(shè)計的系統(tǒng))為了實現(xiàn)一個目的交互,這個目的的描述通常是一個謂詞短語,例如簽合同等。系統(tǒng)設(shè)計包含超級管理員、管理員和營業(yè)員四種用戶角色。超級管理員具有全部的操作權(quán)限,其用例圖如圖3-1所示。圖3-1超級管理員角色系統(tǒng)用例圖管理員不具備系統(tǒng)設(shè)置模塊中的用戶管理和商品類別信息管理功能,其他功能均具備。而銷售人員則只具有銷售開單管理功能。3.2繪制系統(tǒng)流程圖結(jié)合系統(tǒng)的詳細設(shè)計要求,連鎖超市管理系統(tǒng)的主要功能流程圖如圖3-2所示。圖3-2系統(tǒng)主要功能流程圖系統(tǒng)首先對登錄用戶身份進行驗證,依據(jù)用戶的權(quán)限激活相關(guān)功能。超級管理員具有全部的操作權(quán)限,系統(tǒng)的功能結(jié)構(gòu)圖如圖3-3所示。圖3-3系統(tǒng)功能結(jié)構(gòu)圖上圖只是列出了一些主要功能,系統(tǒng)還能夠依據(jù)不同需求生成各種統(tǒng)計報表。3.3系統(tǒng)開發(fā)環(huán)境本系統(tǒng)是在WindowsXP中文版操作系統(tǒng)環(huán)境下,運用MicrosoftVisualStudio2008中文版用C++語言開發(fā)成功的。在開發(fā)過程中,運用了OLE技術(shù)和ActiveX控件技術(shù)。后臺數(shù)據(jù)庫系統(tǒng)設(shè)計接受的是Microsoft的SQLServer2005和Access數(shù)據(jù)庫系統(tǒng),通過ADO數(shù)據(jù)庫開發(fā)技術(shù),干脆操作數(shù)據(jù)庫文件。3.4系統(tǒng)的運行環(huán)境系統(tǒng)可以干脆在Win98、Win2000、WinXP環(huán)境下運行。系統(tǒng)預設(shè)的超級管理員用戶名為“admin”,密碼為“admin”。3.5系統(tǒng)運行演示程序啟動,首先彈出如圖3-4所示的“系統(tǒng)登錄”對話框,只有輸入正確的用戶ID、登錄密碼才能進入系統(tǒng)能夠。圖3-4“系統(tǒng)登錄”對話框假如登錄用戶為超級管理員或管理員,會進入系統(tǒng)的主界面窗口,如圖3-5所示。圖3-5系統(tǒng)的主界面窗口假如登錄用戶權(quán)限為營業(yè)員,由于其只具有售貨權(quán)限,因此系統(tǒng)會干脆彈出“銷售開單”對話框,如圖3-6所示。圖3-6“銷售開單”對話框在進行相關(guān)操作前,首先須要添加、設(shè)置一些基本資料,如商品分類登記,其操作設(shè)置對話框,如圖3-7所示。圖3-7“商品分類登記”對話框另外,系統(tǒng)還供應了豐富的報表功能,如圖3-8所示的商品分類報表,同時對報表供應了導出到Excel文件和打印的功能。圖3-8商品分類報表對話框3.6系統(tǒng)類庫設(shè)計BITVRLab超市管理系統(tǒng)主框架的設(shè)計是通過MFC創(chuàng)建向?qū)?chuàng)建的基于對話框的窗口程序,在對話框程序中添加了菜單欄,系統(tǒng)的主要類庫設(shè)計如下。自定義擴展類:為了提高開發(fā)效率、便于代碼重用,自定義了一些數(shù)據(jù)操作類和控件擴展類,如表3-1所示。表3-1自定義擴展類及功能類說明CADOConn通過ADO實現(xiàn)對ACCESS、SqlServer等數(shù)據(jù)庫的訪問CtablePartInfo依據(jù)數(shù)據(jù)庫表的支配、分片信息,實現(xiàn)對數(shù)據(jù)庫表的增、刪、改、查CFileOperate實現(xiàn)對硬盤文件的常用操作CMyChiToLetter實現(xiàn)依據(jù)逐字提取漢字拼音的首字母CMyButtonCButton類的派生類,實現(xiàn)帶有位圖和文本的按鈕CMyMenuCMenu類的派生類,用于定制自己的菜單CMenuItemContextCMenu類中用到此類,用于保存菜單項的信息CMyTime實現(xiàn)簡潔的時間格式的轉(zhuǎn)換CMyExcel完成VC對Excel文件的操作對話框窗口類:在系統(tǒng)中,用戶全部的數(shù)據(jù)查詢、操作都是通過對話框窗口來實現(xiàn)的,系統(tǒng)開發(fā)的對話框類如表3-2所示。表3-2對話框類及說明類說明CDlgFenJiBasePOS機基本信息管理對話框類CShopManageDlg主框架對話框類CDlgFenLeiBase商品分類基本信息管理對話框類CDlgDanganBase商品基本信息管理對話框類CDlgGongYingShangBase供應商基本信息管理對話框GDlgJiaGeSheZhi價格自動設(shè)置對話框類CDlgJinHuoKanDan商品進貨開單管理對話框類CDlgJinHuoTuiDan商品進貨退單管理對話框類CDlgXiaoShouKanDan商品銷售開單管理對話框類CDlgXiaoShouTuiDan商品銷售退單管理對話框類CDlgAll用于查找信息顯示對話框類CDlgReport用于報表顯示對話框類CDlgLogo用戶登錄對話框類CDlgPwd更改密碼對話框類CDlgQuit退出系統(tǒng)提示對話框類打印相關(guān)類:系統(tǒng)能夠供應了報表的打印和打印預覽功能,其相關(guān)的設(shè)計類如表3-3所示。表3-3打印相關(guān)類及說明類說明CPrintFrameCFrameWnd派生類,用于構(gòu)建打印框架類CPrintView打印視圖類另外,系統(tǒng)還包含一些主框架相關(guān)類、導入ActiveX控件(MFCGridControl)相關(guān)類和導入OLE對象(Excel)相關(guān)類。分布式數(shù)據(jù)庫分析和設(shè)計4.1數(shù)據(jù)庫分析考慮到總站點的信息量大接受SQLServer2005數(shù)據(jù)庫,而區(qū)域站點信息量相對較小接受Access數(shù)據(jù)庫。當區(qū)域業(yè)務拓展,操作終端增加時,Access數(shù)據(jù)庫也很簡潔的移植到SQLServer數(shù)據(jù)庫系統(tǒng)中。另外區(qū)域站點接受Access數(shù)據(jù)庫可以實現(xiàn)便利的部署。4.2數(shù)據(jù)庫概念設(shè)計分析超市管理功能流程,系統(tǒng)的數(shù)據(jù)實體主要包括基本資料對象實體、庫存實體、進貨/銷售開單、進貨/銷售退單、進貨/銷售商品實體、各站點數(shù)據(jù)庫服務器IP信息實體、數(shù)據(jù)庫表支配分片信息實體等?;举Y料對象實體包括商品類別、商品明細、供應商、POS機和登錄用戶實體。商品庫存實體記錄庫存商品的數(shù)量和價格信息,其實體的E-R圖如下。商品進貨單實體用于記錄進貨單的統(tǒng)計信息,其實體的E-R圖如下所示。進貨商品實體用于記錄進貨單對應的商品信息,其實體的E-R圖如下所示。進貨退單實體用于記錄進貨退單信息,其實體的E-R圖如下所示。和進貨相對應的銷售單實體、銷售商品實體和銷售退單實體的E-R圖如下所示。各站點數(shù)據(jù)庫服務器IP信息,記錄各個區(qū)域數(shù)據(jù)庫服務器對應的IP地址,其實體的E-R圖,如下圖所示。數(shù)據(jù)庫表支配分片信息,記錄數(shù)據(jù)中全部的表的分布式支配和分片信息,其實體E-R圖,如圖所示。4.3數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計商品類別表、商品明細表、供應商表、POS機表、登錄用戶表、庫存表、進貨/銷售開單表、進貨/銷售商品表、進貨/銷售退貨商品表、IP地址登錄信息表、數(shù)據(jù)庫表的支配和分片信息。商品類別表:商品明細表:供應商表:POS機表:用戶表:庫存表:進貨單表:進貨商品表:進貨商品退單表:銷售單表:銷售商品表:銷售商品退單表:服務器IP信息表:分片及分布信息表:4.4分片和位置支配設(shè)計站點通信模型在我們的連鎖超市管理系統(tǒng)中,有一個總店并下分多個分店,總店和分店之間或分店和分店之間都可以進行通信。每個分店是一個相對獨立的數(shù)據(jù)庫服務系統(tǒng),其可以連接隨意數(shù)量的客戶端。通信模型如下圖所示:4.4.2數(shù)據(jù)表的分片和位置支配設(shè)計依據(jù)以上得到的關(guān)于主要信息數(shù)據(jù)的需求分析結(jié)果,為該連鎖超市系統(tǒng)的分布式數(shù)據(jù)庫系統(tǒng)進行主要信息數(shù)據(jù)的分片和支配設(shè)計如下:1、數(shù)據(jù)的分片設(shè)計(1)由于該連鎖超市系統(tǒng)的各連鎖店之間在經(jīng)營上是獨立的,每個門店只關(guān)切自己的經(jīng)營狀況,有關(guān)供應商信息、POS機信息、商品信息和進貨/銷貨信息等基礎(chǔ)數(shù)據(jù)都是各門店單獨管理和運用,門店之間互不相關(guān)。因此,商品明細表、供應商表、POS機表、庫存表、進貨/銷售開單表、進貨/銷售商品表、進貨/銷售退貨商品表依據(jù)地域(門店所在區(qū)域標記)接受水平分片的方法得到水平片段。(2)這里我們對于商品信息進行了垂直分片,分成了商品明細表和庫存表,因為商品的某些屬性,例如庫存量等須要經(jīng)常更新,因此將這些屬性劃分出來構(gòu)成單獨的實體可以削減系統(tǒng)開銷。(3)由于整個連鎖超市的職員信息由總公司管理和維護,各門店只可以查詢本店的職員信息。所以職員信息不必分片,可以接受視圖的形式供應應各門店查詢本門店的職員信息。另外,各個區(qū)域數(shù)據(jù)庫服務器的IP地址信息也只是由總部管理、維護,所以也不必分片。(4)由于商品分類數(shù)據(jù)由總部統(tǒng)一管理并供應各門店運用,而且,商品類別信息數(shù)據(jù)在各門店都要經(jīng)常運用。因此,商品類別信息數(shù)據(jù)也不必分片。(5)該分布式數(shù)據(jù)庫系統(tǒng)實現(xiàn)了簡潔的書目管理,記錄數(shù)據(jù)庫中各個表的分片和支配信息,以便數(shù)據(jù)更新時,維護各個站點上數(shù)據(jù)的一樣性。這個表由總部規(guī)劃建立,各門店也會經(jīng)常運用。因此,數(shù)據(jù)庫書目信息表也不必分片。2、數(shù)據(jù)及其片段的支配設(shè)計(1)對于只在各門店單獨運用的除商品類別信息和數(shù)據(jù)庫書目信息以外的其他基礎(chǔ)信息的片段,接受按區(qū)域分片然后支配到各個門店的數(shù)據(jù)庫服務器上??傉旧嫌腥块T店的全部信息。(2)整個系統(tǒng)的職員信息、IP地址信息由公司總部管理和維護,所以只支配在總部站點中。(3)商品類別信息、數(shù)據(jù)庫書目信息是由總部統(tǒng)一規(guī)定并下發(fā)到各門店的,由于各店經(jīng)常會運用到這類基礎(chǔ)信息,因此在各門店都具有相同的副本。所以,商品類別信息、數(shù)據(jù)庫書目信息都不會分片但被復制,且復制的個數(shù)為門店的個數(shù)?;赟QL的SMS的詳細設(shè)計(實現(xiàn))5.1公共類設(shè)計為了提高程序代碼的開發(fā)效率,便于代碼重用,在系統(tǒng)開發(fā)中,創(chuàng)建了一些數(shù)據(jù)操作類和控件擴展類。5.1.1文件操作類CFileOperate為了便于對硬盤文件的操作,開發(fā)了文件操作類CFileOperate,它通過調(diào)用API函數(shù)實現(xiàn)常用的文件操作。CFileOperate類的聲明代碼如下。externCStringstrTmpPath;classCFileOperate{public: //構(gòu)造函數(shù) CFileOperate(); //取得當前程序運行的路徑 CStringGetAppPath(); //推斷是否存在strFn文件夾 BOOLIsFileExist(CStringstrFn,BOOLbDir); //制作strFloderName文件夾返回文件夾名 CStringMakeDirectory(CStringstrFloderName); //自動生成文件夾 CStringMakeDirectory(); //得到文件夾名為strFloderName的路徑 CStringGetDirectoryPath(CStringstrFloderName); //刪除strFloderdName文件夾 voiddelDirectory(CStringstrFloderdName); //刪除主文件夾(data) voiddelMainDirectory(); //制作主文件夾 voidMakeMainDirectory(); //推斷strIntDigit是否為整數(shù),是否小于intBig BOOLCheckIntDigit(CStringstrIntDigit,intintBig); //推斷strFileName是否可以做文件夾或文件的名字 BOOLCheckFileName(CStringstrFileName); //推斷strText是否為空 BOOLCheckEmpty(CStringstrText); //刪除strFloderName文件夾下名為strFileName的文件 voiddelFile(CStringstrFloderName,CStringstrFileName); //得到strFloderName文件夾下名為strFileName的文件路徑 CStringGetFileName(CStringstrFolderName,CStringstrFileName); //制作strFloderName文件夾下名為strFileName的文件 CStringMakeFile(CStringstrFloderName,BOOLblnMake); //顯示文件夾對話框 BOOLGetFolder(CString*strSelectedFolder,constchar*lpszTitle,constHWNDhwndOwner,constchar*strRootFolder,constchar*strStartFolder);系統(tǒng)程序中主要用到了CFileOperate類中的GetAppPath函數(shù)。GetAppPath函數(shù)用于獲得當前運行程序所在文件夾的路徑,其實現(xiàn)代碼如下。CStringCFileOperate::GetAppPath()//取得當前運行程序所在文件夾路徑{ charlpFileName[MAX_PATH];//路徑數(shù)組 //獲得當前運行程序的全路徑 GetModuleFileName(AfxGetInstanceHandle(),lpFileName,MAX_PATH); CStringstrFileName=lpFileName; //從字符串的最右邊向左搜尋'\\'串 intnIndex=strFileName.ReverseFind('\\'); CStringstrPath; if(nIndex>0) strPath=strFileName.Left(nIndex);//取'\\'串左邊字符 else strPath=""; returnstrPath;//返回前運行程序的文件夾路徑}5.1.2時間格式轉(zhuǎn)換類CMyTime系統(tǒng)開發(fā)中,須要常見的對日期、時間數(shù)據(jù)進行操作,因此這里設(shè)計了類CMyTime,實現(xiàn)簡潔的時間日期轉(zhuǎn)換,CMyTime類的聲明如下。classCMyTime{public: CTimeValueTime;//CTime類型的值 //blnChinese:TRUE-"年月日時分秒"FALSE-"-:" CStringGetAllString(BOOLblnChinese); //返回字符串形式的日期時間 //blnChinese:TRUE-"年月日"FALSE-"-" CStringGetDateString(BOOLblnChinese);//返回字符串形式的日期 //blnChinese:TRUE-"時分秒"FALSE-":" CStringGetTimeString(BOOLblnChinese);//返回字符串形式的時間 CStringGetSimpleString();//返回簡潔字符串形式的日期時間 CStringGetWeek();//返回星期"星期日" //設(shè)置字符串形式的值 //blnSimple:TRUE-(%Y%m%d%H%M%S)FALSE-(年月日時分秒或-:) voidSetAllString(CStringValue,BOOLblnSimple); voidSetNow();//設(shè)置成現(xiàn)在時間 CMyTime();//構(gòu)造函數(shù)};SetNow函數(shù)獲得當前日期,時間,將其值賜予ValueTime。voidCMyTime::SetNow(){ ValueTime=CTime::GetCurrentTime();}5.1.3數(shù)據(jù)操作類CADOConn系統(tǒng)開發(fā)了數(shù)據(jù)操作類CADOConn,它是本系統(tǒng)的核心,實現(xiàn)了對數(shù)據(jù)庫數(shù)據(jù)的基本操作功能,CADOConn類的聲明代碼如下。#import"c:\programfiles\commonfiles\system\ado\msado15.dll"\ no_namespacerename("EOF","adoEOF")classCADOConn{//定義變量public: _ConnectionPtrm_pConnection;//指向Connection對象指針: //添加一個指向Recordset對象的指針: _RecordsetPtrm_pRecordset; _bstr_tm_strData; intm_DataType; CADOConn(intDataType);//構(gòu)造函數(shù) CADOConn(); virtual~CADOConn(); voidOnInitCADOConn();//初始化連接數(shù)據(jù)庫 _RecordsetPtr&GetRecordSet(CStringstrSQL);//執(zhí)行查詢 BOOLExecuteSQL(CStringstrSQL);//執(zhí)行SQL語句,InsertUpdatedelete voidExitConnect();//退出連接 BOOLMoveFirst();//字段集移向開頭 BOOLMoveNext();//字段集向下移 BOOLOpen(CStringstrSQL);//打開記錄集 BOOLOpenLogo(CStringstrSQL);//打開記錄集 CStringGetValueString(intindex,intstrSum);//返回記錄集中某字段的字符串 byteGetValueByte(intindex);//返回記錄集中某字段的字節(jié) intGetValueInt(intindex);//返回記錄集中某字段的短整數(shù) doubleGetValueDouble(intindex);//返回記錄集中某字段的雙精度數(shù) floatGetValueFloat(intindex);//返回記錄集中某字段的單精度數(shù) longGetValueLong(intindex);//返回記錄集中某字段的長整型數(shù) CTimeGetValueDate(intindex);//返回記錄集中某字段的日期時間 //獲得記錄集某字段的BYTE值,并換為CString返回 CStringGetValueByteStr(intindex,intstrSum); //獲得記錄集某字段的INT值,并換為CString返回 CStringGetValueIntStr(intindex,intstrSum); //獲得記錄集某字段的Double值,并換為CString返回 CStringGetValueDoubleStr(intindex,intstrLSum,intstrRSum); //獲得記錄集某字段的Float值,并換為CString返回 CStringGetValueFloatStr(intindex,intstrLSum,intstrRSum); //獲得記錄集某字段的Long值,并換為CString返回 CStringGetValueLongStr(intindex,intstrSum); //獲得記錄集某字段的CTime值,并換為CString返回 CStringGetValueDateStr(intindex,CStringstrType); //添加單項數(shù)據(jù) BOOLAddItem(CStringstrTable,intstrSum,LPCTSTRpszText,...); //得到字段中數(shù)據(jù)的類型 intGetValueType(intindex); BOOLadoEOF();//記錄集的結(jié)束推斷 BOOLFillList(CListCtrl*listMain,intColOpenEnd);//填充列表(ColOpenEnd代表綻開多少列) BOOLInitList(CListCtrl*listMain,intcolSum);//初始化列表 CStringGetAppPath();//得到應用程序所在的文件夾 BOOLFillList(CListCtrl*listMain);//填充列表 CStringGetFieldsName(intindex);//返回字段名字 intGetFeildsCount();//返回字段數(shù)量 //返回數(shù)據(jù)集數(shù) longGetRecordCount(); voidWriteLog(CStringstrSql);//寫日志文件 voidWriteLog1(CStringuserName);//寫日志文件,誰誰登錄};1、數(shù)據(jù)庫操作函數(shù)對常用的數(shù)據(jù)庫操作定義了相關(guān)函數(shù)。(1)連接數(shù)據(jù)庫在類的構(gòu)造函數(shù)CADOConn中,聲明數(shù)據(jù)庫的名稱。CADOConn::CADOConn(){ m_DataType=1;//數(shù)據(jù)庫類型Acess m_strData=_bstr_t("ShopData.mdb");//數(shù)據(jù)庫名稱}在OnInitCADOConn函數(shù)中,實現(xiàn)連接數(shù)據(jù)庫。voidCADOConn::OnInitCADOConn(){ //初始化OLE/COM庫環(huán)境 ::CoInitialize(NULL); try { //初始化指針 m_pConnection=NULL; //初始化指針 m_pRecordset=NULL; //創(chuàng)建Connection對象 m_pConnection.CreateInstance("ADODB.Connection"); //設(shè)置連接字符串,必需是BSTR型或者_bstr_t類型 _bstr_tstrConnect; switch(m_DataType) { case1://ACCESS strConnect=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;"); strConnect=strConnect+_bstr_t("DataSource="); strConnect=strConnect+_bstr_t(IPAddress)+_bstr_t("\\data\\"); strConnect=strConnect+m_strData; break; case2://EXCEL strConnect=_bstr_t("Provider=Microsoft.Jet.OLEDB.4.0;"); strConnect=strConnect+_bstr_t("DataSource="); strConnect=strConnect+_bstr_t(GetAppPath())+_bstr_t("\\"); strConnect=strConnect+m_strData; strConnect=strConnect+";ExtendedProperties=Excel8.0"; break; case3://SQLSERVER strConnect="Provider=SQLOLEDB;Server="+MainIP+";Database=ShopData;uid=admin;pwd=123456"; break; } m_pConnection->Open(strConnect,"","",adModeUnknown); } //捕獲異樣 catch(_com_errore) { //顯示錯誤信息 AfxMessageBox(e.Description()); } ASSERT(m_pConnection!=NULL);}(2)對數(shù)據(jù)庫進行查詢GetRecordSet函數(shù)實現(xiàn)執(zhí)行Select查詢語句,返回查詢結(jié)果集_RecordsetPtr&CADOConn::GetRecordSet(CStringstrSQL){ try { //連接數(shù)據(jù)庫,假如Connection對象為空,則重新連接數(shù)據(jù)庫 if(m_pConnection==NULL)OnInitCADOConn(); strSQL.TrimLeft(); strSQL.TrimRight(); //創(chuàng)建記錄集對象 m_pRecordset.CreateInstance(__uuidof(Recordset)); //取得表中的記錄 m_pRecordset->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } //捕獲異樣 catch(_com_errore) { //顯示錯誤信息 AfxMessageBox(e.Description()); } ASSERT(m_pRecordset!=NULL); //返回記錄集 returnm_pRecordset;}CADOConn類的Open函數(shù)的實現(xiàn)和GetRecordSet函數(shù)基本類似,只是它不返回記錄集,而是打開數(shù)據(jù)庫表。(3)執(zhí)行數(shù)據(jù)庫操作語句ExecuteSQL函數(shù)實現(xiàn)執(zhí)行SQL數(shù)據(jù)操作語句,如INSERT/UPDATE/DELETE語句等。BOOLCADOConn::ExecuteSQL(CStringstrSQL){ try { //是否已經(jīng)連接數(shù)據(jù)庫 if(m_pConnection==NULL)OnInitCADOConn(); strSQL.TrimLeft(); strSQL.TrimRight(); m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText); WriteLog(strSQL); returnTRUE; } catch(_com_errore) { AfxMessageBox(e.Description()); returnFALSE; }}2、記錄集操作函數(shù)為了便于對記錄集進行操作,在CADOConn類中定義了常用的記錄集操作函數(shù)。GetValueInt實現(xiàn)了從記錄集中獲得不同類型的字段值函數(shù),以獲得整形字段值。intCADOConn::GetValueInt(intindex){ _variant_tvValue;//var型返回值 _variant_tvIndex;//索引 intiValue;//數(shù)值返回值 vIndex.vt=VT_I2; vIndex.iVal=index; vValue=m_pRecordset->Fields->GetItem(vIndex)->Value;//獲得索引字段的值 switch(vValue.vt) { caseVT_NULL://為空值 iValue=0;//賦值 break; caseVT_ERROR://錯誤 iValue=0;//賦值 break; caseVT_EMPTY://不存在 iValue=0;//賦值 break; default: iValue=vValue.iVal;//獲得值 } returniValue;//返回整數(shù)值}3、列表控件操作函數(shù)在CADOConn類中定義了列表控件的操作函數(shù),實現(xiàn)將記錄集數(shù)據(jù)添加到指定的列表控件中。其中InitList函數(shù)實現(xiàn)初始化列表控件。BOOLCADOConn::InitList(CListCtrl*listMain,intcolSum){ longlMax=0; _variant_tvIndex;//var類型索引 vIndex.vt=VT_I2; inti; lMax=m_pRecordset->Fields->Count;//獲得記錄集字段數(shù) //設(shè)置列表框控件風格 listMain->SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); for(i=0;i<lMax;i++)//遍歷各字段 { CStringstrTitle=""; vIndex.iVal=i;//字段索引 //獲得字段名稱 strTitle=(LPCTSTR)m_pRecordset->Fields->GetItem(vIndex)->GetName(); //在列表框中添加列 listMain->InsertColumn(i,strTitle,LVCFMT_CENTER,100,0); } intintWidth=0;//列表框列的寬度 for(i=0;i<colSum;i++)//遍歷列表框中添加列 { //依據(jù)字段標題自動設(shè)置列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); intWidth=intWidth+listMain->GetColumnWidth(i);//計算列寬總和 } RECTrectList; listMain->GetWindowRect(&rectList);//獲得列表框的窗口區(qū)域 if(intWidth<(rectList.right-rectList.left))//使列表項充溢列表框窗口 { intWidth=(rectList.right-rectList.left-intWidth)/colSum; listMain->SetColumnWidth(i,listMain->GetColumnWidth(i)+intWidth); } returnTRUE;}FillList函數(shù)用于向列表框中添加記錄BOOLCADOConn::FillList(CListCtrl*listMain,intColOpenEnd){ inti,iType,iRow=0,listWidth=0; _variant_tvIndex;//var類型索引 longlMax=0; lMax=m_pRecordset->Fields->Count;//記錄集字段數(shù)目 vIndex.vt=VT_I2; listMain->DeleteAllItems();//刪除列表控件各列的值 if(!m_pRecordset->adoEOF)//遍歷記錄集 { MoveFirst();//首條記錄 while(!m_pRecordset->adoEOF) { for(i=0;i<lMax;i++) { CStringstrValue=""; vIndex.iVal=i;//字段索引 //獲得字段類型 iType=m_pRecordset->Fields->GetItem(vIndex)->GetType(); switch(iType) { caseado_Field_Str: caseado_Field_Text://文本 strValue=GetValueString(i,0);//獲得文本值 break; caseado_Field_Long://長整型 strValue=GetValueLongStr(i,0);//獲得長整值并轉(zhuǎn)換為文本 break; caseado_Field_Int://Int型 strValue=GetValueIntStr(i,0);//獲得INT值并轉(zhuǎn)換為文本 break; caseado_Field_Float://Float型 strValue=GetValueFloatStr(i,0,2);//獲得Float值并轉(zhuǎn)換為文本 break; caseado_Field_Double://Double型 strValue=GetValueDoubleStr(i,0,2);//獲得Double值并轉(zhuǎn)換為文本 break; caseado_Field_Byte://Byte型 strValue=GetValueByteStr(i,0);//獲得Byte值并轉(zhuǎn)換為文本 break; caseado_Field_Date://日期時間型 strValue=GetValueString(i,0);//獲得日期時間值并轉(zhuǎn)換為文本 break; default: strValue=""; break; } if(m_DataType==2)//Excel文件 strValue=GetValueString(i,0); if(i==0)//第一列 listMain->InsertItem(iRow,strValue,0);//添加行 else listMain->SetItemText(iRow,i,strValue);//設(shè)置行值 } m_pRecordset->MoveNext();//下一記錄 iRow=iRow+1; } MoveFirst();//移向記錄集開頭 } if(listMain->GetItemCount()>0)//列表框含有列 { if(ColOpenEnd>0)//要綻開的列 { for(inti=0;i<ColOpenEnd;i++) { listMain->SetColumnWidth(i,LVSCW_AUTOSIZE);//自動設(shè)置列寬 listWidth=listMain->GetColumnWidth(i);//獲得列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);//依據(jù)列標題設(shè)置列寬 if(listWidth<listMain->GetColumnWidth(i))//依據(jù)列標題設(shè)置的列寬若小于自動設(shè)置的列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); } } else { listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);//依據(jù)列標題設(shè)置列寬 } } else//表中沒有列 { for(i=0;i<lMax;i++) { listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); listWidth=listWidth+listMain->GetColumnWidth(i); } RECTrectList; listMain->GetWindowRect(&rectList); if(listWidth<(rectList.right-rectList.left)) { listWidth=(rectList.right-rectList.left-listWidth)/11; listMain->SetColumnWidth(i,listMain->GetColumnWidth(i)+listWidth); } } returnTRUE;}5.1.4數(shù)據(jù)庫表的操作類CtablePartInfo由于本項目模擬分布式數(shù)據(jù)庫,對數(shù)據(jù)庫部分表進行了分片、支配等冗余設(shè)計。因此,對數(shù)據(jù)庫的增、刪、改、查要制定確定的規(guī)則,來保證數(shù)據(jù)的一樣性,而這種規(guī)則不因為表的不同而不同。為此,我們設(shè)計了CtablePartInfo來統(tǒng)一的執(zhí)行這種規(guī)則。classtablePartInfo:publicCWnd{public: tablePartInfo(); tablePartInfo(CString_tableName); ~tablePartInfo();public: //依據(jù)表名tableName獲得表的分片和支配信息 voidGetTablePartInfo(); boolOperationOpen(CStringstrSQL,intnColumn); //依據(jù)表的分片和支配信息,按增加規(guī)則執(zhí)行數(shù)據(jù)庫插入操作 boolOperationAdd(CStringstrSQL); //依據(jù)表的分片和支配信息,按增加規(guī)則執(zhí)行數(shù)據(jù)庫修改操作 boolOperationModify(CStringstrSQL); //依據(jù)表的分片和支配信息,按增加規(guī)則執(zhí)行數(shù)據(jù)庫查詢操作 boolOperationSelect(CStringstrSQL); boolOperationSelect(CStringstrSQL,intnColumn); boolOperationSelectInital(CStringstrSQL,intnColumn); boolOperationSelectInital(CStringstrSQL); //依據(jù)表的分片和支配信息,按增加規(guī)則執(zhí)行數(shù)據(jù)庫刪除操作 boolOperationDelete(CStringstrSQL); //處理總站或者區(qū)域站點故障 voidHandleError(boolsuccess,intarea);public: intpart; intcopy; CListCtrl*m_list; CStringtableName; CStringstrIP; boolIsDone1; boolIsDone2; CStringErrorMessage;};下面以boolOperationAdd(CStringstrSQL)為例介紹了為維護數(shù)據(jù)庫一樣性,對數(shù)據(jù)庫更新規(guī)則的詳細實現(xiàn)。booltablePartInfo::OperationAdd(CStringstrSQL){ boolsuccess=true;//用于推斷SQL語句是否執(zhí)行成功 //首先更新總站數(shù)據(jù)庫中的相應記錄,因為全部的信息都會在總公司中存在 CADOConnadoMain(3); success=adoMain.ExecuteSQL(strSQL,0); HandleError(success,0);//處理執(zhí)行結(jié)果,執(zhí)行故障則給出報錯信息 if(success)//總站執(zhí)行成功,接著進行區(qū)域站點的操作 { if(0==m_globalAreaInt)//主站用戶添加數(shù)據(jù) { if(1==copy)//冗余支配的信息,同步各個區(qū)域站點數(shù)據(jù) { CADOConnadoIP(3); CStringsqlstr="select*fromIPInfowherearea!=0"; adoIP.Open(sqlstr); //這里只有海淀和朝陽兩個站點,所以預先申請兩個CADIConn對象 CADOConnadoAcess1; CADOConnadoAcess2; inti=0; //循環(huán)更新每個區(qū)域站點 while(!adoIP.adoEOF()) { i++; strIP=IPAddress; IPAddress="\\\\"+adoIP.GetValueString(1,0); if(1==i)//處理海淀區(qū)數(shù)據(jù)庫 { success=adoAcess1.ExecuteSQL(strSQL,1); HandleError(success,1); if(!success)//區(qū)域站點沒有添加成功,這時總站撤銷事務 { adoMain.m_pConnection->RollbackTrans(); adoMain.WriteLog(ErrorMessage,0); } //區(qū)域站點添加成功,需等待區(qū)域添加成功再提交事務 } if(2==i&&success)//區(qū)域站點添加成功,處理朝陽區(qū) { success=adoAcess2.ExecuteSQL(strSQL,2); HandleError(success,2); if(!success)//區(qū)域站點沒有添加成功 { adoMain.m_pConnection->RollbackTrans();//總站撤銷事務 adoMain.WriteLog(ErrorMessage,0); adoAcess1.m_pConnection->RollbackTrans();//區(qū)域撤銷事務 adoAcess1.WriteLog(ErrorMessage,1); } else//區(qū)域站點添加成功 { //總站和區(qū)域站點同時提交事務 adoAcess1.m_pConnection->CommitTrans(); adoAcess2.m_pConnection->CommitTrans(); adoMain.m_pConnection->CommitTrans(); } } adoIP.MoveNext(); IPAddress=strIP; } adoIP.ExitConnect(); adoAcess1.ExitConnect();//區(qū)域站點關(guān)閉數(shù)據(jù)庫連接 adoAcess2.ExitConnect(); } else//數(shù)據(jù)沒有copy則不用更新區(qū)域站點數(shù)據(jù),總站提交事務 { adoMain.m_pConnection->CommitTrans(); } } else//分站用戶添加數(shù)據(jù) { if(1==part)//數(shù)據(jù)表分片,向本地添加數(shù)據(jù) { CADOConnadoAcess; success=adoAcess.ExecuteSQL(strSQL); HandleError(success,m_globalAreaInt); if(!success)//區(qū)域站點沒有添加成功 {//總站撤銷事務,寫下撤銷事務日志 adoMain.m_pConnection->RollbackTrans(); adoMain.WriteLog(ErrorMessage,0); } else//區(qū)域站點添加成功 { //總站和區(qū)域站點同時提交事務 adoAcess.m_pConnection->CommitTrans(); adoMain.m_pConnection->CommitTrans(); } adoAcess.ExitConnect();//區(qū)域站點關(guān)閉數(shù)據(jù)庫連接 } else//數(shù)據(jù)表沒有分片,則提交總站事務 { adoMain.m_pConnection->CommitTrans(); } } } adoMain.ExitConnect();//總站關(guān)閉數(shù)據(jù)庫連接 returnsuccess;}5.2界面窗口設(shè)計系統(tǒng)主框架是運用MFC創(chuàng)建向?qū)?chuàng)建的基于對話框的應用程序,工程名為“ShopManage”。5.2.1系統(tǒng)啟動登錄開發(fā)系統(tǒng)啟動時,首先彈出登錄對話框,用戶登錄后,依據(jù)用戶的權(quán)限顯示主界面窗口或是銷售開單窗口。系統(tǒng)啟動時,首先運行的是CShopManageApp類的InitInstance函數(shù),在這里創(chuàng)建登陸對話框,登陸后依據(jù)用戶的權(quán)限彈出相應的對話框窗口。InitInstance函數(shù)的實現(xiàn)代碼如下。BOOLCShopManageApp::InitInstance(){ MainIP="10.108.13.83"; IPAddress=MainIP; IPAddressOrigin=MainIP; AfxEnableControlContainer(); CDlgLogodlgLog;//登錄對話框 CShopManageDlgdlg;//主對話框 CDlgXiaoShouKanDandlgXiao;//銷售開單對話框 inti; CStringstrSql; if(dlgLog.DoModal()!=IDOK)//登錄失敗 ::exit(0);//退出程序 CADOConnadoMain(3); strSql="select*fromAdminInfowherecode='"; strSql=strSql+dlgLog.strNo+"'"; adoMain.Open(strSql);//執(zhí)行查詢語句 if(!adoMain.adoEOF())//結(jié)果集不為空 { if(adoMain.MoveFirst()) { i=adoMain.GetValueInt(2); if(i==2)//銷售員 { m_pMainWnd=&dlgXiao; dlgXiao.DoModal();//銷售開單對話框 } else//管理員 { dlg.strNo=dlgLog.strNo;//管理員ID dlg.strName=dlgLog.strName;//管理員姓名 m_pMainWnd=&dlg; dlg.DoModal();//主對話框 } } } returnFALSE;}登錄用戶的驗證操作在登錄對話框類CDlgLogo的“確定”按鈕響應函數(shù)OnOK中實現(xiàn)。voidCDlgLogo::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); CStringstrSql; CADOConnadoMain(3);//數(shù)據(jù)連接對象,用戶信息表只有總站上有,所以連接SQL數(shù)據(jù)庫 strSql="select*fromAdminInfowherecode='"; strSql=strSql+m_str1+"'andpwd='"; strSql=strSql+m_str2+"'"; adoMain.OpenLogo(strSql);//執(zhí)行查詢 if(!adoMain.adoEOF())//結(jié)果不為空 { strName=adoMain.GetValueString(1,0);//用戶姓名 strNo=m_str1;//用戶ID m_globalArea=adoMain.GetValueString(7,0);//用戶區(qū)域 m_globalAreaInt=adoMain.GetValueInt(7); CDialog::OnOK();//關(guān)閉對話框 //依據(jù)用戶區(qū)域標記獲得區(qū)域站點的ip地址 CADOConnadoIP(3); CStringsqlstr="select*fromIPInfowherearea="+m_globalArea; adoIP.OpenLogo(sqlstr);//執(zhí)行查詢 if(!adoIP.adoEOF())//結(jié)果不為空 { IPAddress="\\\\"+adoIP.GetValueString(1,0); IPAddressOrigin="\\\\"+adoIP.GetValueString(1,0); } //寫登錄日志信息 adoMain.WriteLog1(m_str1); adoMain.WriteLog(strSql); adoIP.WriteLog(sqlstr); adoIP.ExitConnect(); } else MessageBox("密碼或用戶ID錯誤!","提示",MB_OK|MB_ICONWARNING); adoMain.ExitConnect();}5.2.2主界面對話框設(shè)計系統(tǒng)創(chuàng)建的是基于對話框的應用程序,因此系統(tǒng)的主界面是一個對話框窗口。系統(tǒng)中為對話框窗口添加了菜單項,為了便利進行常用操作,在對話框中還添加了一些位圖按鈕。為對話框添加菜單欄,首先須要在工程的資源管理器重添加設(shè)計菜單項,然后在對話框的屬性對話框中,在Menu下拉列表框中,選擇設(shè)計的菜單資源ID即可。按鈕控件則干脆添加到主對話框模板中,須要設(shè)置Flat屬性。在CShopManageDlg類的頭文件中,聲明CMyMenu對象,并將按鈕控件的類型設(shè)置為CMyButton,代碼如下。classCShopManageDlg:publicCDialog{//Constructionpublic: CShopManageDlg(CWnd*pParent=NULL); //standardconstructor CMyMenum_menu; CStringstrNo,strName; CMyButton m_ctrWarning; CMyButton m_ctrStore;……};在CShopManageDlg類的初始化函數(shù)OnInitDialog中,初始化菜單和位圖按鈕的設(shè)置,這里菜單和按鈕的設(shè)置分別接受自定義擴展類CMyMenu和CMyButton,它們對基本菜單和按鈕控件的外觀作了定制,從而美化了程序界面。5.2.3通用報表對話框設(shè)計開發(fā)系統(tǒng)能夠生成多種統(tǒng)計報表,在系統(tǒng)開發(fā)中,設(shè)計了一個通用的報表對話框,這樣就簡化了程序開發(fā)。在通用報表對話框資源模板中,添加了一個列表控件用于顯示報表數(shù)據(jù),一個靜態(tài)文本控件用于顯示報表標題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標準的電力施工合同范本
- 2025北京市常用勞動合同范本
- 2025供貨協(xié)議書合同范文
- 2025建工合同條款細節(jié)設(shè)置雷區(qū)
- 2025輻照加工合同
- 綠色照明的推廣與節(jié)能減排的實踐研究
- 生物科技產(chǎn)業(yè)的未來發(fā)展趨勢與創(chuàng)新機遇分析
- 課題申報參考:老年人健身發(fā)展“主體-時間-空間”三位協(xié)同機制的社會生態(tài)學研究
- 小兒聽力損失的醫(yī)學研究與治療進展
- 科技展區(qū)聲光技術(shù)的未來發(fā)展趨勢預測報告
- 道路瀝青工程施工方案
- 2025年度正規(guī)離婚協(xié)議書電子版下載服務
- 《田口方法的導入》課件
- 內(nèi)陸?zhàn)B殖與水產(chǎn)品市場營銷策略考核試卷
- 醫(yī)生給病人免責協(xié)議書(2篇)
- 損傷力學與斷裂分析
- 2024年縣鄉(xiāng)教師選調(diào)進城考試《教育學》題庫及完整答案(考點梳理)
- 車借給別人免責協(xié)議書
- 應急預案評分標準表
- “網(wǎng)絡(luò)安全課件:高校教師網(wǎng)絡(luò)安全與信息化素養(yǎng)培訓”
- 鋰離子電池健康評估及剩余使用壽命預測方法研究
評論
0/150
提交評論