客户管理系统毕业设计论文

上传人:z*** 文档编号:82056124 上传时间:2022-04-28 格式:DOC 页数:31 大小:646.50KB
收藏 版权申诉 举报 下载
客户管理系统毕业设计论文_第1页
第1页 / 共31页
客户管理系统毕业设计论文_第2页
第2页 / 共31页
客户管理系统毕业设计论文_第3页
第3页 / 共31页
资源描述:

《客户管理系统毕业设计论文》由会员分享,可在线阅读,更多相关《客户管理系统毕业设计论文(31页珍藏版)》请在装配图网上搜索。

1、吉林省明日科技有限公司监制 客户管理系统 学 院 专 业 班 级 学 号 姓 名 指导教师 教师职称 年 月 日 目录 目录 摘要 0 引言 1 系统需求分析 2 总体设计 1 项目规划 2 系统功能结构 3 设计目标 3 系统设计 1 开发及运行环境 2 数据库设计 4 技术准备 1 数据库的封装 2 封装ADO数据库的代码分析 5 主要功能

2、模块设计 1 主窗体 2 客户信息 3 联系人信息 4 联系人信息查询 附录A 参考文献 附录B 数据表 – 3 – 吉林省明日科技有限公司监制 摘要 【摘要】 科技的发展、时代的进步,市场经济的竞争也越发激烈与残酷,在竞争中客户作为市场的最最要的资源,早已成为市场营销的核心,企业间谁拥有的客户多,谁就在竞争中占有绝对的优势。在市场经济竞争如此激烈的环境之下,企业要想立于不败之地,就必须和与之生存发展息息相关的客户,建立起良好的关系,在现有客户资源的基础之上,维护好和老客户的关系,并且不断的发展新的客户,用企业高品质的产品、优质的服务、良好的信誉树

3、立企业在客户心目中的良好形象;并以客户需求为己任,不断的创新与发展自身的产品,以满足客户新需求,并规范企业内部的客户资源的管理方式、提升企业的客户服务质量。计算机管理系统满足了企业对自身客户资源管理的新要求,减少了客户资源管理过程中的浪费的大量人力、物力和财力等。 【关键词】客户管理系统 – 39 – 0 引言 本系统具有完善的基础信息维护和客户信息维护功能,并增置了客户服务模块,满足了客户日常管理的需求;强大的数据查询及图表分析功能,帮助企业能够及

4、时根据分析结果进行新规划和方案,以适应变化万千的消费市场。客户管理系统后台数据库采用SQL Server 2000数据库,以保证数据的安全、高效和稳定。前台采用Microsoft公司的Visual C++ 6.0作为主要的开发工具,其可与SQL Server 2000数据库无缝链接。 1 系统需求分析 通过调查,要求系统需要有以下功能: q 详细全面记录并管理客户信息和联系人信息。 q 方便实用的数据查询功能。 q 能够根据客户的反馈得出相应的处理方法,做到快速、及时。 q 对客户和企业进行分类,方便管理。 q 设置业务往来的商品数量统计功能。 q 通过计算机控制电话呼叫用户

5、。 2 总体设计 2.1 项目规划 客户管理系统所涉及的信息非常的全面,主要由基础信息维护、客户信息维护、客户服务、信息查询、系统管理和帮助信息等几个功能模块组成,规划系统功能模块如下: q 基础信息维护模块 基础信息维护模块主要包括区域信息设置、企业性质设置、企业类型设置、企业资信设置、客户级别设置和客户满意程度设置6部分。 q 客户信息维护模块 客户信息维护模块主要包括客户信息、联系人信息、业务往来、客户呼叫中心4个部分。 q 客户服务模块 客户服务模块主要包括客户反馈、客户投诉2个部分。 q 信息查询模块 信息查询模块主要包括客户信息查询、联系人信息查询、客户反

