工控编程吧
标题:
287上位机VC MFC使用OLE DB打印数据库报表
[打印本页]
作者:
qq263946146
时间:
2016-9-26 13:00
标题:
287上位机VC MFC使用OLE DB打印数据库报表
(, 下载次数: 0)
上传
点击文件名下载附件
OLE DB打印数据库报表
功能展示
数据库总会有需要打印的时候,我们当前例程实现基于OLE DB技术的数据库打印功能,程序运行时会自动连接一数据源(用例程根目录数据库文件创建),并显示出数据表Basic,Cource信息的组合,效果如图,也可以通过菜单内的打印功能,打印出显示的数据表信息;
要点提示
例程中使用SQL语句的意思 是:把Basic表中Basic.StuID与Cause表中Cause.StuID字段记录相等的记录合并为一条记录,并按Course表中的StuScore字段按降序排列
实现功能
1.用根目录数据文件事先创建一数据源StudentInfo,再新建基于CScrollView的单文档的应用程序;
2.插入一ATL模板,(选择Data Access Consumer),驱动选OLE DB PROVIDER FOR ODBC ,数据源选事先创建的StudentInfo,表格选Basic.具体的创建过程也可参考视频演示;
3.给Cbasic 类添加两新变量TCHAR m_StuCourse[51];TCHAR m_StuScore[51]; 在BEGIN_COLUMN_MAP内添加两新代码 COLUMN_ENTRY(5, m_StuCourse)COLUMN_ENTRY(6, m_StuScore)
4.修改Cbasic类SQL语句DEFINE_COMMAND(CBasicAccessor, _T(“SELECT StuID,StuName,StuAdd,StuTel FROM Basic”)) 为 DEFINE_COMMAND(CBasicAccessor, _T("SELECT Basic.StuID,\
Basic.StuName,Basic.StuAdd,Basic.StuTel,Course.StuCourse,\
Course.StuScore FROM Basic INNER JOIN Course ON Basic.StuID=\
Course.StuID ORDER BY Course.StuScore DESC"))
5.在文档类及视窗类都包含头文件#include “Basic.h”并在文档类添加Cbasic 实例CBasic m_Basic;,视窗类添加其指针CBasic* m_pSet;
6.再在视窗类中添加一自定义函数 void OutputReport(CDC* pDC, CPrintInfo* pInfo=NULL);实现打印显示 功能
void CGkbc8View::OutputReport(CDC *pDC, CPrintInfo *pInfo)
{
CString lineText; //打印的一行的文字
TEXTMETRIC metrics; //字体的 度量
CFont titleFont; //标题字体
CFont headingFont; //报表头字体
CFont detailFont; //正文字体
CFont footerFont; //脚注字体
//向前跳1英寸,2.5英寸和6.5英寸
int tabStops[] = {200, 450,650};
int footerTabStops[] = {350, 650};
int y = 0; //当前打印的字体的垂直位置
HRESULT m_hrMoveResult = S_OK;
if (!pInfo || pInfo->m_nCurPage == 1)
m_hrMoveResult = m_pSet->MoveFirst();//移到记录集的第一条记录
//创建标题的字体并加下划线
titleFont.CreateFont(48, 0, 0, 0, FW_BOLD, FALSE, TRUE, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN,
"宋体");
//创建报表头字体并不加下划线
headingFont.CreateFont(38, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN,
"宋体");
//创建正文字体
detailFont.CreateFont(20, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN,
"宋体");
//创建脚注小字体
footerFont.CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0,
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN,
"宋体");
//在设置标题字体时获得默认设置
CFont* oldFont = (CFont*) pDC->SelectObject(&titleFont);
pDC->GetTextMetrics(&metrics);//获得标题字体的范围
//计算标题的行高
int lineHeight = metrics.tmHeight + metrics.tmExternalLeading;
y -= lineHeight;//设置打印文字的竖直位置
pDC->TextOut(250, 0, "学生信息报表");
pDC->SelectObject(&headingFont);//设置报表头字体
//初始化报表头
lineText.Format("%s \t%s \t%s \t%s","学号","姓名", "科目", "成绩");
//输出报表头
pDC->TabbedTextOut(2, y, lineText, 2, tabStops, 0);
//计算报表头字体的行高
lineHeight = metrics.tmHeight + metrics.tmExternalLeading;
y -= lineHeight; //调整竖直位置
pDC->SelectObject(&detailFont);//设置正文字体
pDC->GetTextMetrics(&metrics);//获取正文字体的范围
//计算正文字体行高
lineHeight = metrics.tmHeight + metrics.tmExternalLeading;
while (m_hrMoveResult == S_OK) //在循环访问记录集
{
if (pInfo && abs(y) > 1000)
{
pInfo->SetMaxPage(pInfo->m_nCurPage + 1);
break;
}
//设置要打印的正文一行的文字
lineText.Format("%d \t%s \t%s \t%s",
m_pSet->m_StuID,
m_pSet->m_StuName,
m_pSet->m_StuCourse,
m_pSet->m_StuScore);
pDC->TabbedTextOut(2, y, lineText, 3, tabStops, 0);
y -= lineHeight; //调整竖直位置
m_hrMoveResult = m_pSet->MoveNext();//下一记录
}
if (pInfo)
{
pDC->SelectObject(&footerFont);//设置脚注字体
//设置脚注文字
lineText.Format(
"使用OLE CB开发报表",
pInfo->m_nCurPage);
//在最低端输出脚注
pDC->TabbedTextOut(1, -1025, lineText, 2, footerTabStops, 0);
}
pDC->SelectObject(oldFont);// 获得默认字体
}
7.添加视窗的OnPrint()函数,在OnPrint()及OnDraw()函数中调用OutputReport()函数一次实现数据的显示及打印
8.最后记得在视窗的初始化函数中初始化打开记录集
CSize sizeTotal(800, 2000);//限制范围在 8" x 20"内//因为 MM_LOENGLISH的尺寸单位大小是0.01 英寸
SetScrollSizes(MM_LOENGLISH, sizeTotal);
GetDocument()->SetTitle("学生信息报表");//设置显示标题
m_pSet = &GetDocument()->m_Basic;//设置m_pSet指针指向要使用的数据库
HRESULT hr = m_pSet->Open();//打开记录集
if (hr != S_OK)
AfxMessageBox(_T("记录集打开失败!!"), MB_OK);
我们来演示具体功能实现过程
[iqiyi]http://player.video.qiyi.com/3b69d1f9356a41cc24d52375a8f59f7e/0/0/w_19rsu6i9dp.swf-albumId=6391601809-tvId=6391601809-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4