面向連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)樣本_第1頁
面向連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)樣本_第2頁
面向連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)樣本_第3頁
面向連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)樣本_第4頁
面向連鎖超市管理系統(tǒng)的分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)樣本_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

分布式數(shù)據(jù)庫課程設(shè)計(jì)與實(shí)現(xiàn)——面向連鎖超市管理系統(tǒng)分布式數(shù)據(jù)庫設(shè)計(jì)與實(shí)現(xiàn)目錄1. 連鎖超市管理系統(tǒng)概述 11.1 背景簡(jiǎn)介 11.2可行性分析 11.3系統(tǒng)目的和先進(jìn)之處 21.4小構(gòu)成員和任務(wù)分派 32. 需求分析 42.1顧客需求概述 42.2業(yè)務(wù)需求分析 52.3功能分析 63. 系統(tǒng)總體設(shè)計(jì) 83.1繪制用例圖設(shè)計(jì)系統(tǒng)功能 83.2繪制系統(tǒng)流程圖 93.3系統(tǒng)開發(fā)環(huán)境 103.4系統(tǒng)運(yùn)營(yíng)環(huán)境 113.5系統(tǒng)運(yùn)營(yíng)演示 113.6系統(tǒng)類庫設(shè)計(jì) 144. 分布式數(shù)據(jù)庫分析與設(shè)計(jì) 164.1數(shù)據(jù)庫分析 164.2數(shù)據(jù)庫概念設(shè)計(jì) 164.3數(shù)據(jù)庫邏輯構(gòu)造設(shè)計(jì) 204.4分片與位置分派設(shè)計(jì) 244.4.1站點(diǎn)通信模型 244.4.2數(shù)據(jù)表分片與位置分派設(shè)計(jì) 255. 基于SQLSMS詳細(xì)設(shè)計(jì)(實(shí)現(xiàn)) 275.1公共類設(shè)計(jì) 275.1.1文獻(xiàn)操作類CFileOperate 275.1.2時(shí)間格式轉(zhuǎn)換類CMyTime 295.1.3數(shù)據(jù)操作類CADOConn 295.1.4數(shù)據(jù)庫表操作類CtablePartInfo 375.2界面窗口設(shè)計(jì) 415.2.1系統(tǒng)啟動(dòng)登錄開發(fā) 415.2.2主界面對(duì)話框設(shè)計(jì) 435.2.3通用報(bào)表對(duì)話框設(shè)計(jì)開發(fā) 445.2.4打印對(duì)話框設(shè)計(jì)開發(fā) 465.3基本資料模塊設(shè)計(jì) 485.3.1基本資料管理功能開發(fā) 485.3.2價(jià)格自動(dòng)生成功能開發(fā) 525.3.3報(bào)表功能實(shí)現(xiàn) 545.4進(jìn)貨/銷售模塊設(shè)計(jì) 555.4.1進(jìn)貨/銷售登記設(shè)計(jì) 555.4.2進(jìn)貨設(shè)計(jì) 595.4.3月度記錄設(shè)計(jì) 615.5庫存模塊設(shè)計(jì) 625.5.1庫存查詢功能開發(fā) 625.5.2庫存報(bào)警功能開發(fā) 636. 開發(fā)技巧和難點(diǎn)分析 646.1OLE技術(shù)使用 646.2MFCGridControl控件使用 65連鎖超市管理系統(tǒng)概述背景簡(jiǎn)介隨著市場(chǎng)經(jīng)濟(jì)發(fā)展和人民生活水平提高,本來單一、小規(guī)模超市已無法滿足人民對(duì)購物環(huán)境規(guī)定,大規(guī)模、物品豐富超市正在蓬勃發(fā)展。超市銷售數(shù)據(jù)規(guī)模日益龐大,商品數(shù)目迅速增長(zhǎng),采用以往手工管理已直接或間接地減少了工作效率,最后影響超市尋常運(yùn)轉(zhuǎn)。此外超市發(fā)張壯大,特別是連鎖超市(如家樂福、美廉美)擴(kuò)張,使得她們具備地區(qū)上分散而管理上又相對(duì)集中特點(diǎn),往往既要有各門店局部控制和分散管理,同步也要有整個(gè)組織全局控制和高層次協(xié)同管理。因而把這些門店和中心通過網(wǎng)絡(luò)連接起來,設(shè)計(jì)開發(fā)一款基于分布式數(shù)據(jù)庫連鎖超市管理系統(tǒng)SMS(Supermarketmanagementsystem)勢(shì)在必行。1.2可行性分析(1)經(jīng)濟(jì)可行性使用連鎖超市管理系統(tǒng)對(duì)超市連鎖店進(jìn)行信息化管理將直接提高公司管理部門工作效率。通過網(wǎng)絡(luò)遠(yuǎn)程提交匯總各門店信息,節(jié)約了許多時(shí)間和金錢。另一方面,用信息化管理記錄大量數(shù)據(jù),節(jié)約了諸多人力和財(cái)力,為管理者提供更好決策支持。(2)技術(shù)可行性網(wǎng)絡(luò)應(yīng)用基本設(shè)施完善,由于信息技術(shù)發(fā)展,國(guó)內(nèi)計(jì)算機(jī)網(wǎng)絡(luò)飛速發(fā)展,先后建成了中華人民共和國(guó)公眾多媒體通信網(wǎng)、ChinaNet、中華人民共和國(guó)教誨與科研計(jì)算機(jī)網(wǎng)絡(luò)等構(gòu)成了中華人民共和國(guó)Internet主體,網(wǎng)絡(luò)應(yīng)用進(jìn)入公司與普通家庭,這為發(fā)展連鎖超市網(wǎng)絡(luò)辦公提供了基本設(shè)施。網(wǎng)絡(luò)安全技術(shù)應(yīng)用,涉及加密算法、CA數(shù)字認(rèn)證、數(shù)字簽名等,為網(wǎng)絡(luò)辦公系統(tǒng)應(yīng)用提供安全保證,它實(shí)現(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ā)實(shí)現(xiàn)適合自己管理系統(tǒng)。因而,公司構(gòu)建跨區(qū)域管理系統(tǒng)技術(shù)瓶頸問題(網(wǎng)絡(luò)應(yīng)用基本設(shè)施、網(wǎng)絡(luò)安全、開發(fā)技術(shù))得到了有效解決,公司構(gòu)建網(wǎng)絡(luò)管理系統(tǒng)技術(shù)上可行。(3)操作可行性由于SMS操作是基于C/S客戶端頁面操作,簡(jiǎn)樸明了,顧客無需學(xué)習(xí),普通都可以很容易懂得如何操作。而管理員也無需具備專業(yè)知識(shí),只需要對(duì)某些數(shù)據(jù)進(jìn)行輸入以及平時(shí)尋常維護(hù)就夠了。1.3系統(tǒng)目的和先進(jìn)之處(1)系統(tǒng)目的為連鎖超市提高效率、減少成本;實(shí)現(xiàn)連鎖超市管理優(yōu)化,簡(jiǎn)化工作流程,節(jié)約人力物力,提高工作效率,極大地滿足客戶需要;對(duì)各環(huán)節(jié)進(jìn)行控制分析,實(shí)現(xiàn)統(tǒng)一調(diào)度。滿足連鎖超市基本管理功能,發(fā)揮信息系統(tǒng)靈活性,減輕公司管理人員和操作人員工作承擔(dān),提高工作效率。本系統(tǒng)是一項(xiàng)功能比較完善連鎖超市管理系統(tǒng),對(duì)連鎖店運(yùn)作過程中后臺(tái)數(shù)據(jù)可以隨時(shí)進(jìn)行分析,便于公司管理人員經(jīng)營(yíng)、決策。全面體現(xiàn)了當(dāng)代公司管理理論所倡導(dǎo)工作高效、環(huán)境輕松氛圍。(2)系統(tǒng)先進(jìn)之處多數(shù)解決就地完畢。各地計(jì)算機(jī)由數(shù)據(jù)通信網(wǎng)絡(luò)相聯(lián)系??朔酥行臄?shù)據(jù)庫弱點(diǎn):減少了數(shù)據(jù)傳播代價(jià)。提高了系統(tǒng)可靠性,局部系統(tǒng)發(fā)生故障,其她某些還可繼續(xù)工作。各個(gè)數(shù)據(jù)庫位置是透明,以便系統(tǒng)擴(kuò)充。為了協(xié)調(diào)節(jié)個(gè)系統(tǒng)事務(wù)活動(dòng),事務(wù)管理性能耗費(fèi)高。1.4小構(gòu)成員和任務(wù)分派2.1顧客需求概述下面是通過調(diào)查研究獲得關(guān)于連鎖超市重要信息數(shù)據(jù)需求分析成果:(1)連鎖超市普通由一種中心(公司總部)、各種遠(yuǎn)程連鎖店(門店)構(gòu)成,并且每個(gè)連鎖店分布在不同地區(qū)。(2)連鎖超市各個(gè)部門之間、各個(gè)分店之間、分店與總部之間需要互換數(shù)據(jù),這種數(shù)據(jù)互換是通過局域網(wǎng)和廣域網(wǎng)進(jìn)行。(3)公司總部負(fù)責(zé)產(chǎn)生并管理該連鎖超市整體匯總數(shù)據(jù),即各門店明細(xì)匯總表數(shù)據(jù),如銷售匯總表等。(4)每一種遠(yuǎn)程站點(diǎn)(各門店和公司總部)分別有一種數(shù)據(jù)庫系統(tǒng),各自構(gòu)成一種獨(dú)立子系統(tǒng),可以分別獨(dú)立進(jìn)行本部門業(yè)務(wù)解決。(5)總部為了便于對(duì)各店進(jìn)行管理,同步也為了比較各店銷售狀況,規(guī)定門店將所有商品歸入相應(yīng)商品類別,由總部統(tǒng)一管理并提供各門店使用,并且,商品類別信息數(shù)據(jù)在各門店都要經(jīng)常使用。(6)關(guān)于商品信息、供應(yīng)商信息、POS機(jī)信息、進(jìn)貨信息和銷售信息等經(jīng)營(yíng)基本數(shù)據(jù)都是各門店單獨(dú)管理和使用,門店之間互不有關(guān)。(7)整個(gè)連鎖超市職工信息由公司總部管理和維護(hù),各門店只可以查詢本部門職工信息。2.2業(yè)務(wù)需求分析通過對(duì)超市營(yíng)業(yè)、管理業(yè)務(wù)流程調(diào)查,得到下面業(yè)務(wù)需求??梢詫?duì)商品類別、商品、供應(yīng)商、POS機(jī)等基本信息進(jìn)行管理??梢詫?shí)現(xiàn)采購開單、銷售開單、采購?fù)素洝N售退貨等基本功能。軟件可依照商品資料中設(shè)立最高庫存、最低庫存進(jìn)行庫存報(bào)警。商品批發(fā)價(jià)、零售價(jià)可自動(dòng)生成,減輕定價(jià)工作量??梢陨筛黝愑涗泩?bào)表,提供詳盡營(yíng)業(yè)報(bào)告,實(shí)現(xiàn)對(duì)商品進(jìn)、銷、存及利潤(rùn)等財(cái)務(wù)狀況了如指掌。所有單據(jù)、報(bào)表均可以在打印前預(yù)覽,并且可以導(dǎo)出為Excel文獻(xiàn),然后依照實(shí)際需要進(jìn)行特別編排解決。為了系統(tǒng)安全,每次顧客登錄都創(chuàng)立相應(yīng)日記文獻(xiàn),記錄顧客所有操作。此外,對(duì)系統(tǒng)性能重要有如下幾種方面需求。系統(tǒng)在設(shè)計(jì)過程中應(yīng)充分考慮到可擴(kuò)充性,規(guī)定操作界面美觀大方,容易上手。2.3功能分析依照對(duì)系統(tǒng)業(yè)務(wù)調(diào)查和顧客需求分析,結(jié)共計(jì)算機(jī)信息管理特點(diǎn),設(shè)計(jì)系統(tǒng)實(shí)現(xiàn)功能如下。基本信息管理基本信息管理涉及業(yè)種商品類別信息、商品信息、供應(yīng)商信息、POS機(jī)信息和價(jià)格信息維護(hù)與管理,實(shí)現(xiàn)功能涉及:基本信息添加、刪除和更新操作。生成各類基本信息報(bào)表。打印和導(dǎo)出報(bào)表。進(jìn)貨管理進(jìn)貨管理重要實(shí)現(xiàn)對(duì)商品采購入庫信息進(jìn)行管理,詳細(xì)實(shí)現(xiàn)功能如下:進(jìn)貨開單,實(shí)現(xiàn)商品進(jìn)貨結(jié)算、入庫操作。進(jìn)貨退貨,退還商家有關(guān)商品。生成進(jìn)貨、退貨單據(jù)、商品報(bào)表。打印和導(dǎo)出報(bào)表。銷售管理銷售管理重要實(shí)現(xiàn)對(duì)商品銷售出庫有關(guān)信息進(jìn)行管理,詳細(xì)實(shí)現(xiàn)功能如下:銷售開單,實(shí)現(xiàn)商品銷售結(jié)算、出庫操作。銷售退貨,容許客戶退出有關(guān)商品。生成銷售、銷售退貨單據(jù)、商品報(bào)表。打印和導(dǎo)出報(bào)表。庫存管理庫存管理重要實(shí)現(xiàn)對(duì)商品庫存有關(guān)信息進(jìn)行管理,詳細(xì)實(shí)現(xiàn)功能如下:庫存查詢,可以查看所有庫存商品有關(guān)信息。庫存報(bào)警,對(duì)庫存過多或過少商品進(jìn)行報(bào)表記錄。庫存盤點(diǎn),可以修改商品庫存數(shù)量。帳務(wù)管理帳務(wù)管理重要實(shí)現(xiàn)對(duì)營(yíng)業(yè)員銷售商品、業(yè)務(wù)提成、營(yíng)業(yè)收入等狀況進(jìn)行分類報(bào)表記錄。數(shù)據(jù)管理數(shù)據(jù)管理重要實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行備份、還原及清理等有關(guān)工作。系統(tǒng)管理系統(tǒng)管理重要實(shí)現(xiàn)登錄顧客(職工)管理、系統(tǒng)日記、修改登錄密碼等有關(guān)工作。系統(tǒng)總體設(shè)計(jì)3.1繪制用例圖設(shè)計(jì)系統(tǒng)功能用例圖表達(dá)了角色和用例以及它們之間關(guān)系。它描述了系統(tǒng)、子系統(tǒng)和類一致功能集合,體現(xiàn)為系統(tǒng)和一種或各種外部交互者(角色)消息交互動(dòng)作序列。也就是角色(顧客或外部系統(tǒng))和系統(tǒng)(要設(shè)計(jì)系統(tǒng))為了實(shí)現(xiàn)一種目交互,這個(gè)目描述普通是一種謂詞短語,例如簽合同等。系統(tǒng)設(shè)計(jì)包括超級(jí)管理員、管理員和營(yíng)業(yè)員四種顧客角色。超級(jí)管理員具備所有操作權(quán)限,其用例圖如圖3-1所示。圖3-1超級(jí)管理員角色系統(tǒng)用例圖管理員不具備系統(tǒng)設(shè)立模塊中顧客管理和商品類別信息管理功能,其她功能均具備。而銷售人員則只具備銷售開單管理功能。3.2繪制系統(tǒng)流程圖結(jié)合系統(tǒng)詳細(xì)設(shè)計(jì)規(guī)定,連鎖超市管理系統(tǒng)重要功能流程圖如圖3-2所示。圖3-2系統(tǒng)重要功能流程圖系統(tǒng)一方面對(duì)登錄顧客身份進(jìn)行驗(yàn)證,依照顧客權(quán)限激活有關(guān)功能。超級(jí)管理員具備所有操作權(quán)限,系統(tǒng)功能構(gòu)造圖如圖3-3所示。圖3-3系統(tǒng)功能構(gòu)造圖上圖只是列出了某些重要功能,系統(tǒng)還可以依照不同需求生成各種記錄報(bào)表。3.3系統(tǒng)開發(fā)環(huán)境本系統(tǒng)是在WindowsXP中文版操作系統(tǒng)環(huán)境下,使用MicrosoftVisualStudio中文版用C++語言開發(fā)成功。在開發(fā)過程中,使用了OLE技術(shù)和ActiveX控件技術(shù)。后臺(tái)數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)采用是MicrosoftSQLServer和Access數(shù)據(jù)庫系統(tǒng),通過ADO數(shù)據(jù)庫開發(fā)技術(shù),直接操作數(shù)據(jù)庫文獻(xiàn)。3.4系統(tǒng)運(yùn)營(yíng)環(huán)境系統(tǒng)可以直接在Win98、Win、WinXP環(huán)境下運(yùn)營(yíng)。系統(tǒng)預(yù)設(shè)超級(jí)管理員顧客名為“admin”,密碼為“admin”。3.5系統(tǒng)運(yùn)營(yíng)演示程序啟動(dòng),一方面彈出如圖3-4所示“系統(tǒng)登錄”對(duì)話框,只有輸入對(duì)的顧客ID、登錄密碼才干進(jìn)入系統(tǒng)可以。圖3-4“系統(tǒng)登錄”對(duì)話框如果登錄顧客為超級(jí)管理員或管理員,會(huì)進(jìn)入系統(tǒng)主界面窗口,如圖3-5所示。圖3-5系統(tǒng)主界面窗口如果登錄顧客權(quán)限為營(yíng)業(yè)員,由于其只具備售貨權(quán)限,因而系統(tǒng)會(huì)直接彈出“銷售開單”對(duì)話框,如圖3-6所示。圖3-6“銷售開單”對(duì)話框在進(jìn)行有關(guān)操作前,一方面需要添加、設(shè)立某些基本資料,如商品分類登記,其操作設(shè)立對(duì)話框,如圖3-7所示。圖3-7“商品分類登記”對(duì)話框此外,系統(tǒng)還提供了豐富報(bào)表功能,如圖3-8所示商品分類報(bào)表,同步對(duì)報(bào)表提供了導(dǎo)出到Excel文獻(xiàn)和打印功能。圖3-8商品分類報(bào)表對(duì)話框3.6系統(tǒng)類庫設(shè)計(jì)BITVRLab超市管理系統(tǒng)主框架設(shè)計(jì)是通過MFC創(chuàng)立向?qū)?chuàng)立基于對(duì)話框窗口程序,在對(duì)話框程序中添加了菜單欄,系統(tǒng)重要類庫設(shè)計(jì)如下。自定義擴(kuò)展類:為了提高開發(fā)效率、便于代碼重用,自定義了某些數(shù)據(jù)操作類和控件擴(kuò)展類,如表3-1所示。表3-1自定義擴(kuò)展類及功能類說明CADOConn通過ADO實(shí)現(xiàn)對(duì)ACCESS、SqlServer等數(shù)據(jù)庫訪問CtablePartInfo依照數(shù)據(jù)庫表分派、分片信息,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫表增、刪、改、查CFileOperate實(shí)現(xiàn)對(duì)硬盤文獻(xiàn)慣用操作CMyChiToLetter實(shí)現(xiàn)依照逐字提取中文拼音首字母CMyButtonCButton類派生類,實(shí)現(xiàn)帶有位圖和文本按鈕CMyMenuCMenu類派生類,用于定制自己菜單CMenuItemContextCMenu類中用到此類,用于保存菜單項(xiàng)信息CMyTime實(shí)現(xiàn)簡(jiǎn)樸時(shí)間格式轉(zhuǎn)換CMyExcel完畢VC對(duì)Excel文獻(xiàn)操作對(duì)話框窗口類:在系統(tǒng)中,顧客所有數(shù)據(jù)查詢、操作都是通過對(duì)話框窗口來實(shí)現(xiàn),系統(tǒng)開發(fā)對(duì)話框類如表3-2所示。表3-2對(duì)話框類及闡明類說明CDlgFenJiBasePOS機(jī)基本信息管理對(duì)話框類CShopManageDlg主框架對(duì)話框類CDlgFenLeiBase商品分類基本信息管理對(duì)話框類CDlgDanganBase商品基本信息管理對(duì)話框類CDlgGongYingShangBase供應(yīng)商基本信息管理對(duì)話框GDlgJiaGeSheZhi價(jià)格自動(dòng)設(shè)立對(duì)話框類CDlgJinHuoKanDan商品進(jìn)貨開單管理對(duì)話框類CDlgJinHuoTuiDan商品進(jìn)貨退單管理對(duì)話框類CDlgXiaoShouKanDan商品銷售開單管理對(duì)話框類CDlgXiaoShouTuiDan商品銷售退單管理對(duì)話框類CDlgAll用于查找信息顯示對(duì)話框類CDlgReport用于報(bào)表顯示對(duì)話框類CDlgLogo顧客登錄對(duì)話框類CDlgPwd更改密碼對(duì)話框類CDlgQuit退出系統(tǒng)提示對(duì)話框類打印有關(guān)類:系統(tǒng)可以提供了報(bào)表打印和打印預(yù)覽功能,其有關(guān)設(shè)計(jì)類如表3-3所示。表3-3打印有關(guān)類及闡明類說明CPrintFrameCFrameWnd派生類,用于構(gòu)建打印框架類CPrintView打印視圖類此外,系統(tǒng)還包括某些主框架有關(guān)類、導(dǎo)入ActiveX控件(MFCGridControl)有關(guān)類和導(dǎo)入OLE對(duì)象(Excel)有關(guān)類。分布式數(shù)據(jù)庫分析與設(shè)計(jì)4.1數(shù)據(jù)庫分析考慮到總站點(diǎn)信息量大采用SQLServer數(shù)據(jù)庫,而區(qū)域站點(diǎn)信息量相對(duì)較小采用Access數(shù)據(jù)庫。當(dāng)區(qū)域業(yè)務(wù)拓展,操作終端增長(zhǎng)時(shí),Access數(shù)據(jù)庫也很容易移植到SQLServer數(shù)據(jù)庫系統(tǒng)中。此外區(qū)域站點(diǎn)采用Access數(shù)據(jù)庫可以實(shí)現(xiàn)以便布置。4.2數(shù)據(jù)庫概念設(shè)計(jì)分析超市管理功能流程,系統(tǒng)數(shù)據(jù)實(shí)體重要涉及基本資料對(duì)象實(shí)體、庫存實(shí)體、進(jìn)貨/銷售開單、進(jìn)貨/銷售退單、進(jìn)貨/銷售商品實(shí)體、各站點(diǎn)數(shù)據(jù)庫服務(wù)器IP信息實(shí)體、數(shù)據(jù)庫表分派分片信息實(shí)體等。基本資料對(duì)象實(shí)體涉及商品類別、商品明細(xì)、供應(yīng)商、POS機(jī)和登錄顧客實(shí)體。商品庫存實(shí)體記錄庫存商品數(shù)量和價(jià)格信息,其實(shí)體E-R圖如下。商品進(jìn)貨單實(shí)體用于記錄進(jìn)貨單記錄信息,其實(shí)體E-R圖如下所示。進(jìn)貨商品實(shí)體用于記錄進(jìn)貨單相應(yīng)商品信息,其實(shí)體E-R圖如下所示。進(jìn)貨退單實(shí)體用于記錄進(jìn)貨退單信息,其實(shí)體E-R圖如下所示。與進(jìn)貨相相應(yīng)銷售單實(shí)體、銷售商品實(shí)體和銷售退單實(shí)體E-R圖如下所示。各站點(diǎn)數(shù)據(jù)庫服務(wù)器IP信息,記錄各個(gè)區(qū)域數(shù)據(jù)庫服務(wù)器相應(yīng)IP地址,其實(shí)體E-R圖,如下圖所示。數(shù)據(jù)庫表分派分片信息,記錄數(shù)據(jù)中所有表分布式分派和分片信息,其實(shí)體E-R圖,如圖所示。4.3數(shù)據(jù)庫邏輯構(gòu)造設(shè)計(jì)商品類別表、商品明細(xì)表、供應(yīng)商表、POS機(jī)表、登錄顧客表、庫存表、進(jìn)貨/銷售開單表、進(jìn)貨/銷售商品表、進(jìn)貨/銷售退貨商品表、IP地址登錄信息表、數(shù)據(jù)庫表分派和分片信息。商品類別表:商品明細(xì)表:供應(yīng)商表:POS機(jī)表:顧客表:庫存表:進(jìn)貨單表:進(jìn)貨商品表:進(jìn)貨商品退單表:銷售單表:銷售商品表:銷售商品退單表:服務(wù)器IP信息表:分片及分布信息表:4.4分片與位置分派設(shè)計(jì)4.4.1站點(diǎn)通信模型在咱們連鎖超市管理系統(tǒng)中,有一種總店并下分各種分店,總店和分店之間或分店與分店之間都可以進(jìn)行通信。每個(gè)分店是一種相對(duì)獨(dú)立數(shù)據(jù)庫服務(wù)系統(tǒng),其可以連接任意數(shù)量客戶端。通信模型如下圖所示:4.4.2數(shù)據(jù)表分片與位置分派設(shè)計(jì)依照以上得到關(guān)于重要信息數(shù)據(jù)需求分析成果,為該連鎖超市系統(tǒng)分布式數(shù)據(jù)庫系統(tǒng)進(jìn)行重要信息數(shù)據(jù)分片和分派設(shè)計(jì)如下:1、數(shù)據(jù)分片設(shè)計(jì)(1)由于該連鎖超市系統(tǒng)各連鎖店之間在經(jīng)營(yíng)上是獨(dú)立,每個(gè)門店只關(guān)懷自己經(jīng)營(yíng)狀況,關(guān)于供應(yīng)商信息、POS機(jī)信息、商品信息和進(jìn)貨/銷貨信息等基本數(shù)據(jù)都是各門店單獨(dú)管理和使用,門店之間互不有關(guān)。因而,商品明細(xì)表、供應(yīng)商表、POS機(jī)表、庫存表、進(jìn)貨/銷售開單表、進(jìn)貨/銷售商品表、進(jìn)貨/銷售退貨商品表按照地區(qū)(門店所在區(qū)域標(biāo)志)采用水平分片辦法得到水平片段。(2)這里咱們對(duì)于商品信息進(jìn)行了垂直分片,提成了商品明細(xì)表和庫存表,由于商品某些屬性,例如庫存量等需要經(jīng)常更新,因而將這些屬性劃分出來構(gòu)成單獨(dú)實(shí)體可以減少系統(tǒng)開銷。(3)由于整個(gè)連鎖超市職工信息由總公司管理和維護(hù),各門店只可以查詢本店職工信息。因此職工信息不必分片,可以采用視圖形式提供應(yīng)各門店查詢本門店職工信息。此外,各個(gè)區(qū)域數(shù)據(jù)庫服務(wù)器IP地址信息也只是由總部管理、維護(hù),因此也不必分片。(4)由于商品分類數(shù)據(jù)由總部統(tǒng)一管理并提供各門店使用,并且,商品類別信息數(shù)據(jù)在各門店都要經(jīng)常使用。因而,商品類別信息數(shù)據(jù)也不必分片。(5)該分布式數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)了簡(jiǎn)樸目錄管理,記錄數(shù)據(jù)庫中各個(gè)表分片和分派信息,以便數(shù)據(jù)更新時(shí),維護(hù)各個(gè)站點(diǎn)上數(shù)據(jù)一致性。這個(gè)表由總部規(guī)劃建立,各門店也會(huì)經(jīng)常使用。因而,數(shù)據(jù)庫目錄信息表也不必分片。2、數(shù)據(jù)及其片段分派設(shè)計(jì)(1)對(duì)于只在各門店單獨(dú)使用除商品類別信息和數(shù)據(jù)庫目錄信息以外其她基本信息片段,采用按區(qū)域分片然后分派到各個(gè)門店數(shù)據(jù)庫服務(wù)器上??傉旧嫌兴虚T店所有信息。(2)整個(gè)系統(tǒng)職工信息、IP地址信息由公司總部管理和維護(hù),因此只分派在總部站點(diǎn)中。(3)商品類別信息、數(shù)據(jù)庫目錄信息是由總部統(tǒng)一規(guī)定并下發(fā)到各門店,由于各店經(jīng)常會(huì)使用到此類基本信息,因而在各門店都具備相似副本。因此,商品類別信息、數(shù)據(jù)庫目錄信息都不會(huì)分片但被復(fù)制,且復(fù)制個(gè)數(shù)為門店個(gè)數(shù)。基于SQLSMS詳細(xì)設(shè)計(jì)(實(shí)現(xiàn))5.1公共類設(shè)計(jì)為了提高程序代碼開發(fā)效率,便于代碼重用,在系統(tǒng)開發(fā)中,創(chuàng)立了某些數(shù)據(jù)操作類和控件擴(kuò)展類。5.1.1文獻(xiàn)操作類CFileOperate為了便于對(duì)硬盤文獻(xiàn)操作,開發(fā)了文獻(xiàn)操作類CFileOperate,它通過調(diào)用API函數(shù)實(shí)現(xiàn)慣用文獻(xiàn)操作。CFileOperate類聲明代碼如下。externCStringstrTmpPath;classCFileOperate{public: //構(gòu)造函數(shù) CFileOperate(); //獲得當(dāng)前程序運(yùn)營(yíng)途徑 CStringGetAppPath(); //判斷與否存在strFn文獻(xiàn)夾 BOOLIsFileExist(CStringstrFn,BOOLbDir); //制作strFloderName文獻(xiàn)夾返回文獻(xiàn)夾名 CStringMakeDirectory(CStringstrFloderName); //自動(dòng)生成文獻(xiàn)夾 CStringMakeDirectory(); //得到文獻(xiàn)夾名為strFloderName途徑 CStringGetDirectoryPath(CStringstrFloderName); //刪除strFloderdName文獻(xiàn)夾 voiddelDirectory(CStringstrFloderdName); //刪除主文獻(xiàn)夾(data) voiddelMainDirectory(); //制作主文獻(xiàn)夾 voidMakeMainDirectory(); //判斷strIntDigit與否為整數(shù),與否不大于intBig BOOLCheckIntDigit(CStringstrIntDigit,intintBig); //判斷strFileName與否可以做文獻(xiàn)夾或文獻(xiàn)名字 BOOLCheckFileName(CStringstrFileName); //判斷strText與否為空 BOOLCheckEmpty(CStringstrText); //刪除strFloderName文獻(xiàn)夾下名為strFileName文獻(xiàn) voiddelFile(CStringstrFloderName,CStringstrFileName); //得到strFloderName文獻(xiàn)夾下名為strFileName文獻(xiàn)途徑 CStringGetFileName(CStringstrFolderName,CStringstrFileName); //制作strFloderName文獻(xiàn)夾下名為strFileName文獻(xiàn) CStringMakeFile(CStringstrFloderName,BOOLblnMake); //顯示文獻(xiàn)夾對(duì)話框 BOOLGetFolder(CString*strSelectedFolder,constchar*lpszTitle,constHWNDhwndOwner,constchar*strRootFolder,constchar*strStartFolder);系統(tǒng)程序中重要用到了CFileOperate類中GetAppPath函數(shù)。GetAppPath函數(shù)用于獲取當(dāng)前運(yùn)營(yíng)程序所在文獻(xiàn)夾途徑,其實(shí)當(dāng)代碼如下。CStringCFileOperate::GetAppPath()//獲得當(dāng)前運(yùn)營(yíng)程序所在文獻(xiàn)夾途徑{ charlpFileName[MAX_PATH];//途徑數(shù)組 //獲取當(dāng)前運(yùn)營(yíng)程序全途徑 GetModuleFileName(AfxGetInstanceHandle(),lpFileName,MAX_PATH); CStringstrFileName=lpFileName; //從字符串最右邊向左搜索'\\'串 intnIndex=strFileName.ReverseFind('\\'); CStringstrPath; if(nIndex>0) strPath=strFileName.Left(nIndex);//取'\\'串左邊字符 else strPath=""; returnstrPath;//返回前運(yùn)營(yíng)程序文獻(xiàn)夾途徑}5.1.2時(shí)間格式轉(zhuǎn)換類CMyTime系統(tǒng)開發(fā)中,需要頻繁對(duì)日期、時(shí)間數(shù)據(jù)進(jìn)行操作,因而這里設(shè)計(jì)了類CMyTime,實(shí)現(xiàn)簡(jiǎn)樸時(shí)間日期轉(zhuǎn)換,CMyTime類聲明如下。classCMyTime{public: CTimeValueTime;//CTime類型值 //blnChinese:TRUE-"年月日時(shí)分秒"FALSE-"-:" CStringGetAllString(BOOLblnChinese); //返回字符串形式日期時(shí)間 //blnChinese:TRUE-"年月日"FALSE-"-" CStringGetDateString(BOOLblnChinese);//返回字符串形式日期 //blnChinese:TRUE-"時(shí)分秒"FALSE-":" CStringGetTimeString(BOOLblnChinese);//返回字符串形式時(shí)間 CStringGetSimpleString();//返回簡(jiǎn)樸字符串形式日期時(shí)間 CStringGetWeek();//返回星期"星期日" //設(shè)立字符串形式值 //blnSimple:TRUE-(%Y%m%d%H%M%S)FALSE-(年月日時(shí)分秒或-:) voidSetAllString(CStringValue,BOOLblnSimple); voidSetNow();//設(shè)立成當(dāng)前時(shí)間 CMyTime();//構(gòu)造函數(shù)};SetNow函數(shù)獲取當(dāng)前日期,時(shí)間,將其值賦予ValueTime。voidCMyTime::SetNow(){ ValueTime=CTime::GetCurrentTime();}5.1.3數(shù)據(jù)操作類CADOConn系統(tǒng)開發(fā)了數(shù)據(jù)操作類CADOConn,它是本系統(tǒng)核心,實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫數(shù)據(jù)基本操作功能,CADOConn類聲明代碼如下。#import"c:\programfiles\commonfiles\system\ado\msado15.dll"\ no_namespacerename("EOF","adoEOF")classCADOConn{//定義變量public: _ConnectionPtrm_pConnection;//指向Connection對(duì)象指針: //添加一種指向Recordset對(duì)象指針: _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);//返回記錄集中某字段長(zhǎng)整型數(shù) CTimeGetValueDate(intindex);//返回記錄集中某字段日期時(shí)間 //獲取記錄集某字段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); //添加單項(xiàng)數(shù)據(jù) BOOLAddItem(CStringstrTable,intstrSum,LPCTSTRpszText,...); //得到字段中數(shù)據(jù)類型 intGetValueType(intindex); BOOLadoEOF();//記錄集結(jié)束判斷 BOOLFillList(CListCtrl*listMain,intColOpenEnd);//填充列表(ColOpenEnd代表展開多少列) BOOLInitList(CListCtrl*listMain,intcolSum);//初始化列表 CStringGetAppPath();//得到應(yīng)用程序所在文獻(xiàn)夾 BOOLFillList(CListCtrl*listMain);//填充列表 CStringGetFieldsName(intindex);//返回字段名字 intGetFeildsCount();//返回字段數(shù)量 //返回?cái)?shù)據(jù)集數(shù) longGetRecordCount(); voidWriteLog(CStringstrSql);//寫日記文獻(xiàn) voidWriteLog1(CStringuserName);//寫日記文獻(xiàn),誰誰登錄};1、數(shù)據(jù)庫操作函數(shù)對(duì)慣用數(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ù)中,實(shí)現(xiàn)連接數(shù)據(jù)庫。voidCADOConn::OnInitCADOConn(){ //初始化OLE/COM庫環(huán)境 ::CoInitialize(NULL); try { //初始化指針 m_pConnection=NULL; //初始化指針 m_pRecordset=NULL; //創(chuàng)立Connection對(duì)象 m_pConnection.CreateInstance("ADODB.Connection"); //設(shè)立連接字符串,必要是BSTR型或者_(dá)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) { //顯示錯(cuò)誤信息 AfxMessageBox(e.Description()); } ASSERT(m_pConnection!=NULL);}(2)對(duì)數(shù)據(jù)庫進(jìn)行查詢GetRecordSet函數(shù)實(shí)現(xiàn)執(zhí)行Select查詢語句,返回查詢成果集_RecordsetPtr&CADOConn::GetRecordSet(CStringstrSQL){ try { //連接數(shù)據(jù)庫,如果Connection對(duì)象為空,則重新連接數(shù)據(jù)庫 if(m_pConnection==NULL)OnInitCADOConn(); strSQL.TrimLeft(); strSQL.TrimRight(); //創(chuàng)立記錄集對(duì)象 m_pRecordset.CreateInstance(__uuidof(Recordset)); //獲得表中記錄 m_pRecordset->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); } //捕獲異常 catch(_com_errore) { //顯示錯(cuò)誤信息 AfxMessageBox(e.Description()); } ASSERT(m_pRecordset!=NULL); //返回記錄集 returnm_pRecordset;}CADOConn類Open函數(shù)實(shí)現(xiàn)與GetRecordSet函數(shù)基本類似,只是它不返回記錄集,而是打開數(shù)據(jù)庫表。(3)執(zhí)行數(shù)據(jù)庫操作語句ExecuteSQL函數(shù)實(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ù)為了便于對(duì)記錄集進(jìn)行操作,在CADOConn類中定義了慣用記錄集操作函數(shù)。GetValueInt實(shí)現(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://錯(cuò)誤 iValue=0;//賦值 break; caseVT_EMPTY://不存在 iValue=0;//賦值 break; default: iValue=vValue.iVal;//獲取值 } returniValue;//返回整數(shù)值}3、列表控件操作函數(shù)在CADOConn類中定義了列表控件操作函數(shù),實(shí)現(xiàn)將記錄集數(shù)據(jù)添加到指定列表控件中。其中InitList函數(shù)實(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è)立列表框控件風(fēng)格 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++)//遍歷列表框中添加列 { //依照字段標(biāo)題自動(dòng)設(shè)立列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); intWidth=intWidth+listMain->GetColumnWidth(i);//計(jì)算列寬總和 } RECTrectList; listMain->GetWindowRect(&rectList);//獲取列表框窗口區(qū)域 if(intWidth<(rectList.right-rectList.left))//使列表項(xiàng)布滿列表框窗口 { 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://長(zhǎng)整型 strValue=GetValueLongStr(i,0);//獲取長(zhǎng)整值并轉(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://日期時(shí)間型 strValue=GetValueString(i,0);//獲取日期時(shí)間值并轉(zhuǎn)換為文本 break; default: strValue=""; break; } if(m_DataType==2)//Excel文獻(xiàn) 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);//自動(dòng)設(shè)立列寬 listWidth=listMain->GetColumnWidth(i);//獲取列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);//依照列標(biāo)題設(shè)立列寬 if(listWidth<listMain->GetColumnWidth(i))//依照列標(biāo)題設(shè)立列寬若不大于自動(dòng)設(shè)立列寬 listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); } } else { listMain->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER);//依照列標(biāo)題設(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由于本項(xiàng)目模仿分布式數(shù)據(jù)庫,對(duì)數(shù)據(jù)庫某些表進(jìn)行了分片、分派等冗余設(shè)計(jì)。因而,對(duì)數(shù)據(jù)庫增、刪、改、查要制定一定規(guī)則,來保證數(shù)據(jù)一致性,而這種規(guī)則不由于表不同而不同。為此,咱們?cè)O(shè)計(jì)了CtablePartInfo來統(tǒng)一執(zhí)行這種規(guī)則。classtablePartInfo:publicCWnd{public: tablePartInfo(); tablePartInfo(CString_tableName); ~tablePartInfo();public: //依照表名tableName獲得表分片和分派信息 voidGetTablePartInfo(); boolOperationOpen(CStringstrSQL,intnColumn); //依照表分片和分派信息,按增長(zhǎng)規(guī)則執(zhí)行數(shù)據(jù)庫插入操作 boolOperationAdd(CStringstrSQL); //依照表分片和分派信息,按增長(zhǎng)規(guī)則執(zhí)行數(shù)據(jù)庫修改操作 boolOperationModify(CStringstrSQL); //依照表分片和分派信息,按增長(zhǎng)規(guī)則執(zhí)行數(shù)據(jù)庫查詢操作 boolOperationSelect(CStringstrSQL); boolOperationSelect(CStringstrSQL,intnColumn); boolOperationSelectInital(CStringstrSQL,intnColumn); boolOperationSelectInital(CStringstrSQL); //依照表分片和分派信息,按增長(zhǎng)規(guī)則執(zhí)行數(shù)據(jù)庫刪除操作 boolOperationDelete(CStringstrSQL); //解決總站或者區(qū)域站點(diǎn)故障 voidHandleError(boolsuccess,intarea);public: intpart; intcopy; CListCtrl*m_list; CStringtableName; CStringstrIP; boolIsDone1; boolIsDone2; CStringErrorMessage;};下面以boolOperationAdd(CStringstrSQL)為例簡(jiǎn)介了為維護(hù)數(shù)據(jù)庫一致性,對(duì)數(shù)據(jù)庫更新規(guī)則詳細(xì)實(shí)現(xiàn)。booltablePartInfo::OperationAdd(CStringstrSQL){ boolsuccess=true;//用于判斷SQL語句與否執(zhí)行成功 //一方面更新總站數(shù)據(jù)庫中相應(yīng)記錄,由于所有信息都會(huì)在總公司中存在 CADOConnadoMain(3); success=adoMain.ExecuteSQL(strSQL,0); HandleError(success,0);//解決執(zhí)行成果,執(zhí)行故障則給出報(bào)錯(cuò)信息 if(success)//總站執(zhí)行成功,接著進(jìn)行區(qū)域站點(diǎn)操作 { if(0==m_globalAreaInt)//主站顧客添加數(shù)據(jù) { if(1==copy)//冗余分派信息,同步各個(gè)區(qū)域站點(diǎn)數(shù)據(jù) { CADOConnadoIP(3); CStringsqlstr="select*fromIPInfowherearea!=0"; adoIP.Open(sqlstr); //這里只有海淀和朝陽兩個(gè)站點(diǎn),因此預(yù)先申請(qǐng)兩個(gè)CADIConn對(duì)象 CADOConnadoAcess1; CADOConnadoAcess2; inti=0; //循環(huán)更新每個(gè)區(qū)域站點(diǎn) 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ū)域站點(diǎn)沒有添加成功,這時(shí)總站撤銷事務(wù) { adoMain.m_pConnection->RollbackTrans(); adoMain.WriteLog(ErrorMessage,0); } //區(qū)域站點(diǎn)添加成功,需等待區(qū)域添加成功再提交事務(wù) } if(2==i&&success)//區(qū)域站點(diǎn)添加成功,解決朝陽區(qū) { success=adoAcess2.ExecuteSQL(strSQL,2); HandleError(success,2); if(!success)//區(qū)域站點(diǎn)沒有添加成功 { adoMain.m_pConnection->RollbackTrans();//總站撤銷事務(wù) adoMain.WriteLog(ErrorMessage,0); adoAcess1.m_pConnection->RollbackTrans();//區(qū)域撤銷事務(wù) adoAcess1.WriteLog(ErrorMessage,1); } else//區(qū)域站點(diǎn)添加成功 { //總站和區(qū)域站點(diǎn)同步提交事務(wù) adoAcess1.m_pConnection->CommitTrans(); adoAcess2.m_pConnection->CommitTrans(); adoMain.m_pConnection->CommitTrans(); } } adoIP.MoveNext(); IPAddress=strIP; } adoIP.ExitConnect(); adoAcess1.ExitConnect();//區(qū)域站點(diǎn)關(guān)閉數(shù)據(jù)庫連接 adoAcess2.ExitConnect(); } else//數(shù)據(jù)沒有copy則不用更新區(qū)域站點(diǎn)數(shù)據(jù),總站提交事務(wù) { 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ū)域站點(diǎn)沒有添加成功 {//總站撤銷事務(wù),寫下撤銷事務(wù)日記 adoMain.m_pConnection->RollbackTrans(); adoMain.WriteLog(ErrorMessage,0); } else//區(qū)域站點(diǎn)添加成功 { //總站和區(qū)域站點(diǎn)同步提交事務(wù) adoAcess.m_pConnection->CommitTrans(); adoMain.m_pConnection->CommitTrans(); } adoAcess.ExitConnect();//區(qū)域站點(diǎn)關(guān)閉數(shù)據(jù)庫連接 } else//數(shù)據(jù)表沒有分片,則提交總站事務(wù) { adoMain.m_pConnection->CommitTrans(); } } } adoMain.ExitConnect();//總站關(guān)閉數(shù)據(jù)庫連接 returnsuccess;}5.2界面窗口設(shè)計(jì)系統(tǒng)主框架是使用MFC創(chuàng)立向?qū)?chuàng)立基于對(duì)話框應(yīng)用程序,工程名為“ShopManage”。5.2.1系統(tǒng)啟動(dòng)登錄開發(fā)系統(tǒng)啟動(dòng)時(shí),一方面彈出登錄對(duì)話框,顧客登錄后,依照顧客權(quán)限顯示主界面窗口或是銷售開單窗口。系統(tǒng)啟動(dòng)時(shí),一方面運(yùn)營(yíng)是CShopManageApp類InitInstance函數(shù),在這里創(chuàng)立登陸對(duì)話框,登陸后依照顧客權(quán)限彈出相應(yīng)對(duì)話框窗口。InitInstance函數(shù)實(shí)當(dāng)代碼如下。BOOLCShopManageApp::InitInstance(){ MainIP="3"; IPAddress=MainIP; IPAddressOrigin=MainIP; AfxEnableControlContainer(); CDlgLogodlgLog;//登錄對(duì)話框 CShopManageDlgdlg;//主對(duì)話框 CDlgXiaoShouKanDandlgXiao;//銷售開單對(duì)話框 inti; CStringstrSql; if(dlgLog.DoModal()!=IDOK)//登錄失敗 ::exit(0);//退出程序 CADOConnadoMain(3); strSql="select*fromAdminInfowherecode='"; strSql=strSql+dlgLog.strNo+"'"; adoMain.Open(strSql);//執(zhí)行查詢語句 if(!adoMain.adoEOF())//成果集不為空 { if(adoMain.MoveFirst()) { i=adoMain.GetValueInt(2); if(i==2)//銷售員 { m_pMainWnd=&dlgXiao; dlgXiao.DoModal();//銷售開單對(duì)話框 } else//管理員 { dlg.strNo=dlgLog.strNo;//管理員ID dlg.strName=dlgLog.strName;//管理員姓名 m_pMainWnd=&dlg; dlg.DoModal();//主對(duì)話框 } } } returnFALSE;}登錄顧客驗(yàn)證操作在登錄對(duì)話框類CDlgLogo“擬定”按鈕響應(yīng)函數(shù)OnOK中實(shí)現(xiàn)。voidCDlgLogo::OnOK(){ //TODO:Addextravalidationhere UpdateData(TRUE); CStringstrSql; CADOConnadoMain(3);//數(shù)據(jù)連接對(duì)象,顧客信息表只有總站上有,因此連接SQL數(shù)據(jù)庫 strSql="select*fromAdminInfowherecode='"; strSql=strSql+m_str1+"'andpwd='"; strSql=strSql+m_str2+"'"; adoMain.OpenLogo(strSql);//執(zhí)行查詢 if(!adoMain.adoEOF())//成果不為空 { 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)閉對(duì)話框 //依照顧客區(qū)域標(biāo)志獲得區(qū)域站點(diǎn)ip地址 CADOConnadoIP(3); CStringsqlstr="select*fromIPInfowherearea="+m_globalArea; adoIP.OpenLogo(sqlstr);//執(zhí)行查詢 if(!adoIP.adoEOF())//成果不為空 { 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錯(cuò)誤!","提示",MB_OK|MB_ICONWARNING); adoMain.ExitConnect();}5.2.2主界面對(duì)話框設(shè)計(jì)系統(tǒng)創(chuàng)立是基于對(duì)話框應(yīng)用程序,因而系統(tǒng)主界面是一種對(duì)話框窗口。系統(tǒng)中為對(duì)話框窗口添加了菜單項(xiàng),為了以便進(jìn)行慣用操作,在對(duì)話框中還添加了某些位圖按鈕。為對(duì)話框添加菜單欄,一方面需要在工程資源管理器重添加設(shè)計(jì)菜單項(xiàng),然后在對(duì)話框?qū)傩詫?duì)話框中,在Menu下拉列表框中,選取設(shè)計(jì)菜單資源ID即可。按鈕控件則直接添加到主對(duì)話框模板中,需要設(shè)立Flat屬性。在CShopManageDlg類頭文獻(xiàn)中,聲明CMyMenu對(duì)象,并將按鈕控件類型設(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è)立分別采用自定義擴(kuò)展類CMyMenu和CMyButton,它們對(duì)基本菜單和按鈕控件外觀作了定制,從而美化了程序界面。5.2.3通用報(bào)表對(duì)話框設(shè)計(jì)開發(fā)系統(tǒng)可以生成各種記錄報(bào)表,在系統(tǒng)開發(fā)中,設(shè)計(jì)了一種通用報(bào)表對(duì)話框,這樣就簡(jiǎn)化了程序開發(fā)。在通用報(bào)表對(duì)話框資源模板中,添加了一種列表控件用于顯示報(bào)表數(shù)據(jù),一種靜態(tài)文本控件用于顯示報(bào)表標(biāo)題,尚有兩個(gè)按鈕控件,即“導(dǎo)出”按鈕和“打印”按鈕,分別用于導(dǎo)出報(bào)表和打印報(bào)表。通用報(bào)表對(duì)話框相應(yīng)對(duì)話框類為CDLgReport,在其初始化函數(shù)OnInitDialog中,設(shè)立報(bào)表標(biāo)題和報(bào)表數(shù)據(jù),代碼如下。BOOLCDLgReport::OnInitDialog(){ CDialog::OnInitDialog(); m_area.SetCurSel(m_globalAreaInt); if(0==biaozhi||0!=m_globalAreaInt) m_area.EnableWindow(FALSE); CStringarea; area.Format("%d",m_area.GetCurSel()); tablePartInfoOperate(strTableName); m_Btn1.SetXIcon(IDI_ICONBUTTON);//導(dǎo)出按鈕 m_Btn2.SetXIcon(IDI_ICONBUTTON);//打印按鈕 GetDlgItem(IDC_STATIC1)->SetFont(&ftHeader);//設(shè)立標(biāo)題文本字體 GetDlgItem(IDC_STATIC1)->SetWindowText(strTitle);//設(shè)立標(biāo)題 Operate.m_list=&m_listMain; CStringstr=strSQL+"area="+area; if(0==biaozhi) { str=strSql; } Operate.OperationSelectInital(str); returnTRUE;}在“打印”按鈕響應(yīng)函數(shù)中,實(shí)現(xiàn)彈出打印對(duì)話框,代碼如下。voidCDLgReport::OnButton2()//打印{ //TODO:Addyourcontrolnotificationhandlercodehere CDlgPrintdlg;//打印對(duì)話框 dlg.strTitle=strTitle;//對(duì)話框標(biāo)題 dlg.strSql=strSql;//查詢語句 dlg.m_ListMain=&m_listMain;//列表控件 dlg.DoModal();}“導(dǎo)出”按鈕可實(shí)現(xiàn)將報(bào)表數(shù)據(jù)導(dǎo)出到Excel文獻(xiàn)中,按鈕響應(yīng)函數(shù)實(shí)當(dāng)代碼如下。函數(shù)重要通過自定義Excel對(duì)象操作類CMyExcel來實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)到Excel文獻(xiàn)中。voidCDLgReport::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere inti=0,j=0; CMyExcelexcel1;//Excel操作對(duì)象 CMyTimetime1;//時(shí)間操作對(duì)象 //打開文獻(xiàn)對(duì)話框 CFileDialogdlg(FALSE,"xls","C:\\*.xls",OFN_NOCHANGEDIR,"EXCEL文獻(xiàn)|*.xls"); CADOConnadoMain;//數(shù)據(jù)操作對(duì)象 time1.SetNow();//獲取當(dāng)前時(shí)間 if(dlg.DoModal()==IDOK) { excel1.Open();//打開Excel文獻(xiàn) excel1.AddSheet("導(dǎo)出");//添加Sheet頁 excel1.AutoRange(); excel1.SetItemText(1,1,strTitle);//添加標(biāo)題 adoMain.Open(strSql);//執(zhí)行查詢 //遍歷列表框列 for(i=0;i<m_listMain.GetHeaderCtrl()->GetItemCount();i++) { //將列標(biāo)題添加到Excel表單中 excel1.SetItemText(2,i+1,adoMain.GetFieldsName(i)); } adoMain.ExitConnect();//斷開連接 for(i=0;i<m_listMain.GetItemCount();i++)//遍歷記錄集 { //依次將記錄集各列添加到Excel表單中 for(j=0;j<m_listMain.GetHeaderCtrl()->GetItemCount();j++) { excel1.SetItemText(i+3,j+1,m_listMain.GetItemText(i,j)); } } excel1.SetItemText(i+3,1,time1.GetAllString(TRUE));//在Excel中添加時(shí)間 excel1.AutoColFit();//自動(dòng)設(shè)立Excel列 excel1.SaveAs(dlg.GetPathName());//保存Excel文獻(xiàn) } excel1.Exit();//退出Excel對(duì)象}5.2.4打印對(duì)話框設(shè)計(jì)開發(fā)系統(tǒng)對(duì)所有記錄報(bào)表都提供了打印功能。在報(bào)表對(duì)話框中,單擊“打印”按鈕,就會(huì)彈出相應(yīng)打印對(duì)話框,在對(duì)話框中,通過使用CGridCtrl控件顯示報(bào)表數(shù)據(jù),且可在控件中編輯數(shù)據(jù)。系統(tǒng)設(shè)計(jì)了一種通過打印對(duì)話框,在其對(duì)話框資源模板中添加了3個(gè)按鈕控件和一種顧客自定義控件,該自定義控件用于實(shí)現(xiàn)CGridCtrl控件,其相應(yīng)對(duì)話框類為CDlgPrint。使用CGridCtrl控件可以實(shí)現(xiàn)類似EXCEL界面,可以在網(wǎng)上獲取MFCGridcontrol控件代碼文獻(xiàn),并將這些文獻(xiàn)添加到工程中。在CDlgPrint類頭文獻(xiàn)中,新創(chuàng)立一種CGridCtrl對(duì)象,代碼如下。classCDlgPrint:publicCDialog{//Constructionpublic: CDlgPrint(CWnd*pParent=NULL);//standardconstructor CStringstrSql; CStringstrTitle; CListCtrl*m_ListMain; CGridCtrlm_Grid;……};在DoDataExchange函數(shù)中為顧客自定義控件關(guān)聯(lián)該對(duì)象,代碼如下。voidCDlgPrint::DoDataExchange(CDataExchange*pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgPrint) DDX_Control(pDX,IDC_GRID,m_Grid); //}}AFX_DATA_MAP}在對(duì)話框初始化函數(shù)OnInitDialog中,設(shè)立CGridCtrl控件屬性,并將報(bào)表數(shù)據(jù)添加到CGridCtrl控件中,代碼如下。BOOLCDlgPrint::OnInitDialog(){ CDialog::OnInitDialog(); CADOConnadoMain;//數(shù)據(jù)操作對(duì)象 inti,j; SetWindowText(strTitle);//設(shè)立對(duì)話框標(biāo)題 adoMain.Open(strSql); m_Grid.SetRowCount(m_ListMain->GetItemCount()+1);//設(shè)立控件行 m_Grid.SetColumnCount(adoMain.GetFeildsCount());//設(shè)立控件列 m_Grid.SetEditable(TRUE);//控件可編輯m_Grid.SetTextBkColor(RGB(0xFF,0xFF,0xE0));//設(shè)立背景色 m_Grid.SetFixedColumnCount(1);//設(shè)立表固定列數(shù) m_Grid.SetFixedRowCount(1);//設(shè)立表固定行數(shù) for(i=0;i<adoMain.GetFe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論