6、馈满意度查询和客户投诉满意度查询。 q 系统管理模块 系统管理模块主要包括操作员设置、密码修改。 q 帮助信息模块 帮助信息模块主要包括关于、帮助2个部分。 2.2 系统功能结构 客户管理系统的功能结构如图1所示。 图1 客户管理系统功能架构图 2.3 设计目标 本系统属于典型的数据库管理系统,是针对中小型企业生产管理开发设计的,实现进一步的计算机化的管理。通过本系统可以达到以下目标: q 灵活的运用表格批量输入数据,使信息传递更快捷。 q 系统采用良好的人机对话模式,界面设计美观友好,信息查询灵活、方便、快捷、准确,数据存储安全可靠。 q 键盘操作,快速响应

7、。 q 实现各种查询及打印等。 q 操作员可以随时修改自己的口令。 q 管理员可以设置操作员的权限 q 对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。 q 数据保密性强,为每个用户设置权限级别。 q 系统运行稳定、安全可靠。 3 系统设计 3.1 开发及运行环境 系统开发平台:Visual C++ 6.0。 数据库管理系统软件:SQL Server 2000。 运行平台:Windows xp/ Windows 2000。 分辨率:最佳效果800*600。 3.2 数据库设计 本系统数据库采用SQL Server 2000数据库,系统数据库名称

8、为db_SCGL。数据库db_SCGL中包含19张数据表。下面分别给出数据表概要说明和主要数据表的结构。 1.数据表概要说明 从读者角度出发,使读者对本系统后台的数据库中数据表有一个更清晰的认识,在此特设计一个数据库中数据表列表,该数据表列表包含系统所有数据表,如图2所示。 图2 数据表列表 2.主要数据表的结构 数据库中的数据表请参见附录B。 4 技术准备 4.1 数据库的封装 调用数据库的方式有很多,主要有DAO、ODBC、ADO,但使用起来比较灵活的是ADO,直接引用ADO的方法是在头文件StdAfx.h中加入如下代码: #import "E:\Program

9、 Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF") 然后在要用的ADO的类中加入两个指针的定义就可以应用ADO了 _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; 4.2 封装ADO数据库的代码分析 对ADO的封装主要是将引用ADO的代码加到自定义的类中,并引用头文件StdAfx.h即可,对ADO进行封装的代码如下: 头文件ADO.H声明如下: #import "

10、C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF" ,"adoEOF") class ado { public: _ConnectionPtr m_pConnection; _RecordsetPtr m_pRecordset; public: ado(); virtual ~ado(); void close(); bool MovePrevious();//向上移动 bool MoveLast();//最后一条 bool MoveNext();

11、//向下移动 bool MoveFirst();//最后一条 int GetRecordCount();//获得记录个数 bool Open(CString srecordset, UINT adCmd); void GetErrors(_com_error eErrors);//获得错误信息 CString GetFieldValue(CString Field);//获得字段值 bool Move(int nRecordNum);//移动记录 void ExecuteSQL(CString SQL);//执行SQL语句 void rstOpen(CStr

12、ing TSQL);//打开记录集 }; 实现文件ADO.CPP原代码如下: 构造函数,直接实现数据库的连接。 ado::ado() { ::CoInitialize(NULL); // ADO是基于COM技术要进行初始化 try { m_pConnection.CreateInstance(__uuidof(Connection)); _bstr_t strConnect="Provider=SQLOLEDB;SERVER=127.0.0.1;Database=db_client;uid=sa;pwd=;"; m_pConnection->Open(s

