关键词:SAP Business one、SBO、SAP B1、存储过程、控制、管控
我的个人博客文章路径http://www.blenderkou.top/contents/3/28.html
是否有因杂乱无章的后台存储过程控制感到心烦?
是否有因客户临时调整控制而打开电脑远程服务器在繁多的控制中寻找并修改sql?
是否有因控制的bug而在外面逛街时寻找网吧远程解决问题或暂停控制?
是否有因云部署的B1不方便修改后台控制而麻烦许多?
今天给大家带来的是《SAP B1前台控制方案》,做这个东西是在我试用了大叔的“逐城辅助平台”之后萌生的想法。大叔的Add on 固然好但是让客户看到Add on 启动界面总是不好的,故而自己动手实现了这个简单的方案。
成果展示
1、确保要控制的对象已经在“对象清单”中
[图片上传失败...(image-8c5c93-1515384116121)]
2、添加控制台并激活
[图片上传失败...(image-7bbd81-1515384116121)]
3、添加对应的控制点并在“控制台行”中添加该控制点。
[图片上传失败...(image-7878f6-1515384116121)]
4、触发控制后效果如下图所示,返回“控制点编号”+“报错信息”。
[图片上传失败...(image-800dcf-1515384116121)]
5、可通过报表查看所有控制和对应的启用状态。
[图片上传失败...(image-81e08f-1515384116121)]
我将在接下来的几篇文章中带大家一步步实现该功能,并进行优化。
使用技术说明
本方案使用下技术(或工具)实现,不涉及二次开发。
1)SAP B1自定义表
2)自定义字段
3)自定义对象
4)Screen Painter / SAP Business One Studio
5)T-SQL
方案实现
设计
本方案是参考大叔的Add on当然如果说抄也可以。
本方案分为两大部分:存储、调用 。
“存储”分为 前台、后台 共同完成控制的录入与保存。
“调用”主要是负责通过SAP B1 中的“SBO_SP_TransactionNotification”存储过程调用我们在前台添加的存储过程。
- 对象清单
对象清单用来维护sap b1的单据或主数据对象(默认数据是从大叔发的9.0常用对象清单中提取的) ,后期可以根据需要自行添加。
- 控制台
控制台以对象为单位,作为控制点的汇总并进行“激活”控制
- 控制点
控制点即为每一个最终控制,并和控制台关联。
三个表的主要字段及关系如下图所示
实现
创建自定义表
在SAP B1 中添加如下自定义表
创建自定义字段
在SAP B1中添加如下自定义字段:
注册自定义对象
在SAP B1中添加自定义字段:
(1)路径:工具 ---> 定制工具 ---> 对象注册向导。
(2)步骤:请以下步骤分别进行“业务对象清单”、“控制台”、“控制点”的添加。
业务对象清单
打开“对象注册向导”后,看到一个介绍的界面,浏览下单击“下一步”继续。
注册模式包含“添加”、“更新”、“取消”、“删除”。我们选择“添加”。
[图片上传失败...(image-edc197-1515384116121)]
因我已经添加了对象,此处用修改的截图,与添加界面基本无异。
自行输入“唯一标识”(CT_ObjType)、“名称”*(业务对象清单),选择“类型”(主数据)、“表” (选择控制对象自定义表)。
[图片上传失败...(image-b43155-1515384116121)]
服务设置:根据需要进行选择,建议勾选“删除”(删除错误信息)、“日志”(可以查看数据的修改记录)。
[图片上传失败...(image-77f51b-1515384116121)]
界面设置:格式我们选择“矩阵样式”(例如excel表格式的对象),勾选“菜单项目”并填写相应信息后该对象就可以在模块中出现(我选择的是“管理模块”),否则在“工具”-“默认表格”中 。
[图片上传失败...(image-9ceb64-1515384116121)]
查找字段设置:选择需要按照哪些字段进行查找。
[图片上传失败...(image-e0d415-1515384116121)]
查找字段设置:选择需要显示哪些字段,后面的设置是关于子表的,我们这个对象用不到就直接“下一步”。
[图片上传失败...(image-9d593e-1515384116121)]
完成对象注册:最后一步是连接dll文件,我们不用管他直接单击“完成”。
我不清楚怎么用这个dll应该是需要开发的,有大神知道的麻烦给指导下,小弟将不胜感激,这是我找到的唯一的资料。
[图片上传失败...(image-183974-1515384116121)]
控制台
按照下图所示步骤进行“控制台”对象的添加。
[图片上传失败...(image-ea6f12-1515384116121)]
此处建议勾选“日志”以便查看数据更改记录。
[图片上传失败...(image-91fb20-1515384116121)]
界面设置:样式“标题行样式”,勾选“菜单项目” 并设置参数。
[图片上传失败...(image-9cb66d-1515384116121)]
[图片上传失败...(image-fdd2bd-1515384116121)]
[图片上传失败...(image-32e016-1515384116121)]
子表设置:勾选需要在该对象中出现的子表(如同销售订单行表,如有多个则多选)。
[图片上传失败...(image-3af4bc-1515384116121)]
子表字段设置:选择对应子表并设置需要显示的字段。
[图片上传失败...(image-32f810-1515384116121)]
至此“控制台”对象便添加成功。
[图片上传失败...(image-9208f2-1515384116121)]
控制点
按照下图所示步骤进行“控制点”对象的添加。
控制点的添加请参考“对象”与“控制台”的操作。
[图片上传失败...(image-81111d-1515384116121)]
[图片上传失败...(image-f74633-1515384116121)]
[图片上传失败...(image-535a9a-1515384116121)]
[图片上传失败...(image-c47d2c-1515384116121)]
[图片上传失败...(image-e3cafe-1515384116121)]
[图片上传失败...(image-9645ae-1515384116121)]
至此方案所需对象全部添加完成,可在对应的模块下看到自己添加的对象。
注:如存在标题行样式的对象(如:控制台、控制点)无法打开,请检查UI API服务是否已正常启动。如在重启机器后仍无法解决,目前我知道的只有重新安装B1了。
[图片上传失败...(image-c90201-1515384116121)]
导入对象清单
我们可以用DTW 、SQL后台等方法导入该表的内容。SAP B1对象清单.zip
添加格式化搜索
可以根据自己的需求添加格式化搜索,以便更好的使用。我添加了如下格式化:
[图片上传失败...(image-cc170a-1515384116121)]
点击下载格式化&报表。
添加存储过程
后台的存储过程完成通过将B1本身的存储过程控制转到我们在前台添加的控制中。
添加存储过程“SP_AD_Control”
通过本存储过程完成对前台添加的控制的调用。
----------------------------------
/********************************************************
[SP_AD_Control] 增强控制方案
********************************************************/
/*调用过程:
declare @error int ,@error_message nvarchar (200)
SET @error = 0
EXEC[SP_AD_Control]
'4',
'U',
'1',
N'itemcode',
N'A001',
@error OUTPUT,
@Return OUTPUT
select @error,@Return
*/
----------------------------------
----创建存储过程,并定义参数,参数与标准的[SBO_SP_TransactionNotification]中的参数一致(区别在于用@Return 代替@error_message)
create PROCEDURE [dbo].[SP_AD_Control]
@object_type NVARCHAR(20) , -- SBO Object Type
@transaction_type NCHAR(1) , -- [A]dd, [U]pdate, [D]elete, [C]ancel, C[L]ose
@num_of_cols_in_key INT ,
@list_of_key_cols_tab_del NVARCHAR(255) ,
@list_of_cols_val_tab_del NVARCHAR(255) ,
@error INT OUTPUT ,
@Return NVARCHAR(4000) OUTPUT
--WITH ENCRYPTION
AS
BEGIN
----0.公共区域(在此处定义变量)--
DECLARE @Line INT
DECLARE @Max INT
DECLARE @obj NVARCHAR(20)
DECLARE @SqlStr NVARCHAR(MAX)
DECLARE @CT_Code NVARCHAR(50)
--------------------------------------------------------------------------
----1.查询出当前单据的控制信息并将其插入到缓存表#Table_AD_Control_01中----
--------------------------------------------------------------------------
SELECT ROW_NUMBER() OVER ( ORDER BY T2.Code ASC ) AS LineNum , --通过ROW_NUMBER() OVER 函数为查出的结果添加行号
T2.Code ,
CAST (T2.U_SqlStr AS NVARCHAR(MAX)) AS SqlStr --将控制点存储的SQL语句转换为 NVARCHAR(MAX) 格式
INTO #Table_AD_Control_01 --将查询结果插入到临时表中
FROM dbo.[@CT_BOX] T0 --@CT_BOX 为控制台主表
INNER JOIN dbo.[@CT_BOX1] T1 ON T1.Code = T0.Code --@CT_BOX1 为控制台子表
INNER JOIN dbo.[@CT_POINT] T2 ON T2.Code = T1.U_PointCode --@CT_POINT 为控制点表
WHERE T0.U_Enabled = 'Y' --条件1:控制台为激活状态
AND T1.U_Enabled = 'Y' --条件2:控制点为激活状态(在控制台的行中设置控制点的状态)
AND T0.Code = @object_type --条件3:控制台的Code 等于当前对象的ObjType
GROUP BY T2.Code ,
CAST (T2.U_SqlStr AS NVARCHAR(MAX))
--------------------------------------------------
----2.查询出当前单据控制的最大数量并给变量赋值----
--------------------------------------------------
SELECT @Max = COUNT(T2.Code) ,
@Line = 1
FROM dbo.[@CT_BOX] T0
INNER JOIN dbo.[@CT_BOX1] T1 ON T1.Code = T0.Code
INNER JOIN dbo.[@CT_POINT] T2 ON T2.Code = T1.U_PointCode
WHERE T0.U_Enabled = 'Y'
AND T1.U_Enabled = 'Y'
AND T0.Code = @object_type
----------------------------------------------------
----3.如果当前单据存在对应的控制则执行下面的内容----
----------------------------------------------------
IF @Max > 0
BEGIN
----3.1.查询出当前单据的 object_type
SELECT @obj = T0.Code
FROM dbo.[@CT_OBJTYPE] T0
WHERE T0.Code = @object_type
----3.2.如果@object_type等于当前对象编号则执行下面的内容
IF @object_type = @obj
BEGIN
----3.3.循环执行每一条控制语句直到行号大于等于当前单据控制数量
WHILE @Line <= @Max
AND @error = 0
BEGIN
----3.3.1.查询出当前行的控制语句
SELECT @SqlStr = T0.SqlStr ,
@CT_Code = T0.Code
FROM #Table_AD_Control_01 T0
WHERE T0.LineNum = @Line
----3.3.2.执行当前行的控制语句
EXEC sp_executesql @SqlStr,
N'@object_type NVARCHAR(20) ,
@transaction_type NCHAR(1) ,
@num_of_cols_in_key INT ,
@list_of_key_cols_tab_del NVARCHAR(255) ,
@list_of_cols_val_tab_del NVARCHAR(255) ,
@error INT OUTPUT ,
@Return NVARCHAR(4000) OUTPUT',
@object_type, @transaction_type,
@num_of_cols_in_key,
@list_of_key_cols_tab_del,
@list_of_cols_val_tab_del, @error OUTPUT,
@Return OUTPUT
----3.3.3.如果控制语句返回的@reeor值不等于0则执行下面的内容
IF @error <> 0
BEGIN
SELECT @error = @error ,
@Return = @CT_Code + ':'
+ @Return
END
SELECT @Line = @Line + 1
END
END
END
----------------------------------------
----4.删除临时表#Table_AD_Control_01----
----------------------------------------
DROP TABLE #Table_AD_Control_01
END
在控制中添加语句调用 [SP_AD_Control]
通过SBO_SP_TransactionNotification中添加如下语句。
----------------------------------------------
------SAPB1控制增强解决方案------
----------------------------------------------
BEGIN TRY --用Try Catch 来返回异常
--调用存储过程[SP_AD_Control]
EXEC SP_AD_Control @object_type, @transaction_type,
@num_of_cols_in_key, @list_of_key_cols_tab_del,
@list_of_cols_val_tab_del, @error OUTPUT,
@error_message OUTPUT
END TRY
BEGIN CATCH
SET @error = -1
SET @error_message = N'SAPB1控制增强解决方案出现意外错误,描述:' + ERROR_MESSAGE()
END CATCH
优化
以上工作完成后即可使用 “前台控制方案” 但是体验上还是有待优化,【下一篇将讲解界面的优化】。
-------------- 未完待续 ---------------
扫描下方二维码,关注我第一时间获取文章。
[图片上传失败...(image-c7911b-1515384116121)]