布德ERP系统 - 企业管理软件

币加德ERP

kf05-02 外挂程序接口/复杂的外挂(使用VS自带的.rdlc报表)


开发复杂的报表外挂(使用VS自带的.rdlc报表),建议使用Visual Studio 2013专业版、高级版或旗舰版,不要使用速成版或社区版(没有集成报表开发功能)。最终效果如下图。

14224360f7bd3308bd4j6Wd5b

图:复杂报表外挂最终效果

 

此复杂报表外挂具有如下特点:

  • 币加德ERP自动把当前登录的用户ID、数据库服务器IP、账套对应的后台数据库名称、登录账号、登录密码传递给外挂程序,所以不仅仅可以开发报表外挂,充满想象;
  • 无需币加德ERP的源代码;
  • 外挂可以使用不同的开发语言和平台(币加德ERP使用C#语言,.NET 2.0),外挂使用C#语言,.NET 3.5(不可以使用.NET 2.0,因为没有报表功能;也不可以使用.NET 4.0及以上,因为架构与.NET 2.0不兼容。可以使用VB.NET语言);
  • 外挂程序需要引用币加德ERP的任何.dll文件,外挂程序可以独立运行,为了防止用户直接运行,可以编译成.dll动态链接库文件,由ERP调用;
  • 外挂程序的代码量非常小,基础框架已经搭好,只需要依葫芦画瓢,重点在于取数SQL语句和报表格式调整(这是个细致且费时间的活儿);
  • 此报表外挂案例,包含了报表设计中常用的功能:页面大小的设置、页头、页尾、分组汇总、每页重复显示列头、公司LOGO、签章透明、分页等,报表加入图片的功能很容易扩展到加入条码、二维码。报表可以导出到Excel/PDF/Word。

 

一、准备SQL查询语句

按前面“自定义报表/SQL命令行工具”介绍的方法,准备查询SQL语句,如下图。

14224960f7bd39e2b885Gf4Z2

图:使用SQL命令行工具准备SQL查询语句

 

二、编写外挂程序

按上一节介绍的方法建立项目W2,在W2上右键鼠标,在弹出菜单中选【添加】/【新建项】,如下图。

14225560f7bd3f40732ToShMO

图:添加数据集(默认名称不要更改)

 

在打开的DataSet1.xsd面板中,右键鼠标,如下图。

14230060f7bd44810b8kPTbtr

图:添加TableAdapter

 

在弹出的“添加连接”窗口,录入数据库服务器相关信息,如下图。

  • 服务器名。精简数据库如图进行填写,如果是企业版数据库,请填写“.”(点表示本地,如果不是远程连接到ERP服务器写外挂程序,则需要把点改为ERP服务器的IP地址);
  • 登录到服务器。精简数据库的密码是“17312319729@bijiade.cn”,企业版数据库的密码是在系统安装配置的时候自己设置的。
  • 连接到数据库。选bdERP开头的任意一个就行,外挂程序运行时会根据账套自动切换。

14230560f7bd49cf3f3lw1p3f

图:连接数据库

 

根据TableAdapter配置向导进行配置,如下图。

14231160f7bd4f7edf4iRaqzS

图:不要在连接字符串中包含敏感数据

 

14231960f7bd57de46eqvdLf6

图:默认下一步

 

14232660f7bd5e1f8e5ztzIii

图:默认下一步

 

粘贴准备好的查询SQL语句,点【完成】,如下图。

14233160f7bd63c7ccdf7IflL

图:粘贴准备好的查询SQL语句

 

执行查询SQL语句所得的数据表字段,如下图。

14233860f7bd6a3e63fXM17rC

图:查询所得的数据表字段

 

在W2上右键鼠标,在弹出菜单中选【添加】/【新建项】,如下图。

14234360f7bd6fe65dbmE3LKO

图:添加报表文件(默认名称不要更改)

 

在打开的报表文件界面,右键“数据集”,选择刚刚配置的数据集,如下图。

14234960f7bd757b722q0FDHm

图:选择数据集

 

在报表设计界面,右键鼠标,可以插入文本框等等,也可以把左侧的数据集下面的字段拖放到报表设计界面,如下图。

14240460f7bd841ccffdViNhp

图:报表设计

 

报表设计是最繁琐最费时间的事情,最终设计结果,如下图。

14241360f7bd8d1c0fdx7ye2B

图:报表设计结果

 

打开Form1窗体,从工具箱拖放一个ReportViewer报表查看器到窗体,如下图。

14242260f7bd961cb7aDmiAp7

图:把报表查看器添加到窗体

 

双击Form1窗体,如图30-26,清空窗体中所有的代码,并把下面的代码复制粘贴进去。

14242960f7bd9d5d715kFUBK8

图:Form1代码窗口

 

using Microsoft.Reporting.WinForms;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace W2

{

public partial class Form1 : Form

{

public string _userID = “”;              //登录用户ID

public string _serverIP = @”.\_MSSQL2005″; //服务器IP(如果是SQL企业版,则为“.”)

public string _dbName = “bdERP”;                      //数据库名称

public string _saPassword = “17312319729@bijiade.cn”; //sa密码

public string _curDir = @”..\..\”;                    //当前目录

 

public Form1(){ InitializeComponent(); }

 

public void ShowMe(string userID, string serverIP, string dbName, string saPassword, string curDir)//钩子方法

{

_userID = userID;           //传递用户登录ID

_serverIP = serverIP;       //服务器IP

_dbName = dbName;           //数据库名称

_saPassword = saPassword;   //sa密码

_curDir = curDir;           //当前目录

MessageBox.Show(“用户ID:” + _userID + “\n数据库服务器IP:” + _serverIP + “\n数据库名称:” + _dbName + “\nsa密码:” + _saPassword + “\n当前目录:” + _curDir, “提示”);

base.Show();//显示窗体

}

 

private void Form1_Load(object sender, EventArgs e)

{

//1.SQL查询语句

string sql = @”

SELECT

a.c010 单号, a.c020 日期, a.c200 销售类型, a.c210 客户单号,

a.c030 客户代码, c.c020 客户名称,

a.c090 联系人, a.c091 联系电话,

a.c070 交货方式, a.c080 交货地点,  a.c100 备注, a.c110 业务员,

b.c020 项次, b.c029 客户料号, b.c030 货品代码,

b.c050 品名规格, b.c060 单位, b.c069 含税, b.c070 单价, b.c071 含税单价,

b.c080 数量, b.c090 金额, b.c100 税率, b.c101 税额, b.c110 价税合计,

b.c150 摘要

FROM SAL020 a

LEFT JOIN SAL021 b ON b.c010=a.c010

LEFT JOIN BAS010 c ON c.c010=a.c030

WHERE 1=1 AND a.c061<>’Y’

AND a.c010=’XCK-21060001′

“;

//2.报表文件名(如果报表文件与外挂程序在同一目录,直接写报表名称即可)

string reportName = _curDir + @”Report1.rdlc”;

 

//3.绑定

Bind(sql, reportName);

}

/// <summary>

/// 工具方法,执行SQL查询获取数据,并绑定到指定报表。

/// </summary>

/// <param name=”sql”>SQL查询语句</param>

/// <param name=”reportName”>报表文件名</param>

private void Bind(string sql, string reportName)

{

DataTable data = new DataTable();                           //数据

try

{

//执行SQL查询获取数据

string connStr = “Data Source=” + _serverIP + @”;Initial Catalog=” + _dbName + “;Persist Security Info=True;” +

“User ID=sa;Password=” + _saPassword;

using (SqlConnection conn = new SqlConnection())

{

conn.ConnectionString = connStr;

conn.Open();                      //打开数据库连接

SqlDataAdapter adapt = new SqlDataAdapter(sql, conn);//实例化适配器

adapt.Fill(data);                                    //获取数据

conn.Close();                                       //关闭数据库连接

}

//绑定到指定报表

ReportDataSource rds = new ReportDataSource();

rds.Name = “DataSet1”;                  //要与数据集属性数据集名称要一致

rds.Value = data;

this.reportViewer1.LocalReport.DataSources.Clear();

this.reportViewer1.LocalReport.DataSources.Add(rds);

this.reportViewer1.LocalReport.ReportPath = reportName;  //报表文件名

this.reportViewer1.RefreshReport();

}

catch (Exception ex) { MessageBox.Show(“出错了:\n” + ex.Message, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Error); }

}

}

}

以上代码已经在注释中进行了讲解,看不懂也没有关系,只要依葫芦画瓢,要改2个地方(上面代码已说明):其一是SQL查询语句;其二是报表文件名称(注意路径)。如下图。

14243760f7bda551a3bLe3fbb

图:代码关键点(SQL查询语句、报表文件名)

 

三、配置外挂程序

鼠标右键W2,在弹出菜单中选【属性】,目标框架选.NET 3.5,如下图。

14244260f7bdaacf7deY7BsyX

图:选.NET Framework 3.5

 

提醒:这里输出类型保持默认,为了便于测试。测试正常后,可以改为“类库”。

拷贝外挂程序到ERP的外挂目录下,并确认运行正常,如下图。

14244860f7bdb05ce5fIsLdMQ

图:拷贝外挂程序到ERP的外挂目录下

 

打开【系统设置】/【外挂程序接口】,选择子系统,配置外挂程序接口参数,测试是否可以正常打开外挂程序,最后点【保存并应用】,如下图。

14245360f7bdb5e661cMW2Kjv

图:外挂程序接口

 

四、总结

报表外挂的意义。币加德ERP系统的单据打印都是基于Excel的(参见“第23章 单据打印格式设计”),一般情况下无需开发.rdlc报表,除非现有报表满足不了业务需求。这里以开发.rdlc报表为例,不仅仅为了说明报表开发本身,而且可以学习到如何集成ERP中的用户ID、账套数据库等,无需另外配置数据库连接和建立账户体系。

币加德ERP外挂接口规范。会传递如下这些参数给外挂程序,外挂程序可以不使用,或者部分使用,但是不能缺少这些参数,顺序也不能改变。

/// <summary>

/// 钩子方法。

/// </summary>

/// <param name=”userID”>用户登录ID</param>

/// <param name=”serverIP”>服务器IP</param>

/// <param name=”dbName”>数据库名称</param>

/// <param name=”saPassword”>sa密码</param>

/// <param name=”curDir”>当前目录</param>

public void ShowMe(string userID, string serverIP, string dbName, string saPassword, string curDir)//钩子方法

{

_userID = userID;           //传递用户登录ID

label1.Text = “登录用户ID:” + _userID;//标签显示

base.Show();//显示窗体

}

使用Visual Studio 2013开发.rdlc报表的关键是准备SQL查询语句、报表设计(最费时间)。报表设计有如下特点(注意点),如下图。

1)拖放设计。数据字段按照SQL查询语句的顺序列示,直接拖放进行报表设计,简单直观。

