本发明属于电子工票系统领域,涉及一种用于电子工票机的异地工厂数据库同步方法。
背景技术:
电子工票系统就是用电子的RFID卡来取代条码纸工票的系统。准确的称谓应该是RFIDEPRS(Electronic Productive Recording System),即使用电子无线射频识别技术的生产计数系统。 电子工票系统采用RFID无线射频感应卡片,代替传统的纸质条码工票,进行生产过程数据进行实时采集。帮助企业实时获取生产进度、员工生产产量、物料的加工流向信息、品质信息等,根据现场分析的数据及时做出调度和调整,平衡现场生产瓶颈,改进生产工艺等。
电子工票采用RFID无线射频识别技术,将工人生产的数量和内容直接通过IC/ID卡的读写设备发送到电脑,并记录工人完成的数量和耗时,分析车间流水情况等功能,具有实事、快捷、准确、环保、提高生产效率等作用。
技术实现要素:
本发明的所要解决的技术问题是针对现有电子工票系统,异地工厂管理数据同步的不稳定,和维护成本高的问题,提出一种用于电子工票机的异地工厂数据库同步方法,该方法通过将主副数据库还原合并,按需要的时间执行,而实现数据库稳定同步的方法。
为解决上述技术问题,本发明所采用的技术方案为:
1. 一种用于电子工票机的异地工厂数据库同步方法,实现方法如下:
(1) 数据库设计为主数据库和副数据库,主数据库包含全部数据,副数据库包含要同步到主厂的部分数据;副厂刷卡数据同时写入主副数据库;
(2) 主厂服务器将主数据库备份为文件,副厂服务器将副数据库备份成文件;
(3) 通过网络或u盘传输(如同步盘)主厂数据库文件给副厂数据库服务器,通过网络或u盘将副厂数据库文件传输给主厂数据库服务器;
(4)主厂数据库服务器还原副数据库文件,合并主副数据库;副厂还原主数据库文件,合并主副数据库;
(5)以上过程通过循环按需要时间执行操作,就实现了数据库稳定同步。
发明的有益效果:
现有的电子工票系统工人查询工作工资记录是通过刷卡机,或专用电脑来完成。
本发明的所要解决的技术问题是针对现有电子工票系统,异地工厂管理,数据库不能低成本稳定同步的问题,提出一种用于电子工票机的异地工厂数据库同步方法,该方法通过将主副数据库还原合并,按需要的时间执行,而实现数据库稳定同步的方法。
附图说明
图1是副厂数据库的表的字段数据;
图2主副数据库名称,和副数据表名;
图3是还原合并的程序设置项。
具体实施方式
一种用于电子工票机的异地工厂数据库同步方法,实现方法如下:
(1) 数据库设计为主数据库和副数据库,主数据库包含全部数据,副数据库包含要同步到主厂的部分数据;副厂刷卡数据同时写入主副数据库;
(2) 主厂服务器将主数据库备份为文件,副厂服务器将副数据库备份成文件;
(3) 通过网络或u盘传输(如同步盘)主厂数据库文件给副厂数据库服务器,通过网络或u盘将副厂数据库文件传输给主厂数据库服务器;
(4)主厂数据库服务器还原副数据库文件,合并主副数据库;副厂还原主数据库文件,合并主副数据库;
(5)以上过程通过循环按需要时间执行操作,就实现了数据库稳定同步。
还原合并数据库,参考代码如下,本代码已经用于工业生产:
// MergeDataDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MergeData.h"
#include "MergeDataDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CMergeDataDlg 对话框
// CMergeDataDlg 消息处理程序
bool IsDirectoryExists(CString const& path)
{
//判断是否存在
if(!PathFileExists(path))
return false;
//判断是否为目录
DWORD attributes = ::GetFileAttributes(path);
attributes &= FILE_ATTRIBUTE_DIRECTORY;
return attributes == FILE_ATTRIBUTE_DIRECTORY;
}
CMergeDataDlg::CMergeDataDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMergeDataDlg::IDD, pParent)
, m_strMainDB_Name(_T(""))
, m_strFuDB_Name(_T(""))
, m_strPath(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bMainDBConnected = false;
m_bFuDBConnected = false;
m_strMainDB_Name ="Clothing";
m_strFuDB_Name = "FuDB";
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer();
int nPos;
nPos=sPath.ReverseFind('\\');
sPath=sPath.Left(nPos);
m_strSysPath =sPath+_T("\\sys.config");
m_sysSet.SetSysFilePath(m_strSysPath);
m_sysSet.LoadSet();
m_strPath = m_sysSet.GetDB_path();
}
void CMergeDataDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDITMAIN_NAME, m_strMainDB_Name);
DDX_Text(pDX, IDC_EDITFU_NAME, m_strFuDB_Name);
// DDX_Control(pDX, IDC_EDITFU_NAME, m_EditMainDBName);
DDX_Control(pDX, IDC_EDITMAIN_NAME, m_EditMainDBName);
DDX_Control(pDX, IDC_EDITFU_NAME, m_EditFuDBName);
DDX_Text(pDX, IDC_EDIT_PATH, m_strPath);
}
BEGIN_MESSAGE_MAP(CMergeDataDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDOK, &CMergeDataDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BTNSELMAIN, &CMergeDataDlg::OnBnClickedBtnselmain)
ON_BN_CLICKED(IDC_BTNSELSECOND, &CMergeDataDlg::OnBnClickedBtnselsecond)
ON_BN_CLICKED(IDC_BUTTON1, &CMergeDataDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CMergeDataDlg::OnBnClickedButton2)
/*ON_BN_CLICKED(IDC_BTNFresh, &CMergeDataDlg::OnBnClickedBtnfresh)*/
ON_BN_CLICKED(IDC_BTNFresh, &CMergeDataDlg::OnBnClickedBtnfresh)
ON_BN_CLICKED(IDC_BTN_PATH, &CMergeDataDlg::OnBnClickedBtnPath)
ON_BN_CLICKED(IDCANCEL, &CMergeDataDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
// CMergeDataDlg 消息处理程序
void CMergeDataDlg::GetLastFileInfo(CString &fileName)//得到按修改日期 排序后 文件信息
{
CString strFilePath;
strFilePath =m_sysSet.GetDB_path();
CFileFind finder;
BOOL bWorking = finder.FindFile(strFilePath+"*.bak");
FileInfo fileInfo;
int i=0;
while(bWorking)
{
bWorking=finder.FindNextFile();
strFilePath =finder.GetFilePath();
HANDLE hFile;
WIN32_FIND_DATA wfd;
SYSTEMTIME systime;
FILETIME localtime;
CString strFileDate; //输出日期时间
if((hFile=FindFirstFile(strFilePath,&wfd))==INVALID_HANDLE_VALUE)
{
/*char c[2];
DWORD dw=GetLastError();
wsprintf(c, "%d", dw);
AfxMessageBox(c); */
return;//失败
}
//ok,转换时间
FileTimeToLocalFileTime(&wfd.ftLastWriteTime,&localtime);
FileTimeToSystemTime(&localtime,&systime);
strFileDate.Format(_T("%4d-%2d-%2d-%2d-%2d-%2d"),
systime.wYear,systime.wMonth,systime.wDay,
systime.wHour,systime.wMinute,systime.wSecond);
int Where=0;
Where = strFilePath.ReverseFind('\\');
if (Where == -1)
Where = strFilePath.ReverseFind('/');
CString FileTitle = strFilePath.Right(strFilePath.GetLength() - 1 - Where);
if(i==0)
{
fileInfo.m_strFilePathName=FileTitle;
fileInfo.m_strFileDateTime=strFileDate;
}
else
{
if(strFileDate>fileInfo.m_strFileDateTime)
{
fileInfo.m_strFilePathName=FileTitle;
fileInfo.m_strFileDateTime=strFileDate;
}
}
i+=1;
}
if(i!=0)
fileName = fileInfo.m_strFilePathName;
else
fileName="Nofile";
}
BOOL CMergeDataDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
OnBnClickedBtnfresh();//刷新主数据库 自动运行
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CMergeDataDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMergeDataDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMergeDataDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMergeDataDlg::OnBnClickedOk()
{
if(m_bMainDBConnected && m_bFuDBConnected)
{
DoMergeDB();
}
}
void CMergeDataDlg::OnBnClickedBtnselmain()
{
UpdateData(TRUE);
CString strMain = _T("Data Source=.\\c01;Initial Catalog=");
if(m_strMainDB_Name.Trim()=="")
{
AfxMessageBox(_T("主数据库名不能为空!"));
return;
};
//strMain =strMain+ m_strMainDB_Name+_T(";Integrated Security=True;MultipleActiveResultSets=True");// ;providerName="System.Data.SqlClient"
strMain="Driver=SQL Server;Server=";
strMain+=".\\c01";
strMain+=";Database=";
strMain+=m_strMainDB_Name;
//strdsn+=";
m_adoConnMain.OnInitADOConn((_bstr_t)strMain);
if(m_adoConnMain.IsOpen())
{
m_EditMainDBName.EnableWindow(FALSE);
m_bMainDBConnected =true;
}
else
AfxMessageBox(_T("主数据库连接错误"));
}
void CMergeDataDlg::OnBnClickedBtnselsecond()
{
UpdateData(TRUE);
CString strFu; // = _T("Data Source=.\\SQLEXPRESS;Initial Catalog=");
if(m_strFuDB_Name.Trim()=="")
{
AfxMessageBox(_T("副数据库名不能为空!"));
return;
};
strFu="Driver=SQL Server;Server=";
strFu+=".\\c01";
strFu+=";Database=";
strFu+=m_strFuDB_Name;
m_adoConnSecond.OnInitADOConn((_bstr_t)strFu);
if(m_adoConnMain.IsOpen())
{
m_EditFuDBName.EnableWindow(FALSE);
m_bFuDBConnected = true;
}
else
AfxMessageBox(_T("副数据库连接错误"));
}
void CMergeDataDlg::DoMergeDB()//合并数据库 2014.3.30
{
CString strSQLSel;
strSQLSel = "Select * from PackingProcedureBack where PackingID is Not null and CuttingID is not NULL";
//strSQInsert ="Insert into PackingProcedure (@packingId,@cuttingId,@procedureId,@employeeId,(GETDATE()))";
//_RecordsetPtr recordsetS;
_RecordsetPtr FuRecordset;
_RecordsetPtr FuCardInfoRecordset;
_RecordsetPtr OldRecordset;
_variant_t vSum;
FuRecordset.CreateInstance(__uuidof(Recordset));
FuCardInfoRecordset.CreateInstance(__uuidof(Recordset));
OldRecordset.CreateInstance(__uuidof(Recordset));
FuRecordset = m_adoConnSecond.GetRecordSet((_bstr_t)strSQLSel);
_variant_t var;
if(FuRecordset->adoEOF)
{
//AfxMessageBox(_T("副数据库没有新的数据可以合并!"));
return;
}
/*int ncount =1;
m_strSysPath =m_strSysPath+_T("1");
m_sysSet.SetSysFilePath(m_strSysPath);*/
while (!FuRecordset->adoEOF)
{
//将刷卡的 包与工序、卡员工的信息更新
CString strDATA;
int iPackingID,iCuttingID,iProcedureID,iEmployeeID;
iPackingID=FuRecordset->GetCollect("PackingID");
iCuttingID=FuRecordset->GetCollect("CuttingID");
iProcedureID=FuRecordset->GetCollect("ProcedureID");
iEmployeeID=FuRecordset->GetCollect("EmployeeID");
var=FuRecordset->GetCollect("Date");
strDATA=(LPCSTR)_bstr_t(var);
CString strSQInsert;
CString strSql;
//strSQInsert.Format(_T("insert customer value (%d, '%s' )"), cust_id, cust_name);
strSql.Format(_T("SELECT * FROM PackingProcedure where PackingID=%d and CuttingID= %d and ProcedureID= %d"),
iPackingID,iCuttingID,iProcedureID);
OldRecordset = m_adoConnMain.GetRecordSet(_bstr_t(strSql));
/* ncount+=1;
CString str;
str.Format(_T("%d"),ncount);
m_sysSet.SetDB_path(str);
m_sysSet.SaveSet();*/
if(!OldRecordset->adoEOF)
{
//如果有
CString strDATAtmp;
var=OldRecordset->GetCollect("Date");
strDATAtmp=(LPCSTR)_bstr_t(var);//主时间
if(strDATAtmp<=strDATA)
{
OldRecordset->Close();
OldRecordset=NULL;
// m_pCommand.Detach();//释放命令对象
FuRecordset->MoveNext();
continue;
}
else if(strDATAtmp.Right(8)=="23:59:59")
{
OldRecordset->Close();
OldRecordset=NULL;
FuRecordset->MoveNext();
continue;
}
strSQInsert.Format(_T("Update PackingProcedure Set EmployeeID=%d,Date='%s' where PackingID=%d and CuttingID= %d and ProcedureID= %d"),
iEmployeeID,strDATA,iPackingID,iCuttingID,iProcedureID);
}
else
strSQInsert.Format(_T("insert into PackingProcedure (PackingID,CuttingID,ProcedureID,EmployeeID,[Date]) values(%d,%d,%d,%d,'%s')"),
iPackingID,iCuttingID,iProcedureID,iEmployeeID,strDATA);
/* strSQInsert.Format(_T("insert into PackingProcedure (PackingID,CuttingID,ProcedureID,EmployeeID) values(%d,%d,%d,%d)"),
iPackingID,iCuttingID,iProcedureID,iEmployeeID);*/
OldRecordset->Close();
m_adoConnMain.ExecuteSQL((_bstr_t)strSQInsert);//_bstr_
FuRecordset->MoveNext();
}
SYSTEMTIME systime;
/* FileTimeToSystemTime(&localtime,&systime);
strFileDate.Format(_T("%4d-%2d-%2d-%2d-%2d-%2d"),
systime.wYear,systime.wMonth,systime.wDay,
systime.wHour,systime.wMinute,systime.wSecond); */
}
void CMergeDataDlg::OnBnClickedButton1()//导出
{
CString strBackDB,strSQL;
//strBackDB =m_strFuDB_Name;
strBackDB+="合并Clothing";
CString strPath;
strPath ="E:\\2014\\";
ExecuteProcedure(m_strMainDB_Name,strBackDB,strPath);
}
void CMergeDataDlg::ExecuteProcedure(CString strMainDB_Name,CString strBackDB,CString strPath)
{
::CoInitialize(NULL);
_ConnectionPtr m_pConnection;//连接数据库的Com智能指针,可以自动Release ^_^
m_pConnection.CreateInstance("ADODB.Connection");//建立实例返回HRESULT 所以最好if一下看看成功否
try
{
m_pConnection->Open("Driver={SQL Server};Server=.\\c01;Database=Clothing;UID=;PWD=","","",adModeUnknown);
// .........//其他数据库操作
}
catch(_com_error e)
{
//处理错误吧
}
_CommandPtr m_pCommand;//还是智能指针
m_pCommand.CreateInstance("ADODB.Command");//实例
//m_pCommand->ActiveConnection = m_adoConnMain.m_pConnection;//设置连接,别忘了啊
m_pCommand->ActiveConnection = m_pConnection;//设置连接,别忘了啊
m_pCommand->CommandText = "sp_BackupDB";//存储过程为Test
_ParameterPtr m_pParam1;
m_pParam1.CreateInstance("ADODB.Parameter");
_ParameterPtr m_pParam2;//附加数字的命名习惯不好别学我啊
m_pParam2.CreateInstance("ADODB.Parameter");
_ParameterPtr m_pParam3;
m_pParam3.CreateInstance("ADODB.Parameter");
m_pParam1 = m_pCommand->CreateParameter("savePath",adVarChar,adParamInput,4000,(_variant_t)"E:\\2014\\");//给参数设置各属性
m_pCommand->Parameters->Append(m_pParam1);//加入到Command对象的参数集属性中
m_pParam2 = m_pCommand->CreateParameter("dbName",adVarChar,adParamInput,400,(_variant_t)(_bstr_t)strMainDB_Name);
m_pCommand->Parameters->Append(m_pParam2);
m_pParam3 = m_pCommand->CreateParameter("bakName",adVarChar,adParamInput,400,(_variant_t)strBackDB);
m_pCommand->Parameters->Append(m_pParam3);
m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
}
int CMergeDataDlg::ExecuteRestoreProcedure(CString restoreDB_Name,CString strBackfile,CString strPath)
{
::CoInitialize(NULL);
_ConnectionPtr m_pConnection;//连接数据库的Com智能指针,可以自动Release ^_^
m_pConnection.CreateInstance("ADODB.Connection");//建立实例返回HRESULT 所以最好if一下看看成功否
try
{
m_pConnection->Open("Driver={SQL Server};Server=.\\c01;Database=Master;UID=;PWD=","","",adOptionUnspecified);
// .........//其他数据库操作
}
catch(_com_error e)
{
//处理错误吧
}
_CommandPtr m_pCommand;//还是智能指针
m_pCommand.CreateInstance("ADODB.Command");//实例
m_pCommand->ActiveConnection = m_pConnection;//设置连接,别忘了啊
m_pCommand->CommandText = "sp_RestoreDB";//存储过程为Test
_ParameterPtr m_pParam1;
m_pParam1.CreateInstance("ADODB.Parameter");
_ParameterPtr m_pParam2;//附加数字的命名习惯不好别学我啊
m_pParam2.CreateInstance("ADODB.Parameter");
_ParameterPtr m_pParam3;
m_pParam3.CreateInstance("ADODB.Parameter");
_ParameterPtr m_pParam4;
m_pParam4.CreateInstance("ADODB.Parameter");
m_pParam1 = m_pCommand->CreateParameter("savePath",adVarChar,adParamInput,4000,(_variant_t)strPath);//给参数设置各属性
m_pCommand->Parameters->Append(m_pParam1);//加入到Command对象的参数集属性中
m_pParam2 = m_pCommand->CreateParameter("backFile",adVarChar,adParamInput,400,(_variant_t)(strBackfile));
m_pCommand->Parameters->Append(m_pParam2);
m_pParam3 = m_pCommand->CreateParameter("defaultName",adVarChar,adParamInput,400,(_variant_t)restoreDB_Name);
m_pCommand->Parameters->Append(m_pParam3);
m_pParam4= m_pCommand->CreateParameter("dbName",adVarChar,adParamInput,400,(_variant_t)restoreDB_Name);
m_pCommand->Parameters->Append(m_pParam4);
return m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
}
void CMergeDataDlg::OnBnClickedButton2()//导出数据库
{
CFileFind ff;
BOOL IsFile=ff.FindFile(_T("E:\\2014\\Fudb.bak"));
if(IsFile)
{
CString StrDestFile;
StrDestFile ="E:\\2014\\fudb.bak";
//AfxMessageBox(_T("副数据不存在!"));
::DeleteFile(StrDestFile);
}
OnBnClickedBtnselmain();
CString strPath,strBackDB;
strBackDB = "FuDB";
strPath ="E:\\2014\\";
ExecuteProcedure(m_strFuDB_Name,strBackDB,strPath);
OnBnClickedBtnselsecond();
AfxMessageBox(_T("导出副数据OK!"));
}
void CMergeDataDlg::OnBnClickedBtnfresh()//刷新主数据库
{
/* CFileFind ff;
bool IsFile=ff.FindFile(_T("E:\\2014\\合并Clothing.bak"));
if(!IsFile)
{
AfxMessageBox(_T("‘合并Clothing.bak’不存在!"));
return;
}*/
CString strBackDB;
//strBackDB =m_strFuDB_Name;
//strBackDB="合并Clothing.bak";
GetLastFileInfo(strBackDB);
if(strBackDB=="Nofile")
{
//AfxMessageBox(_T("没有找到数据库备份文件!"));
return;
}
CString strPath;
strPath =m_sysSet.GetDB_path();
if(ExecuteRestoreProcedure(m_strMainDB_Name,strBackDB,strPath))
{
//AfxMessageBox(_T("刷新主数据库OK!"));
}
else
{
//AfxMessageBox(_T("刷新主数据库失败!"));
}
OnBnClickedBtnselmain();
OnBnClickedBtnselsecond();
DoMergeDB();
AfxGetMainWnd()->PostMessage(WM_QUIT);
}
void CMergeDataDlg::OnBnClickedBtnPath()
{
UpdateData(TRUE);
if(!IsDirectoryExists(m_strPath))
{
// AfxMessageBox(_T("没找到改路径!"));
return;
}
m_sysSet.SetDB_path(m_strPath);
m_sysSet.SaveSet();
}
void CMergeDataDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnCancel();
}