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

BlenderKou 阅读量:868 2017-01-07 SAP B1-功能方案-2 前台控制方案 SAPB1 功能方案 SQL 控制 存储

知识分享不易,转载请标注来源:http://www.blenderkou.top/contents/3/28.html
版权申明:欢迎转载,但请注明出处。
一些博文中的参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。


搜索关键词:SAP Business One,SBO,B1,存储过程控制

  是否有因杂乱无章的后台存储过程控制感到心烦?
  是否有因客户临时调整控制而打开电脑远程服务器在繁多的控制中寻找并修改sql?
  是否有因控制的bug而在外面逛街时寻找网吧远程解决问题或暂停控制?
  是否有因云部署的B1不方便修改后台控制而麻烦许多?

  今天给大家带来的是《SAP B1前台控制方案》,做这个东西是在我试用了大叔的“逐城辅助平台”之后萌生的想法。大叔的Add on 固然好但是让客户看到Add on 启动界面总是不好的,故而自己动手实现了这个简单的方案。

成果展示

     1、确保要控制的对象已经在“对象清单”中
     

     2、添加控制台并激活
     

     3、添加对应的控制点并在“控制台行”中添加该控制点。
     

     4、触发控制后效果如下图所示,返回“控制点编号”+“报错信息”。
     

     5、可通过报表查看所有控制和对应的启用状态。
     

     我将在接下来的几篇文章中带大家一步步实现该功能,并进行优化。

使用技术说明

  本方案使用下技术(或工具)实现,不涉及二次开发。
  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

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

     因我已经添加了对象,此处用修改的截图,与添加界面基本无异。
     自行输入“唯一标识”(CT_ObjType)、“名称”*(业务对象清单),选择“类型”(主数据)、“表” (选择控制对象自定义表)。
     

     服务设置:根据需要进行选择,建议勾选“删除”(删除错误信息)、“日志”(可以查看数据的修改记录)。
     

     界面设置:格式我们选择“矩阵样式”(例如excel表格式的对象),勾选“菜单项目”并填写相应信息后该对象就可以在模块中出现(我选择的是“管理模块”),否则在“工具”-“默认表格”中 。
     

     查找字段设置:选择需要按照哪些字段进行查找。
     

     查找字段设置:选择需要显示哪些字段,后面的设置是关于子表的,我们这个对象用不到就直接“下一步”。
     打印次数显示效果

     完成对象注册:最后一步是连接dll文件,我们不用管他直接单击“完成”。
            我不清楚怎么用这个dll应该是需要开发的,有大神知道的麻烦给指导下,小弟将不胜感激,这是我找到的唯一的资料。      
     

控制台

     按照下图所示步骤进行“控制台”对象的添加。
     

     此处建议勾选“日志”以便查看数据更改记录。
     

     界面设置:样式“标题行样式”,勾选“菜单项目” 并设置参数。
     
     
     

     子表设置:勾选需要在该对象中出现的子表(如同销售订单行表,如有多个则多选)。
     

     子表字段设置:选择对应子表并设置需要显示的字段。
     

     至此“控制台”对象便添加成功。
     

控制点

     按照下图所示步骤进行“控制点”对象的添加。
     控制点的添加请参考“对象”与“控制台”的操作。
     
     
     
     
     
     

     至此方案所需对象全部添加完成,可在对应的模块下看到自己添加的对象。
     注:如存在标题行样式的对象(如:控制台、控制点)无法打开,请检查UI API服务是否已正常启动。如在重启机器后仍无法解决,目前我知道的只有重新安装B1了。
     

导入对象清单

     我们可以用DTW 、SQL后台等方法导入该表的内容。SAP B1对象清单.zip

添加格式化搜索

     可以根据自己的需求添加格式化搜索,以便更好的使用。我添加了如下格式化:

     

     点击下载格式化&报表。

添加存储过程

     后台的存储过程完成通过将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



     通过SBO_SP_TransactionNotification中添加如下语句。
在控制中添加语句调用 [SP_AD_Control]

----------------------------------------------
------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


优化

     以上工作完成后即可使用 “前台控制方案” 但是体验上还是有待优化。

注:
关于在“前台控制方案”使用过程中,出现如下问题的。请单击末尾链接下载文件解决该问题。(其他自定义对象出现该问题亦可按照此方法解决)
“此条目已在下表中 ‘控制_01对象表’ (@CT_OBJTYPE) (ODBC -2035) [消息 131-183]”
“此条目已在下表中 ‘控制02控制台主’ (@CT_BOX) (ODBC -2035) [消息 131-183]”
“此条目已在下表中 ‘控制_03控制点’ (@CT_POINT) (ODBC -2035) [消息 131-183]”

SAP-SP-1002_前台控制方案问题修正:01“此条目已在下表中”.zip

微信公众号.jpg

扫描二维码,关注我的公众号,第一时间获取文章!


知识分享不易,转载请标注来源:http://www.blenderkou.top/contents/3/28.html
版权申明:欢迎转载,但请注明出处。
一些博文中的参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。

上一篇
SAP B1-功能方案-3 财务报表:总账

下一篇
SAP B1-功能方案-1 单据打印次数显示