13、trConnect,"","",0); } catch(_com_error e) { AfxMessageBox(e.Description()); } } 利用连接指针打开数据库,这样的方式打开的记录集,无法回滚,可以打开空记录集。 bool ado::Open(CString srecordset, UINT adCmd) { try{ m_pRecordset=m_pConnection->Execute((_bstr_t)srecordset,NULL,adCmd); } catch(_com_error&e) {

14、this->GetErrors(e); return false; } return true; } 用于返回记录集的个数。 int ado::GetRecordCount() { int nCount=0; try{ m_pRecordset->MoveFirst(); } catch(...) { return 0; } if(m_pRecordset->adoEOF) return 0; while (!m_pRecordset->adoEOF) { m_pRecordset->MoveNext();

15、 nCount=nCount+1; } m_pRecordset->MoveFirst(); return nCount; } 这个函数用来获取执行SQL语句时的出错信息。 void ado::GetErrors(_com_error eErrors) { ErrorsPtr pErrors=m_pConnection->GetErrors(); if (pErrors->GetCount()==0) MessageBox(NULL,eErrors.ErrorMessage(),"错 误",MB_OK|MB_ICONEXCLAMATION);

16、 else { for (int i=0;iGetCount();i++)//如果有多条语句,将用这个循环输出所有错误 { _bstr_t desc=pErrors->GetItem((long)i)->GetDescription(); MessageBox(NULL,desc,"错 误",MB_OK|MB_ICONEXCLAMATION); } } } 用记录的指针打开一个记录集,但打开空记录集时返回错误,如果出错就转向用连接打开记录集。 void ado::rstOpen(CString TSQL) { tr

17、y { _bstr_t bstrSQL=TSQL.AllocSysString(); m_pRecordset.CreateInstance(__uuidof(Recordset)); m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); } catch(_com_error e) { m_pRecordset=m_pConnection->Execute((_bstr_t)TSQL,NULL,adCmdT

18、ext); } } 获取记录集指定列的值。 CString ado::GetFieldValue(CString Field) { _variant_t Thevalue; CString temp; Thevalue=m_pRecordset->GetCollect((_bstr_t)Field); if(Thevalue.vt==VT_EMPTY ||Thevalue.vt==VT_NULL) temp=""; else { temp=(char*)(_bstr_t)Thevalue; temp.

19、TrimRight(); temp.TrimLeft(); } return temp; } 指向记录集的游标向上移一条。 bool ado::MovePrevious() { try { m_pRecordset->MovePrevious(); } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } return true; } 指向记录集的游标移到指定行处。 bool ado::Move(int nRecordNum

20、) { try { if(!m_pRecordset->BOF) { m_pRecordset->MoveFirst(); } m_pRecordset->Move(nRecordNum); } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } return true; } 指向记录集的游标向下移一条。 bool ado::MoveNext() { try { m_pRecordset->MoveNext()

21、; } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } return true; } 将指向记录集的游标移到顶部。 bool ado::MoveFirst() { try { m_pRecordset->MoveFirst(); } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } return true; } 将指向记录集的游

22、标移到尾部。 bool ado::MoveLast() { try { m_pRecordset->MoveLast(); } catch(_com_error e) { AfxMessageBox(e.Description()); return false; } return true; } 用指向连接的指针执行SQL语句,如果SQL语句有语法错误,就返回响应的错误。 void ado::ExecuteSQL(CString TSQL) { try { m_pConnection->Execute((_bstr_t)TSQL,

23、NULL,adCmdText); } catch(_com_error e) { AfxMessageBox(e.Description()); } } 关闭指针连接。 void ado::close() { m_pRecordset->Close(); m_pConnection->Close(); m_pRecordset=NULL; m_pConnection=NULL; ::CoUninitialize(); } 5 主要功能模块设计 5.1 主窗体 主窗体主要是对客户管理系统的各个模块进行调用,主要有菜单调用和工具栏调

24、用两种,如图3所示。 图3 主窗体运行效果 1.菜单设计 (1)首先要用到工作区窗口,默认情况下工作区窗体是打开的,如果没打开可以从菜单中选择View/Workspace此时工作区窗体会弹出,具体如图4所示。 工作区窗口 图4 工作区窗口 (2)工作区选项卡有三个选项卡,如图4所示。资源选项卡是VC的资源管理器,它的功能是可以实现添加或删除Windows的位图、图标、对话框等资源,要用资源选项卡,请单击资源选项卡。 (3)添加菜单,可以鼠标右键单击Menu文件夹,出现菜单后选择Insert Menu就会出现菜单编辑器,要想在菜单内添加文字就双击如图4所示的虚线框,弹出

