Dataset | Form | RDLC |
主要放数据集的文件夹 | 存放窗体的文件夹 | 存放各种报表的文件夹 |
第一部,创建报表结构
首先添加数据集项
添加完成之后我们会看到这个页面
之后我们在上面添加一些数据集
数据源的连接要自己设定
之后我们可以输入要编译的sql语句,因为是报表,主要用来查询,一般情况只用select语句就可以
生成之后是这样的一些模型
中间的灰色部分可以双击,进去之后我们能自定义编写一些方法
//用这个方法查询时可以进行拼sql拼接查询,一般不写这个的话是不可以拼接查询的
//加粗部分要根据你不同数据集下的小的数据模型名字不同进行变换
partial class MemberTransferShopTableAdapter
{
internal int FillWhere(MC.MemberTransferShopDataTable dataTable, string whereSql, params SqlParameter[] commandParameters)
{
string sql = this.CommandCollection[0].CommandText;
sql = sql.Substring(0, sql.LastIndexOf("WHERE"));
sql += " WHERE 1=1 " + whereSql;
this.CommandCollection[0].CommandText = sql;
this.Adapter.SelectCommand = this.CommandCollection[0];
this.CommandCollection[0].Parameters.Clear();
foreach (SqlParameter p in commandParameters)
{
this.CommandCollection[0].Parameters.Add(p);
}
dataTable.Clear();
int returnValue = this.Adapter.Fill(dataTable);
return returnValue;
}
}
下面展示两种Form中的连接数据的方法
this.MemberTransferShopTableAdapter.Fill(this.cashier.MemberTransferShopDtl, A参数, A参数,A参数); //参数是你写语句时的参数,报表普遍用这种方法
以下是Fillwhere拼接的方法,拼接方法省去了在数据库里判断的过程,可以减少where后查询的判断,从而加快一定速度。
当然如果没有where条件限制查询速度反而会变慢。主要是减少 CASE WHEN THEN 的试用。
string strWhere = "";
if (strClubID != "")
{
strWhere += " ";
}
if (strIsChainStore != "")
{
strWhere += " ";
}
if (strIsAdvanceSale != "")
{
strWhere += " ";
}
strWhere += " ";
this.waterBarCashierPaymentDtlTableAdapter.FillWhere(this.cashier.WaterBarCashierPaymentDtl, strWhere
, new SqlParameter("@ClubID", strClubID)
);
点击数据模型中间灰色部分我们可以看到属性 ,
我们点击其下面的白色部分也可以看到属性
相信所有人都看到了上图的Parameters ,点击他就会出来窗体,如果你where后有参数的话,我们可以在这里面设置他的类型等属性
到此数据集DataSet文件夹的一些基本操作就叙述完毕
二.Form文件夹下窗体的设置
这里面DataSet 和 BindingSource比较重要
首先是Dataset
选择你要连接的数据集,然后将 BindingSource拉倒窗体上,设置 BindingSource
DataSource属性用来选择连接的DataSet数据集
DataMember选中数据集下的模型
之后他们会自动生成一下的东西
这是窗体上应该具备的东西
这是一个外部空间需要引用,具体我还没自己引用过,我做项目时都是人家引用好了的
这里主要是你在rdlc报表中还可以设置参数,主要是用来页面显示的
//查询
private void btnSeach_Click(object sender, EventArgs e)
{
strWhereOne += " ";
strWhereOne += " ";
this.memberChangeOverToShopTableAdapter.FillWhere(this.mc.MemberChangeOverToShop, strWhereOne
, new SqlParameter("@p_AreaID", strAreaID)
, new SqlParameter("@p_ClubID", ClubID));
//// TODO: 这行代码将数据加载到表“mc.MemberChangeOverToShop”中。您可以根据需要移动或删除它。
//this.memberChangeOverToShopTableAdapter.Fill(this.mc.MemberChangeOverToShop,
// strAreaID,
// strClubID);
if (strIsAdvanceSale != "")
{
strWhere += " AND MC_1.IsAdvanceSale=@isAdvanceSale";
}
strWhere += " ";
this.memberTransferShopTableAdapter.FillWhere(this.mc.MemberTransferShop, strWhere
, new SqlParameter("@p_AreaID", strAreaID)
, new SqlParameter("@p_ClubID", ClubID)
);
//// TODO: 这行代码将数据加载到表“mc1.MemberTransferShop”中。您可以根据需要移动或删除它。
//this.memberTransferShopTableAdapter.Fill(this.mc.MemberTransferShop,
// strAreaID,
);
}
catch (Exception ex)
{
if (strIsAdvanceSale != "")
{
strWhereOne += " AND MC_1.IsAdvanceSale=@isAdvanceSale";
}
strWhereOne += " AND (@p_Mobile = @p_Mobile) AND (B.Mobile = (CASE WHEN @p_Mobile = '' THEN B.Mobile ELSE @p_Mobile END))";
this.memberChangeOverToShopTableAdapter.FillWhere(this.mc.MemberChangeOverToShop, strWhereOne
, new SqlParameter("@p_AreaID", strAreaID)
, new SqlParameter("@p_ClubID", ClubID)
);
//// TODO: 这行代码将数据加载到表“mc.MemberChangeOverToShop”中。您可以根据需要移动或删除它。
//this.memberChangeOverToShopTableAdapter.Fill(this.mc.MemberChangeOverToShop,
// strAreaID,
// strClubID,
);
}
this.rv.RefreshReport();
}
三.Rdlc文件夹下报表的创建
我们可以在报表中创建各种图表和数据表
其中最重要就是组,分为父组和子组,从字面意思理解实际上就是父子关系的意思
右键点击表格中的一格 ,我们可以添加组
插入行,列,总计等
同事组又分为行组和列组,从字面意思理解即可
组实际上就是group by ,将数据按组显示
例如省份是父组,市就是子组 ,父组和子组都可以无限创建
分组的不同显示的数据也不同,有时候之所以数据显示的不全,在数据库查看时没问题的情况下,就是没有设置分组或分组不正确。
点击组会有很多属性,大家可以研究一下,最近感觉还没有什么用处
有时候我们常常要给数据加上一些序号这时也与分组有一点关系
=RowNumber("AreaName") //这就是表达式 用来给表添加序号的 按顺序依次往下填的,括号里的名字是你分组的名字。
一般放在最大的区域后面。举个列子,假如你有省最大下面有多个市,我想给多个市前面加上按顺序自动排序的1到9999的数字,那么这个时候我们就在
省后面添加这个表达式就好了
分组实际上海有一个高级模式在列组的右侧
这里插一句常报的错误(真的是随笔,随便写的),,这个一般是你没引用这个Microsoft.SqlServer.Types.dll或者是你的传进报
表的参数和rdlc文件的参数类型不符合等。
类似这种就是报表主要用来显示数据的形式,表蓝色部分偶尔会有一种现象 ,就是第一页的时候他是有的,到第二页第三页就不显示了。这是因为分组的一些问题导致的。
不要让他这个样
大多数要让他这样
具体这里搞的很烦,我的方法就是创建行组的时候小心谨慎将上面标题行,不包含在组里这样他就会一直显示了。
下面显示数据比较重点的就是表达式了
右键点击表格的一格,能打字的状态哦,会出现创建占位符。
创建站位符就是,创建表达式主要用来显示数据。
当然先看这个比较重要 ,报表数据,你要点击一下报表页面才会出现。
右键点击数据集能添加数据源和数据集
参数也同样可以自己添加这里的参数是给页面使用的于前面的
是相对应的。
点击报表的表格我们可以看到DataSetName 属性,选择本表中要连接的数据源
我们继续说表达式
这就是我们的占位符的表达式,他可以进行一些判断和数据类型的转换来显示数据
单机字段就是我们要显示的数据中的个个字段我们可以将他们加入各种列中
运算符合常见函数经常使用
这里我们说几个我经常用的
例如IIF 位置在程序流中
IIF就是三目运算符,真二假三。
Val 用这个转换的原因是我们在计算时警察出线错误,也就是当你显示数据时显示乱码或不显示很大可能是你的表达错误,很大可能是类型的错误。
Reportitems!表格中任意一个格的名字的名字.value主要用来获取表达格子的值方便显示或计算数据
右键点击站位符,会出现站位符属性,我们有时会需要里面数字操作较多,例如让他以百分号形式显示
到这我的报表简单介绍就算结束了,里面可能还有一点点遗漏的,还有更多超多我不懂不会的关于报表的奇葩
错误和一些有用的知识,希望有人看到我这篇文章给一些指点。最好是文字形式的资料,博客园,CSDN等学习
网站的一些资料吧。
确实是随笔,很随意的就写出来。
今晚乌拉圭对法国 我赌乌拉圭赢, 巴西对比利时 我赌巴西赢。
谢谢观赏