SAP ABAP 实现九九乘法表

用ABAP输出99乘法表


目标:输出下图所示的99乘法口诀表

考察点:循环套循环


外部循环9次,每循环1次,行数A就增加1,并且清空变量B;


内部循环行数A次,每循环1次,变量B就增加1,再让A、B相乘,乘积赋值给变量C,然后输出表达式; 

注意点:


1.为了让单个算式内部不要出现空格,看起来美观,应该 用CONCATENATE连接 或者 加关键字NO-GAP 。

2.定义乘积变量C的时候,用CHAR2类型,而不用NUMC2类型,因为用CHAR2类型时,如果实际结果只有1位,不会显示前导零。用NUMC2时,就会出现如下图所示情况:

 现在有以下几种方法实现

第一种方法:

DATA: a TYPE I VALUE 1,
      b TYPE I ,
      c TYPE I,
      ca TYPE c,
      cb TYPE c,
      cc(2) TYPE c,
      out TYPE STRING.
 
WHILE a < 10.
  b = 1.
  WHILE b <= a.
    c = a * b.
    ca = a.
    cb = b.
    cc = c.
    CONCATENATE cb '*' ca '=' cc INTO out.
    WRITE out.
    b = b + 1.
  ENDWHILE.
a = a + 1.
WRITE /.
ENDWHILE.

第二种方法:

DATA:gf_i TYPE n VALUE 1,
     gf_j TYPE n VALUE 1,
     gf_k(2) TYPE N.
DO 9 TIMES.
  gf_j = 1.
  DO gf_i TIMES.
    gf_k = gf_i * gf_j.
    WRITE:gf_j NO-GAP,'*' NO-GAP,gf_i NO-GAP,'=' NO-GAP,gf_k.
    IF gf_i = gf_j.
      WRITE: /.
      EXIT.
    ELSE.
      gf_j = gf_j + 1.
    ENDIF.
  ENDDO.
  gf_i = gf_i + 1.
ENDDO.

第三种方法

TYPE-POOLS :SLIS .

DATA :I_FIELDCAT_ALV  TYPE SLIS_T_FIELDCAT_ALV ,  "定义列标题(属性信息)
     I_LAYOUT        TYPE SLIS_LAYOUT_ALV ,
     I_FIELDCAT      TYPE SLIS_FIELDCAT_ALV ,  "定义对象
     W_REPID         LIKE SY -REPID .  "当前程序
I_LAYOUT -ZEBRA  =  'X' .  "ALV表格按斑马线条纹显示
I_LAYOUT -COLWIDTH_OPTIMIZE  =  'X' .  "将ALV字段宽度设置为最优化
DATA : I_GRID_SETTINGS  TYPE LVC_S_GLAY . "修改状态
I_GRID_SETTINGS -EDT_CLL_CB  =  'X' .
W_REPID  = SY -REPID .

DATA : COLUMN ( 7 )  TYPE  C .
*DATA it LIKE TABLE OF column.

DATA :  BEGIN  OF WA ,
        CO1  LIKE COLUMN ,
        CO2  LIKE COLUMN ,
        CO3  LIKE COLUMN ,
        CO4  LIKE COLUMN ,
        CO5  LIKE COLUMN ,
        CO6  LIKE COLUMN ,
        CO7  LIKE COLUMN ,
        CO8  LIKE COLUMN ,
        CO9  LIKE COLUMN ,
       END  OF WA .
DATA ITAB  LIKE  TABLE  OF WA .

*变量定义

DATA : GR_TABLE  TYPE  REF  TO CL_SALV_TABLE .
DATA : WA_LAYOUT    TYPE LVC_S_LAYO .

FORM FRM_DISPLAY_DATA  .
   PERFORM FRM_FILL_FIELD .
ENDFORM .

DATA : FIELDCAT  TYPE LVC_T_FCAT  WITH  HEADER  LINE .

DEFINE FILL_FIELD .
   CLEAR fieldcat .
  fieldcat -fieldname      = &1 .
  fieldcat -col_pos        = &2 .
   APPEND fieldcat .
END-OF-DEFINITION .

SELECTION-SCREEN  BEGIN  OF  BLOCK BLK  WITH  FRAME .
PARAMETERS : P_FULL  RADIOBUTTON  GROUP RG ,
            P_LIST  RADIOBUTTON  GROUP RG .
SELECTION-SCREEN  END  OF  BLOCK BLK .

