在做一些报表时,业务顾问直接的需求就是结果要与**标准报表的结果相同,这时候,如我们要完全读懂标准程序取数逻辑,那太难了,所以就会需要直接调用标准程序,然后从程序中获取标准程序中得到的数据集来使用。
1.方法一
以下是程序是项目是需要自定义报表的取数据逻辑与标准事务码FBL5N相同,并取出FBL5N中ALV结果的一段代码。
|
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 |
FORM PRM_GET_FBL5N . * SELECT * * INTO CORRESPONDING FIELDS OF TABLE GT_ALV * FROM BSID * WHERE BUKRS = P_BUKRS * AND GJAHR = P_GJAHR *" AND KUNNR IN S_KUNNR * AND UMSKS = '' * AND BUDAT <= G_BUDAT * . RANGES: II_BUKRS FOR BKPF-BUKRS, II_KUNNR FOR KNA1-KUNNR. DATA: LS_DATA TYPE REF TO DATA. FIELD-SYMBOLS: <LT_DATA> TYPE TABLE, <L_DATA> TYPE DATA, <FS>. CL_SALV_BS_RUNTIME_INFO=>SET( DISPLAY = '' METADATA = '' DATA = 'X' ). II_BUKRS-SIGN = 'I'. II_BUKRS-OPTION = 'EQ'. II_BUKRS-LOW = P_BUKRS. APPEND II_BUKRS. SUBMIT RFITEMAR "FBL5N WITH X_OPSEL EQ 'X' "未清项目 WITH X_CLSEL EQ '' "已清项目 WITH X_AISEL EQ '' "全部项目 WITH X_NORM EQ 'X' "普通项目 WITH X_SHBV EQ '' "特别总账业务 WITH X_MERK EQ '' "注释项目 WITH X_PARK EQ '' "预制项目 WITH X_APAR EQ '' "供应商项目 WITH PA_STIDA EQ G_BUDAT "未清关键日期 WITH DD_BUKRS IN II_BUKRS "公司 WITH DD_KUNNR IN II_KUNNR 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'. LEAVE LIST-PROCESSING. ENDTRY. CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ). * L_INES = LINES( <LT_DATA> ). IF <LT_DATA> IS ASSIGNED. LOOP AT <LT_DATA> ASSIGNING <L_DATA>. MOVE-CORRESPONDING <L_DATA> TO GS_ALV. ASSIGN COMPONENT 'KONTO' OF STRUCTURE <L_DATA> TO <FS>. IF SY-SUBRC = 0. GS_ALV-KUNNR = <FS>."取客户编码 ENDIF. ASSIGN COMPONENT 'DMSHB' OF STRUCTURE <L_DATA> TO <FS>. IF SY-SUBRC = 0. GS_ALV-DMBTR = <FS>."本位币金额 ENDIF. APPEND GS_ALV TO GT_ALV. ENDLOOP. ENDIF. ENDFORM. " PRM_GET_FBL5N |
2.方法二
此方法是在被调用程序中存在ALV显示 时,取ALV的内存内容
|
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
*&********************************************************************* *& PROGRAM NAME : ZTEST23 *& Module Name : *& Apply Author : *& Author : *& Started on : 2020-07-01 *& Transaction : ZTEST23 *& Program type : Report *& Program ID : ZTEST23 *& Program Description : 功能描述。。。。。。 *&*&******************************************************************* *& REVISION LOG * *& * *& LOG# DATE AUTHOR DESCRIPTION * *& ---- ---- ------ ----------- * *& 0001 2020-07-01 XXX Initial Creation *&********************************************************************* REPORT ZTEST23. TABLES: ZTRT0013. SELECT-OPTIONS:S_BUKRS FOR ZTRT0013-BUKRS OBLIGATORY, S_DATUM FOR SY-DATUM NO-EXTENSION NO INTERVALS. DATA: LT_OUT_100 TYPE TABLE OF ZTR_S_2007_Q, LS_OUT_100 TYPE ZTR_S_2007_Q. DATA LT_TAB TYPE TABLE OF ABAPLIST."ALV返回内存 TYPES: BEGIN OF TY_TAB_DATA, LINE(4000), END OF TY_TAB_DATA. DATA: LT_TAB_DATA TYPE TABLE OF TY_TAB_DATA, LS_TAB_DATA TYPE TY_TAB_DATA. SUBMIT ZTRE02007 EXPORTING LIST TO MEMORY WITH S_BUKRS IN S_BUKRS WITH S_ENDDA IN S_DATUM AND RETURN. CALL FUNCTION 'LIST_FROM_MEMORY' TABLES LISTOBJECT = LT_TAB EXCEPTIONS NOT_FOUND = 1 OTHERS = 2. CALL FUNCTION 'LIST_TO_ASCI' " EXPORTING " LIST_INDEX = -1 TABLES LISTASCI = LT_TAB_DATA LISTOBJECT = LT_TAB EXCEPTIONS EMPTY_LIST = 1 LIST_INDEX_INVALID = 2 OTHERS = 3. DATA: LT_FIELDS TYPE TABLE OF STRING, LV_STRING TYPE STRING. DATA: LO_STRUCT_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR, LT_COMPONENTS TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE. " 获取结构描述 LO_STRUCT_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( LS_OUT_100 ). LT_COMPONENTS = LO_STRUCT_DESCR->GET_COMPONENTS( ). *需要去除在调用程序中不显示的字段。 DELETE LT_COMPONENTS WHERE NAME = 'BANK_IND_T' OR NAME = 'CG_E_DATE'. "此时LT_COMPONENTS字段与返回的LT_TAB_DATA表内容结构 完全一致。 LOOP AT LT_TAB_DATA INTO LS_TAB_DATA FROM 4. SPLIT LS_TAB_DATA-LINE AT '|' INTO TABLE LT_FIELDS. DELETE LT_FIELDS INDEX 1. DATA(L_COLS) = LINES( LT_FIELDS ). IF L_COLS < 3. CONTINUE. ENDIF. APPEND INITIAL LINE TO LT_OUT_100 ASSIGNING FIELD-SYMBOL(<FS_LINE>). LOOP AT LT_FIELDS INTO DATA(LS_FIELDS). DATA(LV_INDEX) = SY-TABIX. CONDENSE LS_FIELDS NO-GAPS. ASSIGN COMPONENT LV_INDEX OF STRUCTURE <FS_LINE> TO FIELD-SYMBOL(<LV_FIELD>). IF SY-SUBRC = 0 AND <LV_FIELD> IS ASSIGNED. " 分配成功,使用<lv_field> READ TABLE LT_COMPONENTS INTO DATA(LS_COMPONENTS) INDEX LV_INDEX. IF SY-SUBRC = 0 AND LS_COMPONENTS-TYPE->TYPE_KIND = CL_ABAP_TYPEDESCR=>TYPEKIND_PACKED." 数值类型处理逻辑 SELECT SINGLE DCPFM INTO @DATA(LV_DCPFM) FROM USR01 WHERE BNAME = @SY-UNAME. CALL FUNCTION 'UNITS_STRING_CONVERT' EXPORTING UNITS_STRING = LS_FIELDS DCPFM = LV_DCPFM " 例如:‘X’ 代表一种格式[citation:5] IMPORTING UNITS = <LV_FIELD> EXCEPTIONS OTHERS = 1. ELSEIF SY-SUBRC = 0 AND LS_COMPONENTS-TYPE->TYPE_KIND = CL_ABAP_TYPEDESCR=>TYPEKIND_DATE."日期 CALL FUNCTION 'CONVERT_DATE_INPUT' EXPORTING INPUT = LS_FIELDS IMPORTING OUTPUT = <LV_FIELD> EXCEPTIONS PLAUSIBILITY_CHECK_FAILED = 1 WRONG_FORMAT_IN_INPUT = 2. ELSEIF SY-SUBRC = 0. <LV_FIELD> = LS_FIELDS. ENDIF. ELSE. " 分配失败,处理错误 ENDIF. ENDLOOP. ENDLOOP. WRITE: 'test'. |
