[TOC]
# 報表開發(手機萬能報表)
## 一 前言
天力卓越ERP是一款天力卓越公司自主開發的可用戶自主編輯二次開發的C/S化web風格的進銷存軟件,為解決日益增長的用戶個性化報表需求,依據客戶需求進行相應的報表開發,將二次報表開發功能進行相應的介紹。
## 二 進入報表二次開發界面
在賬套選擇界面,按Ctrl+F11在設計界面輸入Tlzy.123進入軟件
對系統報表進行更改,需在軟件客戶端目錄添加文件 tlzydebug.txt ,重新登錄軟件(慎用)
打開軟件,點擊菜單中報表管理,打開自定義報表管理(圖2-1)

:-: 圖2-1
## 三 正式介紹
在報表開發管理界面點擊新增,進入正式的二次報表開發環節

:-: 圖3-1
## 四 總體界面
一區:自定義報表大框架區域,定義報表大屬性區域
二區:SQL語句或者存儲過程存儲區域
三區:入參定義區域(SQL語句和存儲過程的入參)

:-: 圖4-1
## 五 名詞解釋一(大框架名詞)
1. 報表分類:二次報表可歸屬于相應的界面,要進行報表分類的定義
2. 關聯父表:在上級報表中雙擊某行,可打開目前定義的報表
3. 順序:二次開發報表在目前報表中顯示的順序
4. 手機端展示:該報表是否可以展示在手機
5. 不使用表格配置:可以進行表格說明項目的配置
6. 報表名稱:自定義報表在軟件中顯示的名稱
7. SQL類型:二次報表支持SQL語句及存儲過程

:-: 圖5-1
## 六 名詞解釋二(入參名詞)
1. 字段名稱:入參的參數名稱,一般以@開頭;
2. 中文名:在報表的條件選擇框前顯示的該入參的中文名稱;
3. 數據類型和參數類型:入參的數據類型以及數據類型的具體劃分數據類型分字符型,數值型和日期型;
* 字符型的參數類型分可選錄入型,選擇型,多選型,基礎檔案
* 數值型的參數類型分可選錄入型,選擇型,多選型
* 日期型的參數類型分開始日期和普通日期
4. 選擇項:參數類型為可選錄入型,選擇型,多選型的參數的預定義實際入參的定義;
* 以‘|’隔開表示不同的選擇項。如2017|2018|2019
5. 默認值:傳入參數的默認取值,取值順序:父表傳參>默認值傳參>軟件日期參數;
* 默認值支持SQL函數,如:getdate()
* 傳參到底層單據查詢條件:該報表列中必須包含:dju_id和dju_lxing列
6. 條件必選:自定義報表的條件選擇必須有值;
7. 父表傳參:上級報表雙擊某行時候,或上級報表所選條件參數,打開自定義報表時候所傳參數,父表穿參分為兩種,一種是父表的條件參數,以@開頭,一種是行參數,取父表該列的名稱;
8. 基礎檔案類型:字符型參數可取到的基礎資料內容作為入參;

