• 2020.01.11 【ABAP随笔】SM30常见增强操作-自动带描述等


    1.    自动带出描述类型(更新回数据库)

    我们使用的是在SM30中自动带出销售订单类型的描述

    首先我们创建一张表和一个维护视图(维护视图的好处就是可以方便增加字段),维护视图中维护标记为R标识字段不可输入

     

     

     

    然后需求就是根据填入的销售订单号,去TVAKT中抓取描述,给context字段

    我们根据维护视图创建表维护生成器:

    函数组名称为ZVJXZHU_FG_01

     

    接着进入到函数组ZVJXZHU_FG_01界面下:

    为了防止维护程序的时候出现空的VBELN,所有我们进入到9000屏幕布局页面将VBELN和POSNR设置为必输,双击vbeln列,将input设置为required。

     

    然后代码部分为在9000屏幕的代码下增加:双击创建

    PROCESS BEFORE OUTPUT.
     MODULE LISTE_INITIALISIEREN.
     LOOP AT EXTRACT WITH CONTROL
      TCTRL_ZVJXZHU_01 CURSOR NEXTLINE.
       MODULE LISTE_SHOW_LISTE.
     ENDLOOP.
     MODULE mod_set_sort.
    *
    PROCESS AFTER INPUT.
     MODULE LISTE_EXIT_COMMAND AT EXIT-COMMAND.
     MODULE LISTE_BEFORE_LOOP.
     LOOP AT EXTRACT.
       MODULE LISTE_INIT_WORKAREA.
       CHAIN.
        FIELD ZVJXZHU_01-VBELN .
        FIELD ZVJXZHU_01-PONSR .
        FIELD ZVJXZHU_01-CONTEXT .
        FIELD ZVJXZHU_01-ID .
        MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST.
       ENDCHAIN.
       FIELD VIM_MARKED MODULE LISTE_MARK_CHECKBOX.
       CHAIN.
        FIELD ZVJXZHU_01-VBELN .
        FIELD ZVJXZHU_01-PONSR .
        "add Customization requirements 
        MODULE customize_update.
        "add Customization requirements
        MODULE LISTE_UPDATE_LISTE.
       ENDCHAIN.
     ENDLOOP.
     MODULE LISTE_AFTER_LOOP.

    在include 程序中增加代码:(注意这个和下面通过事件写的自动流水号不同,这个自动带入描述时每次都会执行)

    LZVJXZHU_FG_01I01


    MODULE customize_update INPUT.
      CLEAR gv_auart.

      IF zvjxzhu_01-vbeln IS NOT INITIAL.
        SELECT SINGLE auart INTO gv_auart
         FROM vbak WHERE vbeln =  zvjxzhu_01-vbeln.
        IF sy-subrc EQ 0.
          SELECT SINGLE bezei INTO zvjxzhu_01-context
            FROM tvakt
            WHERE auart = gv_auart AND spras = sy-langu
            .
        ELSE."未找到订单
          zvjxzhu_01-context = '订单不存在'.
        ENDIF.
      ENDIF.

    ENDMODULE.

    我们看下SM30进去维护的效果就是:

     

    2.    自动带出描述(不更新数据库,仅显示)

    (1)   利用数据库自带的外键,用维护视图来带出所需要的字段

    我们这里就带出一下订单日期好了。

    首先必须在ZTJXZHU_01中给vbeln设置外键:VBAK-VBELN

     

     进入维护视图ZVJXZHU_01点关系:

     

      

    然后在视图字段上增加字段:

     

    我们重新生成一下表维护生成器(重新生成之后,9000屏幕上的代码会被刷新,所以需要重新加一下代码,要是代码比较多就最好体现备份一下)

     

    效果如下当你输入一个订单时,会自动带出其创建日期,同时因为设置了外键,当你输入VBELN不存在于VBAK时,不允许输入。

     

     

    (2)   直接修改屏幕-给屏幕加一列,然后自己在PBO中写代码获取所需的值。

    我们就以订单类型来举个例子:

    进入9000屏幕布局:分别把文本和输入框拖到指定位置(因为我的SAP有语言包确实问题所以暂时命名为1234,到元素清单中可以修改)

     

     

    在9000屏幕的PBO中增加代码:

     

    执行SM30效果如下图所示:

     

    3.    自动编号功能

    这个是昨天ABAP群里小伙伴的一个需求,每次增加条目时给条目一个流水号码,当前最大号码+1 (有删除先不管)

    我们通过表维护生成器事件来实现这个功能

    首先我们使用上面定义的ID来作为流水号码,进入视图的表维护生成器界面(点修改进入):

     

    点击事件:

     

    弹出消息,无需理会

     

    点击新条目,然后

     

    我们使用05维护事件,还有其他的维护事件可以使用,大家可以自己去尝试

     

    增加子例程FRM_AUTO_NUM,然后点击编辑器(下图红框),创建form

     

    只有才创建新条目才会调用

    FORM frm_auto_num.

      DATA lt_zvjxzhu TYPE TABLE OF zvjxzhu_01.

      MOVE-CORRESPONDING total[] TO lt_zvjxzhu.

      IF lt_zvjxzhu[] IS NOT INITIAL.
        SORT lt_zvjxzhu BY id DESCENDING.“取ID最大值
        READ TABLE lt_zvjxzhu INTO DATA(ls_zvjxzhu) INDEX 1.
        IF sy-subrc EQ 0.
          zvjxzhu_01-id = ls_zvjxzhu-id + 1.” ID最大值+1
        ENDIF.
      ELSE.
        zvjxzhu_01-id = 1.
      ENDIF.
    ENDFORM.

    这个事件就写好了,在创建新条目的时候,会自动给ID加上流水号码。

     

  • 相关阅读:
    Codeforces Gym100971 K.Palindromization-回文串 (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
    Codeforces Gym100971 G.Repair-思维题(切矩形板子) (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
    Codeforces Gym100971 F.Two Points (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
    Codeforces Gym101502 E.The Architect Omar-find()函数
    Codeforces Round #368 (Div. 2) A , B , C
    hdu 5663 Hillan and the girl 莫比乌斯反演
    bzoj 2301: [HAOI2011]Problem b 莫比乌斯反演
    bzoj 1101 zap 莫比乌斯
    51nod 1289 大鱼吃小鱼 栈
    LightOJ 1245 数学
  • 原文地址:https://www.cnblogs.com/jxzhu/p/12178811.html
Copyright © 2020-2023  润新知