📄 querypage.cpp
字号:
}
// when selecting a field name
void CWherePage2::OnSelchangeFieldNameCombo()
{
bSaved = FALSE;
/*
// change value-caption
UpdateData(TRUE);
CString sztmp;
int fIndex = m_cmbFName.GetCurSel();
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
sztmp = _T("值 ");
switch( pDemo->pFieldDsc[fIndex].fType )
{
case _INTEGER:
sztmp += "(Int)";
break;
case _DOUBLE:
sztmp += "(Double)";
break;
case _DATE:
sztmp += "(Date)[mm/dd/yyyy]";
break;
case _TIME:
sztmp += "(Time)[hh:mm:ss]";
break;
case _STRING:
sztmp += "(String)";
break;
case _ERRTYPE:
default:
sztmp = _T("");
break;
}
m_staValCaption.SetWindowText(sztmp);
*/
}
// save a where-condition
BOOL CWherePage2::SaveCondition()
{
// check
if( !CheckCondition() )
return FALSE;
int nSel = m_cmbFName.GetCurSel();
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
//make sure the value you input is correct at lest in format
if( !CheckValue( m_val, pDemo->pFieldDsc[nSel].fType,
pDemo->pFieldDsc[nSel].fLen) )
return FALSE;
// save instruction
int icnt = pParent->qcond.icnt;
strcpy( pParent->qcond.queryInst[icnt].fName, (LPCTSTR)m_fName );
strcpy( pParent->qcond.queryInst[icnt].op, (LPCTSTR)m_op );
strcpy( pParent->qcond.queryInst[icnt].val, (LPCTSTR)m_val );
pParent->qcond.queryInst[icnt].fType = pDemo->pFieldDsc[nSel].fType;
pParent->qcond.queryInst[icnt].fLen = pDemo->pFieldDsc[nSel].fLen;
pParent->qcond.queryInst[icnt].offset = pDemo->pFieldDsc[nSel].offset;
// increment icnt;
pParent->qcond.icnt++;
// Reset Edits
ResetEdits();
return TRUE;
}
// check condition-input
BOOL CWherePage2::CheckCondition()
{
UpdateData(TRUE);
// if( m_fieldCombo.GetCurSel()==CB_ERR || m_opCombo.GetCurSel()==CB_ERR
if( m_fName.IsEmpty() || m_op.IsEmpty() || m_val.IsEmpty() )
{
AfxMessageBox("条件输入不完全",MB_OK|MB_ICONERROR);
return FALSE;
}
return TRUE;
}
// Reset Edits
void CWherePage2::ResetEdits()
{
m_cmbFName.SetCurSel(-1);
m_cmbFName.SetWindowText("");
m_cmbOp.SetCurSel(-1);
m_cmbOp.SetWindowText("");
m_edVal.SetWindowText("");
}
/******************************
** 对"执行查询"对话框的操作 **
******************************/
// compile select-sentence
void CExecutePage3::OnPaint()
{
CPaintDC dc(this); // device context for painting
// Get parents
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
// compile select-sentence
CString sent;
int i, j, n;
struct inst *pinst;
// select fields
sent = "Select ";
for( i=0; i<pParent->rsltFcnt-1; i++ )
{
sent += pParent->prsltFieldDsc[i].fName;
sent += ", ";
}
sent += pParent->prsltFieldDsc[i].fName;
sent += "\r\n";
// from fileName
sent += "from ";
sent += pDemo->m_fileName;
sent += "\r\n";
//where condition
pinst = pParent->qcond.queryInst;
sent += "where ";
for( i=1, j=0; i<=pParent->qcond.ornumth; i++)
{
sent += "( ";
while( j<pParent->qcond.orIndex[i]-1 )
{
sent += pinst[j].fName;
sent += pinst[j].op;
sent += pinst[j++].val;
sent += " and ";
}
sent += pinst[j].fName;
sent += pinst[j].op;
sent += pinst[j++].val;
sent += " ) \r\n or ";
}
// show select-sentence in m_SelSentence
if( pParent->qcond.ornumth>=1 )
n = sent.GetLength()-9;
else
n = sent.GetLength()-6;
m_SelSentence.SetWindowText( (LPCTSTR)sent.Left(n) );
// Do not call CPropertyPage::OnPaint() for painting messages
}
/******************************
** 对"查询结果"对话框的操作 **
******************************/
BOOL CResultPage4::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// Insert column header in viewList
ShowViewListHeader();
// execute query
ExecQuery();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
//Create a view file
BOOL CResultPage4::OnWizardFinish()
{
FILE* fhd; // view file handle
struct fileHeader vfhead; // view file head
CString szFile,sztmp;
byte *buf, *p;
int row, col;
// Get parents
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
// Show SaveAs FileDialog
CFileDialog fdlg(FALSE, NULL, NULL, OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,
"View files(*.view)|*.VIEW|all files(*.*)|*.*||", NULL);
if( fdlg.DoModal()==IDOK )
{
// create a view file
szFile = fdlg.GetPathName(); // get dbFile name
fhd = fopen((LPCTSTR)szFile,"w+b");
if(!fhd)
{
sztmp = "Failed to create file \"";
sztmp += szFile;
sztmp += "\" !";
AfxMessageBox(sztmp, MB_OK|MB_ICONERROR);
return -1;
}
// write file_header
strcpy(vfhead.ver,"VIEW.demo2005.01\0");
vfhead.fcnt = pParent->rsltFcnt;
vfhead.rcnt = pParent->rsltRcnt;
vfhead.rlen = pParent->rsltRlen;
fwrite( (void*)&vfhead, sizeof(vfhead), 1, fhd);
// write field-description
fwrite( pParent->prsltFieldDsc, sizeof(struct fieldDesc), vfhead.fcnt, fhd);
// scan m_recordList, save it to file
buf = (byte*)malloc( vfhead.rlen );
for( row=0; row<vfhead.rcnt; row++ )
{
memset( buf,0, vfhead.rlen);
p = buf;
for( col=0; col<vfhead.fcnt; col++)
{
sztmp = m_viewList.GetItemText(row, col);
switch( pParent->prsltFieldDsc[col].fType )
{
case _INTEGER:
*(int*)p = atoi( (LPCTSTR)sztmp );
break;
case _DOUBLE:
*(double*)p = atof( (LPCTSTR)sztmp );
break;
case _DATE:
case _TIME:
case _STRING:
strncpy( (char *)p, (LPCTSTR)sztmp, pParent->prsltFieldDsc[col].fLen );
case _ERRTYPE:
default:
break;
}
// next field value
p += pParent->prsltFieldDsc[col].fLen;
}
// write a record to file
fwrite( (void*)buf, vfhead.rlen, 1, fhd );
}
fclose(fhd);
if(buf)
{
free(buf);
buf = NULL;
}
}
return CPropertyPage::OnWizardFinish();
}
// Insert column header in viewList
void CResultPage4::ShowViewListHeader()
{
// Get parents
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
// column width
CRect rect;
m_viewList.GetWindowRect(&rect);
int nWidth = (rect.right-rect.left-4)/pParent->rsltFcnt;
// insert column header
LV_COLUMN lvcol;
lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvcol.fmt = LVCFMT_LEFT;
for(int i=0; i<pParent->rsltFcnt; i++)
{
lvcol.cx = nWidth;
lvcol.pszText = (char*)(LPCTSTR)pParent->prsltFieldDsc[i].fName; // column title
lvcol.iSubItem = i;
// m_recordList.SetColumn(i,&lvcol);
m_viewList.InsertColumn(i,&lvcol);
}
}
// execute query
void CResultPage4::ExecQuery()
{
BYTE *rbuf,*p,*qrbuf,*qp;
// char s[20];
int i,j;
int rlen, rcnt;
char *tmp;
// Get parents
CQuerySheet *pParent = (CQuerySheet*)GetParent();
CDemo2005Dlg *pDemo = (CDemo2005Dlg*)pParent->GetParent();
// local variable
rlen = pDemo->m_fileHeader.rlen;
rcnt = pDemo->m_fileHeader.rcnt;
rbuf = (BYTE*)malloc(rlen);
qrbuf = (BYTE*)malloc(pParent->rsltRlen);
tmp = (char *)malloc(pParent->rsltRlen);
//execute query
pParent->rsltRcnt=0;
fseek( pDemo->m_fhd,
sizeof(pDemo->m_fileHeader)+pDemo->fcnt*sizeof(fieldDesc),
SEEK_SET );
for( i=0; i<rcnt; i++)
{
// read a record
fread( rbuf, rlen, 1, pDemo->m_fhd);
// if the record meet with the condition
if( FindRecord(rbuf, pParent->qcond) )
{
// get selected record
for( j=0; j<pParent->rsltFcnt; j++)
{
qp = qrbuf+pParent->prsltFieldDsc[j].offset;
p = rbuf+pDemo->pFieldDsc[pParent->originFth[j]].offset;
memcpy(qp,p,pParent->prsltFieldDsc[j].fLen);
// Show a fieldValue
CString sztmp;
switch( pParent->prsltFieldDsc[j].fType )
{
case _INTEGER:
sztmp.Format("%d",*(int*)qp);
break;
case _DOUBLE:
sztmp.Format("%f",*(double*)qp);
break;
case _DATE:
case _TIME:
case _STRING:
memset( (void*)tmp, 0, pParent->rsltRlen);
strncpy( tmp, (const char *)qp, pParent->prsltFieldDsc[j].fLen );
sztmp = tmp;
break;
case _ERRTYPE:
default:
break;
}
ShowItemText( m_viewList, pParent->rsltRcnt, j, sztmp);
}
// found record count increment
pParent->rsltRcnt++;
}
}//out for end
// free variable
free(rbuf);
rbuf = NULL;
free(qrbuf);
qrbuf = NULL;
free(tmp);
tmp = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -