Efficiency optimizing

*low efficiency
   l_it_alv_stpox[] = g_it_alv_stpox[].
  SORT l_it_alv_stpox BY zz_matnr idnrk.
  LOOP AT g_it_alv_stpox ASSIGNING <l_wa_alv>.
    LOOP AT l_it_alv_stpox WHERE ( zz_matnr NE <l_wa_alv>-zz_matnr )
                             AND ( idnrk EQ <l_wa_alv>-idnrk )
                             AND ( zz_bunit IS NOT INITIAL )
                             AND ( zz_bunit NE <l_wa_alv>-zz_bunit ).
      <l_wa_alv>-zz_bunit = 'Common'.
      EXIT.
    ENDLOOP.
    UPDATE marc SET zz_bunit = <l_wa_alv>-zz_bunit WHERE werks = <l_wa_alv>-werks
                                                     AND matnr = <l_wa_alv>-idnrk                                                    .
    IF sy-subrc EQ 0.
      COMMIT WORK.
      <l_wa_alv>-zz_message  = l_message_s.
    ELSE.
      ROLLBACK WORK.
      <l_wa_alv>-zz_message  = l_message_f.
    ENDIF.
  ENDLOOP.

大内表LOOP嵌套LOOP,速度太慢,转化成以下逻辑

 delete adjacent duplicates from g_it_alv_stpox comparing zz_matnr idnrk.  
  l_it_idnrk_stpox[] = g_it_alv_stpox[].
  sort l_it_idnrk_stpox by idnrk.
  delete adjacent duplicates from l_it_idnrk_stpox comparing idnrk.

  l_it_idnrk_stpox_d[] = l_it_idnrk_stpox[].
  delete l_it_idnrk_stpox_d where zz_bunit is initial.


  loop at l_it_idnrk_stpox into l_wa_idnrk_stpox.
    l_it_stpox_in_loop[] = l_it_both_stpox[].
    delete l_it_stpox_in_loop where idnrk ne l_wa_idnrk_stpox-idnrk.
    delete l_it_both_stpox where idnrk eq l_wa_idnrk_stpox-idnrk.
    describe table l_it_stpox_in_loop lines l_lines.
    if l_lines gt 1.
      l_wa_idnrk_stpox-zz_bunit = 'Common'.
    endif.
    clear l_lines.
    update marc set zz_bunit = l_wa_idnrk_stpox-zz_bunit where werks = l_wa_idnrk_stpox-werks
                                                     and matnr = l_wa_idnrk_stpox-idnrk.
    if sy-subrc eq 0.
      commit work.
      l_wa_idnrk_stpox-zz_message  = l_message_s.
    else.
      rollback work.
      l_wa_idnrk_stpox-zz_message  = l_message_f.
    endif.

    modify g_it_alv_stpox from l_wa_idnrk_stpox transporting zz_bunit zz_message
    where werks = l_wa_idnrk_stpox-werks and idnrk = l_wa_idnrk_stpox-idnrk.
  endloop.
  clear:l_wa_idnrk_stpox.

猜你喜欢

转载自www.cnblogs.com/aurora-cj/p/9632655.html
今日推荐