我们在ABAP程序中需要获取其他程序的运行结果时,一般是通过SUBMIT加EXPORT、IMPORT来实现的,这种方式需要修改目标程序、不太方便。
本文介绍的方法无需修改目标程序,只要目标程序运行后是显示ALV报表的,即可动态获得目标程序ALV的数据内表。
例如,在自开发的Report中需要调用MB51、FBL1N都可以采用这种方式,直接调用并抓取结果即可,无需修改MB51、FBL1N本身。采用这种方式可以充分利用标准报表获取预期结果,例如动态计算库存、计算供应商余额、获得利润表行次值等,不用自己去写复杂的逻辑。
本例以调用FBL1N为例子,演示A程序调用B程序并获得其ALV数据内表的操作。
如下图为FBL5N的选择界面:
如下为测试程序的输入条件:
附测试代码,利用选择界面输入的条件调用FBL5N并取得结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
REPORT ZFITEST003. TABLES: LFA1, LFB1, BSEG. TYPES: BEGIN OF TYP_OUT, BELNR TYPE BSEG-BELNR, GJAHR TYPE BSEG-GJAHR, BUKRS TYPE BSEG-BUKRS, PSWBT TYPE BSEG-PSWBT, PSWSL TYPE BSEG-PSWSL, SGTXT TYPE BSEG-SGTXT, ZUONR TYPE BSEG-ZUONR, END OF TYP_OUT. DATA: LR_ALV TYPE REF TO DATA, LT_OUT TYPE TABLE OF TYP_OUT, LS_OUT TYPE TYP_OUT. FIELD-SYMBOLS : <LT_ALV> TYPE ANY TABLE, <LS_ALV> TYPE ANY. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-T01. SELECT-OPTIONS: S_LIFNR FOR LFA1-LIFNR, S_BUKRS FOR LFB1-BUKRS OBLIGATORY DEFAULT '1000', S_ZFBDT FOR BSEG-ZFBDT. SELECTION-SCREEN END OF BLOCK B1. SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-T02. PARAMETERS: P_P1 RADIOBUTTON GROUP RBG1 MODIF ID BL4, P_P2 RADIOBUTTON GROUP RBG1 MODIF ID BL4, P_P3 RADIOBUTTON GROUP RBG1 MODIF ID BL4. SELECTION-SCREEN END OF BLOCK B2. START-OF-SELECTION. PERFORM FM_REQUEST_ALV. FORM FM_REQUEST_ALV. *set runtime agrs[]. CALL METHOD CL_SALV_BS_RUNTIME_INFO=>SET EXPORTING DISPLAY = ABAP_FALSE METADATA = ABAP_FALSE DATA = ABAP_TRUE. CLEAR LR_ALV. UNASSIGN <LT_ALV>. *SUBMIT FBL1N. CASE 'X'. WHEN P_P1. SUBMIT RFITEMAP WITH KD_LIFNR IN S_LIFNR WITH KD_BUKRS IN S_BUKRS WITH X_OPSEL = 'X' AND RETURN. WHEN P_P2. SUBMIT RFITEMAP WITH KD_LIFNR IN S_LIFNR WITH KD_BUKRS IN S_BUKRS WITH X_CLSEL = 'X' AND RETURN. WHEN P_P3. SUBMIT RFITEMAP WITH KD_LIFNR IN S_LIFNR WITH KD_BUKRS IN S_BUKRS WITH X_AISEL = 'X' AND RETURN. WHEN OTHERS. ENDCASE. *fetch alv data. TRY. CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = LR_ALV ). ASSIGN LR_ALV->* TO <LT_ALV>. CATCH CX_SALV_BS_SC_RUNTIME_INFO. MESSAGE '获取ALV数据出错!' TYPE 'E'. ENDTRY. CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ). *convert internal table to your internal table. IF <LT_ALV> IS ASSIGNED. UNASSIGN <LS_ALV>. "将内表数据中有需要的字段append到对应内表中. LOOP AT <LT_ALV> ASSIGNING <LS_ALV>. "do something. CLEAR LS_OUT. MOVE-CORRESPONDING <LS_ALV> TO LS_OUT. APPEND LS_OUT TO LT_OUT. ENDLOOP. ENDIF. BREAK-POINT. ENDFORM. |
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/9253.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。