小工具:管理各模块自定义配置项,升级版


以下文章来源于ABAPer孙亮 ,作者孙小亮

ABAPer孙亮 .

绝对“有用 实用”的ABAP与Excel“原创”干货,不定期发布!可加vx: 286503700交流


前言

ERP项目上线后,标准的系统配置,我们很少去做改动了,随着使用的逐渐深入,自开发的功能会越来越多,需要运维顾问进行管理的自定义配置也会越来越多。为此,我提供了一个类似于SPRO的配置工具,用来管理自定义的配置项。

说明:这个配置工具里,也可以将标准的视图维护进来,比如:配置公司代码的维护视图V_T001。


1/6.效果展示

之前做了一个模块自定义配置项的管理工具,比较low一些。

现在做了一下升级,效果如下

小工具:管理各模块自定义配置项,升级版
上面展示的层级结构,通过自定义表进行配置,配置内容大概如下图:

小工具:管理各模块自定义配置项,升级版

小工具:管理各模块自定义配置项,升级版

2/6.使用说明

1.需要创建Z 模块 CONFIG的事务代码,事务代码对应的REPORT程序都是一个,即:ZCUSTOM_CONFIG(代码在最后),如下图:

小工具:管理各模块自定义配置项,升级版

2.需要按照下面的步骤,依次创建数据库表、视图、视图簇(SE54,不会的请百度)、程序。

3.最后的程序里,有一个管理增强有效性的配置项,这个是我这边项目上跟另外一个开发管理的工具关联在一起的,各位部署完程序后,可自行修改代码,屏蔽此配置项。

4.点击配置项的执行按钮时,支持跳转到SM30、SM34,以及无比灵活的某程序的某个FORM


3/6.数据字典

 

为实现上述效果,需要自己创建两张表,如下图

小工具:管理各模块自定义配置项,升级版

4/6.视图

 

创建两个视图

小工具:管理各模块自定义配置项,升级版

5/6.视图簇

创建视图簇如下:

小工具:管理各模块自定义配置项,升级版

代码