25、如图5所示菜单属性对话框(Menu Item Properties)。 菜单编辑器虚线框 文件选项卡 资源选项卡 类选项卡 图4 工作区选项卡及菜单编辑器 在这里输入汉字 图5 菜单属性窗口 (4)设置菜单文本,可以在Caption(标题)编辑框内输入即可,关闭属性窗体后一个菜单项就生成了。所有的菜单项都是照这样的方法重复完成的。最后生成如图6所示的系统执行时的菜单。还有另一种生成菜单的方法,主要是利用WindowApi函数进行文本编辑,具体方法请参照《Windows98程序设计》一书。 图6 系统执行时的菜单效果 2.工具栏设计 工具栏资源可以利用VC

26、自带的ToolBar编辑器生成,也可以采用MFC提供的CToolBarCtrl类动态生成,这里我们用语句动态生成。工具栏的生成将主要用到CToolBarCtrl类的Create方法来创建工具栏,其原型如下: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); dwStyle是工具栏的风格和样式,主要有WS_CHILD(子窗体), WS_VISIBLE(可见) 和WS_DISABLED(不可见),还有以CCS开头8种样式,但在这8种样式中最长常用到的只有CCS_TOP(把工具栏放在顶部),其它

27、请参考MSDN。 下面给出一个在程序中用到生成工具栏的实例代码。 toolbar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_TOOLBAR); this是指向其父窗体的指针,ID_TOOLBAR是在Resource.h中定义的资源标识。 工具栏上的按钮主要是对数据结构TBBUTTON进行赋值来实现的,下面给出一个具体赋值的代码。 button[0].dwData=0; button[0].fsState=TBSTATE_ENABLED; button[0].fsStyle=TBSTYLE_BUTTON; button[0

28、].idCommand=ID_ADD; button[0].iString =toolbar.AddStrings(pString); fsState确定按钮的状态,fsStyle确定按钮的风格,dwData可以是用户定义的数据,idCommand是按下按钮后要执行命令的标识,通常是菜单项的ID值,iString是在按钮上显示文字,主要是通过 CtoolBarCtrl类的AddStrings方法加入的,pString是TCHAR的指针,iBitmap是在按钮上显示的图片的编号,通常是图形列表(CImageList)的序号。这里应该提示大家:button[]数组开始编号是基于0的。iBit

29、map选择图形列表的标号也是基于0的。 如果要在工具栏中添加分隔符,就要使button[0].fsStyle=TBSTYLE_SEP,因为分隔符也是一个按钮,并且此时button[0].idCommand必须为0。 工具栏中的按钮图片是通过CimageList类的进行导入的,CimageList类的Create方法原形如下: BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow ); 由于CimageList类比较简单,一些参数请参照MSDN,我这里只给一个具体实例。 在程序中的图象列表是通过如下代码实现的

30、。 imagelist.Create(32,32,ILC_COLOR32|ILC_MASK,0,0); 创建了类对象还不行,还要往类中导入图片,实现的方法主要是通过全局函数LoadIcon将图标加载到程序中,其主要参数只有一个就是图标文件,这里就不在多说了。ILC_COLOR32是设置图标的颜色深度,ILC_MASK是设置是否非图标区使用透明色。 3.状态条的设计 状态栏主要使用CStatusBarCtrl类来生成,该类Create方法原型为: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT n

31、ID ); 在程序中可以编写如下的语句创建状态条: statebar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_STATU); WS_CHILD和WS_VISIBLE是一般窗体控件通用的样式,使用的次数很多。 程序中经常使用工具栏和状态栏,下面给出在对话框初始化函数中生成工具栏和状态栏的代码,具体代码如下: BOOL khmain::OnInitDialog() { CDialog::OnInitDialog(); int weith[2]; weith[1]=150; weith[0]=500;

32、 statebar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_STATU); statebar.SetParts(3,&weith[0]); statebar.SetText("长春市明日科技有限公司",0,0); imagelist2.Create(32,32,ILC_COLOR32|ILC_MASK,0,0); imagelist2.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON12)));// Add函数是向图象列表中添加

