erp管理系统软件

erp项目实施方案-第30章 外挂程序

作者: admin 来源: erp系统 日期: 2021-07-21 14:19:55 人气: - 评论: 0

30.1 外挂程序介绍

外挂程序作用:扩充ERP功能。满足企业的行业化、个性化需求。

外挂程序接口特点:

Ø 无需系统程序源码。外挂程序集成到ERP中,并且会把登录的用户ID传递给外挂程序;

Ø 多种编程语言支持。可用.NET平台任一编程语言,只需指定文件名、类名、方法名即可;

Ø 外挂程序分门别类。所有外挂程序放置目录固定,都在ERP根目录下的“外挂程序”子目录下,并且子目录与子系统一一对应,比如:“W1.采购系统”外挂程序的目录如下:

ERP根目录\外挂程序\W1\

外挂程序集成在币加德ERP的菜单栏中,如图30-1。

 

30-1 外挂程序接口及系统集成位置

30.2 外挂程序实战

本节使用Visual Studio 2013(速成版、社区版、专业版、高级版、旗舰版都可以,前面2个版本是免费的)来开发外挂程序,如果你使用的是其他版本的Visual Studio,也可以参照学习,大同小异。本节先用完整详细的步骤介绍一个最简单的外挂程序的开发,通过此外挂的学习,可以完全掌握外挂的开发方法。然后用较简洁的步骤介绍如何开发报表外挂,这个案例很实用,企业的程序开发人员或ERP代理服务商经常需要从企业ERP中取数,开发分析报表或开发定制格式的打印单据。

30.2.1 一个简单的外挂程序

1)编写外挂程序

①打开Visual Studio 2013,点【文件】/【新建】/【项目】,如图30-2。

 

30-2 新建项目

“新建项目”窗口,选择【Visual C#】/【Windows 窗体应用程序】,名称为“W1”,如图30-3。

 

30-3 选择Windows 窗体应用程序

“工具箱”中拖一个Label到窗体设计界面,如图30-4。

 

30-4 拖一个标签到设计面板

双击设计面板,打开代码编辑窗口,输入以下代码,如图30-5

public string _userID = "";     //登录用户ID

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

{

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

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

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

}

 

30-5 写程序代码

提醒:不管写什么类型的外挂程序,都需要上面的代码,相当于ERP与外挂程序之间约定的一种协议,目的在于把ERP系统当前的登录用户ID传递给外挂程序,并打开外挂程序的主窗体。除此之外,外挂程序与普通的Windows窗体程序没有任何区别。

外挂程序可以查询ERP的后台数据表,但千万别修改(删除)数据,这是一个基本的原则。否则出错后无法核查是ERP的问题,还是外挂程序的问题。

鼠标右键项目名称,在上下文菜单中选【属性】,在打开的窗口中,“目标框架”选择“.NET Framework 2.0”(为了兼容老电脑),“输出类型”选“类库”(如果选“Windows应用程序”,用户可以越过权限设置,直接运行外挂程序),如图30-6

 

30-6 设置项目属性

再次点【启动】,系统会报错(因上一步中改变了目标框架),修正错误,如图30-7

 

30-7 修改错误

再次点【启动】,系统会弹出无法直接启动类库项目的错误,这正是所要的,如图30-8

 

30-8 弹出无法直接启动类库项目的错误

打开外挂程序的输出目录(参见“图30-3 选择Windows 窗体应用程序”选定的位置),并把外挂程序复制到ERP的外挂程序目录,如图30-9

 

 

30-9 拷贝外挂程序至ERP外挂目录

2)接口定义

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

外挂程序接口参数:

Ø 模块代码:外挂子系统代码 + 3位流水码。

Ø 模块名称:最简洁的文字介绍外挂程序。“模块代码、模板名称”会显示在ERP系统的外挂菜单中,参见“30-1 外挂程序接口及系统集成位置”。

Ø 文件名称:不含路径,含扩展名。

Ø 类名称:类名称必须是“命名空间.类名”。

Ø 方法名称:方法名称必须是公有的,否则无法正常调用。

Ø 备注:较详尽的文字介绍外挂程序。

 

30-10 外挂程序接口

提醒:外挂程序 + ERP数据字典 = 无限扩展 ERP 功能!

(无需“币加德ERP”源代码)

 

30.2.2 开发复杂的报表外挂(使用VS自带的.rdlc报表)

建议使用Visual Studio 2013专业版、高级版或旗舰版,不要使用速成版或社区版(没有集成报表开发功能)。最终效果如图30-11。

 

30-11 复杂报表外挂最终效果

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

Ø 币加德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。

1准备SQL查询语句。按前面“第29章 自定义报表/29.1 SQL命令行工具”介绍的方法,准备查询SQL语句,如图30-12

 

30-12 使用SQL命令行工具准备SQL查询语句

2写外挂程序。

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

 

30-13 添加数据集(默认名称不要更改)

在打开的DataSet1.xsd面板中,右键鼠标,如30-14。

 

30-14 添加TableAdapter

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

Ø 服务器名。精简数据库如图进行填写,如果是企业版数据库,请填写“.”(点表示本地,如果不是远程连接到ERP服务器写外挂程序,则需要把点改为ERP服务器的IP地址);

Ø 登录到服务器。精简数据库的密码是“17312319729@bijiade.cn”,企业版数据库的密码是在系统安装配置的时候自己设置的。

Ø 连接到数据库。选bdERP开头的任意一个就行,外挂程序运行时会根据账套自动切换。

 

30-15 连接数据库

根据TableAdapter配置向导进行配置,如30-16~图30-18。

 

30-16 不要在连接字符串中包含敏感数据

 

30-17 默认下一步

 

30-18 默认下一步

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

 

30-19 粘贴准备好的查询SQL语句

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

 

30-20 查询所得的数据表字段

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

 

30-21 添加报表文件(默认名称不要更改)

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

 

30-22 选择数据集

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

 

30-23 报表设计

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

 

30-24 报表设计结果

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

 

30-25 把报表查看器添加到窗体

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

 

30-26 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查询语句;其二是报表文件名称(注意路径)。如图30-27

 

30-27 代码关键点(SQL查询语句、报表文件名)

3配置外挂程序。

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

 

30-28 .NET Framework 3.5

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

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

 

30-29 拷贝外挂程序到ERP的外挂目录下

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

 

30-30 外挂程序接口

4最后总结。

报表外挂的意义。币加德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查询语句、报表设计(最费时间)。报表设计有如下特点(注意点),如30-31。

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

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

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

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

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

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

 

30-31 报表设计特点(注意点)

 

30-32 “报表”的“ConsumeContainerWhitesapce”属性值改为True


分享到:


发表评论
更多 网友评论0 条评论)
暂无评论

昆山市玉山镇更上一层楼软件设计工作室
© 2017-2035 苏州币加德软件研发有限公司
联系电话/微信号:173 1231 9729 陈生

苏ICP备17048491号    回到顶部
常熟ERP,常熟ERP软件,常熟ERP软件开发,常熟ERP量身定制