检查变量是否在ABAP中是初始的

时间:2014-08-17 10:23:23

标签: abap

我需要从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.

我需要知道是否有任何功能模块或任何其他方法来优化我的代码并提高其性能。

2 个答案:

答案 0 :(得分:2)

如果您不想通过IF检查每个字段(假设v1-vn)的工作区,您应该从工作区的类型中读取dd03。然后你需要一些硬编码的字符串,它们(部分地)识别工作区中的那些字段,应该检查它们。然后你需要一个内循环,你循环在dd03工作区,用"包含模式"以前的指令,保证,你只循环dd03的相关FIELDNAMES。然后,您需要将之前创建的结构YourWorkara的& - 34; assign-component(内部循环覆盖dd03l-fieldnameof-actual循环字段)转换为"。 如果您使用" cast"之后,您可以使用rollname将实际的循环字段强制转换为rollname,这是dd03l的一部分。这保证了一个由"任何"键入的字段符号。可以正确填充,因此可以更准确地检查初始值。

你需要一些代码吗? 这是:

1)定义一些变量:

   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

2)想象一下,你想得到你工作区的数据类型(有几种方法):

" 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语句创建,减少到  最合适的部分,去掉头顶,所以未经测试。)。

这或多或少都是你应该尝试的。请告诉我,如果有任何错误,会导致错误。

        .

答案 1 :(得分:2)

假设,正如您的代码所示,您希望生成,而不是获取(如您所写)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.