设中国护士网为首页 | 中国护士网专注于知识的分享,因为专注,所以更好!
分享到:

ABAP中宏的使用

来源:中国护士网  作者:www.512test.com

宏是一种单纯源代码复用技术,存在参数传递机制,宏比include形式更为简单,往往只是为了增强程序的可读性。宏可以在程序中定义,再进行调用使用,此宏只在本程序中可用。也可以将宏定义存贮在Macros库Trmac(se11中查看)中,这样可以在任何程序中直接调用。

Define macro_name.

End-of-definition.

必须在Define和End-of-definition之间指定完整的语句,这些语句最多包含9个占位符,即&1-&9。占位符的意义在于暂时不指定代码,调用的时候进行代码替换。

注:可以从宏中调用另一个宏,但宏不能调用自身

    宏的定义一定要出现在引用它的程序段之前

    一般Macro_name不超过20个字符

1.下面内容为在ALV Report中常用的关于CATALOG的写法

FORM INIT_FIELDCAT  CHANGING PT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.

  DATA : LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
          L_INDEX     LIKE SY-INDEX.

  CLEAR :L_INDEX, PT_FIELDCAT.

* Define a macro
  DEFINE CATALOG.
    L_INDEX  = L_INDEX + 1.
    CLEAR LS_FIELDCAT.
    LS_FIELDCAT-COL_POS          = L_INDEX.
    LS_FIELDCAT-TABNAME          = 'GT_LIST'.
    LS_FIELDCAT-DDICTXT          = 'M'.
    LS_FIELDCAT-FIELDNAME        = &1.
    LS_FIELDCAT-SELTEXT_M        = &2.

    LS_FIELDCAT-OUTPUTLEN        = &3.
    LS_FIELDCAT-KEY              = &4.
    LS_FIELDCAT-REF_TABNAME      = &5.
    LS_FIELDCAT-REF_FIELDNAME    = &6.
    LS_FIELDCAT-JUST             = &7.
    LS_FIELDCAT-QFIELDNAME       = &8.
    LS_FIELDCAT-CURRENCY         = &9.
    APPEND LS_FIELDCAT TO  PT_FIELDCAT.
  END-OF-DEFINITION.

* Use the macro
  CATALOG:
    'PERNR'    TEXT-001 '12' '' '' '' '' '' '',
    'ENAME'    TEXT-002 '10' '' '' '' '' '' '',
    'ZYEAR'    TEXT-003 '04' '' '' '' '' '' '',
    'BEGDA'    TEXT-004 '10' '' '' '' '' '' '',
    'ENDDA'    TEXT-005 '10' '' '' '' '' '' '',
    'PERIOD'   TEXT-006 '21' '' '' '' '' '' '',
    'ORGEH'    TEXT-007 '08' '' '' '' '' '' '',
    'ORGTX'    TEXT-008 '20' '' '' '' '' '' '',
    'RATING'   TEXT-010 '10' '' '' '' '' '' '',
    'RTEXT'    TEXT-009 '08' '' '' '' '' '' '',
    'ID'       TEXT-011 '08' '' '' '' '' '' '',
    'TSTEXT'   TEXT-012 '15' '' '' '' '' '' ''.

ENDFORM.   " INIT_FIELDCAT

 

2.下面内容为HR模块中常用的存贮在Macros库Trmac中的宏

RP-PROVIDE-FROM-FRST Pnnnn  SPACE  PN-BEGDA  PN-ENDDA.

PNP-SW-FOUND = '0'
LOOP AT &1
     IF &2 NE SPACE
         CHECK &1-SUBTY EQ &2
     ENDIF
     IF &1-BEGDA LE &4 AND &1-ENDDA GE&3
        PNP-SW-FOUND = '1'
        EXIT
     ENDIF
ENDLOOP

IF PNP-SW-FOUND EQ '0'
    CLEAR &1
ENDIF

RP-PROVIDE-FROM-FRST   Pnnnn  SPACE  PN-BEGDA  PN-ENDDA.
参数:&1(Pnnnn) &2(SPACE可为常量) &3(PN-BEGDA可为常量)  &4(PN-ENDDA可为常量)

功能:如果Pnnnn-BEGDA <= PN-ENDDA
          Pnnnn-ENDDA >= PN-BEGDA
      则PNP-SW-FOUND=1,Pnnnn会存入符合上面时间条件的内表中的第一行数据,否则Pnnnn将会被清空。