33、图表 imagelist2.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON13))); imagelist2.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON14))); imagelist2.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON15))); imagelist2.Add(::LoadIcon(::AfxGetResourceH

34、andle(),MAKEINTRESOURCE(IDI_ICON16))); imagelist2.Add(::LoadIcon(::AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_ICON20))); toolbar2.EnableAutomation(); toolbar2.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID_TOOLBAR2); toolbar2.SetImageList(&imagelist2); int i; //以下就是对TBBUTTON结构进行赋值,赋值完成

35、后工具栏的按钮就实现了 for(i=0;i<7;i++) { button[i].dwData=0; button[i].fsState=TBSTATE_ENABLED; button[i].fsStyle=TBSTYLE_BUTTON; } button[0].idCommand=ID_KHXX; button[0].iBitmap=0; button[1].idCommand=ID_lxrxx; button[1].iBitmap=1; button[2].idCommand=ID_KHHJ; button[2].iBitmap=2; b

36、utton[3].idCommand=ID_KHFK; button[3].iBitmap=3; button[4].idCommand=ID_KHTS; button[4].iBitmap=4; button[5].idCommand=ID_EXITSYS; button[5].iBitmap=5; CString s; TCHAR *pString;//这个指针取得生成工具栏按钮的字符串 for(i=0;i<7;i++) { s.LoadString(i+IDS_31); int nStringLength= s.GetLength() + 1;

37、 pString = s.GetBufferSetLength(nStringLength); button[i].iString =toolbar2.AddStrings(pString); s.ReleaseBuffer(); } toolbar2.AddButtons(6,button); toolbar2.AutoSize(); toolbar2.SetStyle(TBSTYLE_FLAT|CCS_TOP); return TRUE; // return TRUE unless you set the focus to a control

38、 // EXCEPTION: OCX Property Pages should return FALSE } 5.2 客户信息 1.实现目标 主要实现客户基本信息的添加、删除和修改,能够进行上一条,下一条,第一条和最后一条的操作,能够用列表显示数据表中全部信息,使用分页的方式。程序运行如图7所示。 图7 客户信息录入窗口 2.设计步骤 (1)设计基于CDialog的khbase类 利用资源编辑器添加一个新的对话框资源,双击新加入的对话框资源,弹出如图8所示的系统提示对话框,提示用户是否添加新类。 页:15 此图无边杠请重抓。 图8

39、添加新类的系统对话框 这时,只需要单击“OK”按钮就会弹出添加新类的对话框,如图9所示。 图9 添加新类对话框 只要在Name栏中输入类的名字khbase,单击“OK”按钮,就会生成khbase.cpp和khbase.h两个文件,这两个文件就组成了一个类。相应的实现代码请读者参阅.CPP的文件。 (2)添加TabSheet类,用于实现分页功能。只要将TabSheet.cpp和TabSheet.h加入到工程中在代码中调用TabSheet类既可实现。 (3)主窗体添加成员变量m_tab,列表窗体添加成员变量m_list。 添加成员变量是通过类向导实现的,单击菜单View\Clas

40、sWizard就会弹出类向导,选择MemberVariables选项卡,类向导对话框如图10所示,添加成员变量只要单击ConctrolIDs,要修改的资源ID会呈现出蓝色被选状态,此时“AddVariable”按钮会变成可用状态,单击“AddVariable”按钮会弹出如图11所示添加变量对话框,按照图中的提示,添加变量名称,选择变量类型,单击“OK”按钮即可完成成员变量的添加。 图10 类向导对话框 图11 添加成员变量对话框 主要变量列表如表1所示(这里没有给出所有成员变量,具体请参照程序原代码)。 表1

