[TOC]
# 报表开发(手机万能报表)
## 一 前言
天力卓越ERP是一款天力卓越公司自主开发的可用户自主编辑二次开发的C/S化web风格的进销存软件,为解决日益增长的用户个性化报表需求,依据客户需求进行相应的报表开发,将二次报表开发功能进行相应的介绍。
## 二 进入报表二次开发界面
在账套选择界面,按Ctrl+F11在设计界面输入Tlzy.123进入软件
对系统报表进行更改,需在软件客户端目录添加文件 tlzydebug.txt ,重新登录软件(慎用)
打开软件,点击菜单中报表管理,打开自定义报表管理(图2-1)
![](https://box.kancloud.cn/5ab893de8698c67707ed71614f309cfa_1366x728.png)
:-: 图2-1
## 三 正式介绍
在报表开发管理界面点击新增,进入正式的二次报表开发环节
![](https://box.kancloud.cn/8be8c2cd6c356513c119fc26f4574bc2_1364x463.png)
:-: 图3-1
## 四 总体界面
一区:自定义报表大框架区域,定义报表大属性区域
二区:SQL语句或者存储过程存储区域
三区:入参定义区域(SQL语句和存储过程的入参)
![](https://box.kancloud.cn/bb9e52816d1dcdbe86112097e2e1c6ba_1366x728.png)
:-: 图4-1
## 五 名词解释一(大框架名词)
1. 报表分类:二次报表可归属于相应的界面,要进行报表分类的定义
2. 关联父表:在上级报表中双击某行,可打开目前定义的报表
3. 顺序:二次开发报表在目前报表中显示的顺序
4. 手机端展示:该报表是否可以展示在手机
5. 不使用表格配置:可以进行表格说明项目的配置
6. 报表名称:自定义报表在软件中显示的名称
7. SQL类型:二次报表支持SQL语句及存储过程
![](https://box.kancloud.cn/8427ac12c7a3080360088bba6a0e12d9_1366x728.png)
:-: 图5-1
## 六 名词解释二(入参名词)
1. 字段名称:入参的参数名称,一般以@开头;
2. 中文名:在报表的条件选择框前显示的该入参的中文名称;
3. 数据类型和参数类型:入参的数据类型以及数据类型的具体划分数据类型分字符型,数值型和日期型;
* 字符型的参数类型分可选录入型,选择型,多选型,基础档案
* 数值型的参数类型分可选录入型,选择型,多选型
* 日期型的参数类型分开始日期和普通日期
4. 选择项:参数类型为可选录入型,选择型,多选型的参数的预定义实际入参的定义;
* 以‘|’隔开表示不同的选择项。如2017|2018|2019
5. 默认值:传入参数的默认取值,取值顺序:父表传参>默认值传参>软件日期参数;
* 默认值支持SQL函数,如:getdate()
* 传参到底层单据查询条件:该报表列中必须包含:dju_id和dju_lxing列
6. 条件必选:自定义报表的条件选择必须有值;
7. 父表传参:上级报表双击某行时候,或上级报表所选条件参数,打开自定义报表时候所传参数,父表穿参分为两种,一种是父表的条件参数,以@开头,一种是行参数,取父表该列的名称;
8. 基础档案类型:字符型参数可取到的基础资料内容作为入参;
![](https://box.kancloud.cn/714173e8975d37372cccd82b4850ce16_532x431.png)
:-: 图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.在自定义报表管理中进行零售日报表的添加
![](https://box.kancloud.cn/224c72368633102976e7350fd4baf2eb_1094x588.png)
:-: 图8-1
* 其中查询日期入参有两种参数可选,一是默认值,取服务器当前日期,二是父表传参,取父表零售月报表的day_列的该行的值。
* 此零售日报表打开两种方式,一种是直接打开,查询日期取默认值,一种是在零售月报表中双击某行打开,查询日期参数取零售月报表该行的day_的值作为查询日期的参数值。
![](https://box.kancloud.cn/0d559da6d6d982d2b906c553b5ddd7e4_532x431.png)
:-: 图8-2
### 3.进行表格配置(具体详情见表格配置设置)
![](https://box.kancloud.cn/21e67691f5a7611e79cb271352cae505_800x600.png)
:-: 图8-3
### 4.检查数据有无错误,二次报表开发完成