一些ABAP编程的知识点整理

【设置 SAP 打印机SET_PRINT_PARAMETERS】
根据画面输入的打印机名称,在打印窗口弹出后,把打印设备自动设置为打印机名称参数对应的打印设备

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PRINT_PARAMETERS
*&---------------------------------------------------------------------*
*      報嶞偺僷儔儊乕僞偺愝掕
*----------------------------------------------------------------------*
FORM. FRM_SET_PRINT_PARAMETERS.
  DATA: LC_PDEST    TYPE PRI_PARAMS-PDEST,
        LSTR_TSP03L TYPE TSP03L.

* 在TSP03L设备表中找到打印机名称画面参数P_PRTID对应的打印设备PADEST
*  SELECT SINGLE *
*    INTO LSTR_TSP03L
*    FROM TSP03L
*  WHERE LNAME = P_PRTID.
*  IF SY-SUBRC EQ 0.
*    LC_PDEST = LSTR_TSP03L-PADEST.
*  ENDIF.

* 把取道的打印设备PADEST设置到打印窗口项目中
  CALL FUNCTION 'SET_PRINT_PARAMETERS'
    EXPORTING
      DESTINATION                = LC_PDEST
      IMMEDIATELY                = CNS_X
            .
ENDFORM.                    "FRM_SET_PRINT_PARAMETERS

【把内表以CSV文件格式输出】
* 通过文件保存对话框得到需要保存文件的全路径LC_FULLPATH
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
*    EXPORTING
    CHANGING
      FILENAME            = LC_FILENAME
      PATH                = LC_PATH
      FULLPATH            = LC_FULLPATH
    EXCEPTIONS
      CNTL_ERROR          = 1
      ERROR_NO_GUI        = 2
      NOT_SUPPORTED_BY_GUI = 3
      others              = 4
          .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  IF LC_FILENAME IS NOT INITIAL.
*  这个function是关键所在,可以把一个内表的一行的所有字段用‘;’分割,然后整合成一个string放到目标内表中LITAB_CON_LIST3
    CALL FUNCTION 'SAP_CONVERT_TO_CSV_FORMAT'
      EXPORTING
        I_FIELD_SEPERATOR          = CNS_COMMA
      TABLES
        I_TAB_SAP_DATA            = GITAB_LIST3
      CHANGING
        I_TAB_CONVERTED_DATA      = LITAB_CON_LIST3
      EXCEPTIONS
        CONVERSION_FAILED          = 1
        OTHERS                    = 2
              .
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

*  可在此目标内表的头部加上必要的header
    CONCATENATE TEXT-009          "姩掕壢栚
                TEXT-010          "姩掕壢栚柤
                TEXT-011          "婡擻椞堟柤
                TEXT-012          "慜寧孞墇
                TEXT-013          "庁曽嬥妟
                TEXT-014          "戄曽嬥妟
                TEXT-015          "梻寧孞墇
          INTO LC_HEADER
      SEPARATED BY CNS_COMMA.
    INSERT LC_HEADER INTO LITAB_CON_LIST3 INDEX 1.

*  拿到全路径之后,直接download就ok
    CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
        FILENAME                        = LC_FULLPATH
      TABLES
        DATA_TAB                        = LITAB_CON_LIST3
              .
  ENDIF.
ENDFORM.                    " FRM_FILE_DOWNLOAD

【如何动态指派数字字段名assign】
比如有12个字段,HSL01,HSL02,HSL03,HSL04,HSL05一直到HSL12
如果我在选择画面上指定要累加04~08之间的字段,那assign就可以派上用场了
由于和指针的作用类同,所以下面就叫它指针

1.定义指针
  FIELD-SYMBOLS <FS> TYPE FAGLFLEXT-HSL01.
2.使用方法:定义另一个lc_p指针数据,通过do循环的sy-index进行一条条遍历
这里比较重要的是要严格控制好选择画面上low值和high值对lc_p指针的界限
    DO.
      IF S_MONAT-HIGH IS NOT INITIAL.
        LC_P = S_MONAT-LOW + SY-INDEX - 1.
        IF LC_P > S_MONAT-HIGH.
          EXIT.
        ENDIF.
      ELSE.
        LC_P = S_MONAT-LOW.
        IF SY-INDEX = 2.
          EXIT.
        ENDIF.
      ENDIF.
      WRITE LC_P TO LC_NUM.
      PERFORM. FRM_CONVERT_ALPHA_INPUT CHANGING LC_NUM.
      CONCATENATE LC_NAME LC_NUM INTO LC_FIELD.
      ASSIGN (LC_FIELD) TO <FS>.
      IF LSTR_DATA3-DRCRK = CNS_S.
        LC_SSUM = LC_SSUM + <FS>.
      ENDIF.
      IF LSTR_DATA3-DRCRK = CNS_H.
        <FS> = <FS> * ( -1 ) .
        LC_HSUM = LC_HSUM + <FS>.
      ENDIF.
      CLEAR LC_FIELD.
    ENDDO.

【range table 的最新定义方法】
跟旧版本的ECC的range定义方法不同,现在改用如下的定义方法:

  R_RACCT2    TYPE RANGE OF CHAR2,
  R_RACCT3    TYPE RANGE OF CHAR3,
  R_RACCT31    TYPE RANGE OF CHAR3,
  LSTR_RACCT2  LIKE LINE OF R_RACCT2,
  LSTR_RACCT3  LIKE LINE OF R_RACCT3,
  LSTR_RACCT31 LIKE LINE OF R_RACCT31.

* 儗儞僕42乣49
  LSTR_RACCT2-SIGN = CNS_I.
  LSTR_RACCT2-OPTION = CNS_BT.
  LSTR_RACCT2-LOW = CNS_42.
  LSTR_RACCT2-HIGH = CNS_49.
  APPEND LSTR_RACCT2 TO R_RACCT2.
* 儗儞僕000乣512
  LSTR_RACCT3-SIGN = CNS_I.
  LSTR_RACCT3-OPTION = CNS_BT.
  LSTR_RACCT3-LOW = CNS_000.
  LSTR_RACCT3-HIGH = CNS_512.
  APPEND LSTR_RACCT3 TO R_RACCT3.
* 儗儞僕522乣999
  LSTR_RACCT31-SIGN = CNS_I.
  LSTR_RACCT31-OPTION = CNS_BT.
  LSTR_RACCT31-LOW = CNS_522.
  LSTR_RACCT31-HIGH = CNS_999.
  APPEND LSTR_RACCT31 TO R_RACCT31.

【如何在标准一览画面上加上自己的系统按钮】
可以在top-of-page或者start-of-selection事件中定义:
SET PF-STATUS 'ZS01'.
这里的'ZS01'是自己定义的,双击它进去后就别有洞天了,可以自己定义系统按钮已经各种快捷键

如果要选择标准的一览出力画面,首先进入菜单:
補足->テンプレート调整
在弹出的窗口中选择“一览ステータス”
基本的关于一览的系统按钮都有了

然后自己添加需要的按钮,在GUI模块中,找一个空白的输入框中输入该按钮的parameter ID,这个ID是在程序中用到的。比如这里定义为“DOWN”。
单击回车后有各种关于该按钮 信息的输入框,填充完成就可以了
注意一定要选择一个快捷键,不然添加还是失败的。。

最终添加好后记得激活。

在程序中的使用:
在AT USER-COMMAND.事件中:catch发生的系统信息,如果catch到“DOWN”消息,也就是说刚刚定义的按钮被点击了。
  CASE SY-UCOMM.
    WHEN 'DOWN'.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          TITLEBAR                    = '幚峴妋擣'
          TEXT_QUESTION              = '堦棗撪梕傪僟僂儞儘乕僪偟傑偡丅傛傠偟偄偱偡偐丠'
          TEXT_BUTTON_1              = '偼丂偄'
          TEXT_BUTTON_2              = '偄 偄 偊'
          DEFAULT_BUTTON              = '1'
          DISPLAY_CANCEL_BUTTON      = ' '
        IMPORTING
          ANSWER                      = GC_ANSWER
                .
      IF GC_ANSWER = '1'.
