2013-05-21 1 views
2

У меня есть внутренняя таблица, которая записывается в файл, а затем вставляется в BW в качестве источника данных. Иногда непечатаемый символ превращает его в вывод файла и прерывает процесс импорта в BW. Ниже приведен образец моего кода. Поскольку itab не является типом c или string, я не могу использовать регулярное выражение find/replace. Кто-нибудь еще должен был решить этот тип проблемы раньше?Искание символов без печати внутри внутренней таблицы ABAP

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 

.

Ошибка, которую я получаю: «WA_SHIPTAB» должен быть объектом данных типа символа (тип данных C, N, D, T или STRING). У меня нет типов символов в itab shiptab. Я знаю, что я могу делать этот поиск по каждому полю отдельно, но itab имеет 235 полей, и это не кажется эффективным.

+0

Может у ou, пожалуйста, добавьте определение типа 'shiptab'? – vwegert

+0

Готово, я также могу добавить структуры внутри shiptab, но они довольно большие и сделают сообщение труднее читать. Дайте мне знать, если вы хотите их увидеть. – CodeMonkey

+0

Будет ли возможность переместить все несимвольные поля в отдельную подструктуру? – vwegert

ответ

2

Программа имеет еще одну копию главного Itab, который на основе голец поля, я петельные через это и поместил следующий код:

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

Ссылки для ответа:

SCN Link

Help.SAP Link

1

Вы можете использовать Runtime Type Sevices для циклического определения определения каждого поля в таблице, чтобы определить, какие типы совместимы с операцией REGEX. Затем вы можете использовать динамическое назначение для обработки только тех полей, которые совместимы, по одному за раз. Например:

" 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. 

 Смежные вопросы

  • Нет связанных вопросов^_^