*----------------------------------------------------------------------*
*       CLASS lcl_alv DEFINITION
*----------------------------------------------------------------------*
*       ALV操作类(定义)
*----------------------------------------------------------------------*
CLASS LCL_ALV  DEFINITION .
   PUBLIC  SECTION .
     METHODS : GETDATA          "取得要显示的数据
      RETURNING  VALUE (LT_TAB )  LIKE ITAB ,
      ALV_FULL         "全屏Grid列表处理方法
         IMPORTING  VALUE (LT_TAB )  LIKE ITAB ,
      ALV_LIST         "普通List处理方法
         IMPORTING  VALUE (LT_TAB )  LIKE ITAB ,
      MAIN .            "主方法
ENDCLASS .                     "lcl_alv DEFINITION


*----------------------------------------------------------------------*
*       CLASS lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
*       ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS LCL_ALV  IMPLEMENTATION .
*取得要显示的数据
   METHOD GETDATA .
     DO  9  TIMES .
       DATA I1  TYPE  I .
      I1  = SY - INDEX .

       DO I1  TIMES .
         DATA RESULT ( 2 )  TYPE  C .
         DATA : C1  TYPE  C ,
              C2  TYPE  C .
        RESULT  = I1 * SY - INDEX .
        C1  = I1 .
        C2  = SY - INDEX .
         CONCATENATE C1  '*' C2  '=' RESULT  INTO COLUMN .
         CONCATENATE WA COLUMN  INTO WA  SEPARATED  BY  ' ' .

       ENDDO .
       APPEND WA  TO LT_TAB .
       CLEAR WA .
     ENDDO .

   ENDMETHOD .                     "getdata

*输出全屏网格列表的方法
   METHOD ALV_FULL .
     "创建实例
     TRY .
        CL_SALV_TABLE =>FACTORY (
         IMPORTING
          R_SALV_TABLE  = GR_TABLE
         CHANGING
          T_TABLE       = LT_TAB
           ) .
       CATCH CX_SALV_MSG .
     ENDTRY .

     "显示列表
    GR_TABLE ->DISPLAY (  ) .
   ENDMETHOD .                     "alv_full

*输出全屏普通列表的方法
   METHOD ALV_LIST .
     "创建实例
     TRY .
        CL_SALV_TABLE =>FACTORY (
         EXPORTING
          LIST_DISPLAY  =  'X'
         IMPORTING
          R_SALV_TABLE  = GR_TABLE
         CHANGING
          T_TABLE       = LT_TAB
           ) .
       CATCH CX_SALV_MSG .
     ENDTRY .

     "显示列表
    GR_TABLE ->DISPLAY (  ) .
   ENDMETHOD .                     "alv_list

*主方法,整合数据
   METHOD MAIN .
     DATA : LT_TAB  LIKE ITAB .

     "取得要显示的数据
    LT_TAB  = ME ->GETDATA (  ) .

     "判断选择屏幕的选择条件调用不同的方法
     CASE  'X' .
       WHEN P_FULL .
        ME ->ALV_FULL ( LT_TAB  ) .
       WHEN P_LIST .
        ME ->ALV_LIST ( LT_TAB  ) .
     ENDCASE .
   ENDMETHOD .                     "main
ENDCLASS .                     "lcl_alv IMPLEMENTATION
FORM FRM_LAYOUT  .
   CLEAR : WA_LAYOUT . "它用来定义ALV报表的整体属性
* WA_LAYOUT-ZEBRA         = 'X' ."ZBbra
*  WA_LAYOUT-DETAILINIT         = 'X' . "initial values on detail screen
  WA_LAYOUT -CWIDTH_OPT     =  'X' . "优化列宽选项是否设置
*  WA_LAYOUT-DETAILTITL      = 'Detail Information' ."设置弹出窗口的标题栏
  WA_LAYOUT -BOX_FNAME  =  'SEL' .
*  WA_LAYOUT-INFO_FNAME = 'ROWCOLOR'.

ENDFORM .
FORM FRM_FILL_FIELD .

   CLEAR FIELDCAT .
  FIELDCAT -FIELDNAME  =  'BELNR' .
  FIELDCAT -COL_POS    =  '9' .
   APPEND FIELDCAT .

  FILL_FIELD  '1'  '9' .
  FILL_FIELD  '2'  '9' .
  FILL_FIELD  '3'  '9' .
  FILL_FIELD  '4'  '9' .
  FILL_FIELD  '5'  '9' .
  FILL_FIELD  '6'  '9' .
  FILL_FIELD  '7'  '9' .
  FILL_FIELD  '8'  '9' .
  FILL_FIELD  '9'  '9' .

ENDFORM .                     " FRM_FILL_FIELD
*报表执行
START-OF-SELECTION .
   DATA  LR_ALV    TYPE  REF  TO LCL_ALV .
   CREATE OBJECT LR_ALV .
  LR_ALV ->MAIN (  ) .

第四种方法

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值