📄 cdatamanage.cpp
字号:
strData = m_propData[propid];
return ID_SUCCESSFULLY;
}
//FUNCTION:
// 得到当前记录指定属性的内容
//PARAMETERS:
// propid: [in]属性ID
// lData: [out]属性内容
// ID_SUCCESSFULLY: 成功
// ID_PROPID_ERROR: 参数错误
WORD CDataManage::GetPropData(WORD propid, LONG *lData)
{
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_LONG) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
*lData = _ttol(m_propData[propid]);
return ID_SUCCESSFULLY;
}
WORD CDataManage::GetPropData(WORD propid, FLOAT *fData)
{
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_DOT) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
*fData = _ttol(m_propData[propid]) / 100.0;
return ID_SUCCESSFULLY;
}
WORD CDataManage::GetPropData(WORD propid, CTime &time)
{
int iYear, iMonth, iDay, iHouse, iMin, iSec;
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_DATE) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
_stscanf(m_propData[propid],_T("%d,%d,%d,%d,%d,%d"),
&iYear, &iMonth, &iDay, &iHouse, &iMin, &iSec);
if(iYear > 1000 && iYear < 3000
&& iMonth > 0 && iMonth < 13
&& iDay > 0 && iDay < 32
&& iMin >= 0 && iMin <= 60
&& iSec >= 0 && iSec <= 60)
{
time = CTime(iYear, iMonth, iDay, iHouse, iMin, iSec);
}
return ID_SUCCESSFULLY;
}
//////////////////////////////////////////////////////////////////////////////////////
//FUNCTION:
// 设置当前记录指定属性的内容
//PARAMETERS:
// propid: [in]属性ID
// strData:[in]属性内容
//RETURN:
// ID_SUCCESSFULLY: 成功
// ID_PROPID_ERROR: 参数错误
WORD CDataManage::SetPropData(WORD propid, const CString &strData)
{
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_STR) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
m_propData[propid] = strData;
m_modifyFlag = TRUE;
m_bReloadFlag = TRUE;
return ID_SUCCESSFULLY;
}
//FUNCTION:
// 设置当前记录指定属性的内容
//PARAMETERS:
// propid: [in]属性ID
// lData: [in]属性内容
//RETURN:
// ID_SUCCESSFULLY: 成功
// ID_PROPID_ERROR: 参数错误
WORD CDataManage::SetPropData(WORD propid, LONG lData)
{
TCHAR p[50];
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_LONG) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
_ltot(lData, p, 10);
m_propData[propid] = p;
m_modifyFlag = TRUE;
m_bReloadFlag = TRUE;
return ID_SUCCESSFULLY;
}
WORD CDataManage::SetPropData(WORD propid, FLOAT fData)
{
TCHAR p[50];
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_DOT) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
_ltot(fData * 100 + 0.5, p, 10); //?这里要注意一个精度问题
m_propData[propid] = p;
m_modifyFlag = TRUE;
m_bReloadFlag = TRUE;
return ID_SUCCESSFULLY;
}
WORD CDataManage::SetPropData(WORD propid, const CTime &time)
{
TCHAR p[50];
if(propid < 0 || propid >= m_propNum)
{
return ID_PROPID_ERROR;
}
propid++;
if(m_propidList[propid] != FIELD_TYPE_DATE) //字段类型不匹配
{
return ID_TYPE_ERROR;
}
_stprintf(p, _T("%d,%d,%d,%d,%d,%d"), time.GetYear(),
time.GetMonth(), time.GetDay(), time.GetHour(),
time.GetMinute(), time.GetSecond());
m_propData[propid] = p;
m_modifyFlag = TRUE;
m_bReloadFlag = TRUE;
return ID_SUCCESSFULLY;
}
//////////////////////////////////////////////////////////////////////////////////////
//FUNCTION:
// 将数据库中的数据(.cdb)转换成unicode文本(.txt)格式保存
//PARAMETERS:
// strFileName: [in]unicode文本文件名
//RETURN:
// ID_SUCCESSFULLY: 成功
// 其它: 失败
WORD CDataManage::SaveToCsv(const CString &strFileName)
{
WORD i;
WORD wErrCode;
WORD wBufLen;
CString strErrMes;
CString strRecordBuffer;
CString strABuffer;
CString strFieldBuffer;
CCsv csv;
FILE *stream;
//以写方式打开文件
stream = _tfopen(strFileName, _T("w+b"));
if( stream == NULL )
{
::AfxMessageBox(_T("open file error!"), MB_OK, NULL);
return ID_OPEN_CSV_ERROR;
}
//如果记录数为空则只生成一个空文件
if(GetCurRecrodNum() == 0)
{
fclose( stream );
return ID_SUCCESSFULLY;
}
//定位到第一条记录
wErrCode = Seek(CEDB_SEEK_BEGINNING, 0);
switch(wErrCode)
{
case ID_SUCCESSFULLY:
break;
default:
strErrMes.Format(_T("Error X-%d-X!"), wErrCode);
::AfxMessageBox(strErrMes, MB_OK, NULL);
fclose( stream );
return wErrCode;
}
//255,254是文件类型的标识
fputc(255, stream);
fputc(254, stream);
while(wErrCode == ID_SUCCESSFULLY)
{
//生成一条记录的CSV字符串
strRecordBuffer = _T("");
for(i = 1; i < m_propNum; i++)
{
strRecordBuffer += csv.StrToCsv(m_propData[i], strFieldBuffer);
if(i < m_propNum - 1)
{
strRecordBuffer += _T("\t");
}
}
strRecordBuffer += _T("\r\n");
//写入一条记录
wBufLen = strRecordBuffer.GetLength();
fwrite(strRecordBuffer, sizeof(TCHAR), wBufLen, stream);
//下一条记录
wErrCode = Seek(CEDB_SEEK_CURRENT, 1);
switch(wErrCode){
case ID_SUCCESSFULLY:
break;
case ID_SEEK_ERROR:
case ID_NULL_ERROR:
//::AfxMessageBox(_T("传输完毕!"), MB_OK, NULL);
break;
default:
strErrMes.Format(_T("Error X-%d-X!"), wErrCode);
::AfxMessageBox(strErrMes, MB_OK, NULL);
return wErrCode;
break;
}
}
fclose( stream );
Seek(CEDB_SEEK_BEGINNING, 0);
return ID_SUCCESSFULLY;
}
WORD CDataManage::LoadFromCsv(const CString &strFileName)
{
WORD wErrCode;
WORD i;
WORD csvCount;
CString strFieldBuffer;
TCHAR readBuf[2] = {0,0};
BOOL bFullFlag;
CCsv csv;
FILE *stream;
//打开数据库并识别标志位
stream = _tfopen(strFileName, _T("r+b"));
if( stream == NULL )
{
//::AfxMessageBox(_T("open file error!"), MB_OK, NULL);
return ID_OPEN_CSV_ERROR;
}
if(fgetc(stream) != 255)
{
return ID_ERROR_FILE;
}
if(fgetc(stream) != 254)
{
return ID_ERROR_FILE;
}
//删除数据库中的所有记录
wErrCode = m_selfCigdata.ClearAllRecord();
if(wErrCode != ID_SUCCESSFULLY)
{
return wErrCode;
}
m_wNextRecordNum = 10000; //记录内部索引计数复位
//增加一条新的空记录
wErrCode = AddNewRecord();
if(wErrCode != ID_SUCCESSFULLY)
{
fclose( stream );
return wErrCode;
}
//读取数据,加入到CE数据库中
i = 1;
bFullFlag = FALSE;
while(1)
{
strFieldBuffer = _T("");
csvCount = 0;
while(fread(readBuf, sizeof(TCHAR), 1, stream) == 1)
{
switch(readBuf[0])
{
//出现字段分隔符
case ',':
case '\t':
if((csvCount / 2) * 2 == csvCount) //表示字段分隔
{
goto READ_A_FIELD_OVER;
}
if(!bFullFlag) //表示字段中的内容
{
strFieldBuffer += readBuf;
}
break;
//出现记录分隔符
case '\r':
if((csvCount / 2) * 2 == csvCount) //表示记录分隔
{
goto READ_A_RECORD_OVER;
}
if(!bFullFlag) //表示字段中的内容
{
strFieldBuffer += _T("\r\n");
}
break;
case '\n':
break; //忽略换行符
case '\"':
csvCount++; //"号计数
default:
if(!bFullFlag)
{
strFieldBuffer += readBuf;
}
break;
}
}
goto READ_A_FILE_OVER;
//读完一个字段
READ_A_FIELD_OVER:
//写入字段并忽略多出的字段
if(!bFullFlag)
{
csv.CsvToStr(strFieldBuffer, m_propData[i]);
//读取下一个字段,容错,忽略多出的字段
i++;
if(i >= m_propNum)
{
bFullFlag = TRUE;
}
}
continue;
//读完一条记录
READ_A_RECORD_OVER:
//写入字段并忽略多出的字段
if(!bFullFlag)
{
csv.CsvToStr(strFieldBuffer, m_propData[i]);
}
//新增下一条记录
m_modifyFlag = TRUE;
wErrCode = AddNewRecord();
if(wErrCode != ID_SUCCESSFULLY)
{
fclose( stream );
return wErrCode;
}
i = 1;
bFullFlag = FALSE;
continue;
}
READ_A_FILE_OVER:
fclose(stream);
//删除多出的最后一条记录并复位记录
wErrCode = DelCurRecord();
if(wErrCode != ID_SUCCESSFULLY)
{
Seek(CEDB_SEEK_BEGINNING, 0);
return wErrCode;
}
Seek(CEDB_SEEK_BEGINNING, 0);
return ID_SUCCESSFULLY;
}
//数据显示是否需要更新
BOOL CDataManage::IsReload()
{
if(m_bReloadFlag)
{
m_bReloadFlag = FALSE;
return TRUE;
}
else
{
return FALSE;
}
}
///////////////////////////////////////////////////////////////////////////////////
BOOL CDataManage::CompareVal(WORD propid, WORD compType, const CString &strVal)
{
CString strTemp;
//读取字段内容
if(GetPropData(propid, strTemp) != ID_SUCCESSFULLY)
{
return FALSE;
}
//是否匹配
switch(compType)
{
case CDM_FIND_SMALLER:
if(strTemp < strVal)
{
return TRUE;
}
break;
case CDM_FIND_EQU:
if(strTemp == strVal)
{
return TRUE;
}
break;
case CDM_FIND_GREATER:
if(strTemp == strVal)
{
return TRUE;
}
break;
case CDM_FIND_NEAR:
if(strTemp.Find(strVal, 0) != -1)
{
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
BOOL CDataManage::CompareVal(WORD propid, WORD compType, LONG lVal)
{
LONG lTemp;
//读取字段内容
if(GetPropData(propid, &lTemp) != ID_SUCCESSFULLY)
{
return FALSE;
}
//是否匹配
switch(compType)
{
case CDM_FIND_SMALLER:
if(lTemp < lVal)
{
return TRUE;
}
break;
case CDM_FIND_EQU:
if(lTemp == lVal)
{
return TRUE;
}
break;
case CDM_FIND_GREATER:
if(lTemp > lVal)
{
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
BOOL CDataManage::CompareVal(WORD propid, WORD compType, FLOAT fVal)
{
FLOAT fTemp;
if(GetPropData(propid, &fTemp) != ID_SUCCESSFULLY)
{
return FALSE;
}
switch(compType)
{
case CDM_FIND_SMALLER:
if(fTemp < fVal)
{
return TRUE;
}
break;
case CDM_FIND_EQU:
if(abs(fTemp - fVal) < 0.0001)
{
return TRUE;
}
break;
case CDM_FIND_GREATER:
if(fTemp > fVal)
{
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
BOOL CDataManage::CompareVal(WORD propid, WORD compType, const CTime &tVal)
{
CTime tTemp;
if(GetPropData(propid, tTemp) != ID_SUCCESSFULLY)
{
return FALSE;
}
switch(compType)
{
case CDM_FIND_SMALLER:
if(tTemp < tVal)
{
return TRUE;
}
break;
case CDM_FIND_EQU:
if(tTemp == tVal)
{
return TRUE;
}
break;
case CDM_FIND_GREATER:
if(tTemp > tVal)
{
return TRUE;
}
break;
case CDM_FIND_NEAR:
if(tTemp.GetYear() == tVal.GetYear()
&& tTemp.GetMonth() == tVal.GetMonth()
&& tTemp.GetDay() == tVal.GetDay())
{
return TRUE;
}
break;
case CDM_FIND_YEAR_MONTH_EQU:
if(tTemp.GetYear() == tVal.GetYear()
&& tTemp.GetMonth() == tVal.GetMonth())
{
return TRUE;
}
break;
case CDM_FIND_YEAR_EQU:
if(tTemp.GetYear() == tVal.GetYear())
{
return TRUE;
}
break;
default:
break;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -