SAP B1-功能方案-2 前台控制方案


关键词: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)步骤:请以下步骤分别进行“业务对象清单”、“控制台”、“控制点”的添加。

业务对象清单

打开“对象注册向导”后,看到一个介绍的界面,浏览下单击“下一步”继续。

控制方案-添加“业务对象清单”-1
控制方案-添加“业务对象清单”-1

注册模式包含“添加”、“更新”、“取消”、“删除”。我们选择“添加”。

[图片上传失败...(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)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,661评论 0 15
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,863评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,446评论 25 707
  • 以后一定要自己名下有个房子,哪怕小点也没关系!还有就是要好好努力,不断提升自己!买保险,买理财产品,重视自己的财务状况!
    cloud1125阅读 216评论 0 0