Looking for Non-Printable characters inside internal table ABAP

谁都会走 提交于 2020-01-13 19:27:31

问题


I have an internal table this is written to file and then pulled into the BW as a datasource. Occasionally a non printable character makes it into the file output and breaks the import process into the BW. Below is a sample of my code. Since the itab is not type c or string I am unable to use the find/replace regex on it. Has anyone else had to solve this type of problem before?

    FORM eliminate_non_print_char TABLES p_shiptab STRUCTURE shiptab.     

  LOOP AT p_shiptab INTO wa_shiptab.

    FIND REGEX '[^[:print:]]+(?!$)'
      IN wa_shiptab
    IGNORING CASE.
    "RESULTS result.
    IF  sy-subrc = 0.

     REPLACE REGEX '[^[:print:]]+(?!$)'
        IN wa_shiptab WITH ''
     IGNORING CASE.

    ENDIF.
  ENDLOOP.

DATA: BEGIN OF shiptab OCCURS 2000.
        INCLUDE STRUCTURE ship1.
        INCLUDE STRUCTURE ship2.
DATA: landtx            LIKE vbrk-landtx,
      bl_konwa          LIKE vbak-waerk.                    
        INCLUDE STRUCTURE ship3.
        INCLUDE STRUCTURE ship4.
DATA: frght_amnt_usd    LIKE konv-kwert,                    
      revenue_amnt_usd  LIKE vbap-netwr,                    
      unit_price_usd    LIKE vbap-netpr,                    
      pgi_posting_date  LIKE mkpf-budat,                    
      ord_line_item_qty LIKE lips-lfimg,                    
      asm_no            LIKE kna1-kunnr,
      asm_username      LIKE adrc-sort1,
      va_augru_t        LIKE tvaut-bezei,         
      ship_to_name      LIKE adrc-name1,
      bill_to_name      LIKE adrc-name1,
      forward_to_name   LIKE adrc-name1,
      fmv_amnt           LIKE konv-kbetr,    
      va_butxt           LIKE t001-butxt,    
      sold_to_search_term LIKE adrc-sort1,   
      bill_to_search_term LIKE adrc-sort1,  
      va_prctr           LIKE vbap-prctr,    
      va_bezei           LIKE tvrot-bezei.   
        INCLUDE STRUCTURE zorder_attr.         
DATA: extended_bits_count(20),              
      va_bstkd_hdr LIKE char32.            
DATA: gsm_bp_katr6      LIKE kna1-katr6,    
      gsm_bp_vtext6     LIKE tvk6t-vtext,   
      asm_ze_katr7      LIKE kna1-katr7,    
      asm_ze_vtext7     LIKE tvk7t-vtext,   
      gsm_ze_katr6      LIKE kna1-katr6,    
      gsm_ze_vtext6     LIKE tvk7t-vtext.
DATA:  END OF shiptab

.

The error I get is: "WA_SHIPTAB" must be a character-type data object (data type C, N, D,T, or STRING). I have non character types in the itab shiptab. I know I can do this lookup on each field individually, but the itab has 235 fields and that does not seem efficient.


回答1:


The program has another copy of the main itab that is char based fields, I looped through this and placed the following code:

REPLACE ALL OCCURRENCES OF REGEX '[^[:print:]]+$'
  IN transtab WITH ''
  IGNORING CASE.

Links for the answer:

SCN Link

Help.SAP Link




回答2:


You could use Runtime Type Sevices to loop through the definition of each field in the table to determine which are type-compatable with the REGEX operation. You can then use dynamic assignment to process only those fields which are compatable, one at a time. For example:

" Initalize Range of typekinds that are compatable with REGEX. See constant 
" attributes of CL_ABAP_DATADESCR for typekind definitions. You'll have to
" define these explicitly
lr_typekind_regex = <...>. 

" Get components of table structure
lo_tabdescr = cl_abap_typedescr=>describe_by_data( p_shiptab ).
lo_strdescr = lo_tabdescr->get_table_ine_type( ).
li_comp = lo_structdescr->get_components( ).

" Loop through table, sanitizing regex-compatable fields in each row
LOOP AT p_shiptab ASSIGNING <la_shiptab>.
  LOOP AT li_comp INTO la_comp.
    CHECK la_comp-type->type_kind IN lr_typekind_regex.

    " Call subroutine containing Regex to remove non-printable chars from field        
    ASSIGN COMPONENT la_comp-name OF STRUCTURE <la_shiptab> TO <l_charvalue>.
    PERFORM sanitize_field CHANGING <l_charvalue>. 

  ENDLOOP.
ENDLOOP.


来源:https://stackoverflow.com/questions/16675141/looking-for-non-printable-characters-inside-internal-table-abap

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!