当前位置:   article > 正文

查找数据库表内包含的特殊字符

数据库查询特殊符号*

f380e37289e50158e4dc07949b85d5cd.png

最近比较忙,稍微介绍一下。
本程序的作用是查找并删除数据库表内包含的特殊字符。

通过接口或者Excel上载创建的主数据描述,凭证数据的文本字段等,偶尔会有包含特殊字符的情况,且大部分时候是不可见字符,比如制表符,回车换行,0x0000等等。如果没有工具程序,只用SE16等查找或者更改非常困难,所以特意做了一个程序来干这个事情。

辅助功能1、显示可见字符的ASCII码

2fd1a70cfcfc8f92ce9040b742e47b48.png

辅助功能2、自动创建日志表

eafc04137c00e00e070e814c8b810734.png

e5b304bb7a72d1cfa98a07802033c04e.png

辅助功能3、自定义的更新功能(有更改日志)

cd846cce033f9ad48060fde0503d51ca.png

程序的运行界面:

30695c322c64f1ef23b6f3f71d1401fc.png

6d6d77101ed1f37c28d23da62a352831.png

9482c088202d6a87b3abc98f533702f8.png

7fd059c040fc3f26b27334fe1f314721.png

下面是优美的代码~

  1. *&---------------------------------------------------------------------*
  2. *& Report ZCHECKSPECIALHEX
  3. *& 检查/修正表内的CNDT类型字段值包含的特殊字符
  4. *&---------------------------------------------------------------------*
  5. *& Baitianzhen
  6. *& 2022.04.16
  7. *&---------------------------------------------------------------------*
  8. REPORT zcheckspecialhex NO STANDARD PAGE HEADING .
  9. TYPE-POOLS: sscr,slis.
  10. TABLES: dd02v,dd03l,tadir,sscrfields.
  11. DATA: fldct TYPE lvc_t_fcat WITH HEADER LINE,
  12. slayt TYPE lvc_s_layo,
  13. repid TYPE sy-repid,
  14. subrc TYPE sy-subrc,
  15. char45 TYPE char45,
  16. tabix TYPE sy-tabix,
  17. fmname TYPE funcname,
  18. whstr TYPE string,
  19. tmpstr TYPE string,
  20. numstr TYPE string,
  21. keystr TYPE string,
  22. cspace TYPE char4,
  23. tmpint TYPE i,
  24. percnt TYPE i,
  25. cflag.
  26. DATA: set_str TYPE string,
  27. con_str TYPE string.
  28. DATA: cxroot TYPE REF TO cx_root,
  29. excmsg TYPE char255.
  30. DATA: paraname TYPE char40,
  31. stru_type TYPE REF TO cl_abap_structdescr,
  32. itab_type TYPE REF TO cl_abap_tabledescr,
  33. comp_des TYPE abap_componentdescr,
  34. comp_tab TYPE abap_component_tab WITH HEADER LINE.
  35. DATA: logtname TYPE tablename VALUE 'ZCSL'.
  36. DATA: BEGIN OF wa_value ,
  37. fldname TYPE string,
  38. fldtype TYPE string,
  39. fldvalue TYPE string,
  40. hexvalue TYPE string,
  41. END OF wa_value.
  42. DATA: BEGIN OF it_flds OCCURS 0 ,
  43. fldname TYPE fieldname,
  44. ref_tab TYPE tabname,
  45. ref_fld TYPE fieldname,
  46. convext TYPE convexit,
  47. inttype TYPE inttype,
  48. END OF it_flds.
  49. DATA: BEGIN OF wa_log,
  50. mandt TYPE mandt ,
  51. tabname TYPE tabname,
  52. objectid TYPE cdobjectv,
  53. fieldname TYPE fieldname,
  54. erdat TYPE erdat ,
  55. erzet TYPE erzet ,
  56. ernam TYPE ernam ,
  57. value_old TYPE cdfldvalo,
  58. value_new TYPE cdfldvaln,
  59. END OF wa_log.
  60. DATA: it_fkey LIKE TABLE OF it_flds WITH HEADER LINE.
  61. DATA: it_fnok LIKE TABLE OF it_flds WITH HEADER LINE.
  62. DATA: it_dd03 TYPE TABLE OF dd03p WITH HEADER LINE.
  63. DATA: rf_tabl TYPE REF TO data,
  64. rf_twa TYPE REF TO data,
  65. rf_out TYPE REF TO data,
  66. rf_owa TYPE REF TO data.
  67. FIELD-SYMBOLS: <fs_out> TYPE STANDARD TABLE,
  68. <fs_tabl> TYPE STANDARD TABLE,
  69. <fsx> TYPE x, <fs_owa>, <fs_twa>, <fs_fld>, <fs>.
  70. SELECTION-SCREEN FUNCTION KEY 1.
  71. SELECTION-SCREEN FUNCTION KEY 2.
  72. SELECTION-SCREEN FUNCTION KEY 3.
  73. SELECTION-SCREEN FUNCTION KEY 4.
  74. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t01.
  75. SELECTION-SCREEN BEGIN OF LINE.
  76. SELECTION-SCREEN COMMENT (31) ctxt0 FOR FIELD p_tname .
  77. PARAMETERS: p_tname TYPE tabname16 MEMORY ID dtb .
  78. SELECTION-SCREEN COMMENT 52(31) ctxtl .
  79. SELECTION-SCREEN END OF LINE.
  80. SELECT-OPTIONS s_type FOR cflag NO INTERVALS.
  81. SELECT-OPTIONS s_flds FOR dd03l-fieldname NO INTERVALS MATCHCODE OBJECT dd_fieldname.
  82. SELECT-OPTIONS s_conl FOR char45 NO INTERVALS LOWER CASE.
  83. SELECT-OPTIONS s_sfld FOR dd03l-fieldname NO INTERVALS MATCHCODE OBJECT dd_fieldname.
  84. SELECTION-SCREEN BEGIN OF LINE.
  85. SELECTION-SCREEN COMMENT (31) ctxt1 FOR FIELD p_hchar .
  86. PARAMETERS: p_hchar TYPE char18 DEFAULT '0000'.
  87. SELECTION-SCREEN PUSHBUTTON 52(9) but03 USER-COMMAND space .
  88. SELECTION-SCREEN PUSHBUTTON 62(9) but04 USER-COMMAND newline .
  89. SELECTION-SCREEN PUSHBUTTON 72(9) but00 USER-COMMAND minchar .
  90. SELECTION-SCREEN END OF LINE.
  91. SELECTION-SCREEN BEGIN OF LINE.
  92. SELECTION-SCREEN PUSHBUTTON 52(9) but02 USER-COMMAND tab .
  93. SELECTION-SCREEN PUSHBUTTON 62(9) but05 USER-COMMAND cr_lf .
  94. SELECTION-SCREEN PUSHBUTTON 72(9) but01 USER-COMMAND maxchar .
  95. SELECTION-SCREEN END OF LINE.
  96. SELECTION-SCREEN END OF BLOCK b1.
  97. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t02.
  98. PARAMETERS p_proind AS CHECKBOX .
  99. PARAMETERS p_update AS CHECKBOX USER-COMMAND updchk.
  100. SELECTION-SCREEN BEGIN OF LINE.
  101. SELECTION-SCREEN POSITION 4.
  102. PARAMETERS pr_rep RADIOBUTTON GROUP typ DEFAULT 'X' MODIF ID a.
  103. SELECTION-SCREEN COMMENT (30) ctxt3 FOR FIELD pr_rep MODIF ID a.
  104. PARAMETERS p_conv AS CHECKBOX MODIF ID a.
  105. SELECTION-SCREEN COMMENT (14) ctxt6 FOR FIELD p_conv MODIF ID a.
  106. SELECTION-SCREEN END OF LINE.
  107. SELECTION-SCREEN BEGIN OF LINE.
  108. SELECTION-SCREEN POSITION 4.
  109. PARAMETERS pr_clr RADIOBUTTON GROUP typ MODIF ID a.
  110. SELECTION-SCREEN COMMENT (12) ctxt5 FOR FIELD pr_clr MODIF ID a.
  111. SELECTION-SCREEN END OF LINE.
  112. SELECTION-SCREEN END OF BLOCK b2.
  113. SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE t03.
  114. SELECTION-SCREEN COMMENT /1(79): txt1,txt2,txt3,txt4,txt5,txt6,txt7,txt8.
  115. SELECTION-SCREEN END OF BLOCK b3.
  116. SELECTION-SCREEN BEGIN OF SCREEN 1100 AS WINDOW .
  117. SELECTION-SCREEN BEGIN OF LINE.
  118. SELECTION-SCREEN COMMENT (8) ctxt7 FOR FIELD p_fval.
  119. PARAMETERS: p_fval TYPE char255 .
  120. SELECTION-SCREEN END OF LINE.
  121. SELECTION-SCREEN END OF SCREEN 1100.
  122. SELECTION-SCREEN BEGIN OF SCREEN 1200 AS WINDOW .
  123. SELECTION-SCREEN BEGIN OF LINE.
  124. SELECTION-SCREEN COMMENT (6) ctxt8 FOR FIELD p_fval.
  125. PARAMETERS: p_uptab TYPE tabname16 OBLIGATORY.
  126. SELECTION-SCREEN END OF LINE.
  127. SELECTION-SCREEN BEGIN OF LINE.
  128. SELECTION-SCREEN COMMENT (6) ctxt9 FOR FIELD p_fval.
  129. PARAMETERS: p_upfld TYPE fieldname VISIBLE LENGTH 10 OBLIGATORY .
  130. SELECTION-SCREEN COMMENT (3) ctxta FOR FIELD p_upval.
  131. PARAMETERS: p_upval TYPE string VISIBLE LENGTH 24 LOWER CASE.
  132. PARAMETERS: p_astxt AS CHECKBOX DEFAULT 'X'.
  133. SELECTION-SCREEN COMMENT (6) ctxtc FOR FIELD p_astxt.
  134. SELECTION-SCREEN END OF LINE.
  135. SELECTION-SCREEN BEGIN OF LINE.
  136. SELECTION-SCREEN COMMENT (6) ctxtb FOR FIELD p_fval.
  137. PARAMETERS: p_upwhe TYPE string LOWER CASE OBLIGATORY.
  138. SELECTION-SCREEN END OF LINE.
  139. SELECTION-SCREEN END OF SCREEN 1200.
  140. AT SELECTION-SCREEN OUTPUT.
  141. sscrfields-functxt_01 = 'ASCII码'.
  142. sscrfields-functxt_02 = '创建日志表'.
  143. sscrfields-functxt_03 = '查看日志'.
  144. sscrfields-functxt_04 = '单个字段更新'.
  145. t01 = '数据'.
  146. t02 = '选项'.
  147. t03 = '使用说明'.
  148. ctxt0 = '表名'.
  149. ctxt1 = '特殊字符的HEX'.
  150. ctxt3 = 'C类型过滤掉特殊字符,NDT类型改为初始值'.
  151. ctxt5 = '字段数据清空为初始值'.
  152. ctxt6 = '并将C类型数据转为内部格式'.
  153. ctxt7 = '外部格式:'.
  154. ctxt8 = 'UPDATE'.
  155. ctxt9 = 'SET'.
  156. ctxta = ' = '.
  157. ctxtb = 'WHERE'.
  158. ctxtc = '常量'.
  159. but00 = 'MinChar'.
  160. but01 = 'MaxChar'.
  161. but02 = 'Tab'.
  162. but03 = 'Space'.
  163. but04 = 'NewLine'.
  164. but05 = 'CR_LF'.
  165. %_p_proind_%_app_%-text = '显示查找进度'.
  166. %_p_update_%_app_%-text = '更改数据库数据'.
  167. %_p_tname_%_app_%-text = '表名'.
  168. %_p_hchar_%_app_%-text = '特殊字符的HEX'.
  169. %_s_type_%_app_%-text = '字段类型(C/N/D/T)'.
  170. %_s_flds_%_app_%-text = '字段名'.
  171. %_s_conl_%_app_%-text = 'WHERE语句'.
  172. %_s_sfld_%_app_%-text = '额外输出字段'.
  173. txt1 = `1、如果不输入要检查字段,则检查表内所有C/N/D/T类型的非KEY字段`.
  174. txt2 = `2、WHERE语句可以不填写,也可以填写多行,每行不要超过45字符`.
  175. txt3 = `3、默认输出KEY字段和包含特殊字符的字段,如果想要输出其他字段,可以放到“额外输出字段”`.
  176. txt4 = `4、如果不勾中"更新数据库数据",则只列出数据,不更新数据库`.
  177. txt5 = `5、更新数据库的时候,使用INITIAL值覆盖或者只去掉特殊字符`.
  178. txt6 = `6、如果勾中数据转为内部格式,则先去掉特殊字符然后根据表内字段对应域的转换例程转换为内部格式`.
  179. txt7 = `7、HEX为空会列出所有在数据库取出的CNDT类型数据,排查错误使用,不支持更新模式`.
  180. txt8 = `8、HEX为Space有特殊用法,可以查出非INITIAL字段包含空格的情况,比如日期或时间值为空格的,不可以使用过滤模式`.
  181. CLEAR ctxtl.
  182. SELECT SINGLE ddtext INTO ctxtl
  183. FROM dd02t
  184. WHERE tabname = p_tname AND
  185. ddlanguage = sy-langu.
  186. LOOP AT SCREEN.
  187. IF p_update = ''.
  188. IF screen-group1 CA 'A'.
  189. screen-active = '0'.
  190. ENDIF.
  191. ENDIF.
  192. IF screen-name CS 'P_PROIND'.
  193. screen-input = '0'.
  194. ENDIF.
  195. MODIFY SCREEN.
  196. ENDLOOP.
  197. IF sy-dynnr = '1100'.
  198. LOOP AT SCREEN.
  199. screen-input = '0'.
  200. MODIFY SCREEN.
  201. ENDLOOP.
  202. SET CURSOR FIELD 'CTXT7'.
  203. ENDIF.
  204. IF sy-dynnr = '1200'.
  205. PERFORM selscreen_ext USING 'GET SPOS'.
  206. ENDIF.
  207. INITIALIZATION.
  208. PERFORM get_hchar USING space CHANGING cspace.
  209. AT SELECTION-SCREEN.
  210. CASE sscrfields-ucomm.
  211. WHEN 'FC01'.
  212. LEAVE TO LIST-PROCESSING .
  213. NEW-PAGE NO-HEADING NO-TITLE.
  214. SET PF-STATUS space.
  215. SUPPRESS DIALOG.
  216. PERFORM ascii.
  217. WHEN 'FC02'.
  218. PERFORM fill_dd03 USING : 'MANDT ' 'MANDT' 'X',
  219. 'TABNAME ' 'TABNAME' 'X',
  220. 'OBJECTID ' 'CDOBJECTV' 'X',
  221. 'FIELDNAME' 'FIELDNAME' 'X',
  222. 'ERDAT ' 'ERDAT' 'X',
  223. 'ERZET ' 'ERZET' 'X',
  224. 'ERNAM ' 'ERNAM' 'X',
  225. 'VALUE_OLD' 'CDFLDVALO' '',
  226. 'VALUE_NEW' 'CDFLDVALN' ''.
  227. SELECT SINGLE * FROM tadir
  228. WHERE pgmid = 'R3TR' AND
  229. object = 'PROG' AND
  230. obj_name = sy-repid.
  231. PERFORM create_table TABLES it_dd03
  232. USING 'ZCSL' 'ZCHECKSPECIALHEX日志' tadir-devclass .
  233. WHEN 'FC03'.
  234. CONCATENATE '/1BCDWB/DB' logtname INTO char45 .
  235. SUBMIT (char45) VIA SELECTION-SCREEN AND RETURN .
  236. WHEN 'FC04'.
  237. CALL SELECTION-SCREEN 1200 STARTING AT 32 6 .
  238. CHECK sy-subrc = 0 .
  239. PERFORM update_single_fld USING p_uptab p_upfld p_upval p_upwhe p_astxt .
  240. WHEN 'MINCHAR'.
  241. PERFORM get_hchar USING %_minchar CHANGING p_hchar.
  242. WHEN 'MAXCHAR'.
  243. PERFORM get_hchar USING %_maxchar CHANGING p_hchar.
  244. WHEN 'TAB'.
  245. PERFORM get_hchar USING %_horizontal_tab CHANGING p_hchar.
  246. WHEN 'SPACE'.
  247. PERFORM get_hchar USING space CHANGING p_hchar.
  248. WHEN 'NEWLINE'.
  249. PERFORM get_hchar USING %_newline CHANGING p_hchar.
  250. WHEN 'CR_LF'.
  251. PERFORM get_hchar USING %_cr_lf CHANGING p_hchar.
  252. WHEN 'UPDCHK'.
  253. CHECK p_update = 'X'.
  254. CALL FUNCTION 'POPUP_TO_CONFIRM'
  255. EXPORTING
  256. titlebar = '确认'
  257. text_question = '本程序会直接更改数据库数据!请在专业人员指导下使用,继续选择更改吗?'
  258. default_button = 'A'
  259. IMPORTING
  260. answer = cflag.
  261. IF cflag <> '1'.
  262. p_update = ''.
  263. ENDIF.
  264. ENDCASE.
  265. START-OF-SELECTION.
  266. PERFORM checkinput.
  267. PERFORM savelog(zreplog) USING sy-repid '' IF FOUND.
  268. PERFORM get_dd03 USING p_tname.
  269. PERFORM create_itab.
  270. PERFORM getdata.
  271. PERFORM updatelog(zreplog) IF FOUND.
  272. CHECK <fs_out> IS NOT INITIAL.
  273. PERFORM outdata.
  274. *&---------------------------------------------------------------------*
  275. *& Form checkinput
  276. *&---------------------------------------------------------------------*
  277. FORM checkinput.
  278. SELECT SINGLE * FROM dd02v WHERE tabname = logtname.
  279. IF sy-subrc <> 0 AND p_update = 'X'.
  280. MESSAGE s000(oo) WITH '请先创建日志表'.
  281. STOP.
  282. ENDIF.
  283. IF p_tname IS INITIAL.
  284. MESSAGE s000(oo) WITH '表名必输'.
  285. STOP.
  286. ENDIF.
  287. tmpint = strlen( p_hchar ) MOD 4.
  288. IF tmpint <> 0.
  289. MESSAGE s000(oo) WITH 'HEX长度必须是4的倍数'.
  290. STOP.
  291. ENDIF.
  292. IF p_hchar CN '0123456789ABCDEF '.
  293. MESSAGE s000(oo) WITH 'HEX只能是数字或者A-F'.
  294. STOP.
  295. ENDIF.
  296. IF p_update = 'X' AND p_hchar = '' .
  297. MESSAGE s000(oo) WITH 'HEX为空不可以使用更新模式'.
  298. STOP.
  299. ENDIF.
  300. IF p_update = 'X' AND pr_rep = 'X' AND p_hchar = cspace.
  301. MESSAGE s000(oo) WITH 'HEX为Space不可以使用过滤模式'.
  302. STOP.
  303. ENDIF.
  304. ENDFORM. "checkinput
  305. *&---------------------------------------------------------------------*
  306. *& Form get_dd03
  307. *&---------------------------------------------------------------------*
  308. FORM get_dd03 USING in_tabname.
  309. DATA tabname TYPE ddobjname.
  310. DELETE s_flds WHERE low = ''.
  311. DELETE s_sfld WHERE low = ''.
  312. CLEAR: it_dd03[],it_flds[],it_fkey[],it_fnok[].
  313. tabname = in_tabname.
  314. CALL FUNCTION 'DDIF_TABL_GET'
  315. EXPORTING
  316. name = tabname
  317. langu = sy-langu
  318. IMPORTING
  319. dd02v_wa = dd02v
  320. TABLES
  321. dd03p_tab = it_dd03
  322. EXCEPTIONS
  323. illegal_input = 1
  324. OTHERS = 2.
  325. IF it_dd03[] IS INITIAL.
  326. MESSAGE s000(oo) WITH '表' tabname '不存在'.
  327. STOP.
  328. ELSE.
  329. IF 'TRANSP POOL CLUSTER' CS dd02v-tabclass.
  330. DELETE it_dd03 WHERE datatype = 'CLNT' OR datatype = ''.
  331. LOOP AT it_dd03 WHERE fieldname IN s_flds AND
  332. inttype CA 'CNDT' AND
  333. inttype IN s_type
  334. OR keyflag = 'X'.
  335. it_flds-fldname = it_dd03-fieldname.
  336. it_flds-ref_tab = tabname.
  337. it_flds-ref_fld = it_dd03-fieldname.
  338. it_flds-convext = it_dd03-convexit.
  339. it_flds-inttype = it_dd03-inttype.
  340. APPEND it_flds.
  341. IF it_dd03-keyflag = 'X'.
  342. APPEND it_flds TO it_fkey.
  343. ELSE.
  344. APPEND it_flds TO it_fnok.
  345. ENDIF.
  346. ENDLOOP.
  347. IF it_fnok[] IS INITIAL.
  348. MESSAGE s000(oo) WITH '未找到CNDT类型的非KEY字段'.
  349. STOP.
  350. ENDIF.
  351. ELSE.
  352. MESSAGE s000(oo) WITH '只支持透明表/簇表/池表' DISPLAY LIKE 'E'.
  353. STOP.
  354. ENDIF.
  355. ENDIF.
  356. ENDFORM. "get_dd03
  357. *&---------------------------------------------------------------------*
  358. *& Form create_itab
  359. *&---------------------------------------------------------------------*
  360. FORM create_itab.
  361. LOOP AT it_flds .
  362. CONCATENATE it_flds-ref_tab '-' it_flds-ref_fld INTO paraname.
  363. comp_des-type ?= cl_abap_datadescr=>describe_by_name( paraname ).
  364. comp_des-name = it_flds-fldname.
  365. APPEND comp_des TO comp_tab.
  366. ENDLOOP.
  367. LOOP AT s_sfld.
  368. READ TABLE it_dd03 WITH KEY fieldname = s_sfld-low.
  369. CHECK sy-subrc = 0.
  370. READ TABLE it_flds WITH KEY fldname = s_sfld-low.
  371. CHECK sy-subrc <> 0.
  372. CONCATENATE p_tname '-' s_sfld-low INTO paraname.
  373. comp_des-type ?= cl_abap_datadescr=>describe_by_name( paraname ).
  374. comp_des-name = s_sfld-low.
  375. APPEND comp_des TO comp_tab.
  376. ENDLOOP.
  377. stru_type = cl_abap_structdescr=>create( comp_tab[] ).
  378. CREATE DATA rf_twa TYPE HANDLE stru_type.
  379. ASSIGN rf_twa->* TO <fs_twa>.
  380. itab_type = cl_abap_tabledescr=>create( stru_type ).
  381. CREATE DATA rf_tabl TYPE HANDLE itab_type.
  382. ASSIGN rf_tabl->* TO <fs_tabl>.
  383. LOOP AT it_fkey.
  384. PERFORM catset TABLES fldct
  385. USING it_fkey-fldname 'RSREF' 'STRING' it_fkey-fldname.
  386. ENDLOOP.
  387. LOOP AT s_sfld.
  388. READ TABLE it_dd03 WITH KEY fieldname = s_sfld-low.
  389. CHECK sy-subrc = 0.
  390. READ TABLE it_fkey WITH KEY fldname = s_sfld-low.
  391. CHECK sy-subrc <> 0.
  392. PERFORM catset TABLES fldct
  393. USING s_sfld-low 'RSREF' 'STRING' s_sfld-low.
  394. ENDLOOP.
  395. PERFORM catset TABLES fldct
  396. USING: 'FLDNAME' 'DD03L' 'FIELDNAME' '字段',
  397. 'FLDTYPE' 'DD03L' 'INTTYPE' '数据类型',
  398. 'FLDVALUE' 'RSREF' 'STRING' '字段值',
  399. 'HEXVALUE' 'RSREF' 'STRING' 'HEX'.
  400. CALL METHOD cl_alv_table_create=>create_dynamic_table
  401. EXPORTING
  402. it_fieldcatalog = fldct[]
  403. IMPORTING
  404. ep_table = rf_out.
  405. ASSIGN rf_out->* TO <fs_out>.
  406. CREATE DATA rf_owa LIKE LINE OF <fs_out>.
  407. ASSIGN rf_owa->* TO <fs_owa>.
  408. ENDFORM. "create_itab
  409. *&---------------------------------------------------------------------*
  410. *& Form getdata
  411. *&---------------------------------------------------------------------*
  412. FORM getdata.
  413. CLEAR whstr.
  414. LOOP AT s_conl.
  415. CONCATENATE whstr s_conl-low INTO whstr SEPARATED BY space.
  416. ENDLOOP.
  417. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  418. EXPORTING
  419. text = '开始在数据库取数...'.
  420. TRY.
  421. SELECT * INTO CORRESPONDING FIELDS OF TABLE <fs_tabl>
  422. FROM (p_tname)
  423. WHERE (whstr).
  424. CATCH cx_root INTO cxroot.
  425. excmsg = cxroot->get_text( ).
  426. MESSAGE s000(oo) WITH '取数错误:' excmsg(50) excmsg+50(50) DISPLAY LIKE 'E'.
  427. RETURN.
  428. ENDTRY.
  429. IF <fs_tabl> IS INITIAL.
  430. MESSAGE s000(oo) WITH '数据库未取到数据'.
  431. RETURN.
  432. ENDIF.
  433. WRITE sy-dbcnt TO char45 LEFT-JUSTIFIED.
  434. numstr = lines( it_fnok ).
  435. CONCATENATE '开始在' char45 '条记录,' numstr '个字段中查找...' INTO tmpstr.
  436. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  437. EXPORTING
  438. text = tmpstr.
  439. LOOP AT <fs_tabl> ASSIGNING <fs_twa>.
  440. tabix = sy-tabix.
  441. LOOP AT it_fnok .
  442. ASSIGN COMPONENT it_fnok-fldname OF STRUCTURE <fs_twa> TO <fs_fld>.
  443. IF p_hchar IS NOT INITIAL AND <fs_fld> IS INITIAL.
  444. CONTINUE.
  445. ENDIF.
  446. IF p_hchar <> '' .
  447. PERFORM findx USING p_hchar <fs_fld> CHANGING subrc.
  448. ENDIF.
  449. IF subrc = 0 OR p_hchar = '' .
  450. MOVE-CORRESPONDING <fs_twa> TO <fs_owa>.
  451. ASSIGN <fs_fld> TO <fsx> CASTING.
  452. wa_value-fldname = it_fnok-fldname.
  453. wa_value-fldtype = it_fnok-inttype.
  454. wa_value-fldvalue = <fs_fld>.
  455. wa_value-hexvalue = <fsx>.
  456. MOVE-CORRESPONDING wa_value TO <fs_owa>.
  457. APPEND <fs_owa> TO <fs_out>.
  458. IF p_proind = 'X'.
  459. tmpstr = sy-tabix.
  460. percnt = tabix * 100 / sy-dbcnt.
  461. CONCATENATE '已经找到' tmpstr '条' INTO tmpstr.
  462. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
  463. EXPORTING
  464. percentage = percnt
  465. text = tmpstr.
  466. ENDIF.
  467. IF p_update = 'X' AND p_hchar <> ''.
  468. CLEAR: keystr,wa_log.
  469. wa_log-tabname = p_tname.
  470. wa_log-fieldname = it_fnok-fldname.
  471. wa_log-erdat = sy-datum.
  472. wa_log-erzet = sy-uzeit.
  473. wa_log-ernam = sy-uname.
  474. wa_log-value_old = <fs_fld>.
  475. IF pr_clr = 'X' OR it_fnok-inttype CA 'NDT'.
  476. CLEAR <fs_fld>.
  477. ELSE .
  478. PERFORM replacex USING p_hchar <fs_fld> .
  479. IF it_fnok-convext IS NOT INITIAL AND p_conv = 'X'.
  480. CONCATENATE 'CONVERSION_EXIT_' it_fnok-convext '_INPUT' INTO fmname.
  481. CALL FUNCTION fmname
  482. EXPORTING
  483. input = <fs_fld>
  484. IMPORTING
  485. output = <fs_fld>
  486. EXCEPTIONS
  487. OTHERS = 1.
  488. ENDIF.
  489. ENDIF.
  490. wa_log-value_new = <fs_fld>.
  491. CLEAR: con_str,set_str.
  492. CONCATENATE it_fnok-fldname ` = <fs_fld>` INTO set_str.
  493. LOOP AT it_fkey.
  494. ASSIGN COMPONENT it_fkey-fldname OF STRUCTURE <fs_twa> TO <fs>.
  495. tmpstr = <fs>.
  496. IF sy-tabix = 1.
  497. CONCATENATE it_fkey-fldname ` = '` tmpstr `'` INTO con_str.
  498. ELSE.
  499. CONCATENATE con_str ` AND ` it_fkey-fldname ` = '` tmpstr `'` INTO con_str.
  500. ENDIF.
  501. CONCATENATE keystr <fs> INTO keystr RESPECTING BLANKS.
  502. ENDLOOP.
  503. UPDATE (p_tname) SET (set_str) WHERE (con_str).
  504. wa_log-objectid = keystr.
  505. INSERT (logtname) FROM wa_log.
  506. tmpint = tmpint + 1.
  507. ENDIF.
  508. ENDIF.
  509. ENDLOOP.
  510. IF tmpint > 1000. "超过1000条提交一次
  511. COMMIT WORK.
  512. CLEAR tmpint.
  513. ENDIF.
  514. ENDLOOP.
  515. IF <fs_out> IS INITIAL.
  516. MESSAGE s000(oo) WITH '未找到符合条件的数据'.
  517. ELSEIF tmpint > 0.
  518. COMMIT WORK.
  519. ENDIF.
  520. ENDFORM. "getdata
  521. *&---------------------------------------------------------------------*
  522. *& Form set_zero
  523. *&---------------------------------------------------------------------*
  524. FORM set_zero CHANGING char.
  525. FIELD-SYMBOLS <fs_x> TYPE x.
  526. ASSIGN char TO <fs_x> CASTING.
  527. CLEAR <fs_x>.
  528. ENDFORM. "set_zero
  529. *&---------------------------------------------------------------------*
  530. *& Form get_hchar
  531. *&---------------------------------------------------------------------*
  532. FORM get_hchar USING char CHANGING hchar.
  533. FIELD-SYMBOLS <fs_x> TYPE x.
  534. ASSIGN char TO <fs_x> CASTING.
  535. hchar = <fs_x>.
  536. ENDFORM. "get_hchar
  537. *&---------------------------------------------------------------------*
  538. *& Form findx
  539. *&---------------------------------------------------------------------*
  540. FORM findx USING value(xchar) str CHANGING subrc.
  541. DATA len TYPE i.
  542. FIELD-SYMBOLS <fs_x> TYPE x.
  543. IF xchar = cspace.
  544. IF str CA ''.
  545. subrc = 0.
  546. ELSE.
  547. subrc = 4.
  548. ENDIF.
  549. ELSE.
  550. len = strlen( xchar ) / 4.
  551. ASSIGN xchar TO <fs_x> CASTING.
  552. <fs_x> = xchar.
  553. FIND xchar(len) IN str .
  554. subrc = sy-subrc.
  555. ENDIF.
  556. ENDFORM. "findx
  557. *&---------------------------------------------------------------------*
  558. *& 替换字符串的二进制数据,仅用于UNICODE系统
  559. *& 比如PERFORM replacex USING '000D000A' CHANGING str.
  560. *& PERFORM replacex USING '0009' CHANGING str.
  561. *&---------------------------------------------------------------------*
  562. FORM replacex USING value(xchar) CHANGING value(str).
  563. DATA len TYPE i.
  564. FIELD-SYMBOLS <fs_x> TYPE x.
  565. CHECK xchar <> ''.
  566. len = strlen( xchar ) / 4.
  567. ASSIGN xchar TO <fs_x> CASTING.
  568. <fs_x> = xchar.
  569. REPLACE ALL OCCURRENCES OF xchar(len) IN str WITH ''.
  570. ENDFORM. "replacex
  571. *&---------------------------------------------------------------------*
  572. *& Form ASCII
  573. *&---------------------------------------------------------------------*
  574. FORM ascii .
  575. DATA hex4 TYPE x LENGTH 4.
  576. DATA hex1 TYPE x VALUE '20'.
  577. DATA inta TYPE i.
  578. FIELD-SYMBOLS <fc> TYPE c.
  579. ASSIGN hex4 TO <fc> CASTING.
  580. WHILE hex1 < '7F'.
  581. IF %_endian = 'B'.
  582. hex4+3 = hex1.
  583. ELSE.
  584. hex4+2 = hex1.
  585. ENDIF.
  586. WRITE: hex4+2, AT (8) <fc>+1 COLOR 6 INTENSIFIED ON INVERSE ON.
  587. hex1 = hex1 + 1.
  588. inta = sy-index MOD 8.
  589. IF inta = 0. SKIP. ENDIF.
  590. ENDWHILE.
  591. ENDFORM. "ascii
  592. *&---------------------------------------------------------------------*
  593. *& Form replace_0x00
  594. *&---------------------------------------------------------------------*
  595. FORM replace_0x00 CHANGING data.
  596. DATA dtype.
  597. FIELD-SYMBOLS <fs>.
  598. DESCRIBE FIELD data TYPE dtype.
  599. CASE dtype.
  600. WHEN 'C' OR 'N' OR 'D' OR 'T' OR 'g'.
  601. REPLACE ALL OCCURRENCES OF %_minchar IN data WITH ''.
  602. WHEN 'u' OR 'v'.
  603. DO .
  604. ASSIGN COMPONENT sy-index OF STRUCTURE data TO <fs>.
  605. IF sy-subrc <> 0.
  606. EXIT.
  607. ELSE.
  608. DESCRIBE FIELD <fs> TYPE dtype.
  609. CHECK dtype CA 'CNDTg'.
  610. REPLACE ALL OCCURRENCES OF %_minchar IN <fs> WITH ''.
  611. ENDIF.
  612. ENDDO.
  613. WHEN 'h'.
  614. MESSAGE e000(oo) WITH '输入对象不支持内表'.
  615. WHEN OTHERS.
  616. ENDCASE.
  617. ENDFORM. "replace_0x00
  618. *&---------------------------------------------------------------------*
  619. *& Form outdata
  620. *&---------------------------------------------------------------------*
  621. FORM outdata.
  622. slayt-zebra = 'X'.
  623. slayt-no_toolbar = 'X'.
  624. repid = sy-repid.
  625. tmpstr = lines( <fs_out> ).
  626. IF p_update = 'X'.
  627. MESSAGE s000(oo) WITH '记录数:' tmpstr '. 数据库数据已更改'.
  628. ELSE.
  629. MESSAGE s000(oo) WITH '记录数:' tmpstr.
  630. ENDIF.
  631. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  632. EXPORTING
  633. it_fieldcat_lvc = fldct[]
  634. is_layout_lvc = slayt
  635. i_callback_program = repid
  636. i_callback_user_command = 'USER_COMMAND'
  637. TABLES
  638. t_outtab = <fs_out>.
  639. ENDFORM. " outdata
  640. *---------------------------------------------------------------------*
  641. * FORM catset *
  642. *---------------------------------------------------------------------*
  643. FORM catset TABLES fldcat USING p_field p_reftab p_reffld p_text.
  644. DATA: ls_fldcat TYPE lvc_s_fcat.
  645. ls_fldcat-fieldname = p_field.
  646. ls_fldcat-scrtext_l = p_text.
  647. ls_fldcat-coltext = p_text.
  648. ls_fldcat-ref_table = p_reftab.
  649. ls_fldcat-ref_field = p_reffld.
  650. IF p_field = 'HEXVALUE'.
  651. ls_fldcat-outputlen = '60'.
  652. ELSE.
  653. ls_fldcat-col_opt = 'A'.
  654. ENDIF.
  655. IF 'FLDNAME FLDVALUE HEXVALUE FLDTYPE' CS p_field.
  656. ls_fldcat-emphasize = 'C300'.
  657. ENDIF.
  658. READ TABLE it_fkey WITH KEY fldname = p_field.
  659. IF sy-subrc = 0.
  660. ls_fldcat-key = 'X'.
  661. ENDIF.
  662. APPEND ls_fldcat TO fldcat .
  663. CLEAR ls_fldcat .
  664. ENDFORM. "catset
  665. *&--------------------------------------------------------------------*
  666. *& Form user_command
  667. *&--------------------------------------------------------------------*
  668. FORM user_command USING r_ucomm TYPE sy-ucomm
  669. r_field TYPE slis_selfield.
  670. DATA: lr_fld TYPE REF TO data.
  671. CASE r_ucomm.
  672. WHEN '&IC1'.
  673. READ TABLE <fs_out> INTO <fs_owa> INDEX r_field-tabindex.
  674. MOVE-CORRESPONDING <fs_owa> TO wa_value.
  675. CASE r_field-fieldname.
  676. WHEN 'FLDNAME' OR 'FLDTYPE'.
  677. CALL FUNCTION 'RS_TOOL_ACCESS'
  678. EXPORTING
  679. operation = 'SHOW'
  680. object_name = p_tname
  681. object_type = 'TABL'
  682. position = wa_value-fldname
  683. EXCEPTIONS
  684. not_executed = 01.
  685. WHEN 'FLDVALUE'.
  686. PERFORM selscreen_ext USING 'GET CRET NONE SPOS'.
  687. CONCATENATE p_tname '-' wa_value-fldname INTO paraname.
  688. CREATE DATA lr_fld TYPE (paraname).
  689. ASSIGN lr_fld->* TO <fs_fld>.
  690. <fs_fld> = wa_value-fldvalue.
  691. WRITE <fs_fld> TO p_fval LEFT-JUSTIFIED .
  692. CALL SELECTION-SCREEN 1100 STARTING AT 32 6 .
  693. WHEN 'HEXVALUE'.
  694. PERFORM show_hex USING wa_value-fldvalue wa_value-hexvalue.
  695. WHEN OTHERS .
  696. PERFORM se16_single_show USING <fs_owa>.
  697. ENDCASE.
  698. ENDCASE.
  699. ENDFORM. "user_command
  700. *&---------------------------------------------------------------------*
  701. *& Form show_hex
  702. *&---------------------------------------------------------------------*
  703. FORM show_hex USING fldvalue hexvalue.
  704. DATA: char255 TYPE char255.
  705. DATA: lt_txt TYPE TABLE OF char4 WITH HEADER LINE.
  706. DATA: lt_cat TYPE lvc_t_fcat WITH HEADER LINE.
  707. DATA: BEGIN OF lt_out OCCURS 0,
  708. index TYPE sy-index,
  709. hchar TYPE char4,
  710. cchar TYPE char2,
  711. END OF lt_out.
  712. CHECK hexvalue IS NOT INITIAL.
  713. char255 = fldvalue.
  714. CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
  715. EXPORTING
  716. text = hexvalue
  717. TABLES
  718. ftext_tab = lt_txt.
  719. LOOP AT lt_txt.
  720. tabix = sy-tabix - 1.
  721. lt_out-index = sy-tabix.
  722. lt_out-hchar = lt_txt.
  723. lt_out-cchar = char255+tabix(1).
  724. APPEND lt_out.
  725. ENDLOOP.
  726. PERFORM catset TABLES lt_cat
  727. USING: 'INDEX' '' '' 'INDEX',
  728. 'HCHAR' '' '' 'HCHAR',
  729. 'CCHAR' '' '' 'CCHAR'.
  730. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  731. EXPORTING
  732. it_fieldcat_lvc = lt_cat[]
  733. i_screen_start_column = 60
  734. i_screen_start_line = 1
  735. i_screen_end_column = 84
  736. i_screen_end_line = 20
  737. TABLES
  738. t_outtab = lt_out
  739. EXCEPTIONS
  740. program_error = 1.
  741. ENDFORM. "show_hex
  742. *&---------------------------------------------------------------------*
  743. *& Form se16_single_show
  744. *&---------------------------------------------------------------------*
  745. FORM se16_single_show USING wa.
  746. DATA: dba_sellist TYPE TABLE OF tbsellist WITH HEADER LINE.
  747. DATA: action(4) VALUE 'EANZ'.
  748. DATA: prog TYPE rsnewleng-programm.
  749. DATA: mem_id(32) VALUE 'TABELLENANZEIGER'.
  750. FIELD-SYMBOLS <ls_fld>.
  751. LOOP AT it_fkey.
  752. ASSIGN COMPONENT it_fkey-fldname OF STRUCTURE wa TO <ls_fld>.
  753. dba_sellist-tablefield = it_fkey-fldname.
  754. dba_sellist-operator = 'EQ'.
  755. dba_sellist-value = <ls_fld>.
  756. APPEND dba_sellist.
  757. ENDLOOP.
  758. EXPORT action dba_sellist TO MEMORY ID mem_id.
  759. CONCATENATE '/1BCDWB/DB' p_tname INTO prog.
  760. SUBMIT (prog) AND RETURN.
  761. ENDFORM. "se16_single_show
  762. *&---------------------------------------------------------------------*
  763. *& 创建透明表
  764. *&---------------------------------------------------------------------*
  765. FORM create_table TABLES transfld STRUCTURE dd03p
  766. USING transtab ddtext devclass .
  767. DATA: objstr(40),
  768. reqnum TYPE trkorr.
  769. DATA: wa_02v TYPE dd02v ,
  770. wa_09l TYPE dd09v ,
  771. subrc TYPE sy-subrc.
  772. DATA: lt_03p TYPE TABLE OF dd03p WITH HEADER LINE .
  773. SELECT SINGLE * INTO wa_02v FROM dd02v
  774. WHERE tabname = transtab AND
  775. tabclass = 'TRANSP'.
  776. IF sy-subrc = 0.
  777. MESSAGE s000(oo) WITH '透明表' transtab '已存在'.
  778. RETURN.
  779. ENDIF.
  780. ***传输请求
  781. CONCATENATE 'TABL' transtab INTO objstr.
  782. CALL FUNCTION 'RS_CORR_INSERT'
  783. EXPORTING
  784. object = objstr
  785. object_class = 'DICT'
  786. devclass = devclass
  787. korrnum = reqnum
  788. master_language = sy-langu
  789. global_lock = 'X'
  790. mode = 'I'
  791. suppress_dialog = ''
  792. IMPORTING
  793. ordernum = reqnum
  794. EXCEPTIONS
  795. cancelled = 1
  796. permission_failure = 2
  797. unknown_objectclass = 3
  798. OTHERS = 4.
  799. IF sy-subrc <> 0.
  800. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  801. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 .
  802. ENDIF.
  803. ***创建透明表并激活
  804. wa_02v-tabname = transtab.
  805. wa_02v-ddtext = ddtext.
  806. wa_02v-ddlanguage = sy-langu.
  807. wa_02v-tabclass = 'TRANSP'.
  808. wa_02v-as4user = sy-uname.
  809. wa_02v-contflag = 'C'.
  810. wa_02v-mainflag = 'X'.
  811. wa_09l-tabname = transtab.
  812. wa_09l-tabart = 'APPL1'.
  813. wa_09l-tabkat = 6.
  814. LOOP AT transfld.
  815. lt_03p-tabname = transtab.
  816. lt_03p-ddlanguage = sy-langu.
  817. lt_03p-position = sy-tabix.
  818. lt_03p-fieldname = transfld-fieldname.
  819. lt_03p-rollname = transfld-rollname.
  820. lt_03p-notnull = 'X'.
  821. lt_03p-keyflag = transfld-keyflag.
  822. APPEND lt_03p.
  823. CLEAR lt_03p.
  824. ENDLOOP.
  825. CALL FUNCTION 'DDIF_TABL_PUT'
  826. EXPORTING
  827. name = transtab
  828. dd02v_wa = wa_02v
  829. dd09l_wa = wa_09l
  830. TABLES
  831. dd03p_tab = lt_03p
  832. EXCEPTIONS
  833. tabl_not_found = 1
  834. name_inconsistent = 2
  835. tabl_inconsistent = 3
  836. put_failure = 4
  837. put_refused = 5
  838. OTHERS = 6.
  839. IF sy-subrc = 0.
  840. CALL FUNCTION 'DDIF_TABL_ACTIVATE'
  841. EXPORTING
  842. name = transtab
  843. IMPORTING
  844. rc = subrc
  845. EXCEPTIONS
  846. not_found = 1
  847. put_failure = 2
  848. OTHERS = 3.
  849. IF sy-subrc <> 0 OR ( subrc > 4 ).
  850. MESSAGE s000(oo) WITH '创建成功,激活失败,请手工激活表ZCSL'.
  851. ELSE.
  852. MESSAGE s000(oo) WITH '创建成功,激活成功'.
  853. ENDIF.
  854. ELSE.
  855. MESSAGE s000(oo) WITH '创建失败'.
  856. ENDIF.
  857. ENDFORM. "create_table
  858. *&---------------------------------------------------------------------*
  859. *& Form fill_dd03
  860. *&---------------------------------------------------------------------*
  861. FORM fill_dd03 USING fldname rollname key.
  862. it_dd03-fieldname = fldname.
  863. it_dd03-rollname = rollname.
  864. it_dd03-keyflag = key.
  865. APPEND it_dd03. CLEAR it_dd03.
  866. ENDFORM. "fill_dd03
  867. *&---------------------------------------------------------------------*
  868. *& Form UPDATE_SINGLE_FLD
  869. *&---------------------------------------------------------------------*
  870. FORM update_single_fld USING tabname fldname fldval whestr astxt.
  871. DATA: lt_setstr TYPE string.
  872. DATA: lr_table TYPE REF TO data,
  873. lr_line TYPE REF TO data.
  874. FIELD-SYMBOLS: <lfs_tab> TYPE STANDARD TABLE, <lfs_wa>, <lfs>.
  875. PERFORM get_dd03 USING tabname.
  876. TRY.
  877. CREATE DATA lr_table TYPE TABLE OF (tabname).
  878. ASSIGN lr_table->* TO <lfs_tab>.
  879. CREATE DATA lr_line LIKE LINE OF <lfs_tab>.
  880. ASSIGN lr_line->* TO <lfs_wa>.
  881. SELECT * INTO TABLE <lfs_tab> FROM (p_uptab) WHERE (p_upwhe).
  882. IF sy-subrc <> 0.
  883. MESSAGE e000(oo) WITH '未找到数据'.
  884. ENDIF.
  885. LOOP AT <lfs_tab> INTO <lfs_wa>.
  886. CLEAR: keystr,wa_log.
  887. LOOP AT it_fkey.
  888. ASSIGN COMPONENT it_fkey-fldname OF STRUCTURE <lfs_wa> TO <lfs>.
  889. CONCATENATE keystr <lfs> INTO keystr RESPECTING BLANKS.
  890. ENDLOOP.
  891. ASSIGN COMPONENT fldname OF STRUCTURE <lfs_wa> TO <lfs>.
  892. IF sy-subrc <> 0.
  893. MESSAGE e000(oo) WITH `数据库列'` fldname `'未知`.
  894. ENDIF.
  895. tmpstr = fldval.
  896. wa_log-tabname = tabname.
  897. wa_log-objectid = keystr.
  898. wa_log-fieldname = fldname.
  899. wa_log-erdat = sy-datum.
  900. wa_log-erzet = sy-uzeit.
  901. wa_log-ernam = sy-uname.
  902. wa_log-value_old = <lfs>.
  903. wa_log-value_new = tmpstr.
  904. INSERT (logtname) FROM wa_log.
  905. ENDLOOP.
  906. IF astxt = 'X'.
  907. CONCATENATE fldname ` = tmpstr ` INTO lt_setstr.
  908. ELSE.
  909. CONCATENATE fldname ` = ` tmpstr INTO lt_setstr.
  910. ENDIF.
  911. UPDATE (p_uptab) SET (lt_setstr) WHERE (p_upwhe).
  912. IF sy-subrc = 0.
  913. COMMIT WORK.
  914. MESSAGE s000(oo) WITH '更新数据条数:' sy-dbcnt .
  915. ELSE.
  916. ROLLBACK WORK.
  917. MESSAGE e000(oo) WITH '更新失败'.
  918. ENDIF.
  919. CATCH cx_root INTO cxroot.
  920. ROLLBACK WORK.
  921. excmsg = cxroot->get_text( ).
  922. MESSAGE e000(oo) WITH excmsg.
  923. ENDTRY.
  924. ENDFORM. " UPDATE_SINGLE_FLD
  925. *&---------------------------------------------------------------------*
  926. *& 弹出选择屏幕屏蔽按钮
  927. *&---------------------------------------------------------------------*
  928. FORM selscreen_ext USING extfcode.
  929. DATA: exttab TYPE slis_t_extab.
  930. SPLIT extfcode AT space INTO TABLE exttab.
  931. CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
  932. EXPORTING
  933. p_status = '%_CSP'
  934. TABLES
  935. p_exclude = exttab.
  936. ENDFORM. "selscreen_ext

761258b2573363155405e8239ec1037c.jpeg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/173829
推荐阅读
相关标签
  

闽ICP备14008679号