⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 querypage.cpp

📁 数据库管理软件,具有很多功能,应用DBS数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

// 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 + -