用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 ( ) .
第四种方法