我需要从csv文件中获取记录并处理它。最初,我需要检查是否所有的值都存在(大约15个字段),如果值是初始的(即空白),我需要抛出错误(输出必须写入每个记录的文件中)。
当前我遵循的逻辑是:
LOOP AT gt_filedata into gs_filedata.
IF gs_filedata-var1 IS INITIAL.
concatenate gv_msg text-001 into gv_msg SEPARATED BY ','.
ENDIF.
IF gs_filedata-var2 IS INITIAL.
concatenate gv_msg text-002 into gv_msg SEPARATED BY ','.
ENDIF.
" And so on...
ENDLOOP.
我需要知道是否有任何功能模块或任何其他方法来优化我的代码并提高其性能。
假设,如您的代码所示,您希望生成,而不是获取(如您所写)csv行:
field-symbols: <lv_part> type any,
<ls_filedata> like line of gt_filedata.
data: lv_part type string,
lv_msg type string.
loop at gt_filedata assigning <ls_filedata>.
clear lv_msg.
do.
assign component sy-index of structure <ls_filedata> to <lv_part>.
if sy-subrc ne 0.
exit. " exit DO
endif.
if <lv_part> is not initial.
lv_part = <lv_part>. " Converts to type C
if lv_msg is not initial.
concatenate lv_msg ',' into lv_msg.
endif.
concatenate lv_msg lv_part into lv_msg.
endif.
enddo.
append lv_msg to lt_csv. " Or transfer line to output file here
endloop.
如果您不想通过IF
检查每个工作区域字段,您应该从工作区域的类型中读取dd03。然后需要一些硬编码字符串,这些字符串部分地标识工作区域中的那些字段。然后,您需要一个内部循环,在此循环遍历dd03工作区,并使用"contains模式"。指令,这保证了您只遍历dd03的相关字段名。然后需要之前创建的assign-component (inner loop over dd03l-fieldnameof-actual looped field) of structure YourWorkarea to <anyfieldsymbol>
。
如果使用"casting"之后,您可以使用rollname将实际的循环字段强制转换为rollname,它是dd03l的一部分。这保证了"any"类型的字段符号可以正确地填充,从而更精确地检查初始
你需要一些代码吗?
-
定义一些变量:
lo_structdesc TYPE REF TO cl_abap_structdescr, dfies_wa TYPE dfies, dfies_tab TYPE STANDARD TABLE OF dfies, lv_ident TYPE fieldname value 'INP_'. " imagine all fields start like this. FIELD-SYMBOLS: <fsany> TYPE any. FIELD-SYMBOLS: <fsanyv> TYPE any
-
假设您想获得您的工作区域的数据类型(有几种方法):
" get struct by type lo_structdesc ?= cl_abap_structdescr=>describe_by_data( my_struct ). " introspect components dfies_tab = lo_structdesc->GET_DDIC_FIELD_LIST( ). loop at dfies_tab into dfies_wa where fieldname cp lv_ident. assign-component ( dfies_wa-fieldname ) of structure my_struct to <fsany> casting type (dfies_wa-rollname). if <fsany> is assigned. if <fsany> is initial. " ERROR HERE else. " continue with loop. endif. endif.
endloop .
未测试的从我的源代码中收缩副本,用于动态where语句的创建,减少到最合适的部分,删除开销,所以未测试。