SAP ABAP程序中创建透明表
*需求:根据条件在ABAP程序中动态创建透明表,例如按月生成底表存数、优化查询速度.
*主要利用4个函数:
*DDIF_TABL_ACTIVATE 激活透明表
*GOX_GEN_TABLE_STD 生成透明表
*DDIF_TABL_PUT 设置表的相关信息
*DDIF_TABL_GET 获得表的相关信息
*步骤:准备属性、生成、获取、设置、激活。
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
PARAMETERS: tabname TYPE char32 OBLIGATORY. DATA: lt_new_object TYPE comt_gox_def_header, lt_old_object LIKE lt_new_object, lv_dbtab1_name TYPE char32, ls_new_object LIKE LINE OF lt_new_object, ls_new_object_details TYPE LINE OF comt_gox_table_entry_fields, lt_returntab TYPE bapirettab, ls_return LIKE LINE OF lt_returntab. DATA: lv_ddobjname TYPE ddobjname, ls_dd02v TYPE dd02v. DEFINE build_fields. ls_new_object-object_type = 'TABLE_FIELD'. lv_guid = cl_system_uuid=>if_system_uuid_static~create_uuid_c32( ). ls_new_object-key_guid = lv_guid. ls_new_object-parent_key = lv_parent_guid. "表的guid. ls_new_object-object_name = &1. "字段名 * ls_new_object_details属性(字段的详细设置) CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'POSITION'. ls_new_object_details-fieldvalue = &2. "字段顺序 APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'KEYFLAG'. ls_new_object_details-fieldvalue = &3. "主键标识 APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'NOTNULL'. ls_new_object_details-fieldvalue = &4. "非空标识. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'ROLLNAME'. ls_new_object_details-fieldvalue = &5. "数据元素 APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'REFTABLE'. ls_new_object_details-fieldvalue = &6. "数量金额单位参考表. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'REFFIELD'. ls_new_object_details-fieldvalue = &7. "数量金额单位参考字段. APPEND ls_new_object_details TO ls_new_object-details. APPEND ls_new_object TO lt_new_object. CLEAR ls_new_object. END-OF-DEFINITION. * technical setting *透明表技术设置的更多字段名可见DD02V,以下为常见设置字段. ls_new_object-object_type = 'TABLE'. ls_new_object-object_name = tabname. TRY. DATA(lv_guid) = cl_system_uuid=>if_system_uuid_static~create_uuid_c32( ). CATCH cx_uuid_error . ENDTRY. ls_new_object-key_guid = lv_guid. DATA(lv_parent_guid) = ls_new_object-key_guid. ls_new_object_details-fieldname = 'TABCLASS'. "表的类型. ls_new_object_details-fieldvalue = 'TRANSP'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'TABKAT'. ls_new_object_details-fieldvalue = '0'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'TABART'. ls_new_object_details-fieldvalue = 'APPL2'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'CONTFLAG'. "交付类. ls_new_object_details-fieldvalue = 'A'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'MAINFLAG'. "表是否允许维护. ls_new_object_details-fieldvalue = 'X'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'BUFFALLOW'. "是否允许缓冲. ls_new_object_details-fieldvalue = ''. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'PUFFERUNG'. "缓冲类型. ls_new_object_details-fieldvalue = ''. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'SCHFELDANZ'. "缓冲数. ls_new_object_details-fieldvalue = '0'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. ls_new_object_details-fieldname = 'EXCLASS'. "表是否能增强. ls_new_object_details-fieldvalue = '1'. APPEND ls_new_object_details TO ls_new_object-details. CLEAR ls_new_object_details. APPEND ls_new_object TO lt_new_object. "多维表. CLEAR ls_new_object. *table fields build. *调用宏 build_fields: 'MANDT' '1' 'X' 'X' 'S_MANDT' '' '', 'CARRID' '2' 'X' 'X' 'S_CARR_ID' '' '', 'CARRNAME' '3' '' '' 'S_CARRNAME' '' '', 'PRICE' '4' '' '' 'S_PRICE' 'SFLIGHT' 'CURRENCY'. *生成透明表. lv_dbtab1_name = tabname. CALL FUNCTION 'GOX_GEN_TABLE_STD' EXPORTING iv_object_name = lv_dbtab1_name it_object_new = lt_new_object it_object_old = lt_old_object iv_devclass = 'ZGD' "local $tmp or your package name. IMPORTING et_bapireturn = lt_returntab. CHECK lt_returntab IS INITIAL. *获得表的相关信息. lv_ddobjname = lv_dbtab1_name. CALL FUNCTION 'DDIF_TABL_GET' EXPORTING name = lv_ddobjname state = 'A' langu = sy-langu IMPORTING dd02v_wa = ls_dd02v EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc <> 0. RETURN. ENDIF. *设置表的相关信息. ls_dd02v-mainflag = 'X'. CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = lv_ddobjname dd02v_wa = ls_dd02v EXCEPTIONS tabl_not_found = 1 name_inconsistent = 2 tabl_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. RETURN. ENDIF. *active table CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = lv_ddobjname auth_chk = ' '. CHECK sy-subrc = 0. WRITE:/ 'Table: ', lv_ddobjname, ' generated successfully.'. WRITE:/ 'Please use SE11 to varify.'. |
如若转载,请注明出处:https://www.gavindong.com/2876.html