📄 card.cpp
字号:
{
TDataSet *pQuery;
CARDDATA a;
int rc;
pQuery = m_CardDataSource->DataSet;
ZeroMemory(&a,sizeof(a));
rc = (int)pQuery;
while(rc){
rc=ReworkCard(this,&a,0);
if(rc){ //获取相同内容的其它记录(0=>无,1=>其它记录)
if(GetOtherCardOnTable(&a,-1)==FALSE)
break; //没有重复
}
}
if(rc){
rc=AppendDataSet(pQuery);
if(rc)SaveCardRecord(pQuery,&a);
if(rc)rc=PostDataSet(pQuery);
if(!rc)ShowTableError(0);
}
if(rc){//显示Grid的nIndex行内容
m_DelBut->Enabled=TRUE;
m_EditBut->Enabled=TRUE;
}
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_DelButClick(TObject *Sender)
{
DELETEXT DelText;
TADOQuery *pQuery,*pOther;
CARDDATA a;
int rc;
pQuery = (TADOQuery *)m_CardDataSource->DataSet;
rc = (int)pQuery;
if(rc){
ZeroMemory(&DelText,sizeof(DelText));
rc=DeleteSomeRecord(this,&DelText);
}
if(rc){
rc=DelText.nSome;
if(rc==0)rc=DeleteOneCurCard(pQuery);//删除当前记录
else rc=DeleteSomeCard(pQuery,DelText.nFrom,DelText.nTo);//删除一些记录
}
if(rc){ //正确删除
rc= GetAllRecNum(pQuery);//获取总记录数
if(rc<=0)
{m_DelBut->Enabled=FALSE; m_EditBut->Enabled=FALSE;}
}
}
//删除当前一条记录
int DeleteOneCurCard(TADOQuery *pCardQuery)
{
static char pszText[]="是否真的永久(不可恢复地)删除\n\n"
"%s当前卡号为:\"%u\"的卡片?";
CARDDATA a;
char szBuf[200];
int rc;
ReadCardRecord(pCardQuery,&a);
rc=GetCardFreeBeforeDelete(&a);//删除前,确认卡片是否被领用
if(rc){
wsprintf(szBuf,pszText,a.nCardNo);
rc= Application->MessageBox(szBuf,GetMainTitle(),
MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_APPLMODAL);
if(rc==IDYES)rc=TRUE;else rc=FALSE;
}
if(rc)rc=DelCurRecordOnTable(pCardQuery);//删除当前一条记录
return(rc);
}
//删除一些卡片
int DeleteSomeCard(TADOQuery *pCardQuery,int nCardNo1,int nCardNo2)
{
static char pszStop[]="没有查询到任何记录!";
static char pszText[]="是否真的永久(不可恢复地)删除\n\n"
"%s卡号从\"%u\"至\"%u\"的卡片?";
TADOQuery *pOtherQuery;
CARDDATA a;
int rc,nFlag;
int i,nRec;
char szBuf[200];
wsprintf(szBuf,"CARDNO>=%u and CARDNO<=%u",nCardNo1,nCardNo2);
pOtherQuery = (TADOQuery *)GetOtherQuery();
nRec=QueryOneADOTable(pOtherQuery,GetCardTableName(),NULL,NULL);
if(nRec==0)
Application->MessageBox(pszStop,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
if(nRec>0)rc=TRUE; else rc=FALSE;
if(rc)nFlag = FirstDataSet(pOtherQuery);
for(i=0;i<nRec && rc && nFlag;i++){
ReadCardRecord(pOtherQuery,&a);
rc=GetCardFreeBeforeDelete(&a);//删除前,确认卡片是否被领用
if(rc) nFlag=NextDataSet(pOtherQuery);
}
if(rc){
wsprintf(szBuf,pszText,nCardNo1,nCardNo2);
rc= Application->MessageBox(szBuf,GetMainTitle(),
MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_APPLMODAL);
if(rc==IDYES)rc=TRUE;else rc=FALSE;
}
if(rc){ //删除表中数据
wsprintf(szBuf,"CARDNO>=%u and CARDNO<=%u",nCardNo1,nCardNo2);
EmptyOneADOTable(pOtherQuery,GetCardTableName(),szBuf);
}
if(rc)OpenADOQuery(pCardQuery,NULL);//按原来条件查询数据表
return(rc);
}
//删除前,确认卡片是否被领用
int GetCardFreeBeforeDelete(CARDDATA *pCard)
{
static char pszText[]="部分待删除的卡片\n已经被领用!\n\n请先将卡片归还!";
int rc;
rc=TRUE;
if(pCard->nHolderNo!=0){
Application->MessageBox(pszText,GetMainTitle(),
MB_OK|MB_ICONSTOP|MB_APPLMODAL);
rc=FALSE;
}
return(rc);
}
void __fastcall TCardForm::m_TextDBGridTitleClick(TColumn *Column)
{
static char *pszName[]={"CARDNO","CARDHI,CARDID","CARDTYPE","HOLDERNO",
"BEGINDATE","ENDDATE"};
int rc;
TADOQuery *pQuery;
char szBuf[200];
rc=Column->Index;
if(rc>=0 && rc<sizeof(pszName)/sizeof(char *))
pQuery = (TADOQuery *)m_CardDataSource->DataSet;
else pQuery==NULL;
if(pQuery!=NULL){ //获取SQL查询Where条件
GetQueryWhereName(pQuery->SQL,szBuf);
rc=QueryOneADOTable(pQuery,GetCardTableName(),szBuf,pszName[rc]);
}
else rc=0;
if(rc>0)rc=TRUE; else rc=FALSE;
m_DelBut->Enabled=rc;
m_EditBut->Enabled=rc;
}
//准备刷卡识别
void __fastcall TCardForm::m_BeginButClick(TObject *Sender)
{
int rc;
m_PauseBut->Enabled=TRUE;
m_BeginBut->Enabled=FALSE;
//设置刷卡记录处理过程
SetIODataProc(ReadCardProc);
}
void __fastcall TCardForm::m_PauseButClick(TObject *Sender)
{
int rc;
m_PauseBut->Enabled=FALSE;
m_BeginBut->Enabled=TRUE;
//取消刷卡记录处理过程
SetIODataProc(NULL);
}
//---------------------------------------------------------------------------
//刷卡识别处理(若数据未经处理,则返回FALSE)
int ReadCardProc(void *pIORec)
{
static BYTE nFlag;
CARDDATA a;
TDataSet *pQuery;
IODATA *t;
int rc,nDevice;
rc=0;
if(nFlag || pCardForm==NULL)return(rc); //防止重入
nFlag=TRUE;
t = (IODATA *)pIORec;
if(t->nDataType==IODATA_CARDDATA){ //刷卡资料
nDevice=GetCardDataOnForm(pCardForm,&a);//根据设定生成卡片数据
if(t->nCRNo==LOWORD(nDevice) &&
t->nReaderID==HIWORD(nDevice))
rc=TRUE;
}
if(rc){
pQuery = pCardForm->m_CardDataSource->DataSet;
rc = (int)pQuery;
if(rc){//获取相同内容的其它记录(0=>无,1=>其它记录)
a.nCardID=t->nCardID;
a.nCardHI = t->nCardHI;
rc = !GetOtherCardOnTable(&a,-1);
}
if(rc){
rc=AppendDataSet(pQuery);
if(rc)SaveCardRecord(pQuery,&a);
if(rc)rc=PostDataSet(pQuery);
if(!rc)ShowTableError(0);
}
if(rc){//显示Grid的nIndex行内容
pCardForm->m_DelBut->Enabled=TRUE;
pCardForm->m_EditBut->Enabled=TRUE;
SetCardNoOnForm(pCardForm,a.nCardNo+1);
}
}
nFlag=FALSE;
return(rc);
}
//根据设定生成卡片数据
int GetCardDataOnForm(TCardForm *pForm,CARDDATA *pCard)
{
int nCRNo,nReaderNo;
ZeroMemory(pCard,sizeof(CARDDATA));
pCard->nType = atoi(pForm->m_CardTypeCoBox->Text.c_str());
pCard->nCardNo = atoi(pForm->m_CardNoEdit->Text.c_str());
nCRNo = atoi(pForm->m_CRCoBox->Text.c_str());
nReaderNo = atoi(pForm->m_ReaderCoBox->Text.c_str());
return(MAKELONG(nCRNo,nReaderNo));
}
//根据设定卡片起始编号
int SetCardNoOnForm(TCardForm *pForm,int nCardNo)
{
SetIntToControl(pForm->m_CardNoEdit,nCardNo);//设置整数值到子控制中
return(nCardNo);
}
//获取相同内容的其它记录(0=>无,1=>其它记录)
int GetOtherCardOnTable(CARDDATA *Sour,int nOld)
{
static char pszStop[]="添加/修改的感应卡片时,\n"
"其卡号或内码不能为 0 值!";
static char pszText[]="添加/修改的感应卡片\n"
"其卡号:\"%u\"或内码:\"%u\"\n\n"
"已经有重复!";
char szBuf[200];
int nRec,rc;
TADOQuery *pQuery;
rc=FALSE;
if(Sour->nCardNo==0 || Sour->nCardID==0){
MessageBeep(MB_OK);
Application->MessageBox(pszStop,GetMainTitle(),
MB_OK|MB_ICONSTOP|MB_APPLMODAL);
return(TRUE);
}
wsprintf(szBuf,"CARDNO=%u OR CARDID=%u",Sour->nCardNo,Sour->nCardID);
//用OtherADOQuery元件查询一个表中记录
pQuery = (TADOQuery *)GetOtherQuery();
nRec=QueryOneADOTable(pQuery,GetCardTableName(),szBuf,NULL);
if(nRec>0){
if(nOld<=0)rc=TRUE;
else if(nRec>1)rc=TRUE;
else {
nRec = GetRecordIDOnTable(pQuery);
if(nRec!=nOld)rc=TRUE;
}
}
if(rc){
wsprintf(szBuf,pszText,Sour->nCardNo,Sour->nCardID);
Application->MessageBox(szBuf,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
}
return(rc);
}
//获取相同内容的其它记录(0=>无,1=>其它记录)
int GetOtherCardOnTable(TADOQuery *pQuery,CARDDATA *Sour,int nOld)
{
static char pszText[]="添加/修改的感应卡片\n"
"其卡号:\"%u\"或内码:\"%u\"\n\n"
"已经有重复!";
char szBuf[200];
TLocateOptions Opts;
Variant locvalues[1];
int nCardNo,nCardID;
int nNew,rc;
Opts.Clear();
nCardNo = Sour->nCardNo;
nCardID=Sour->nCardID;
if(nCardNo!=0){
locvalues[0].PutElement(nCardNo,0);
// = Variant(nCardNo,varInteger);
rc=pQuery->Locate("CARDNO", VarArrayOf(locvalues, 0), Opts);
}
else{
locvalues[0] = Variant(nCardID);
rc=pQuery->Locate("CARDID", VarArrayOf(locvalues, 0), Opts);
}
if(rc){
nNew = GetCurRecno(pQuery);//获取当前记录号
if(nNew!=nOld)rc=TRUE;
else rc=FALSE;
}
if(rc){
wsprintf(szBuf,pszText,Sour->nCardNo,Sour->nCardID);
Application->MessageBox(szBuf,GetMainTitle(),
MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
}
if(nOld>0)//移到指定记录
GotoRecordOnTable(pQuery,nOld);
return(rc);
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_InqButClick(TObject *Sender)
{
int rc;
char *pszStr,szOrder[50];
TADOQuery *pQuery;
pszStr = new char[500];
rc=(int)pszStr;
if(rc){
pQuery = (TADOQuery *)m_CardDataSource->DataSet;
rc=(int)pQuery;
}
if(rc)
rc= ReworkInqCard(this,pszStr,500);//输入查询多条件
if(rc){ //获取SQL查询Where条件
GetQueryOrderBy(pQuery->SQL,szOrder);
QueryOneADOTable(pQuery,GetCardTableName(),pszStr,szOrder);
}
if(pszStr!=NULL)delete[] pszStr;
}
//---------------------------------------------------------------------------
void __fastcall TCardForm::m_CardDataSourceDataChange(TObject *Sender,
TField *Field)
{
TDataSet *pQuery;
int m,n;
char szBuf[50];
if(Field==NULL){//多个字段同时变化,即当前记录已变化
pQuery =m_CardDataSource->DataSet;
n= GetAllRecNum(pQuery);//获取总记录数
m=GetCurRecno(pQuery);//获取当前记录号
wsprintf(szBuf,"%d/%d",m,n);
m_RecNumPanel->Caption=szBuf;
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -