今天做了一个程序,业务顾问要求取客户未清账来做数据出处理生成报表,业务顾问想的也很简就是给个日期,取未清数据,我也没仔细考虑,直接就取了BSID里的未清来处理,结果测试不全,传到生产机才发现,
业务顾问要求的是给定日期,查此日期前的未清,这一小改变,影响就大了,取BSID明显是达不到要求的了,一开始想自己写程序逻辑取数,当业务顾问提到查出来的凭证要一标准事务码FBL5N的结果一样。
所以就想直接调用FBL5N的程序:RFITEMAR ,然后得到其中的ALV内表的数据,然后再来处理,这样结果就与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 |
*&---------------------------------------------------------------------* *& Report ZTEST20 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZTEST20. RANGES: II_BUKRS FOR BKPF-BUKRS. *DATA: GTD_MX TYPE STANDARD TABLE OF alv_t_t2 WITH HEADER LINE. "内表定义要与程序中的内表结构一致,便于存储和输出 DATA: BEGIN OF GTD_MX OCCURS 0, BUKRS TYPE BKPF-BUKRS, BELNR TYPE BKPF-BELNR, GJAHR TYPE BKPF-GJAHR. DATA : END OF GTD_MX. DATA: LS_DATA TYPE REF TO DATA. FIELD-SYMBOLS: <LT_DATA> TYPE TABLE, <L_DATA> TYPE DATA. CL_SALV_BS_RUNTIME_INFO=>SET( DISPLAY = '' METADATA = '' DATA = 'X' ). II_BUKRS-SIGN = 'I'. II_BUKRS-OPTION = 'EQ'. II_BUKRS-LOW = '1000'. APPEND II_BUKRS. SUBMIT RFITEMAR "使用rep静态地指定一个程序,或者使用name动态地指定 * USING SELECTION-SCREEN '1000' "指定要访问的选择屏幕dynnr,如不使用该条目,系统调用标准选择屏幕。 * VIA SELECTION-SCREEN "显示被调用的选择屏幕。如不使用该条目,选择屏幕过程(selection screen processing)将会在后台发生。 * USING SELECTION-SET '变式' "选择屏幕使用变式 * USING SELECTION-SETS OF PROGRAM '程序名' "指定使用的变式的程序 * WITH SELECTION-TABLE rspar "选择屏幕使用内表rspar中的值,内表的行结构为RSPARAMS或者RSPARAMSL_255 WITH X_OPSEL EQ 'X' "选择屏幕参数 WITH X_CLSEL EQ '' "选择屏幕参数 WITH X_AISEL EQ '' "选择屏幕参数 WITH X_NORM EQ 'X' "选择屏幕参数 WITH PA_STIDA EQ '20200427' "选择屏幕参数 WITH DD_BUKRS IN II_BUKRS "选择屏幕参数 * WITH FREE SELECTIONS texpr "通过一个内表texpr向选择屏幕提供基于逻辑数据库的动态选择,内表texpr的类型是RSDS类型组中的RSDS_TEXPR * LINE-SIZE width "使用width设置程序访问的Basic List的行宽 * LINE-COUNT page_lines "使用设置程序访问的Basic List的页包含的行数 * EXPORTING LIST TO MEMORY "将程序访问的Basic List以行类型为ABAPLIST的内表形式保存到ABAP Memory中 AND RETURN. TRY. CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = LS_DATA ). ASSIGN LS_DATA->* TO <LT_DATA>. CATCH CX_SALV_BS_SC_RUNTIME_INFO. MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'. ENDTRY. CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ). LOOP AT <LT_DATA> ASSIGNING <L_DATA>. MOVE-CORRESPONDING <L_DATA> TO GTD_MX. APPEND GTD_MX. ENDLOOP. |
这例子,从自己的程序,调用了另外的程序,子程序RFITEMAR,并传递调用参数,执行完成后,不显示ALV,直接返回结果,
得到结果后,我们就可以自由的处理数据了。