1 REPORT ZME12_BDC1. 2 *REPORT demo_select_dynamic_conditions . 3 TABLES: makt,dd02t,marc. 4 TYPE-POOLS : ABAP. 5 DATA where_tab(80) OCCURS 10 WITH HEADER LINE. 6 DATA where_tab2(80) OCCURS 10 WITH HEADER LINE. 7 DATA : wa_itab LIKE makt OCCURS 10 WITH HEADER LINE. 8 DATA : idetails TYPE abap_compdescr_tab, 9 xdetails TYPE abap_compdescr. 10 DATA:wa LIKE idetails WITH HEADER LINE. 11 12 DATA:BEGIN OF get_table occurs 0 , 13 tabname TYPE string,"表名 14 fieldname LIKE dd03l-fieldname,"字段名称 15 rollname LIKE dd03l-rollname,"资料元素 16 inttype LIKE dd03l-inttype, "类型 17 END OF get_table. 18 19 SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME. 20 PARAMETERS:p_field TYPE string OBLIGATORY. 21 PARAMETERS: s_trx TYPE string LOWER CASE." LOWER CASE 大小写不转换 22 SELECTION-SCREEN END OF BLOCK B1. 23 24 INITIALIZATION. 25 26 START-OF-SELECTION. 27 *--->去掉前导 0 28 * CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' 29 * EXPORTING 30 * input = s_trx 31 * IMPORTING 32 * output = s_trx. 33 *IF cl_abap_matcher=>matches( 34 * pattern = '^(-?[1-9]d*(.d*[1-9])?)|(-?0.d*[1-9])$' 35 * text = s_trx ) = abap_true. 36 * 37 ** WRITE '数字'. 38 * CONCATENATE p_field ' EQ ''' s_trx '''' INTO where_tab. 39 *ELSE. 40 * 41 ** WRITE '非数字'. 42 * CONCATENATE p_field ' LIKE ''%' s_trx '%''' INTO where_tab. 43 *ENDIF. 44 * CONCATENATE p_field ' LIKE ''%' s_trx '%''' INTO where_tab. 45 * APPEND where_tab. 46 47 * CONCATENATE p_field ' NE ''''' INTO where_tab2. 48 * APPEND where_tab2. 49 * CLEAR where_tab2. 50 51 TYPE-POOLS : ABAP. 52 FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE, 53 <DYN_WA>, 54 <DYN_FIELD>. 55 DATA: dy_table TYPE REF TO data, 56 dy_line TYPE REF TO data, 57 xfc TYPE lvc_s_fcat, 58 ifc TYPE lvc_t_fcat. 59 60 DATA:wa_structure TYPE lvc_s_fcat, 61 wa_structure1 TYPE lvc_s_fcat, 62 gt_structure TYPE lvc_t_fcat. 63 64 DATA: gs_layout TYPE slis_layout_alv, 65 gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE, 66 wa_fieldcat TYPE slis_fieldcat_alv. 67 68 START-OF-SELECTION. 69 PERFORM data_table. 70 PERFORM get_col. 71 PERFORM alv_show. 72 END-OF-SELECTION. 73 74 FORM data_table. 75 DATA: l_count TYPE i. 76 77 DATA : ref_table_des TYPE REF TO cl_abap_structdescr. 78 DATA : ef_is_unicode LIKE /bdl/tasks-status. 79 DATA:l_value TYPE string. 80 DATA: l_index TYPE sy-tabix, 81 lv_comt TYPE i, 82 l_num TYPE i, 83 p_len TYPE n. 84 85 gs_layout-colwidth_optimize = 'X'. 86 p_len = strlen( s_trx ). 87 "查询ABAP 所有table表格 88 SELECT dd02vv~TABNAME 89 dd03l~fieldname 90 dd03l~rollname 91 dd03l~inttype 92 COUNT(*) FROM dd02vv 93 INNER JOIN dd02l ON dd02l~tabname EQ dd02vv~tabname 94 INNER JOIN dd03l ON dd03l~tabname EQ dd02vv~tabname 95 * UP TO 10 ROWS 96 INTO CORRESPONDING FIELDS OF TABLE get_table 97 WHERE dd02vv~tabclass IN ('TRANSP','CLUSTER','POOL') AND " 透明表 98 dd02vv~contflag NE 'L' AND " 存储时资料的表格,空传送 99 dd02vv~as4local NOT IN ( 'N','T' ) AND " 未启用,临时版本 100 ( dd03l~fieldname EQ p_field OR 101 dd03l~rollname EQ p_field ) AND 102 * dd02vv~tabname NOT IN ( 'DF50D' ,'DF40D' ) AND 103 dd03l~LENG >= p_len AND 104 is_gtt NE 'X' " X全局临时表 N 没有全局临时表 105 GROUP BY dd02vv~tabname dd03l~fieldname 106 dd03l~rollname dd03l~inttype. 107 108 "字符小写转换大写 109 TRANSLATE p_field to UPPER CASE. 110 "创建内表结构 111 PERFORM new_teble. 112 " 创建内表 113 PERFORM create_dynamic_itab. 114 115 LOOP AT get_table. 116 l_index = sy-tabix. 117 CLEAR: l_num. 118 "查询表格内容是否有值 119 SELECT COUNT(*) INTO l_num 120 UP TO 2 ROWS 121 FROM (get_table-tabname). 122 IF sy-subrc <> 0. 123 DELETE get_table INDEX l_index. 124 CONTINUE. 125 ENDIF. 126 ** DESCRIBE TABLE get_table-tabname LINES index_z 127 ** n = lines(get_table-tabname). 128 * 129 * "***获取表结构 130 * CLEAR:ef_is_unicode,idetails[],xdetails, 131 * ref_table_des. 132 * " check the system is unicode or nonunicode 133 * CALL FUNCTION '/BDL/CHECK_UNICODE' 134 * IMPORTING 135 * ef_is_unicode = ef_is_unicode. 136 ** get the structure of the table. 137 * ref_table_des ?= 138 * cl_abap_typedescr=>describe_by_name( get_table-tabname ). 139 * idetails[] = ref_table_des->components[]. 140 * 141 * "先获取每个table字段 与查找的table是否相同 142 * READ TABLE idetails INTO wa WITH KEY name = p_field BINARY SEARCH. 143 * IF sy-subrc = 0 . 144 "--->1.abap 字典类型为 p x i f 8 字段调用动态 sql会down 145 "--->2.为知 b s g y u v h V r l a e j k z 类型 调用动态 sql是否会down 146 CLEAR:l_value. 147 IF get_table-inttype EQ 'P' OR 148 get_table-inttype EQ 'X' OR 149 get_table-inttype EQ 'I' OR 150 get_table-inttype EQ 'F' OR 151 get_table-inttype EQ '8'. 152 153 * SELECT (p_field) 154 * FROM (get_table-tabname) 155 * INTO @l_value. 156 157 ASSIGN COMPONENT 'TABLE_NAME' OF 158 STRUCTURE <dyn_wa> TO <dyn_field>. 159 160 <dyn_field> = get_table-tabname. 161 162 ASSIGN COMPONENT 'FIELD' OF 163 STRUCTURE <dyn_wa> TO <dyn_field>. 164 165 <dyn_field> = get_table-fieldname. 166 167 ASSIGN COMPONENT 'VALUE' OF 168 STRUCTURE <dyn_wa> TO <dyn_field>. 169 170 <dyn_field> = l_value . 171 172 ASSIGN COMPONENT 'ACCURACY' OF 173 STRUCTURE <dyn_wa> TO <dyn_field>. 174 IF l_value EQ s_trx. 175 <dyn_field> = 1. 176 ELSE. 177 <dyn_field> = 0. 178 ENDIF. 179 180 APPEND <dyn_wa> TO <dyn_table>. CLEAR <dyn_wa>. 181 ELSE. 182 CLEAR:where_tab[]. 183 CONCATENATE get_table-fieldname ' LIKE ''%' s_trx '%''' 184 INTO where_tab. 185 APPEND where_tab. 186 187 SELECT SINGLE (get_table-fieldname) 188 FROM (get_table-tabname) 189 INTO @l_value 190 WHERE (where_tab). 191 IF sy-subrc = 0. 192 ASSIGN COMPONENT 'TABLE_NAME' OF 193 STRUCTURE <dyn_wa> TO <dyn_field>. 194 195 <dyn_field> = get_table-tabname. 196 197 ASSIGN COMPONENT 'FIELD' OF 198 STRUCTURE <dyn_wa> TO <dyn_field>. 199 200 <dyn_field> = get_table-fieldname. 201 202 ASSIGN COMPONENT 'VALUE' OF 203 STRUCTURE <dyn_wa> TO <dyn_field>. <dyn_field> 204 205 = l_value . 206 207 ASSIGN COMPONENT 'ACCURACY' OF 208 STRUCTURE <dyn_wa> TO <dyn_field>. 209 IF l_value EQ s_trx. <dyn_field> 210 = 1. 211 ELSE. <dyn_field> 212 = 0. 213 ENDIF. 214 215 APPEND <dyn_wa> TO <dyn_table>. CLEAR <dyn_wa>. 216 ENDIF. 217 ENDIF. 218 219 * ENDIF. 220 ENDLOOP. 221 ENDFORM. 222 223 *&---------------------------------------------------------------------* 224 *& form create_dynamic_itab 225 *&---------------------------------------------------------------------* 226 * text 227 *----------------------------------------------------------------------* 228 form create_dynamic_itab. 229 * create dynamic internal table and assign to fs 230 CALL METHOD cl_alv_table_create=>create_dynamic_table 231 EXPORTING i_length_in_byte 232 = 'x' it_fieldcatalog 233 = ifc 234 IMPORTING ep_table 235 = dy_table. 236 ASSIGN dy_table->* TO <dyn_table>. 237 * create dynamic work area and assign to fs 238 CREATE DATA dy_line LIKE LINE OF <dyn_table>. 239 ASSIGN dy_line->* TO <dyn_wa>. 240 ENDFORM. 241 242 *&---------------------------------------------------------------------* 243 *& Form NEW_TEBLE 244 *&---------------------------------------------------------------------* 245 *& text 246 *&---------------------------------------------------------------------* 247 *& --> p1 text 248 *& <-- p2 text 249 *&---------------------------------------------------------------------* 250 FORM NEW_TEBLE . 251 CLEAR xfc. 252 * xfc-tabname = 'TABLE_NAME'. xfc 253 -fieldname = 'TABLE_NAME' . xfc 254 -datatype = 'C'. xfc 255 -inttype = 'C'. xfc 256 -intlen = 30. 257 "小数点 258 * xfc-decimals = xdetails-decimals. 259 APPEND xfc TO ifc. 260 CLEAR xfc. 261 * xfc-tabname = 'TABLE_FIELD'. xfc 262 -fieldname = 'FIELD'."p_field . xfc 263 -datatype = 'C'. xfc 264 -inttype = 'C'. xfc 265 -intlen = 30. 266 "小数点 267 * xfc-decimals = xdetails-decimals. 268 APPEND xfc TO ifc. 269 270 CLEAR xfc. 271 * xfc-tabname = 'TABLE_FIELD'. xfc 272 -fieldname = 'VALUE'. xfc 273 -datatype = 'C'. xfc 274 -inttype = 'C'. xfc 275 -intlen = 50. 276 "小数点 277 * xfc-decimals = xdetails-decimals. 278 APPEND xfc TO ifc. 279 280 CLEAR xfc. 281 * xfc-tabname = 'TABLE_FIELD'. xfc 282 -fieldname = 'ACCURACY'. xfc 283 -datatype = 'P'. xfc 284 -inttype = 'P'. xfc 285 -intlen = 5. 286 "小数点 xfc 287 -decimals = 2. 288 APPEND xfc TO ifc. 289 ENDFORM. 290 291 FORM get_col. 292 DEFINE FILEDCAT. gt_fieldcat 293 -fieldname = &1. "对应内表的字段名 gt_fieldcat 294 -seltext_l = &2. "输出列文本 gt_fieldcat 295 -outputlen = &3. "長度 296 APPEND gt_fieldcat. 297 END-OF-DEFINITION. FILEDCAT 298 299 'TABLE_NAME' '表格名称' 20. FILEDCAT 300 'FIELD' '表格字段' 20. FILEDCAT 301 'VALUE' '值' 20. FILEDCAT 302 'ACCURACY' '值的精确度' 20. 303 ENDFORM. 304 305 *&---------------------------------------------------------------------* 306 *& Form ALV_SHOW 307 *&---------------------------------------------------------------------* 308 *& text 309 *&---------------------------------------------------------------------* 310 *& --> p1 text 311 *& <-- p2 text 312 *&---------------------------------------------------------------------* 313 FORM ALV_SHOW . 314 315 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' 316 EXPORTING I_CALLBACK_PROGRAM 317 = SY-REPID IS_LAYOUT 318 = GS_LAYOUT IT_FIELDCAT 319 = GT_FIELDCAT[] I_SAVE 320 = 'A' 321 TABLES T_OUTTAB 322 = <dyn_table> 323 EXCEPTIONS PROGRAM_ERROR 324 = 1 325 OTHERS = 2. 326 ENDFORM.