利用erp系統(tǒng)開發(fā)接口定制復(fù)雜軟件kf05-02
開發(fā)復(fù)雜的報(bào)表外掛(使用VS自帶的.rdlc報(bào)表),建議使用Visual Studio 2013專業(yè)版、高級(jí)版或旗艦版,不要使用速成版或社區(qū)版(沒有集成報(bào)表開發(fā)功能)。最終效果如下圖。
圖:復(fù)雜報(bào)表外掛最終效果
此復(fù)雜報(bào)表外掛具有如下特點(diǎn):
- 幣加德ERP自動(dòng)把當(dāng)前登錄的用戶ID、數(shù)據(jù)庫(kù)服務(wù)器IP、賬套對(duì)應(yīng)的后臺(tái)數(shù)據(jù)庫(kù)名稱、登錄賬號(hào)、登錄密碼傳遞給外掛程序,所以不僅僅可以開發(fā)報(bào)表外掛,充滿想象;
- 無需幣加德ERP的源代碼;
- 外掛可以使用不同的開發(fā)語言和平臺(tái)(幣加德ERP使用C#語言,.NET 2.0),外掛使用C#語言,.NET 3.5(不可以使用.NET 2.0,因?yàn)闆]有報(bào)表功能;也不可以使用.NET 4.0及以上,因?yàn)榧軜?gòu)與.NET 2.0不兼容。可以使用VB.NET語言);
- 外掛程序需要引用幣加德ERP的任何.dll文件,外掛程序可以獨(dú)立運(yùn)行,為了防止用戶直接運(yùn)行,可以編譯成.dll動(dòng)態(tài)鏈接庫(kù)文件,由ERP調(diào)用;
- 外掛程序的代碼量非常小,基礎(chǔ)框架已經(jīng)搭好,只需要依葫蘆畫瓢,重點(diǎn)在于取數(shù)SQL語句和報(bào)表格式調(diào)整(這是個(gè)細(xì)致且費(fèi)時(shí)間的活兒);
- 此報(bào)表外掛案例,包含了報(bào)表設(shè)計(jì)中常用的功能:頁面大小的設(shè)置、頁頭、頁尾、分組匯總、每頁重復(fù)顯示列頭、公司LOGO、簽章透明、分頁等,報(bào)表加入圖片的功能很容易擴(kuò)展到加入條碼、二維碼。報(bào)表可以導(dǎo)出到Excel/PDF/Word。
一、準(zhǔn)備SQL查詢語句
按前面“自定義報(bào)表/SQL命令行工具”介紹的方法,準(zhǔn)備查詢SQL語句,如下圖。
圖:使用SQL命令行工具準(zhǔn)備SQL查詢語句
二、編寫外掛程序
按上一節(jié)介紹的方法建立項(xiàng)目W2,在W2上右鍵鼠標(biāo),在彈出菜單中選【添加】/【新建項(xiàng)】,如下圖。
圖:添加數(shù)據(jù)集(默認(rèn)名稱不要更改)
在打開的DataSet1.xsd面板中,右鍵鼠標(biāo),如下圖。
圖:添加TableAdapter
在彈出的“添加連接”窗口,錄入數(shù)據(jù)庫(kù)服務(wù)器相關(guān)信息,如下圖。
- 服務(wù)器名。精簡(jiǎn)數(shù)據(jù)庫(kù)如圖進(jìn)行填寫,如果是企業(yè)版數(shù)據(jù)庫(kù),請(qǐng)?zhí)顚憽?”(點(diǎn)表示本地,如果不是遠(yuǎn)程連接到ERP服務(wù)器寫外掛程序,則需要把點(diǎn)改為ERP服務(wù)器的IP地址);
- 登錄到服務(wù)器。精簡(jiǎn)數(shù)據(jù)庫(kù)的密碼是“17312319729@bijiade.cn”,企業(yè)版數(shù)據(jù)庫(kù)的密碼是在系統(tǒng)安裝配置的時(shí)候自己設(shè)置的。
- 連接到數(shù)據(jù)庫(kù)。選bdERP開頭的任意一個(gè)就行,外掛程序運(yùn)行時(shí)會(huì)根據(jù)賬套自動(dòng)切換。
圖:連接數(shù)據(jù)庫(kù)
根據(jù)TableAdapter配置向?qū)нM(jìn)行配置,如下圖。
圖:不要在連接字符串中包含敏感數(shù)據(jù)
圖:默認(rèn)下一步
圖:默認(rèn)下一步
粘貼準(zhǔn)備好的查詢SQL語句,點(diǎn)【完成】,如下圖。
圖:粘貼準(zhǔn)備好的查詢SQL語句
執(zhí)行查詢SQL語句所得的數(shù)據(jù)表字段,如下圖。
圖:查詢所得的數(shù)據(jù)表字段
在W2上右鍵鼠標(biāo),在彈出菜單中選【添加】/【新建項(xiàng)】,如下圖。
圖:添加報(bào)表文件(默認(rèn)名稱不要更改)
在打開的報(bào)表文件界面,右鍵“數(shù)據(jù)集”,選擇剛剛配置的數(shù)據(jù)集,如下圖。
圖:選擇數(shù)據(jù)集
在報(bào)表設(shè)計(jì)界面,右鍵鼠標(biāo),可以插入文本框等等,也可以把左側(cè)的數(shù)據(jù)集下面的字段拖放到報(bào)表設(shè)計(jì)界面,如下圖。
圖:報(bào)表設(shè)計(jì)
報(bào)表設(shè)計(jì)是最繁瑣最費(fèi)時(shí)間的事情,最終設(shè)計(jì)結(jié)果,如下圖。
圖:報(bào)表設(shè)計(jì)結(jié)果
打開Form1窗體,從工具箱拖放一個(gè)ReportViewer報(bào)表查看器到窗體,如下圖。
圖:把報(bào)表查看器添加到窗體
雙擊Form1窗體,如圖30-26,清空窗體中所有的代碼,并把下面的代碼復(fù)制粘貼進(jìn)去。
圖: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″;?//服務(wù)器IP(如果是SQL企業(yè)版,則為“.”)
public?string?_dbName =?“bdERP”; ?????????????????????//數(shù)據(jù)庫(kù)名稱
public?string?_saPassword =?“17312319729@bijiade.cn”;?//sa密碼
public?string?_curDir =?@”..\..\”; ???????????????????//當(dāng)前目錄
public?Form1(){?InitializeComponent();?}
public?void?ShowMe(string?userID,?string?serverIP,?string?dbName,?string?saPassword,?string?curDir)//鉤子方法
{
_userID = userID; ??????????//傳遞用戶登錄ID
_serverIP = serverIP; ??????//服務(wù)器IP
_dbName = dbName; ??????????//數(shù)據(jù)庫(kù)名稱
_saPassword = saPassword; ??//sa密碼
_curDir = curDir; ??????????//當(dāng)前目錄
MessageBox.Show(“用戶ID:”?+ _userID +?“\n數(shù)據(jù)庫(kù)服務(wù)器IP:”?+ _serverIP +?“\n數(shù)據(jù)庫(kù)名稱:”?+ _dbName +?“\nsa密碼:”?+ _saPassword +?“\n當(dāng)前目錄:”?+ _curDir,?“提示”);
base.Show();//顯示窗體
}
private?void?Form1_Load(object?sender,?EventArgs?e)
{
//1.SQL查詢語句
string?sql =?@”
SELECT
a.c010 單號(hào), a.c020 日期, a.c200 銷售類型, a.c210 客戶單號(hào),
a.c030 客戶代碼, c.c020 客戶名稱,
a.c090 聯(lián)系人, a.c091 聯(lián)系電話,
a.c070 交貨方式, a.c080 交貨地點(diǎn), ?a.c100 備注, a.c110 業(yè)務(wù)員,
b.c020 項(xiàng)次, b.c029 客戶料號(hào), b.c030 貨品代碼,
b.c050 品名規(guī)格, b.c060 單位, b.c069 含稅, b.c070 單價(jià), b.c071 含稅單價(jià),
b.c080 數(shù)量, b.c090 金額, b.c100 稅率, b.c101 稅額, b.c110 價(jià)稅合計(jì),
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.報(bào)表文件名(如果報(bào)表文件與外掛程序在同一目錄,直接寫報(bào)表名稱即可)
string?reportName = _curDir +?@”Report1.rdlc”;
//3.綁定
Bind(sql, reportName);
}
///?<summary>
///?工具方法,執(zhí)行SQL查詢獲取數(shù)據(jù),并綁定到指定報(bào)表。
///?</summary>
///?<param name=”sql”>SQL查詢語句</param>
///?<param name=”reportName”>報(bào)表文件名</param>
private?void?Bind(string?sql,?string?reportName)
{
DataTable?data =?new?DataTable(); ??????????????????????????//數(shù)據(jù)
try
{
//執(zhí)行SQL查詢獲取數(shù)據(jù)
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(); ?????????????????????//打開數(shù)據(jù)庫(kù)連接
SqlDataAdapter?adapt =?new?SqlDataAdapter(sql, conn);//實(shí)例化適配器
adapt.Fill(data); ???????????????????????????????????//獲取數(shù)據(jù)
conn.Close(); ??????????????????????????????????????//關(guān)閉數(shù)據(jù)庫(kù)連接
}
//綁定到指定報(bào)表
ReportDataSource?rds =?new?ReportDataSource();
rds.Name =?“DataSet1”; ?????????????????//要與數(shù)據(jù)集屬性數(shù)據(jù)集名稱要一致
rds.Value = data;
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(rds);
this.reportViewer1.LocalReport.ReportPath = reportName; ?//報(bào)表文件名
this.reportViewer1.RefreshReport();
}
catch?(Exception?ex) {?MessageBox.Show(“出錯(cuò)了:\n”?+ ex.Message,?“提示”,?MessageBoxButtons.OK,?MessageBoxIcon.Error); }
}
}
}
以上代碼已經(jīng)在注釋中進(jìn)行了講解,看不懂也沒有關(guān)系,只要依葫蘆畫瓢,要改2個(gè)地方(上面代碼已說明):其一是SQL查詢語句;其二是報(bào)表文件名稱(注意路徑)。如下圖。
圖:代碼關(guān)鍵點(diǎn)(SQL查詢語句、報(bào)表文件名)
三、配置外掛程序
鼠標(biāo)右鍵W2,在彈出菜單中選【屬性】,目標(biāo)框架選.NET 3.5,如下圖。
圖:選.NET Framework 3.5
提醒:這里輸出類型保持默認(rèn),為了便于測(cè)試。測(cè)試正常后,可以改為“類庫(kù)”。
拷貝外掛程序到ERP的外掛目錄下,并確認(rèn)運(yùn)行正常,如下圖。
圖:拷貝外掛程序到ERP的外掛目錄下
打開【系統(tǒng)設(shè)置】/【外掛程序接口】,選擇子系統(tǒng),配置外掛程序接口參數(shù),測(cè)試是否可以正常打開外掛程序,最后點(diǎn)【保存并應(yīng)用】,如下圖。
圖:外掛程序接口
四、總結(jié)
①報(bào)表外掛的意義。幣加德ERP系統(tǒng)的單據(jù)打印都是基于Excel的(參見“第23章 單據(jù)打印格式設(shè)計(jì)”),一般情況下無需開發(fā).rdlc報(bào)表,除非現(xiàn)有報(bào)表滿足不了業(yè)務(wù)需求。這里以開發(fā).rdlc報(bào)表為例,不僅僅為了說明報(bào)表開發(fā)本身,而且可以學(xué)習(xí)到如何集成ERP中的用戶ID、賬套數(shù)據(jù)庫(kù)等,無需另外配置數(shù)據(jù)庫(kù)連接和建立賬戶體系。
②幣加德ERP外掛接口規(guī)范。會(huì)傳遞如下這些參數(shù)給外掛程序,外掛程序可以不使用,或者部分使用,但是不能缺少這些參數(shù),順序也不能改變。
///?<summary>
///?鉤子方法。
///?</summary>
///?<param name=”userID”>用戶登錄ID</param>
///?<param name=”serverIP”>服務(wù)器IP</param>
///?<param name=”dbName”>數(shù)據(jù)庫(kù)名稱</param>
///?<param name=”saPassword”>sa密碼</param>
///?<param name=”curDir”>當(dāng)前目錄</param>
public?void?ShowMe(string?userID,?string?serverIP,?string?dbName,?string?saPassword,?string?curDir)//鉤子方法
{
_userID = userID; ??????????//傳遞用戶登錄ID
label1.Text =?“登錄用戶ID:”?+ _userID;//標(biāo)簽顯示
base.Show();//顯示窗體
}
③使用Visual Studio 2013開發(fā).rdlc報(bào)表的關(guān)鍵是準(zhǔn)備SQL查詢語句、報(bào)表設(shè)計(jì)(最費(fèi)時(shí)間)。報(bào)表設(shè)計(jì)有如下特點(diǎn)(注意點(diǎn)),如下圖。
1)拖放設(shè)計(jì)。數(shù)據(jù)字段按照SQL查詢語句的順序列示,直接拖放進(jìn)行報(bào)表設(shè)計(jì),簡(jiǎn)單直觀。
2)設(shè)計(jì)時(shí)可以調(diào)整紙張大小。報(bào)表默認(rèn)大小是A4縱向(可以更改),寬度不能超過“紙張寬度+邊距”,否則打印預(yù)覽時(shí)多出了很多空白頁(如果拉窄了寬度后,打印預(yù)覽時(shí)還是有空白頁,則需要把“報(bào)表”的“ConsumeContainerWhitesapce”屬性值改為True,此屬性意思“指使在容器中的內(nèi)容增長(zhǎng)時(shí),是占用還是保留容器中的最小空白。只要內(nèi)容右側(cè)和下方的空白受到影響。”)。縱向不用留空間,在打印時(shí)根據(jù)數(shù)據(jù)行數(shù)自動(dòng)拉高。
3)數(shù)據(jù)表是一個(gè)整體。當(dāng)在設(shè)計(jì)時(shí)插入表格,表格是一個(gè)整體,但是列頭在多頁時(shí)重復(fù)顯示功能時(shí)不時(shí)卡殼(tablix“Tablix2”具有無效的?TablixMember。TablixColumnHierarchy?中所有?TablixMember?元素的?RepeatOnNewPage?屬性必須設(shè)置為?false。),所以建議把標(biāo)題欄刪除,手工增加文本框代替,放在頁眉處,這樣每頁都會(huì)顯示。
4)數(shù)據(jù)區(qū)可多級(jí)分組。報(bào)表的核心在于數(shù)據(jù)區(qū),可以分組匯總等。
5)頁眉/頁腳。頁腳可以插入頁碼,加上印章(透明處理參見第23章)等。
提醒:如果報(bào)表外掛程序在集成到ERP前運(yùn)行得好好的,集成后出錯(cuò),最大的可能性有2種:其一如果提示“此程序集的運(yùn)行時(shí)比當(dāng)前加載的運(yùn)行時(shí)新,無法加載此程序集”,則是因?yàn)檫x錯(cuò)了.NET版本(參見“圖30-28?選.NET Framework 3.5”);其二如果報(bào)表無法顯示,則是因?yàn)閳?bào)表路徑錯(cuò)了,或者報(bào)表文件Report1.rdlc沒有和外掛程序一起復(fù)制到ERP的外掛程序目錄中。
圖:報(bào)表設(shè)計(jì)特點(diǎn)(注意點(diǎn))
圖:把“報(bào)表”的“ConsumeContainerWhitesapce”屬性值改為True
評(píng)論 |0|
You must be logged in to post a comment.