2)设计时可以调整纸张大小。报表默认大小是A4纵向(可以更改),宽度不能超过“纸张宽度+边距”,否则打印预览时多出了很多空白页(如果拉窄了宽度后,打印预览时还是有空白页,则需要把“报表”的“ConsumeContainerWhitesapce”属性值改为True,此属性意思“指使在容器中的内容增长时,是占用还是保留容器中的最小空白。只要内容右侧和下方的空白受到影响。”)。纵向不用留空间,在打印时根据数据行数自动拉高。

3)数据表是一个整体。当在设计时插入表格,表格是一个整体,但是列头在多页时重复显示功能时不时卡壳(tablix“Tablix2”具有无效的 TablixMember。TablixColumnHierarchy 中所有 TablixMember 元素的 RepeatOnNewPage 属性必须设置为 false。),所以建议把标题栏删除,手工增加文本框代替,放在页眉处,这样每页都会显示。

4)数据区可多级分组。报表的核心在于数据区,可以分组汇总等。

5)页眉/页脚。页脚可以插入页码,加上印章(透明处理参见第23章)等。

提醒:如果报表外挂程序在集成到ERP前运行得好好的,集成后出错,最大的可能性有2种:其一如果提示“此程序集的运行时比当前加载的运行时新,无法加载此程序集”,则是因为选错了.NET版本(参见“图30-28 选.NET Framework 3.5”);其二如果报表无法显示,则是因为报表路径错了,或者报表文件Report1.rdlc没有和外挂程序一起复制到ERP的外挂程序目录中。

14250160f7bdbdcf6e0GE4qwb

图:报表设计特点(注意点)

 

14250760f7bdc3ad12a8x5LnY

图:把“报表”的“ConsumeContainerWhitesapce”属性值改为True

 


评论 |0|


* 姓名(必填):
@ * 邮件地址(必填):


*) Required fields are marked with star
**) You can use some