41、 主要资源属性设置 资源ID 类型 成员变量 描述 IDC_EDIT1 CEdit m_edit1 客户编号 IDC_COMBO1 CComboBox m_com1 企业类型 3.代码分析 实现分页机制的TabSheet类的代码如下: 在构造函数中定义添加的对话框的个数变量,当前对话框索引的变量。 CTabSheet::CTabSheet() { m_nNumOfPages = 0;//存储对话框个数变量 m_nCurrentPage = 0;//存储当前使用着的对话框索引的变量 } CTabSheet::~CTabSheet() {

42、} 将对话框和Tab控件通过函数相关联。 BOOL CTabSheet::AddPage(LPCTSTR title, CDialog *pDialog,UINT ID) { if( MAXPAGE == m_nNumOfPages ) return FALSE; m_nNumOfPages++; m_pPages[m_nNumOfPages-1] = pDialog; m_IDD[m_nNumOfPages-1] = ID; m_Title[m_nNumOfPages-1] = title; return TRUE; } 用来设置对话框资源在Tab控件

43、中的位置。 void CTabSheet::SetRect() { CRect tabRect, itemRect; int nX, nY, nXc, nYc; GetClientRect(&tabRect); GetItemRect(0, &itemRect); nX=itemRect.left; nY=itemRect.bottom+1; nXc=tabRect.right-itemRect.left-2; nYc=tabRect.bottom-nY-2; m_pPages[0]->SetWindowPos(&wndTop, nX, nY, nXc

44、, nYc, SWP_SHOWWINDOW); for( int nCount=1; nCount < m_nNumOfPages; nCount++ ) m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW); m_nNumOfPages = 0; } 用来设置指定对话框资源在Tab控件中的位置。 void CTabSheet::SetRect(int m) { CRect tabRect, itemRect; int nX, nY, nXc, nYc; GetCli

45、entRect(&tabRect); GetItemRect(0, &itemRect); nX=itemRect.left; nY=itemRect.bottom+1; nXc=tabRect.right-itemRect.left-2; nYc=tabRect.bottom-nY-2; for( int nCount=0; nCount < m_nNumOfPages; nCount++ ) m_pPages[nCount]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_HIDEWINDOW); m_pPages

46、[m]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW); } 在Tab控件中显示对话框。 void CTabSheet::Show() { for( int i=0; i < m_nNumOfPages; i++ ) { m_pPages[i]->Create( m_IDD[i], this ); InsertItem( i, m_Title[i] ); } m_pPages[0]->ShowWindow(SW_SHOW); for( i=1; i < m_nNumOfPages; i++

47、) m_pPages[i]->ShowWindow(SW_HIDE); SetRect(); } 在Tab控件中显示指定对话框。 void CTabSheet::Show(int n) { for( int i=0; i < m_nNumOfPages; i++ ) { m_pPages[i]->Create( m_IDD[i], this ); InsertItem( i, m_Title[i] ); } for( i=0; i < m_nNumOfPages; i++) m_pPages[i]->ShowWindow(SW_HIDE);

48、 m_pPages[n]->ShowWindow(SW_SHOW); SetRect(n); SetCurSel(n); } 用户单击Tab控件时,将焦点设置在对话框上。 void CTabSheet::OnLButtonDown(UINT nFlags, CPoint point) { CTabCtrl::OnLButtonDown(nFlags, point); if(m_nCurrentPage != GetCurFocus()) { m_pPages[m_nCurrentPage]->ShowWindow(SW_HIDE); m_nCu

49、rrentPage=GetCurFocus(); m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); } } 通过Tab控件在窗体中设置选项卡。 int CTabSheet::SetCurSel(int nItem) { if( nItem < 0 || nItem >= m_nNumOfPages) return -1; int ret = m_nCurrentPage; if(m_nCurrentPage != nItem ) { m_pPages[m_nCurrentPage]->ShowW

50、indow(SW_HIDE); m_nCurrentPage = nItem; m_pPages[m_nCurrentPage]->ShowWindow(SW_SHOW); CTabCtrl::SetCurSel(nItem); } m_nNumOfPages = 0; return ret; } 获得Tab控件当前用户选择的分页项。 int CTabSheet::GetCurSel() { return CTabCtrl::GetCurSel(); } 5.3 联系人信息查询 1.实现目标 实现查询功能,可以查询联系人的编号,企业的名称,

