10.7.7 报表打印的实现
报表功能主要实现把收支数据分类汇总统计在报表对话框界面上显示。具体是按本日、本月、本年三种情况分类统计总收入、总支出、总赢利数据。打印模块通过把收支信息数据写入列表控件中,使用两个继承CDialog的CPreParent类和CPreView类来实现。CPreParent类作为控制窗口,CPreParent窗口内包括一个打印控制工具栏及一个预览窗口CPreView。
给【收支信息报表】按钮添加单击消息函数,在该函数中实现报表对话框的显示。给报表对话框添加初始化消息WM_INITDIALOG,在对应的OnInitDialog()函数中完成报表的实现。报表统计通过自定义函数LOADDATA()实现。该函数具体代码如下:
代码位置:见光盘中本章源代码的BAOBIAODLG类。
- 1 void BAOBIAODLG::LOADDATA()
- 2 {
- 3 bool tflag1,tflag2,tflag3;
//用来判断字符串匹配 - 4 mySet->Requery();
//重新打开记录集 - 5 m_list.DeleteAllItems();
//列表数据清空 - 6 int incomenum1=0,costnum1=0,total1=0,incomenum2=0;
//定义整型变量 - 7 int costnum2=0,total2=0,incomenum3=0,costnum3=0,total3=0;
- 8 CString dstr,dstr1,dstr2,mstr,mstr1,mstr2,ystr,ystr1,ystr2;
//数据转换成字符串 - 9 COleDateTime oleDt=COleDateTime::GetCurrentTime();
//获取系统当前时间 - 10 CString stime=oleDt.Format("%Y-%m-%d %H:%M:%S");
//时间格式转换 - 11 while(!mySet->IsEOF())
//记录没到最后一条 - 12 {
- 13 for(int i=0;i<10;i++)
//判断时间是不是本日 - 14 {
- 15 if(mySet->m_time[i]==stime[i])
- 16 tflag1=true;
- 17 else
//有不同 - 18 {
- 19 tflag1=false;
- 20 break;
- 21 }
- 22 }
- 23 if(tflag1)
//记录时间是本日 - 24 {
- 25 incomenum1=incomenum1+mySet->m_incomenum;
//本日收入数据求和 - 26 costnum1=costnum1+mySet->m_costnum;
//本日支出数据求和 - 27 }
- 28 for(int j=0;j<7;j++)
//判断时间是不是本月 - 29 {
- 30 if(mySet->m_time[j]==stime[j])
- 31 tflag2=true;
- 32 else
//有不同 - 33 {
- 34 tflag2=false;
- 35 break;
- 36 }
- 37 }
- 38 if(tflag2)
//记录时间是当前月 - 39 {
- 40 incomenum2=incomenum2+mySet->m_incomenum;
//本月收入数据求和 - 41 costnum2=costnum2+mySet->m_costnum;
//本月支出数据求和 - 42 }
- 43 for(int n=0;n<4;n++)
//判断是不是当前年 - 44 {
- 45 if(mySet->m_time[n]==stime[n])
- 46 tflag3=true;
- 47 else
//有不同 - 48 {
- 49 tflag3=false;
- 50 break;
- 51 }
- 52 }
- 53 if(tflag3)
//记录时间是当前年 - 54 {
- 55 incomenum3=incomenum3+mySet->m_incomenum;
//当前年收入数据求和
- 56 costnum3=costnum3+mySet->m_costnum;
//当前年支出数据求和 - 57 }
- 58 mySet->MoveNext();
//记录后移 - 59 }
第9~10行代码实现了系统当前时间获取。
第13~27行代码实现查找记录时间是本日的,统计当天所有的收入数目和支出数目。
第28~42行代码实现查找记录时间是本月的,统计本月所有的收入数目和支出数目。
第43~57行代码实现查找记录时间是本年的,统计本年所有的收入数目和支出数目。
统计了年、月和日的收入数目和支出数目后进行计算,并把数据写入到表控件中。
- 60 total1=incomenum1-costnum1;
//本日收支差 - 61 total2=incomenum2-costnum2;
//本月收支差 - 62 total3=incomenum3-costnum3;
//本年收支差 - 63 dstr.Format("%d",incomenum1);
//数据类型转换 - 64 dstr1.Format("%d",costnum1);
- 65 dstr2.Format("%d",total1);
- 66 mstr.Format("%d",incomenum2);
- 67 mstr1.Format("%d",costnum2);
- 68 mstr2.Format("%d",total2);
- 69 ystr.Format("%d",incomenum3);
- 70 ystr1.Format("%d",costnum3);
- 71 ystr2.Format("%d",total3);
- 72 m_list.InsertItem(0,"今日统计");
//添加第一行数据项 - 73 m_list.SetItemText(0,1,dstr);
//添加第二列数据 - 74 m_list.SetItemText(0,2,dstr1);
//添加第三列 - 75 m_list.SetItemText(0,3,dstr2);
//添加第四列 - 76 m_list.InsertItem(1,"");
//第二行数据项为空 - 77 m_list.SetItemText(1,1,"");
- 78 m_list.SetItemText(1,2,"");
- 79 m_list.SetItemText(1,3,"");
- 80 m_list.InsertItem(2,"目前本月统计");
//添加第三行数据项 - 81 m_list.SetItemText(2,1,mstr);
- 82 m_list.SetItemText(2,2,mstr1);
- 83 m_list.SetItemText(2,3,mstr2);
- 84 m_list.InsertItem(3,"");
//第四行数据项为空 - 85 m_list.SetItemText(3,1,"");
- 86 m_list.SetItemText(3,2,"");
- 87 m_list.SetItemText(3,3,"");
- 88 m_list.InsertItem(4,"本年度统计");
//添加第五行数据项 - 89 m_list.SetItemText(4,1,ystr);
- 90 m_list.SetItemText(4,2,ystr1);
- 91 m_list.SetItemText(4,3,ystr2);
- 92 mySet->Close();
//关闭记录集 - 93 }
第60~62行代码实现计算三种分类汇总的收入与支出差。
第63~91行代码实现把汇总后的日统计、月统计及年度统计数据显示在列表控件中。
打印模块具体实现过程请读者参考本书第2章的相关内容,在此不再重复。
……
【责任编辑:
云霞 TEL:(010)68476606】