* 乽偼丂偄乿偑墴壓偝傟偨応崌
        PERFORM. FRM_FILE_DOWNLOAD.
      ELSE.
* 乽偄偄偊乿偑墴壓偝傟偨応崌
        MESSAGE S010.
      ENDIF.
  ENDCASE.

【如何实现选择第一个radio输入框为灰色非激活,选择第二个radio时该输入框激活】
在定义选择画面时,有2个重要点需要注意:
设定USER-COMMAND 和 MODIF ID
USER-COMMAND表示的意思是:哪个button改变时需要发出事件信息
MODIF ID表示:哪个画面元素需要修改
*----------------------------------------------------------------------*
*SELECTION SCREEN
*----------------------------------------------------------------------*
PARAMETERS:
  P_1 TYPE C RADIOBUTTON GROUP DATE
                        DEFAULT 'X'
                        USER-COMMAND FLAG,    “重要*
  P_2 TYPE C RADIOBUTTON GROUP DATE.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 6(10) TEXT-001.
  PARAMETERS GP_IPDAT TYPE SY-DATUM MODIF ID BL1.  “重要*
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP 2.

SELECTION-SCREEN: BEGIN OF LINE,
                  COMMENT 8(60) TEXT-005,          "乽捠忢峏怴乿
                  END OF LINE,
                  BEGIN OF LINE,
                  COMMENT 8(60) TEXT-006,          "乽巜掕擔峏怴乿
                  END OF LINE.

在AT SELECTION-SCREEN中循环SCREEN系统变量,把需要修改的画面元素的属性进行相应的修改
*----------------------------------------------------------------------*
*AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF P_1 = CNS_X AND SCREEN-GROUP1 = CNS_BL1.
      SCREEN-INPUT = '0'.
      CLEAR GP_IPDAT.
    ENDIF.
    IF P_2 = CNS_X AND SCREEN-GROUP1 = CNS_BL1.
      SCREEN-INPUT = '1'.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

这里把输入框变成灰色,修改的属性是INPUT,设为0不可输入,设为1则可修改。
其他属性可以在se11的data type中输入screen研究。

【实现ALV的双击事件执行其他任务】
调用function “REUSE_ALV_GRID_DISPLAY”显示ALV,设置I_CALLBACK_USER_COMMAND为'USER_COMMAND',这里的'USER_COMMAND'需要另外定义一个form来接受双击事件。

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    I_CALLBACK_PROGRAM                = SY-REPID
  I_CALLBACK_USER_COMMAND          = 'USER_COMMAND'      * 重要
  I_BACKGROUND_ID                  = 'SIWB_WALLPAPER'
    IS_LAYOUT                        = L_WA_LAYOUT
    IT_FIELDCAT                      = ITAB_FIELDCAT
  I_DEFAULT                        = 'X'
  I_SAVE                            = 'A'
  IT_EVENTS                        = I_EVENTS
  IT_EVENT_EXIT                    = I_EVENT_EXIT
  TABLES
    T_OUTTAB                          = ITAB_BSIK
EXCEPTIONS
  PROGRAM_ERROR                    = 1
  OTHERS                            = 2
            .
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDFORM.                    " FRM_ALV_REPORT

*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*

FORM. USER_COMMAND USING UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
  IF UCOMM = '&IC1'.                              * 双击事件的ASCII码是'&IC1'
    READ TABLE ITAB_BSIK INTO STR_BSIK INDEX SELFIELD-TABINDEX. *重要。。
*双击的当前行为SELFIELD-TABINDEX
*可以通过判断SELFIELD-TABINDEX不为空来决定下面的步骤是否进行。
*    CHECK SY-SUBRC = 0.

*    MESSAGE STR_BSIK-BUDAT TYPE 'I'.

    SET PARAMETER ID: 'BLN' FIELD STR_BSIK-BELNR,
                      'BUK' FIELD P_BUKRS,
                      'GJR' FIELD STR_BSIK-BUDAT.
    CALL TRANSACTION 'FB03'.
  ENDIF.
ENDFORM.                    "USER_COMMAND
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值