51、联系人的姓名等字段,最后将查询出来的结果显示在列表中,程序运行结果如图12所示。 图12. 联系人信息查询 2.设计步骤 (1)设计类qlxr,基类为CDialog。 (2)定义文本框的成员变量(给资源IDC_EDIT1加变量)和列表框的成员变量(给资源IDC_LIST1加变量)。 主要成员变量列表如表2所示(这里没有给出所有成员变量,具体请参照程序原代码)。 表2 主要资源属性设置 资源ID 类型 变量 描述 IDC_COMBO1 CComboBox m_com1 查询条件 IDC_COMBO

52、2 CComboBox m_com2 查询条件 IDC_EDIT1 CEdit m_edit1 输入查询信息 IDC_LIST1 CListCtrl m_list 显示查询结果 3.代码分析 联系人人信息查询文件Qlxr.ccp的主要代码如下: 对话框的初始化程序代码如下: BOOL qlxr::OnInitDialog() { CDialog::OnInitDialog(); this->m_com1.AddString("联系人编号"); this->m_com1.AddString("企业名称"); this->m_com1.AddStr

53、ing("联系人姓名"); this->m_com1.AddString("联系人性别"); this->m_com1.AddString("年龄"); this->m_com1.AddString("职位"); this->m_com1.AddString("办公电话"); this->m_com1.AddString("电子邮件"); this->m_com1.AddString("手机"); this->m_com2.AddString("like"); this->m_com2.AddString("="); m_list.SetExtendedSt

54、yle(LVS_EX_GRIDLINES| LVS_EX_FULLROWSELECT| LVS_EX_HEADERDRAGDROP| LVS_EX_ONECLICKACTIVATE); m_list.InsertColumn(0,"联系人编号"); m_list.InsertColumn(1,"企业名称"); m_list.InsertColumn(2,"联系人姓名"); m_list.InsertColumn(3,"联系人性别"); m_list.InsertColumn(4,"年龄"); m_list.InsertColumn(5,"职位");

55、 m_list.InsertColumn(6,"办公电话"); m_list.InsertColumn(7,"电子邮件"); m_list.InsertColumn(8,"手机"); m_list.SetColumnWidth(0,100);//设置列表框列的宽度 m_list.SetColumnWidth(1,100); m_list.SetColumnWidth(2,100); m_list.SetColumnWidth(3,100); m_list.SetColumnWidth(4,100); m_list.SetColumnWidth(5,100); m_lis

56、t.SetColumnWidth(6,100); m_list.SetColumnWidth(7,100); m_list.SetColumnWidth(8,100); this->loadlist(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void qlxr::OnButton2() { this->EndDialog(true);

57、 } 实现查询功能,当文本框和选择列表框都为空是,出现提示。 void qlxr::OnButton1() { m_list.DeleteAllItems(); ado rst; CString sql,edit1,com1,com2; this->m_edit.GetWindowText(edit1); this->m_com2.GetWindowText(com2); this->m_com1.GetWindowText(com1); if(edit1.IsEmpty()) {AfxMessageBox("请输入"); ret

58、urn; } if(com1.IsEmpty()) {AfxMessageBox("请输入"); return; } if(com2.IsEmpty()) {AfxMessageBox("请输入"); return; } sql.Format("select * from tb_Client_lxrxx where %s %s '%s'",ssel,com2,edit1); rst.Open(sql,adCmdText); int recordcount=rst.GetRecordCount(); int ii; for(

59、ii=1;ii<=recordcount;ii++) { m_list.InsertItem(ii-1,""); m_list.SetItemText(ii-1,0,rst.GetFieldValue("lxrxx_id")); m_list.SetItemText(ii-1,1,rst.GetFieldValue("lxrxx_qymc")); m_list.SetItemText(ii-1,2,rst.GetFieldValue("lxrxx_xm")); m_list.SetItemText(ii-1,3,rst.GetFieldValue("lxrxx_xb")); m_

60、list.SetItemText(ii-1,4,rst.GetFieldValue("lxrxx_nl")); m_list.SetItemText(ii-1,5,rst.GetFieldValue("lxrxx_zw")); m_list.SetItemText(ii-1,6,rst.GetFieldValue("lxrxx_bgdh")); m_list.SetItemText(ii-1,7,rst.GetFieldValue("lxrxx_Email")); m_list.SetItemText(ii-1,8,rst.GetFieldValue("lxrxx_sj")); rs

61、t.Move(ii); } rst.close(); } 程序运行中对话框被打开后,列表框数据的初始化。 void qlxr::loadlist() { ado rst; rst.Open("select * from tb_Client_lxrxx",adCmdText); int recordcount=rst.GetRecordCount(); int ii; for(ii=1;ii<=recordcount;ii++) { m_list.InsertItem(ii-1,""); m_list.SetItemText(ii-1,0,rst.GetFie

62、ldValue("lxrxx_id")); m_list.SetItemText(ii-1,1,rst.GetFieldValue("lxrxx_qymc")); m_list.SetItemText(ii-1,2,rst.GetFieldValue("lxrxx_xm")); m_list.SetItemText(ii-1,3,rst.GetFieldValue("lxrxx_xb")); m_list.SetItemText(ii-1,4,rst.GetFieldValue("lxrxx_nl")); m_list.SetItemText(ii-1,5,rst.GetFieldV

63、alue("lxrxx_zw")); m_list.SetItemText(ii-1,6,rst.GetFieldValue("lxrxx_bgdh")); m_list.SetItemText(ii-1,7,rst.GetFieldValue("lxrxx_Email")); m_list.SetItemText(ii-1,8,rst.GetFieldValue("lxrxx_sj")); rst.Move(ii); } rst.close(); } 此函数用来将用户在ComboBox控件的选择转换成SQL语句所需的字段名称。 void qlxr::OnSelchangeC

64、ombo1() { switch(m_com1.GetCurSel()) { case 0: ssel="lxrxx_id"; break; case 1: ssel="lxrxx_qymc"; break; case 2: ssel="lxrxx_xm"; break; case 3: ssel="lxrxx_xb"; break; case 4: ssel="lxrxx_nl"; break; case 5: ssel="lxrxx_zw"; break;

65、 case 6: ssel="lxrxx_bgdh"; break; case 7: ssel="lxrxx_Email"; break; case 8: ssel="lxrxx_sj"; break; } } 附录A 参考文献 1.《Visual Basic精彩编程200例》机械工业出版社 赛奎春、高春艳等 2003年1月 2.《Visual Basic数据库开发实例解析》机械工业出版社 刘志铭、高春艳等 2003年8月 3.《Visual FoxPro数据库开发实例解析》机械工业出版社 王晶莹、王国辉等 200

66、3年9月 4.《Power Builder数据库开发实例解析》机械工业出版社 华传铭、张振坤等 2003年9月 5.《Delphi数据库开发实例解析》机械工业出版社 赛奎春、郑骁鹏等 2004年2月 6.《PowerBuilder 精彩编程200例》机械工业出版社 张振坤、李文立等 2004年9月 7.《Visual FoxPro 精彩编程200例》机械工业出版社 王国辉、董韶华等 2004年9月 8.《ASP数据库开发实例解析》机械工业出版社 李严、于亚芳、王国辉 2004年12月 9.《Delphi工程应用与项目实践》机械工业出版社 宋坤、赵智勇等 2005年1月 10.《Visual Basic工程应用与项目实践》机械工业出版社 高春艳、李俊民等 2005年1月 11.《Visual C++工程应用与项目实践》机械工业出版社 张雨、阮伟良等 2005年1月 12.《JSP工程应用与项目实践》机械工业出版社 陈威、白伟明、李楠 2005年2月 13.《ASP工程应用与项目实践》机械工业出版社 王国辉、牛强、李南南 2005年4月

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!