*&---------------------------------------------------------------------**& 程序名称:ZCUSTOM_CONFIG*& 程序描述:各模块通用配置程序*&===============================**&创建日期:2021.06.21             程序员:孙亮*&===============================**&修改日期    请求号   修改人   业务提交人    修改描述 **&---------------------------------------------------------------------*REPORT  zcustom_config.
CLASS lcl_tree_event_receiver DEFINITION. PUBLIC SECTION. METHODS: handle_tree_link_click FOR EVENT link_click OF cl_gui_column_tree IMPORTING node_key item_name.ENDCLASS.
TYPES:BEGIN OF ty_item, dir_no TYPE zcus_conf_dir-dir_no, dir_text TYPE zcus_conf_dir-dir_text, item_no TYPE zcus_conf_item-item_no, item_text TYPE zcus_conf_item-item_text, tabname TYPE zcus_conf_item-tabname, ztype TYPE zcus_conf_item-ztype, progname TYPE zcus_conf_item-progname, formname TYPE zcus_conf_item-formname, END OF ty_item.
CONSTANTS: gc_enh_conf TYPE string VALUE 'ENH_CONF', gc_cus_conf TYPE string VALUE 'CUS_CONF', gc_column_btn TYPE tv_itmname VALUE 'BUTTON', gc_column_item TYPE tv_itmname VALUE 'ITEM'.DATA: gv_module TYPE string, gt_item TYPE SORTED TABLE OF ty_item WITH UNIQUE KEY dir_no item_no, go_tree TYPE REF TO cl_gui_column_tree, go_docking_tree TYPE REF TO cl_gui_docking_container, go_event_tree TYPE REF TO lcl_tree_event_receiver, gt_exclude TYPE TABLE OF sy-ucomm, gt_sel_condition TYPE TABLE OF vimsellist WITH HEADER LINE.
CLASS lcl_tree_event_receiver IMPLEMENTATION. METHOD handle_tree_link_click. PERFORM handle_tree_link_click USING node_key item_name. ENDMETHOD.ENDCLASS.
SELECTION-SCREEN PUSHBUTTON 1(20) refresh USER-COMMAND refresh.
INITIALIZATION. refresh = '刷新'. DATA(lv_tcode) = sy-tcode 1. REPLACE FIRST OCCURRENCE OF 'CONFIG' IN lv_tcode WITH ''. IF lv_tcode = 'FI'. gv_module = 'FICO'. ELSE. gv_module = lv_tcode. ENDIF. sy-title = |{ gv_module }自定义配置|.
PERFORM get_data.
AT SELECTION-SCREEN OUTPUT. CLEAR gt_exclude. APPEND 'ONLI' TO gt_exclude. APPEND 'SPOS' TO gt_exclude. CALL FUNCTION 'RS_SET_SELSCREEN_STATUS' EXPORTING p_status = sy-pfkey p_program = sy-cprog TABLES p_exclude = gt_exclude.
PERFORM create_tree. PERFORM display_data.
AT SELECTION-SCREEN. IF sy-ucomm = 'REFRESH'. PERFORM get_data. PERFORM display_data. ENDIF.
FORM get_data. SELECT a~dir_no a~dir_text b~item_no b~item_text b~tabname b~ztype b~progname b~formname INTO TABLE gt_item FROM zcus_conf_dir AS a LEFT JOIN zcus_conf_item AS b ON b~zmodule = a~zmodule AND b~dir_no = a~dir_no WHERE a~zmodule = gv_module.ENDFORM.FORM create_tree. DATA: ls_header TYPE treev_hhdr, lt_events TYPE cntl_simple_events.
CHECK go_docking_tree IS INITIAL. CREATE OBJECT go_docking_tree EXPORTING ratio = 93 side = cl_gui_docking_container=>dock_at_bottom.
ls_header-heading = |{ gv_module }自定义配置项|. ls_header-width = 50.
"创建树 CREATE OBJECT go_tree EXPORTING parent = go_docking_tree node_selection_mode = cl_gui_column_tree=>node_sel_mode_single item_selection = abap_true hierarchy_column_name = gc_column_item hierarchy_header = ls_header.
"获取事件并添加事件 go_tree->get_registered_events( IMPORTING events = lt_events ). APPEND VALUE #( eventid = cl_gui_column_tree=>eventid_link_click appl_event = 'X' ) TO lt_events. go_tree->set_registered_events( events = lt_events ).
"创建事件处理类 CREATE OBJECT go_event_tree. SET HANDLER go_event_tree->handle_tree_link_click FOR go_tree.
"在树中增加一列按钮 go_tree->insert_hierarchy_column( name = gc_column_btn ).ENDFORM.FORM display_data. DATA: lt_nodes TYPE treev_ntab, lt_items TYPE STANDARD TABLE OF streeitm WITH DEFAULT KEY, lv_node_key TYPE tv_nodekey.
DEFINE macro_append_node. IF &2 IS INITIAL. APPEND VALUE #( node_key = &1 n_image = &3 isfolder = &4 ) TO lt_nodes. ELSE. APPEND VALUE #( node_key = &1 relatkey = &2 relatship = cl_gui_column_tree=>relat_last_child n_image = &3 isfolder = &4 ) TO lt_nodes. ENDIF. END-OF-DEFINITION.
DEFINE macro_append_btn. APPEND VALUE #( node_key = &1 item_name = gc_column_btn class = cl_gui_column_tree=>item_class_link t_image = icon_execute_object ) TO lt_items. END-OF-DEFINITION.
DEFINE macro_append_item. APPEND VALUE #( node_key = &1 item_name = gc_column_item text = &2 disabled = 'X' ) TO lt_items. END-OF-DEFINITION.
go_tree->delete_all_nodes( ).
"增加两个固定项 macro_append_node gc_enh_conf '' icon_space ''. macro_append_btn gc_enh_conf. macro_append_item gc_enh_conf '增强有效性配置'.
macro_append_node gc_cus_conf '' icon_space ''. macro_append_btn gc_cus_conf. macro_append_item gc_cus_conf '管理自定义配置项'.
LOOP AT gt_item ASSIGNING FIELD-SYMBOL(). AT NEW dir_no. macro_append_node -dir_no '' '' 'X'. macro_append_item -dir_no -dir_text. ENDAT.
IF -item_no IS NOT INITIAL OR -item_text IS NOT INITIAL. lv_node_key = |{ -dir_no }-{ -item_no }|. macro_append_node lv_node_key -dir_no icon_space ''. macro_append_btn lv_node_key. macro_append_item lv_node_key -item_text. ENDIF. ENDLOOP.
CALL METHOD go_tree->add_nodes_and_items EXPORTING node_table = lt_nodes item_table = lt_items item_table_structure_name = 'STREEITM' "MTREEITM' EXCEPTIONS OTHERS = 1. go_tree->expand_root_nodes( ).ENDFORM.FORM handle_tree_link_click USING p_node_key TYPE lvc_nkey p_item_name TYPE tv_itmname. CASE p_node_key. WHEN gc_enh_conf. SUBMIT zabap_enha_config WITH p_module = gv_module AND RETURN.
WHEN gc_cus_conf. REFRESH gt_sel_condition. APPEND VALUE #( viewfield = 'ZMODULE' operator = 'EQ' value = gv_module ) TO gt_sel_condition. PERFORM call_sm34 USING 'ZVCUS_CONF'.
PERFORM get_data. PERFORM display_data.
WHEN OTHERS. CHECK strlen( p_node_key ) > 3. SPLIT p_node_key AT '-' INTO DATA(lv_dir_no) DATA(lv_item_no). READ TABLE gt_item WITH KEY dir_no = lv_dir_no item_no = lv_item_no ASSIGNING FIELD-SYMBOL(). IF -ztype = 'SM30'. PERFORM call_sm30 USING -tabname. ELSEIF -ztype = 'SM34'. PERFORM call_sm34 USING -tabname. ELSE. PERFORM (-formname) IN PROGRAM (-progname) IF FOUND. ENDIF.
ENDCASE.ENDFORM.FORM call_sm30 USING p_tablename TYPE dd02v-tabname. DATA: l_action TYPE c VALUE 'U'.
IF gt_sel_condition[] IS INITIAL. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING action = l_action view_name = p_tablename. ELSE. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING action = l_action view_name = p_tablename TABLES dba_sellist = gt_sel_condition[]. REFRESH: gt_sel_condition. ENDIF.ENDFORM.FORM call_sm34 USING p_clustername TYPE vcldir-vclname. DATA: l_action TYPE c VALUE 'U'.
IF gt_sel_condition[] IS INITIAL. CALL FUNCTION 'VIEWCLUSTER_MAINTENANCE_CALL' EXPORTING maintenance_action = 'U' viewcluster_name = p_clustername. ELSE. CALL FUNCTION 'VIEWCLUSTER_MAINTENANCE_CALL' EXPORTING maintenance_action = 'U' viewcluster_name = p_clustername TABLES dba_sellist = gt_sel_condition[]. REFRESH: gt_sel_condition. ENDIF.ENDFORM.