:-: 圖6-1
## 七 報表二次開發步驟
1. 建立好報表所需要的存儲過程或者SQL語句
2. 在二次報表管理系統中進行相關的添加,報表分類,關聯父表(可無),報表名稱,SQL類型,填寫SQL語句或者存儲過程名稱,添加相應的入參。
3. 重新進入軟件,就可以在相關分類下看到本次添加的二次報表
4. 進行表格配置,添加中文名稱和標題。
5. 驗證數據正確性和完整性。
## 八 報表二次開發例子
以零售日報表為例,父類報表為零售月報表,下級子類報表為零售單查詢
### 1.建立零售日報表存儲過程
~~~
CREATE PROCEDURE [dbo].[sp_BB_saleDay]
( @org_id varchar(50)='',
@p_id varchar(50)='',
@c_id varchar(50)='',
@s_id varchar(50)='',
@d_id varchar(50)='',
@e_jsren varchar(50)='',
@e_cjren varchar(50)='',
@day datetime
)
AS
SET NOCOUNT ON
DECLARE @batchbzhi VARCHAR(255)
DECLARE @i INT, @mji FLOAT, @zyrshu INT
IF (@org_id<>'') AND (@s_id='') ---門店查詢依賴倉庫
BEGIN
SELECT TOP 1 @s_id=s_id FROM base_org_storage WHERE org_id=@org_id
SET @s_id=ISNULL(@s_id, '')
END
SELECT @mji=SUM(ISNULL(mji, 0.0)), @zyrshu=SUM(ISNULL(zyrshu, 0))
FROM base_storage WHERE @s_id = '' or id = @s_id
SELECT @mji=ISNULL(@mji, 0.00), @zyrshu=ISNULL(@zyrshu, 0)
BEGIN
SELECT dju_id,
SUM(-1*crkbzhi*d.sliang) AS xssliang, --數量
SUM(-1*crkbzhi*zhje) AS xssr, --銷售金額
SUM(-1*crkbzhi*d.cbje) AS xscb, --銷售成本
SUM(CASE WHEN zhje = '0' THEN -1*crkbzhi*d.cbje ELSE 0.0 END) AS zpcbje, --贈品成本金額
SUM(CASE WHEN d.sfglkcun=0 THEN -1*crkbzhi*je ELSE 0.0 END) AS ptspje, --普通商品銷售金額
SUM(CASE WHEN d.sfglkcun=1 THEN -1*crkbzhi*je ELSE 0.0 END) AS bglkcspje --不管理庫存商品銷售金額
INTO #DetailPday
FROM v_sale_detail d,v_sale_idx i , base_product p ,base_employee e1 ,base_employee e2,base_organization org , base_client c ,base_storage s
--,base_department dp
WHERE convert (varchar(10),i.rqi,120)=convert (varchar(10),@day,120) and
(@org_id = '' or d.org_id = @org_id) and
(@c_id='' OR i.c_id=@c_id) AND
(@s_id='' OR d.s_id =@s_id) AND
(@p_id='' OR p_id=@p_id) AND
(@e_jsren='' OR d.e_jsren =@e_jsren) AND
(@e_cjren='' OR d.e_cjren =@e_cjren) AND
(@d_id='' OR i.d_id =@d_id) AND
d.dju_id = i.id and d.S_ID=s.ID AND
i.C_ID=c.ID ANDd.e_jsren=e1.ID AND
d.e_cjren =e2.id and
--i.d_ID=dp.id AND ----暫時取消部門
d.p_id=p.ID and d.org_id= org.id
GROUP BY dju_id ,rqi
SELECT [ID], bhao, rqi, dju_lxing,e_jsren, e_cjren, c_id, c_mcheng, ysje,hjyhje, yjje,ssje, a_id
INTO #IdxBillDayTemp --------提煉主表
FROM v_sale_idx i
WHERE i.ztai='10' and convert (varchar(10),i.rqi,120)=convert (varchar(10),@day,120)
SELECT i.*, ISNULL((CASE i.a_id WHEN '-1' THEN '多賬戶' ELSE a.mcheng END), '' ) AS a_mcheng
INTO #IdxBillDay
FROM #IdxBillDayTemp i
LEFT JOIN Base_Account a ON i.a_id=a.id
-----------開始陳列日報表
SELECT i.rqi, dju_id, bhao, dju_lxing, e_jsren, e_cjren, c_id, c_mcheng, a_mcheng,
SUM(xssliang) AS xssliang, ---銷售數量
SUM(xssr) AS xssr, ---銷售收入
SUM(xscb) AS xscb, ---成本
SUM(zpcbje) AS zpcbje, ---贈品成本
SUM(ptspje) AS ptspje, ---普通商品金額
SUM(bglkcspje) AS bglkcspje, ---不管理庫存商品金額
(CASE WHEN ISNULL(SUM(xssr), 0.0)=0.0 THEN 0.0 ELSE (ISNULL(SUM(ptspje), 0.0)/ISNULL(SUM(xssr), 0.0))*100 END) AS ptspzb,
(CASE WHEN ISNULL(SUM(xssr), 0.0)=0.0 THEN 0.0 ELSE (ISNULL(SUM(bglkcspje), 0.0)/ISNULL(SUM(xssr), 0.0))*100 END) AS bglkcspzb,
SUM(hjyhje) AS xsyh, ---銷售優惠
SUM(yjje) AS xsysk, ---應收金額
SUM(i.ssje) AS xsssk ---實收金額
FROM #DetailPday d
INNER JOIN #IdxBillDay I ON d.dju_id=i.[ID]
GROUP BY rqi, dju_id, bhao, dju_lxing, e_jsren, e_cjren, c_id, c_mcheng, a_mcheng
ORDER BY rqi, dju_id
END
EXEC sp_DropTempTable '#DetailPday'
EXEC sp_DropTempTable '#IdxBillDayTemp'
EXEC sp_DropTempTable '#IdxBillDay'
~~~
### 2.在自定義報表管理中進行零售日報表的添加

:-: 圖8-1
* 其中查詢日期入參有兩種參數可選,一是默認值,取服務器當前日期,二是父表傳參,取父表零售月報表的day_列的該行的值。
* 此零售日報表打開兩種方式,一種是直接打開,查詢日期取默認值,一種是在零售月報表中雙擊某行打開,查詢日期參數取零售月報表該行的day_的值作為查詢日期的參數值。

:-: 圖8-2
### 3.進行表格配置(具體詳情見表格配置設置)

:-: 圖8-3
### 4.檢查數據有無錯誤,二次報表開發完成