笔者微信:286503700(QQ同号)

如果喜欢,谢谢转发。


推荐阅读:

动态批量修改任意表任意字段的值

动态获取查询条件的一个小Demo

使用cl_gui_docking_container 实现多ALV》

VOFM 修改 组单开票时 会计凭拆分规则

DEMO SUBMIT 某程序并获取该程序ALV数据

DEMO:S/4 1809 FAGLL03H 增加字段增强

几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了

DEMO:BTE增强实现凭证创建检查

SAP Parallel Accounting(平行分类账业务)配置 操作手册 BAPI demo程序

CC02修改确认日期BAPI:Processing of change number  was canceled

我是怎样调试BAPI的,以F-02为例

女儿的部分书单

推荐几本小说吧,反正过年闲着也是闲着,看看呗

我是不是被代码给耽误了……不幸沦为一名程序员……

三亚自由行攻略(自己穷游总结)

苏州游记

杂谈:说走就走的旅行没那么难

溜达:无锡

记码农十周年(20110214--20210214)

不一样的SAP干货铺群:帅哥靓妹、红包、烤羊腿!

十年老码农搬砖习惯和技巧

我这个老码农是怎么debug标准程序的

我是怎样调试BAPI的,以F-02为例

杂谈:几种接口

《干货来袭:2020年公众号内容汇总

Odata 增删改查详例

ODATA CREATE_DEEP_ENTITY 详例

RESTful DEMO 一:SAP 如何提供 RESTful Web 服务

RESTful DEMO 四 :增删改查及调用

DEMO  search help 增强 ( vl03n KO03 等)

录BDC时  弹出的公司代码框问题

动态获取查询条件的一个小Demo

动态批量修改任意表任意字段的值

 

WDA Demo

WDA  DEMO 0:开启服务 设置hosts
WDA  DEMO 02: 简单介绍
WDA  DEMO 03: 根据选择条件查询并显示
WDA  DEMO 04: select options 查询并显示
WDA  DEMO 05:两个table联动展示数据
WDA  DEMO 06: 创建事务代码
WDA  DEMO 07 页面跳转及全局变量的使用
WDA  DEMO 08 全局变量方式二
WDA  DEMO 09 ALV 简单展示
WDA  DEMO 1:简单查询并显示结果
WDA  DEMO 10 代码模块化整理
WDA  DEMO 11 根据BAPI/Function创建WDA
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python跑批过程中出现Impala异常"AnalysisException: 自定义函数未知",通常是由于在Impala查询中使用了一个在Impala中未定义或无法识别的自定义函数。 Impala是一个为了高速查询而设计的分布式SQL查询引擎。它拥有许多内置的函数供用户使用。然而,有时用户需要使用自定义函数来满足特定的需求。当我们尝试在Impala查询中调用自定义函数时,如果Impala无法找到这个函数的定义或者无法识别这个函数,就会抛出"AnalysisException: 自定义函数未知"异常。 解决这个问题的方法有以下几个步骤: 1. 确保已正确定义自定义函数:首先检查自定义函数的定义是否正确,包括函数名称、参数数目和类型等。如果自定义函数的定义有误,需要进行修正。 2. 检查函数是否已正确注册:在Impala中,我们需要通过注册函数来告诉Impala该函数的存在。通过在命令行或Impala客户端中执行REGISTER FUNCTION语句,将自定义函数注册到Impala中。如果函数未正确注册,Impala就无法识别该函数。 3. 确保Impala版本兼容性:有时候自定义函数可能是在较新版本的Impala中开发或测试的,而正在运行的Impala环境可能是较旧版本。在这种情况下,可能会出现Impala无法识别自定义函数的情况。因此,需要确保Impala的版本兼容性,或者考虑升级Impala以支持所需的自定义函数。 4. 检查函数的依赖:有时候自定义函数可能依赖于其他库或模块。在Impala中使用自定义函数之前,需要确保所依赖的库或模块已正确安装和配置,并能够在Impala环境中正常访问。 总结:当Python跑批过程中出现Impala异常"AnalysisException: 自定义函数未知"时,需要检查自定义函数的定义、注册情况、Impala版本兼容性以及函数的依赖,并进行相应的修正和配置,以解决该异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值